package Ġio . ro ver . notifications . ui Ċ Ċ import Ġandroid . arch . lifecycle . Lifecycle Ċ import Ġandroid . arch . lifecycle . Lifecycle Observer Ċ import Ġandroid . arch . lifecycle . On Lifecycle Event Ċ import Ġio . ro ver . core . logging . log Ċ import Ġio . ro ver . core . streams . Publish Subject Ċ import Ġio . ro ver . core . streams . Publish ers Ċ import Ġio . ro ver . core . streams . do On Next Ċ import Ġio . ro ver . core . streams . do On Request Ċ import Ġio . ro ver . core . streams . filter Null s Ċ import Ġio . ro ver . core . streams . map Ċ import Ġio . ro ver . core . streams . share Ċ import Ġio . ro ver . core . streams . share Hot And Replay Ċ import Ġio . ro ver . core . tracking . Session Tracker Interface Ċ import Ġio . ro ver . notifications . domain . Notification Ċ import Ġio . ro ver . notifications . ui . conc ern s . Notification Center List ViewModel Interface Ċ import Ġio . ro ver . notifications . ui . conc ern s . Notifications Repository Interface Ċ import Ġorg . reactiv est ream s . Publisher Ċ import Ġjava . util . Date Ċ Ċ class ĠNotification Center List ViewModel ( ĊĠĠĠ Ġprivate Ġval Ġnotifications Repository : ĠNotifications Repository Interface , ĊĠĠĠ Ġprivate Ġval Ġsession Tracker : ĠSession Tracker Interface , ĊĠĠĠ Ġactivity Lifecycle : ĠLifecycle Ċ ) Ġ: ĠNotification Center List ViewModel Interface Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġevents (): ĠPublisher < out ĠNotification Center List ViewModel Interface . Event > Ġ= Ġe pic . do On Request Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠIn fer Ġfrom Ġa Ġnew Ġsubscriber Ġthat Ġit 's Ġa Ġnewly Ġdisplayed Ġview , Ġand , Ġthus , Ġan ĊĠĠĠĠĠĠĠ Ġ// Ġautomatic Ġrefresh Ġshould Ġbe Ġkick ed Ġoff . ĊĠĠĠĠĠĠĠ Ġrequest Refresh () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġnotification Clicked ( notification : ĠNotification ) Ġ{ ĊĠĠĠĠĠĠĠ Ġactions . onNext ( Action . Notification Clicked ( notification )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdelete Notification ( notification : ĠNotification ) Ġ{ ĊĠĠĠĠĠĠĠ Ġactions . onNext ( Action . Delete Notification ( notification )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrequest Refresh () Ġ{ ĊĠĠĠĠĠĠĠ Ġnotifications Repository . refresh () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠState : Ġstable ĠIDs Ġmapping . Ġ ĠEnsure Ġthat Ġwe Ġhave Ġa Ġ 1 0 0 % Ġconsistent Ġstable ĠID Ġfor Ġthe Ġlifetime ĊĠĠĠ Ġ// Ġof Ġthe Ġview Ġmodel Ġ( which Ġwill Ġsufficient ly Ġmatch Ġthe Ġlifetime Ġof Ġthe Ġre cycler view Ġthat ĊĠĠĠ Ġ// Ġrequires Ġthe Ġstable ids ). ĊĠĠĠ Ġprivate Ġvar Ġhighest Stable Id Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġval Ġstable Ids : ĠMutable Map < String , ĠInt > Ġ= Ġmutable Map Of () ĊĊĠĠĠ Ġprivate Ġval Ġactions Ġ= ĠPublish Subject < Action >() ĊĊĠĠĠ Ġprivate Ġval Ġe pic : ĠPublisher < Notification Center List ViewModel Interface . Event > Ġ= ĊĠĠĠĠĠĠĠ ĠPublish ers . merge ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactions . share (). map Ġ{ Ġaction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAction . Notification Clicked Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġdelete Ġoperation Ġis Ġentirely Ġasynchronous , Ġas Ġa Ġside - effect . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotifications Repository . mark Read ( action . notification ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Center List ViewModel Interface . Event . Navigate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction . notification ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAction . Delete Notification Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotifications Repository . delete ( action . notification ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. filter Null s (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotifications Repository . updates (). map Ġ{ Ġupdate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. notifications ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġ! it . is Deleted Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . expires At ?. after ( Date ()) Ġ?: Ġtrue Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. do On Next Ġ{ Ġnotifications Ready For Display Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġside - effect , Ġupdate Ġthe Ġstable Ġids Ġlist Ġmap : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Stable Ids ( notifications Ready For Display ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. map Ġ{ Ġnotifications Ready For Display Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Center List ViewModel Interface . Event . List Updated ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotifications Ready For Display , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstable Ids ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. do On Next Ġ{ Ġupdate Stable Ids ( it . notifications ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotifications Repository ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. events () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġrepository Event Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . v (" Received Ġevent Ġ$ repository Event ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( repository Event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNotifications Repository Interface . E mission . Event . Refresh ing Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Center List ViewModel Interface . Event . Refresh ing ( repository Event . refresh ing ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNotifications Repository Interface . E mission . Event . Fetch Failure Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Center List ViewModel Interface . Event . Display Problem Message () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ). share Hot And Replay ( 0 ) ĊĊĠĠĠ Ġprivate Ġfun Ġtrack Enter Notification Center () Ġ{ ĊĠĠĠĠĠĠĠ Ġsession Tracker . enter Session ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Notification Center ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Notification ĠCenter ĠPresent ed ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Notification ĠCenter ĠView ed ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhash Map Of () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtrack Leave Notification Center () Ġ{ ĊĠĠĠĠĠĠĠ Ġsession Tracker . leave Session ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Notification Center ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Notification ĠCenter ĠDis missed ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhash Map Of () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Stable Ids ( notifications : ĠList < Notification >) Ġ{ ĊĠĠĠĠĠĠĠ Ġnotifications . forEach Ġ{ Ġnotification Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! stable Ids . containsKey ( notification . id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstable Ids [ notification . id ] Ġ= Ġ++ highest Stable Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġactivity Lifecycle . add Observer ( object Ġ: ĠLifecycle Observer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ On Lifecycle Event ( Lifecycle . Event . ON _ RE SU ME ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġpresented () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrack Enter Notification Center () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ On Lifecycle Event ( Lifecycle . Event . ON _ PAUSE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġdis missed () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrack Leave Notification Center () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsealed Ġclass ĠAction Ġ{ ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠNotification Clicked ( val Ġnotification : ĠNotification ) Ġ: ĠAction () ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠDelete Notification ( val Ġnotification : ĠNotification ) Ġ: ĠAction () ĊĠĠĠ Ġ} Ċ } Ċ