package Ġcom . fs ck . k 9 . controller . push Ċ Ċ import Ġcom . fs ck . k 9 . Account Ċ import Ġcom . fs ck . k 9 . Account . Folder Mode Ċ import Ġcom . fs ck . k 9 . Preferences Ċ import Ġcom . fs ck . k 9 . backend . Backend Manager Ċ import Ġcom . fs ck . k 9 . network . Connectivity ChangeListener Ċ import Ġcom . fs ck . k 9 . network . Connectivity Manager Ċ import Ġcom . fs ck . k 9 . notification . Push Notification Manager Ċ import Ġcom . fs ck . k 9 . notification . Push Notification State Ċ import Ġcom . fs ck . k 9 . notification . Push Notification State . LIST EN ING Ċ import Ġcom . fs ck . k 9 . notification . Push Notification State . WAIT _ BACKGROUND _ SYNC Ċ import Ġcom . fs ck . k 9 . notification . Push Notification State . WAIT _ NETWORK Ċ import Ġcom . fs ck . k 9 . preferences . Background Sync Ċ import Ġcom . fs ck . k 9 . preferences . General Settings Manager Ċ import Ġjava . util . concurrent . Executors Ċ import Ġkotlinx . coroutines . Coroutine Dispatcher Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . as Coroutine Dispatcher Ċ import Ġkotlinx . coroutines . flow . distinct Until Changed Ċ import Ġkotlinx . coroutines . flow . launch In Ċ import Ġkotlinx . coroutines . flow . map Ċ import Ġkotlinx . coroutines . flow . on Each Ċ import Ġkotlinx . coroutines . launch Ċ import Ġtim ber . log . Tim ber Ċ Ċ /** Ċ Ġ* ĠStarts Ġand Ġstops Ġ[ Account Push Controller ] s Ġas Ġnecessary . ĠMan ages Ġthe ĠPush Ġforeground Ġservice . Ċ Ġ*/ Ċ class ĠPush Controller Ġinternal Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġpreferences : ĠPreferences , ĊĠĠĠ Ġprivate Ġval Ġgeneral Settings Manager : ĠGeneral Settings Manager , ĊĠĠĠ Ġprivate Ġval Ġbackend Manager : ĠBackend Manager , ĊĠĠĠ Ġprivate Ġval Ġpush Service Manager : ĠPush Service Manager , ĊĠĠĠ Ġprivate Ġval Ġboot Complete Manager : ĠBoot Complete Manager , ĊĠĠĠ Ġprivate Ġval Ġauto Sync Manager : ĠAuto Sync Manager , ĊĠĠĠ Ġprivate Ġval Ġpush Notification Manager : ĠPush Notification Manager , ĊĠĠĠ Ġprivate Ġval Ġconnectivity Manager : ĠConnect ivity Manager , ĊĠĠĠ Ġprivate Ġval Ġaccount Push Controller Factory : ĠAccount Push Controller Factory , ĊĠĠĠ Ġprivate Ġval Ġcoroutine Scope : ĠCor outine Scope Ġ= ĠGlobal Scope , ĊĠĠĠ Ġprivate Ġval Ġcoroutine Dispatcher : ĠCor outine Dispatcher Ġ= ĠExec utors . new Single Thread Executor (). as Coroutine Dispatcher () Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlock Ġ= ĠAny () ĊĠĠĠ Ġprivate Ġvar Ġinitialization Started Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġval Ġpush ers Ġ= Ġmutable Map Of < String , ĠAccount Push Controller >() ĊĊĠĠĠ Ġprivate Ġval Ġauto Sync Listener Ġ= ĠAuto Sync Listener (:: on Auto Sync Changed ) ĊĠĠĠ Ġprivate Ġval Ġconnectivity ChangeListener Ġ= Ġobject Ġ: ĠConnect ivity ChangeListener Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Connectivity Changed () Ġ= Ġthis @ Push Controller . on Connectivity Changed () ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Connectivity Lost () Ġ= Ġthis @ Push Controller . on Connectivity Lost () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInitialize Ġ[ Push Controller ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠOnly Ġcall Ġthis Ġmethod Ġin Ġsituations Ġwhere Ġstarting Ġa Ġforeground Ġservice Ġis Ġallowed . ĊĠĠĠĠ Ġ* ĠSee Ġhttps :// developer . android . com / about / versions / 1 2 / foreground - services ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġinit () Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( lock ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( initialization Started ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitialization Started Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcoroutine Scope . launch ( coroutine Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit In Background () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdisable Push () Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . v (" Push Controller . disable Push () ") ĊĊĠĠĠĠĠĠĠ Ġcoroutine Scope . launch ( coroutine Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( account Ġin Ġpreferences . accounts ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccount . folder Push Mode Ġ= ĠFolder Mode . NONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreferences . save Account ( account ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit In Background () Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . v (" Push Controller . init In Background () ") ĊĊĠĠĠĠĠĠĠ Ġpreferences . add On Accounts ChangeListener (:: on Accounts Changed ) ĊĠĠĠĠĠĠĠ Ġlisten For Background Sync Changes () ĊĠĠĠĠĠĠĠ Ġbackend Manager . addListener (:: on Backend Changed ) ĊĊĠĠĠĠĠĠĠ Ġupdate Push ers () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlisten For Background Sync Changes () Ġ{ ĊĠĠĠĠĠĠĠ Ġgeneral Settings Manager . get Settings Flow () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . background Sync Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. distinct Until Changed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Each Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Update Push ers () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. launch In ( coroutine Scope ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Accounts Changed () Ġ{ ĊĠĠĠĠĠĠĠ Ġlaunch Update Push ers () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Auto Sync Changed () Ġ{ ĊĠĠĠĠĠĠĠ Ġlaunch Update Push ers () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Connectivity Changed () Ġ{ ĊĠĠĠĠĠĠĠ Ġcoroutine Scope . launch ( coroutine Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( lock ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( account Push Controller Ġin Ġpush ers . values ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccount Push Controller . reconnect () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Push ers () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Connectivity Lost () Ġ{ ĊĠĠĠĠĠĠĠ Ġlaunch Update Push ers () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Backend Changed ( account : ĠAccount ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcoroutine Scope . launch ( coroutine Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaccount Push Controller Ġ= Ġsynchronized ( lock ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush ers . remove ( account . uuid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccount Push Controller ?. stop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Push ers () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlaunch Update Push ers () Ġ{ ĊĠĠĠĠĠĠĠ Ġcoroutine Scope . launch ( coroutine Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Push ers () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Push ers () Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . v (" Push Controller . update Push ers () ") ĊĊĠĠĠĠĠĠĠ Ġval Ġgeneral Settings Ġ= Ġgeneral Settings Manager . get Settings () ĊĊĠĠĠĠĠĠĠ Ġval Ġbackground Sync Disabled Via System Ġ= Ġauto Sync Manager . is Auto Sync Disabled ĊĠĠĠĠĠĠĠ Ġval Ġbackground Sync Disabled In App Ġ= Ġgeneral Settings . background Sync Ġ== ĠBackground Sync . NE VER ĊĠĠĠĠĠĠĠ Ġval Ġnetwork Not Available Ġ= Ġ! connectivity Manager . is Network Available () ĊĠĠĠĠĠĠĠ Ġval Ġreal Push Accounts Ġ= Ġget Push Accounts () ĊĊĠĠĠĠĠĠĠ Ġval Ġpush Accounts Ġ= Ġif Ġ( background Sync Disabled Via System Ġ|| Ġbackground Sync Disabled In App Ġ|| Ġnetwork Not Available ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreal Push Accounts ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġpush Account Uuid s Ġ= Ġpush Accounts . map Ġ{ Ġit . uuid Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġare Push ers Active Ġ= Ġsynchronized ( lock ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Push Account Uuid s Ġ= Ġpush ers . keys ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Push Account Uuid s Ġ= Ġpush Account Uuid s Ġ- Ġcurrent Push Account Uuid s ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstop Push Account Uuid s Ġ= Ġcurrent Push Account Uuid s Ġ- Ġpush Account Uuid s ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stop Push Account Uuid s . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . v (" .. Stopping ĠPush Controller Ġfor Ġaccounts : Ġ% s ", Ġstop Push Account Uuid s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( account Uuid Ġin Ġstop Push Account Uuid s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaccount Push Controller Ġ= Ġpush ers . remove ( account Uuid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccount Push Controller ?. stop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( start Push Account Uuid s . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . v (" .. Starting ĠPush Controller Ġfor Ġaccounts : Ġ% s ", Ġstart Push Account Uuid s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( account Uuid Ġin Ġstart Push Account Uuid s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaccount Ġ= Ġpreferences . get Account ( account Uuid ) Ġ?: Ġerror (" Account Ġnot Ġfound : Ġ$ account Uuid ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush ers [ account Uuid ] Ġ= Ġaccount Push Controller Factory . create ( account ). also Ġ{ Ġaccount Push Controller Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccount Push Controller . start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . v (" .. Running ĠPush Controllers : Ġ% s ", Ġpush ers . keys ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpush ers . isNotEmpty () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreal Push Accounts . isEmpty () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Services () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Sync Disabled Via System Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Push Notification State ( WAIT _ BACKGROUND _ SYNC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Services () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Not Available Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Push Notification State ( WAIT _ NETWORK ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Services () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġare Push ers Active Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Push Notification State ( LIST EN ING ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Services () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Services () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Push Accounts (): ĠList < Account > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġpreferences . accounts . filter Ġ{ Ġaccount Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccount . folder Push Mode Ġ!= ĠFolder Mode . NONE Ġ&& Ġbackend Manager . get Backend ( account ). is Push Cap able ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġset Push Notification State ( notification State : ĠPush Notification State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpush Notification Manager . notification State Ġ= Ġnotification State ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Services () Ġ{ ĊĠĠĠĠĠĠĠ Ġpush Service Manager . start () ĊĠĠĠĠĠĠĠ Ġboot Complete Manager . enable Receiver () ĊĠĠĠĠĠĠĠ Ġregister Auto Sync Listener () ĊĠĠĠĠĠĠĠ Ġregister Connectivity ChangeListener () ĊĠĠĠĠĠĠĠ Ġconnectivity Manager . start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstop Services () Ġ{ ĊĠĠĠĠĠĠĠ Ġpush Service Manager . stop () ĊĠĠĠĠĠĠĠ Ġboot Complete Manager . disable Receiver () ĊĠĠĠĠĠĠĠ Ġauto Sync Manager . unregister Listener () ĊĠĠĠĠĠĠĠ Ġunregister Connectivity ChangeListener () ĊĠĠĠĠĠĠĠ Ġconnectivity Manager . stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġregister Auto Sync Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( auto Sync Manager . res pect System Auto Sync ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauto Sync Manager . register Listener ( auto Sync Listener ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauto Sync Manager . unregister Listener () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġregister Connectivity ChangeListener () Ġ{ ĊĠĠĠĠĠĠĠ Ġconnectivity Manager . addListener ( connectivity ChangeListener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġunregister Connectivity ChangeListener () Ġ{ ĊĠĠĠĠĠĠĠ Ġconnectivity Manager . remove Listener ( connectivity ChangeListener ) ĊĠĠĠ Ġ} Ċ } Ċ