/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 ĠGoogle ĠLLC Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . google . samples . apps . ios ched . ui . schedule Ċ Ċ import Ġandroidx . annotation . String Res Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mediator LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . live Data Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . google . samples . apps . ios ched . R Ċ import Ġcom . google . samples . apps . ios ched . model . SessionId Ċ import Ġcom . google . samples . apps . ios ched . model . userdata . User Session Ċ import Ġcom . google . samples . apps . ios ched . shared . analytics . Analytics Actions Ċ import Ġcom . google . samples . apps . ios ched . shared . analytics . Analytics Helper Ċ import Ġcom . google . samples . apps . ios ched . shared . data . signin . Authenticated UserInfo Ċ import Ġcom . google . samples . apps . ios ched . shared . domain . Refresh Conference Data UseCase Ċ import Ġcom . google . samples . apps . ios ched . shared . domain . logistics . Load Auto Scroll Flag UseCase Ċ import Ġcom . google . samples . apps . ios ched . shared . domain . prefs . Load Selected Filters UseCase Ċ import Ġcom . google . samples . apps . ios ched . shared . domain . prefs . Save Selected Filters UseCase Ċ import Ġcom . google . samples . apps . ios ched . shared . domain . sessions . Event Location Ċ import Ġcom . google . samples . apps . ios ched . shared . domain . sessions . Get Conference Days UseCase Ċ import Ġcom . google . samples . apps . ios ched . shared . domain . sessions . Load User Sessions By Day UseCase Ċ import Ġcom . google . samples . apps . ios ched . shared . domain . sessions . Load User Sessions By Day UseCase Parameters Ċ import Ġcom . google . samples . apps . ios ched . shared . domain . sessions . Load User Sessions By Day UseCase Result Ċ import Ġcom . google . samples . apps . ios ched . shared . domain . sessions . Ob serve Conference Data UseCase Ċ import Ġcom . google . samples . apps . ios ched . shared . domain . settings . Get TimeZone UseCase Ċ import Ġcom . google . samples . apps . ios ched . shared . domain . users . Star Event And Notify UseCase Ċ import Ġcom . google . samples . apps . ios ched . shared . domain . users . Star Event Parameter Ċ import Ġcom . google . samples . apps . ios ched . shared . fc m . Topic Subscriber Ċ import Ġcom . google . samples . apps . ios ched . shared . result . Event Ċ import Ġcom . google . samples . apps . ios ched . shared . result . Result Ċ import Ġcom . google . samples . apps . ios ched . shared . result . Result . Success Ċ import Ġcom . google . samples . apps . ios ched . shared . result . data Ċ import Ġcom . google . samples . apps . ios ched . shared . schedule . User Session Matcher Ċ import Ġcom . google . samples . apps . ios ched . shared . time . Time Provider Ċ import Ġcom . google . samples . apps . ios ched . shared . util . Time Utils Ċ import Ġcom . google . samples . apps . ios ched . shared . util . map Ċ import Ġcom . google . samples . apps . ios ched . shared . util . switch Map Ċ import Ġcom . google . samples . apps . ios ched . ui . Snackbar Message Ċ import Ġcom . google . samples . apps . ios ched . ui . messages . Snackbar Message Manager Ċ import Ġcom . google . samples . apps . ios ched . ui . schedule . filters . Event Filter Ċ import Ġcom . google . samples . apps . ios ched . ui . schedule . filters . Event Filter . My Events Filter Ċ import Ġcom . google . samples . apps . ios ched . ui . schedule . filters . Event Filter . Tag Filter Ċ import Ġcom . google . samples . apps . ios ched . ui . schedule . filters . Load Event Filters UseCase Ċ import Ġcom . google . samples . apps . ios ched . ui . session common . Event Actions Ċ import Ġcom . google . samples . apps . ios ched . ui . signin . SignIn ViewModel Delegate Ċ import Ġcom . google . samples . apps . ios ched . util . cancel If Active Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . supervisor Scope Ċ import Ġorg . th reet en . bp . Zone Id Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . util . UUID Ċ import Ġjavax . inject . Inject Ċ Ċ /** Ċ Ġ* ĠLoads Ġdata Ġand Ġexposes Ġit Ġto Ġthe Ġview . Ċ Ġ* ĠBy Ġannot ating Ġthe Ġconstructor Ġwith Ġ[@ Inject ], ĠD agger Ġwill Ġuse Ġthat Ġconstructor Ġwhen Ġneeding Ġto Ċ Ġ* Ġcreate Ġthe Ġobject , Ġso Ġdefining Ġa Ġ[@ Provides ] Ġmethod Ġfor Ġthis Ġclass Ġwon 't Ġbe Ġneeded . Ċ Ġ*/ Ċ class ĠSchedule ViewModel Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġload User Sessions By Day UseCase : ĠLoad User Sessions By Day UseCase , ĊĠĠĠ Ġprivate Ġval Ġget Conference Days UseCase : ĠGet Conference Days UseCase , ĊĠĠĠ Ġprivate Ġval Ġload Event Filters UseCase : ĠLoad Event Filters UseCase , ĊĠĠĠ Ġsign In ViewModel Delegate : ĠSign In ViewModel Delegate , ĊĠĠĠ Ġprivate Ġval Ġstar Event UseCase : ĠStar Event And Notify UseCase , ĊĠĠĠ Ġtopic Subscriber : ĠTopic Subscriber , ĊĠĠĠ Ġprivate Ġval Ġsn ackbar Message Manager : ĠSn ackbar Message Manager , ĊĠĠĠ Ġprivate Ġval Ġget TimeZone UseCase : ĠGet TimeZone UseCase , ĊĠĠĠ Ġprivate Ġval Ġrefresh Conference Data UseCase : ĠRefresh Conference Data UseCase , ĊĠĠĠ Ġobserve Conference Data UseCase : ĠOb serve Conference Data UseCase , ĊĠĠĠ Ġload Selected Filters UseCase : ĠLoad Selected Filters UseCase , ĊĠĠĠ Ġprivate Ġval Ġsave Selected Filters UseCase : ĠSave Selected Filters UseCase , ĊĠĠĠ Ġprivate Ġval Ġanalytics Helper : ĠAnalytics Helper , ĊĠĠĠ Ġis Scroll Feature Enabled UseCase : ĠLoad Auto Scroll Flag UseCase , ĊĠĠĠ Ġprivate Ġval Ġtime Provider : ĠTime Provider Ċ ) Ġ: ĠViewModel (), ĠSchedule EventListener , ĠSign In ViewModel Delegate Ġby Ġsign In ViewModel Delegate Ġ{ ĊĊĠĠĠ Ġ// ĠKeep s Ġtrack Ġof Ġthe Ġcoroutine Ġthat Ġlist ens Ġfor Ġuser Ġsessions ĊĠĠĠ Ġprivate Ġvar Ġload User Sessions Job : ĠJob ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġload Sessions Result Ġ= ĠMutable LiveData < Result < Load User Sessions By Day UseCase Result >>() ĊĊĠĠĠ Ġval ĠisLoading : ĠLive Data < Boolean > Ġ= Ġload Sessions Result . map Ġ{ Ġit Ġ== ĠResult . Loading Ġ} ĊĊĠĠĠ Ġ// ĠThe Ġcurrent ĠUser Session Matcher , Ġused Ġto Ġfilter Ġthe Ġevents Ġthat Ġare Ġshown ĊĠĠĠ Ġprivate Ġval Ġuser Session Matcher Ġ= ĠUser Session Matcher () ĊĊĠĠĠ Ġprivate Ġval Ġprefer Conference TimeZone Result Ġ= ĠMutable LiveData < Result < Boolean >>() ĊĊĠĠĠ Ġprivate Ġval Ġshow In Conference TimeZone Ġ= Ġprefer Conference TimeZone Result . map Ġ{ Ġit . data Ġ?: Ġtrue Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGets Ġthe Ġlabel Ġto Ġdisplay Ġfor Ġeach Ġconference Ġdate . ĠWhen Ġusing Ġtime Ġzones Ġother Ġthan Ġthe ĊĠĠĠĠ Ġ* Ġconference Ġzone , Ġconference Ġdays Ġand Ġcalendar Ġdates Ġmay Ġnot Ġalign . ĠTo Ġminimize Ġconfusion , ĊĠĠĠĠ Ġ* Ġwe Ġshow Ġactual Ġdates Ġwhen Ġusing Ġconference Ġzone Ġtime ; Ġotherwise , Ġwe Ġshow Ġthe Ġday Ġnumber . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġlabels For Days : ĠLive Data < List < Int >> Ġ= Ġshow In Conference TimeZone . map Ġ{ Ġin Conference TimeZone Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( Time Utils . phys ically In Conference TimeZone () Ġ|| Ġin Conference TimeZone ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ map ĠlistOf ( R . string . day 1 _ date , ĠR . string . day 2 _ date ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ map ĠlistOf ( R . string . day 1 , ĠR . string . day 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġtime Zone Id : ĠLive Data < Zone Id > Ġ= Ġshow In Conference TimeZone . map Ġ{ Ġin Conference TimeZone Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( in Conference TimeZone ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTime Utils . CON FER ENCE _ TIME ZONE ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠZone Id . system Default () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġsession Time Data Day : ĠList < Mediator LiveData < Session Time Data >> Ġ= ĊĠĠĠĠĠĠĠ Ġget Conference Days UseCase (). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMed iator LiveData < Session Time Data >() ĊĠĠĠĠĠĠĠ Ġ}. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSession Ġdata Ġob serves Ġthe Ġtime Ġzone Ġand Ġthe Ġrepository . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠforEach Indexed Ġ{ Ġ_, Ġsession Time Data Day Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession Time Data Day . add Source ( time Zone Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession Time Data Day . value Ġ= Ġsession Time Data Day . value ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Zone Id Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: ĠSession Time Data ( time Zone Id Ġ= Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠCached Ġlist Ġof ĠTag Filters Ġreturned Ġby Ġthe Ġuse Ġcase . ĠOnly ĠResult . Success Ġmod ifies Ġit . ĊĠĠĠ Ġprivate Ġvar Ġcached Event Filters Ġ= Ġmutable ListOf < Event Filter >() ĊĊĠĠĠ Ġprivate Ġval Ġ_ event Filters Ġ= ĠMutable LiveData < List < Event Filter >>() ĊĠĠĠ Ġval Ġevent Filters : ĠLive Data < List < Event Filter >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ event Filters ĊĊĠĠĠ Ġprivate Ġval Ġ_ selected Filters Ġ= ĠMutable LiveData < List < Event Filter >>() ĊĠĠĠ Ġval Ġselected Filters : ĠLive Data < List < Event Filter >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ selected Filters ĊĠĠĠ Ġprivate Ġval Ġ_ has Any Filters Ġ= ĠMutable LiveData < Boolean >(). apply Ġ{ Ġvalue Ġ= Ġfalse Ġ} ĊĠĠĠ Ġval Ġhas Any Filters : ĠLive Data < Boolean > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ has Any Filters ĊĊĠĠĠ Ġprivate Ġval Ġswipe Refresh Result Ġ= ĠMutable LiveData < Result < Boolean >>() ĊĠĠĠ Ġval Ġswipe Refresh ing : ĠLive Data < Boolean > Ġ= Ġswipe Refresh Result . map Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWh enever Ġrefresh Ġfinishes , Ġstop Ġthe Ġindicator , Ġwhatever Ġthe Ġresult ĊĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġevent Count : ĠLive Data < Int > Ġ= Ġload Sessions Result . map Ġ{ Ġit . data ?. user Session Count Ġ?: Ġ 0 Ġ} ĊĊĠĠĠ Ġ/** ĠLive Data Ġfor ĠActions Ġand ĠEvents Ġ**/ ĊĊĠĠĠ Ġprivate Ġval Ġ_ errorMessage Ġ= ĠMed iator LiveData < Event < String >> (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Source ( load Sessions Result ) Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġis ĠResult . Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= ĠEvent ( content Ġ= Ġresult . exception . message Ġ?: Ġ" Error ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval ĠerrorMessage : ĠLive Data < Event < String >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ errorMessage ĊĊĠĠĠ Ġprivate Ġval Ġ_ navigate To Session Action Ġ= ĠMutable LiveData < Event < String >>() ĊĠĠĠ Ġval Ġnavigate To Session Action : ĠLive Data < Event < String >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ navigate To Session Action ĊĊĠĠĠ Ġprivate Ġval Ġ_ sn ackBar Message Ġ= ĠMed iator LiveData < Event < Snackbar Message >>() ĊĠĠĠ Ġval Ġsn ackBar Message : ĠLive Data < Event < Snackbar Message >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ sn ackBar Message ĊĊĠĠĠ Ġ/** ĠResource Ġid Ġof Ġthe Ġprofile Ġbutton 's Ġcontent Ġdescription ; Ġchanges Ġbased Ġon Ġsign Ġin Ġstate **/ ĊĠĠĠ Ġprivate Ġval Ġ_ profile Content Desc Ġ= ĠMed iator LiveData < Int >(). apply Ġ{ Ġvalue Ġ= ĠR . string . sign _ in Ġ} ĊĊĠĠĠ Ġval Ġprofile Content Desc : ĠLive Data < Int > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ profile Content Desc ĊĊĠĠĠ Ġprivate Ġval Ġ_ navigate To SignIn Dialog Action Ġ= ĠMutable LiveData < Event < Unit >>() ĊĠĠĠ Ġval Ġnavigate To SignIn Dialog Action : ĠLive Data < Event < Unit >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ navigate To SignIn Dialog Action ĊĊĠĠĠ Ġprivate Ġval Ġ_ navigate To Sign Out Dialog Action Ġ= ĠMutable LiveData < Event < Unit >>() ĊĠĠĠ Ġval Ġnavigate To Sign Out Dialog Action : ĠLive Data < Event < Unit >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ navigate To Sign Out Dialog Action ĊĊĠĠĠ Ġprivate Ġval Ġ_ navigate To Search Action Ġ= ĠMutable LiveData < Event < Unit >>() ĊĠĠĠ Ġval Ġnavigate To Search Action : ĠLive Data < Event < Unit >> Ġ= Ġ_ navigate To Search Action ĊĊĠĠĠ Ġ// ĠFlags Ġused Ġto Ġdisable Ġthe Ġ" scroll Ġto Ġnow " Ġfeature ĊĠĠĠ Ġvar Ġuser Has Inter acted Ġ= Ġfalse ĊĊĠĠĠ Ġ// ĠThe Ġcurrently Ġhappening Ġevent ĊĠĠĠ Ġval Ġcurrent Event : ĠLive Data < Event Location ?> Ġ= Ġload Sessions Result . switch Map Ġ{ ĊĠĠĠĠĠĠĠ Ġlive Data Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOnly Ġemit Ġif Ġthe Ġfeature Ġis Ġnot Ġrem otely Ġdisabled ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Scroll Feature Enabled UseCase ( Unit ). data Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( it . data ?. first Un finished Session ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠLoad Ġpersisted Ġfilters Ġto Ġthe Ġmatcher Ġwhen Ġthe ĠViewModel Ġstarts ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthese Ġuse Ġcases Ġfail , Ġwe Ġdon 't Ġwant Ġto Ġcancel Ġthe Ġexecution Ġof Ġthis Ġcoroutine ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsupervisor Scope Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Selected Filters UseCase ( user Session Matcher ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Event Filters () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreating Ġa Ġnew Ġcoroutine Ġto Ġlisten Ġfor Ġuser Ġauth Ġchanges Ġbecause Ġwe Ġdon 't Ġwant ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġto Ġsuspend Ġthe Ġcalling Ġcoroutine Ġon Ġthe Ġcollect Ġcall Ġand Ġwe Ġalso Ġwant Ġto ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġlisten Ġfor Ġchanges Ġin Ġconference Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLoad Ġuser Ġsessions Ġwhen Ġthe Ġuser Ġhas Ġchanged Ġand Ġupdate Ġprofile Ġcontent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Firebase User . collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ profile Content Desc . value Ġ= Ġget Profile Content Description ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Loading Ġuser Ġsession Ġwith Ġuser Ġ${ it ?. data ?. get Uid () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh User Sessions () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLoad Ġfilters Ġand Ġuser Ġsessions Ġwhen Ġthere 's Ġnew Ġconference Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserve Conference Data UseCase ( Any ()). collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Detected Ġnew Ġdata Ġin Ġconference Ġdata Ġrepository ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Event Filters () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh User Sessions () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠSubscribe Ġuser Ġto Ġschedule Ġupdates ĊĠĠĠĠĠĠĠ Ġtopic Subscriber . subscribe To Schedule Updates () ĊĊĠĠĠĠĠĠĠ Ġinitialize TimeZone () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠLoad ĠEvent Filters Ġwhen Ġpersisted Ġfilters Ġare Ġloaded Ġand Ġwhen Ġthere 's Ġnew Ġconference Ġdata ĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġload Event Filters () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġload Event Filters Result Ġ= Ġload Event Filters UseCase ( user Session Matcher ) ĊĠĠĠĠĠĠĠ Ġif Ġ( load Event Filters Result Ġis ĠSuccess ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcached Event Filters Ġ= Ġload Event Filters Result . data . to Mutable List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Filter State Observable s () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( load Event Filters Result Ġis ĠResult . Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ errorMessage . value Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEvent ( content Ġ= Ġload Event Filters Result . exception . message Ġ?: Ġ" Error ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinitialize TimeZone () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġfrom Ġeach Ġschedule Ġday Ġfragment Ġto Ġload Ġdata . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Session Time Data For Day ( day : ĠInt ): ĠLive Data < Session Time Data > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsession Time Data Day . getOrElse ( day ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexception Ġ= ĠException (" Invalid Ġday : Ġ$ day ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( exception ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġexception ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġopen Event Detail ( id : ĠSession Id ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ navigate To Session Action . value Ġ= ĠEvent ( id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtoggle Filter ( filter : ĠEvent Filter , Ġenabled : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchanged Ġ= Ġwhen Ġ( filter ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMy Events Filter Ġ-> Ġuser Session Matcher . set Show Pin ned Events Only ( enabled ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTag Filter Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Session Matcher . add ( filter . tag ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Session Matcher . remove ( filter . tag ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( changed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠActually Ġtoggle Ġthe Ġfilter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġcached Event Filters . indexOf ( filter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcached Event Filters [ index ] Ġ= Ġfilter . copy ( enabled ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPers ist Ġthe Ġfilters ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsave Selected Filters UseCase ( user Session Matcher ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġobservable s ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Filter State Observable s () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh User Sessions () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAnalytics ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfilter Name Ġ= Ġif Ġ( filter Ġis ĠMy Events Filter ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Star red Ġ& ĠReserved " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfilter . getText () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction Ġ= Ġif Ġ( enabled ) ĠAnalytics Actions . ENABLE Ġelse ĠAnalytics Actions . DISABLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanalytics Helper . log Ui Event (" Filter Ġchanged : Ġ$ filter Name ", Ġaction ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclear Filters () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( user Session Matcher . clear All ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcached Event Filters Ġ= Ġcached Event Filters . map To ( mutable ListOf ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . isSelected ) Ġit . copy ( false ) Ġelse Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsave Selected Filters UseCase ( user Session Matcher ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Filter State Observable s () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh User Sessions () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġanalytics Helper . log Ui Event (" Clear Ġfilters ", ĠAnalytics Actions . CLICK ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠUpdate Ġall Ġobservable s Ġrelated Ġto Ġthe Ġfilter Ġstate . ĠCalled Ġfrom Ġmethods Ġthat Ġmodify ĊĠĠĠ Ġ// Ġselected Ġfilters Ġin Ġthe ĠUser Session Matcher . ĊĠĠĠ Ġprivate Ġfun Ġupdate Filter State Observable s () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhas Any Filters Ġ= Ġuser Session Matcher . has Any Filters () ĊĠĠĠĠĠĠĠ Ġ_ has Any Filters . value Ġ= Ġhas Any Filters ĊĠĠĠĠĠĠĠ Ġ_ event Filters . value Ġ= Ġcached Event Filters ĊĠĠĠĠĠĠĠ Ġ_ selected Filters . value Ġ= Ġcached Event Filters . filter Ġ{ Ġit . isSelected Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Swipe Refresh () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġswipe Refresh Result . value Ġ= Ġrefresh Conference Data UseCase ( Any ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Profile Clicked () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Signed In ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ navigate To Sign Out Dialog Action . value Ġ= ĠEvent ( Unit ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ navigate To SignIn Dialog Action . value Ġ= ĠEvent ( Unit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Search Clicked () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ navigate To Search Action . value Ġ= ĠEvent ( Unit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon SignIn Required () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ navigate To SignIn Dialog Action . value Ġ= ĠEvent ( Unit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ String Res ĊĠĠĠ Ġprivate Ġfun Ġget Profile Content Description ( user Result : ĠResult < Authenticated UserInfo ?> ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( user Result Ġis ĠSuccess Ġ&& Ġuser Result . data ?. is Signed In () Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . sign _ out ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . sign _ in ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrefresh User Sessions () Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" ViewModel Ġrefresh ing Ġuser Ġsessions ") ĊĊĠĠĠĠĠĠĠ Ġ// Ġwhen Ġthere 's Ġa Ġnew Ġuser , Ġcancel Ġlistening Ġfor Ġthe Ġold Ġuser 's Ġsessions ĊĠĠĠĠĠĠĠ Ġload User Sessions Job . cancel If Active () ĊĊĠĠĠĠĠĠĠ Ġload User Sessions Job Ġ= ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload User Sessions By Day UseCase ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLoad User Sessions By Day UseCase Parameters ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Session Matcher , Ġget UserId (), Ġtime Provider . now Z oned () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Sessions Result . value Ġ= Ġit ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGroup Ġsessions Ġby Ġday ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession Time Data Day . forEach Indexed Ġ{ Ġindex , Ġsession Time Data Day Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Sessions Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . data ?. user Sessions Per Day ?. get ( get Conference Days UseCase ()[ index ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn @ forEach Indexed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession Time Data Day . value Ġ= Ġsession Time Data Day . value ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Ġ= Ġuser Sessions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: ĠSession Time Data ( list Ġ= Ġuser Sessions ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Star Clicked ( user Session : ĠUser Session ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Signed In ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Showing ĠSign - in Ġdialog Ġafter Ġstar Ġclick ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ navigate To SignIn Dialog Action . value Ġ= ĠEvent ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnew Is Star red State Ġ= Ġ! user Session . user Event . is Star red ĊĊĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġthe Ġsn ackbar Ġmessage Ġoptim istic ally . ĊĠĠĠĠĠĠĠ Ġval Ġstring Res Id Ġ= Ġif Ġ( new Is Star red State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . event _ star red ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . event _ un star red ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( new Is Star red State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanalytics Helper . log Ui Event ( user Session . session . title , ĠAnalytics Actions . STAR RED ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsn ackbar Message Manager . addMessage ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar Message ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmessageId Ġ= Ġstring Res Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Id Ġ= ĠR . string . dont _ show , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Change Id Ġ= ĠUUID . randomUUID (). toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget UserId ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġstar Event UseCase ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStar Event Parameter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Session . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Event Ġ= Ġuser Session . user Event . copy ( is Star red Ġ= Ġnew Is Star red State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠShow Ġan Ġerror Ġmessage Ġif Ġa Ġstar Ġrequest Ġfails ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġis ĠResult . Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ sn ackBar Message . value Ġ= ĠEvent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar Message ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmessageId Ġ= ĠR . string . event _ star _ error , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlong Duration Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinitialize TimeZone () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprefer Conference TimeZone Result . value Ġ= Ġget TimeZone UseCase ( Unit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠSession Time Data ( var Ġlist : ĠList < User Session >? Ġ= Ġnull , Ġvar Ġtime Zone Id : ĠZone Id ? Ġ= Ġnull ) Ċ Ċ interface ĠSchedule EventListener Ġ: ĠEvent Actions Ġ{ ĊĠĠĠ Ġ/** ĠCalled Ġfrom Ġthe ĠUI Ġto Ġenable Ġor Ġdisable Ġa Ġparticular Ġfilter . Ġ*/ ĊĠĠĠ Ġfun Ġtoggle Filter ( filter : ĠEvent Filter , Ġenabled : ĠBoolean ) ĊĊĠĠĠ Ġ/** ĠCalled Ġfrom Ġthe ĠUI Ġto Ġremove Ġall Ġfilters . Ġ*/ ĊĠĠĠ Ġfun Ġclear Filters () Ċ } Ċ