package Ġcom . gu ym ichael . react d roid . extensions . navigation . model Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . app . Application Ċ import Ġandroid . content . Component Name Ċ import Ġandroid . os . Bundle Ċ import Ġcom . gu ym ichael . ap romise . AP romise Ċ import Ġcom . gu ym ichael . kotlin react . Logger Ċ import Ġcom . gu ym ichael . react d roid . extensions . navigation . Client Page Int f Ċ import Ġio . reactivex . rx java 3 . core . Observable Ċ import Ġio . reactivex . rx java 3 . dis pos ables . Disposable Ċ import Ġio . reactivex . rx java 3 . subjects . Publish Subject Ċ Ċ internal Ġclass ĠActiv ities Monitor ( internal Ġvar Ġlog Lifecycle : ĠBoolean Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ: ĠApplication . Activity Lifecycle Callbacks Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġactivity State Records Ġ= ĠHashMap < Component Name , ĠActivity State Record ?> () ĊĠĠĠ Ġprivate Ġval Ġapp Foreground State Subject Ġ= ĠPublish Subject . create < Boolean >() ĊĠĠĠ Ġprivate Ġval Ġactivities State Subject Ġ= ĠPublish Subject . create < Pair < Activity , Ġ@ Activity Foreground State ĠInt >>() ĊĊĊĠĠĠ Ġprivate Ġval Ġlogger Disposable Ġ= Ġif Ġ( log Lifecycle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġobserve App Foreground State (). subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . d ( Activities Monitor :: class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" app Ġis Ġnow Ġ${ ( if Ġ( it ) Ġ" foreground " Ġelse Ġ" background ") }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġnull ĊĊĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Created ( activity : ĠActivity , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Activity Record ( activity , ĠActivity Foreground State . CREATED ) ĊĠĠĠ Ġ} ĊĠĠĠĠĊĠĠĠ Ġoverride Ġfun Ġon Activity Started ( activity : ĠActivity ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Activity Record ( activity , ĠActivity Foreground State . STARTED ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Res umed ( activity : ĠActivity ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Activity Record ( activity , ĠActivity Foreground State . RE SU MED ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Paused ( activity : ĠActivity ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Activity Record ( activity , ĠActivity Foreground State . PA USED ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Stopped ( activity : ĠActivity ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Activity Record ( activity , ĠActivity Foreground State . STOP PED ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Destroyed ( activity : ĠActivity ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Activity Record ( activity , ĠActivity Foreground State . DESTROY ED ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Save InstanceState ( activity : ĠActivity , Ġout State : ĠBundle ) Ġ{} ĊĊĊĊ ĊĊĠĠĠ Ġ/* ĠAPI Ġ*/ ĊĊĠĠĠ Ġ/** ĠTo Ġbe Ġrun Ġon Ġthe Ġui Ġthread Ġ*/ ĊĠĠĠ Ġfun Ġbind Activity To Client Page ( activity : ĠActivity , Ġpage : ĠClient Page Int f ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Activity Record ( activity , Ġpage ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Activity Foreground ( activity : ĠActivity ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġis Activity Foreground Intl ( activity , Ġallow Paused Ġ= Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Activity Foreground ( cls : ĠClass < out ĠActivity >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġis Activity Foreground Intl ( cls , Ġallow Paused Ġ= Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetActivity State ( cls : ĠClass < out ĠActivity >): Ġ@ Activity Foreground State ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠgetActivity Record ( cls )?. state ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetActivity State ( activity : ĠActivity ): Ġ@ Activity Foreground State ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠgetActivity Record ( activity )?. state ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠIs Ġany Ġactivity Ġin Ġforeground Ġ*/ ĊĠĠĠ Ġfun Ġis App Foreground (): ĠBoolean Ġ{ Ġ// TH INK Ġsync ĊĠĠĠĠĠĠĠ Ġreturn Ġactivity State Records . values . any Ġ{ Ġrecord Ġ-> Ġrecord Ġ!= Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis State Foreground ( record . state ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġobserve App Foreground State (): ĠObservable < Boolean > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġapp Foreground State Subject ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġobserve Activities State (): ĠObservable < Pair < Activity , Ġ@ Activity Foreground State ĠInt >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġactivities State Subject ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠwaitFor App Foreground (): ĠA Promise < Unit > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( is App Foreground ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠA Promise . of () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠA Promise . of Callback < Unit , ĠDis posable >({ Ġpromise Callback Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserve App Foreground State () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do OnError Ġ{ Ġpromise Callback . on Failure ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit Ġ== Ġtrue Ġ} Ġ// foreground Ġonly ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpromise Callback . on Success ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// finally Ġdispose Ġthe Ġobserver ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) Ġ{ Ġd Ġ-> Ġd . take If Ġ{ Ġ! it . is Disposed Ġ} ?. dispose () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠwaitFor App Background (): ĠA Promise < Unit > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( is App Foreground ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠA Promise . of Callback < Unit , ĠDis posable >({ Ġpromise Callback Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserve App Foreground State () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do OnError Ġ{ Ġpromise Callback . on Failure ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit Ġ== Ġfalse Ġ} Ġ// background Ġonly ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpromise Callback . on Success ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// finally Ġdispose Ġthe Ġobserver ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) Ġ{ Ġd Ġ-> Ġd . take If Ġ{ Ġ! it . is Disposed Ġ} ?. dispose () Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠA Promise . of () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĊĊ ĊĊĠĠĠ Ġ/* Ġpriv ates Ġ*/ ĊĊĠĠĠ Ġprivate Ġfun Ġcomponent Name For ( cls : ĠClass < out ĠActivity >): ĠComponent Name ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcls .` package ` ?. name ?. let { ĊĠĠĠĠĠĠĠĠĠĠĠ ĠComponent Name ( it , Ġcls . simple Name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis State Foreground ( state : Ġ@ Activity Foreground State ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Foreground State . CREATED , ĠActivity Foreground State . STARTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, ĠActivity Foreground State . RE SU MED , ĠActivity Foreground State . PA USED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Activity Res umed ( record : ĠActivity State Record , Ġallow Paused : ĠBoolean ) ĊĠĠĠĠĠĠĠ Ġ: ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġreturn Ġrecord . state Ġ== ĠActivity Foreground State . RE SU MED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġ( allow Paused Ġ&& Ġrecord . state Ġ== ĠActivity Foreground State . PA USED ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Activity Foreground Intl ( activity : ĠActivity , Ġallow Paused : ĠBoolean ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠgetActivity Record ( activity )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Activity Res umed ( it , Ġallow Paused ) ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Activity Foreground Intl ( cls : ĠClass < out ĠActivity >, Ġallow Paused : ĠBoolean ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠgetActivity Record ( cls )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Activity Res umed ( it , Ġallow Paused ) ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// TH INK Ġcache Ġas Ġlocal Ġvariable Ġfor Ġspeed ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return Ġtop most Ġ[ Activity ], Ġif Ġnot Ġnull , Ġguaranteed Ġto Ġbe Ġ' alive ' Ġ- Ġnot Ġfinish ing / destroy ed ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġget Foreground Record Intl (): ĠActivity State Record ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( Ġ// TH INK Ġsort ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity State Records . values . first OrNull Ġ{ Ġrecord Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecord ?. state Ġ== ĠActivity Foreground State . RE SU MED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġrecord . is Activity Alive () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// if Ġnot Ġfound , Ġallow Ġcreated Ġor Ġstarted ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġactivity State Records . values . first OrNull Ġ{ Ġrecord Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( record ?. state Ġ== ĠActivity Foreground State . CREATED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġrecord ?. state Ġ== ĠActivity Foreground State . STARTED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġrecord . is Activity Alive () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// if Ġnot Ġfound , Ġallow Ġpaused ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġactivity State Records . values . first OrNull Ġ{ Ġrecord Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecord ?. state Ġ== ĠActivity Foreground State . PA USED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġrecord . is Activity Alive () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġrecord Ġmatching Ġthe Ġgiven Ġ` page ` Ġwith Ġa Ġstate Ġ` CREATED ` Ġto Ġ` STOP PED `, Ġinclusive , ĊĠĠĠĠ Ġ* Ġand Ġits Ġactivity Ġalive Ġ( not Ġfinished Ġ/ Ġdestroyed ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġget Top Live Activity Record ( page : ĠClient Page Int f ): ĠActivity State Record ? Ġ{ Ġ// TH INK Ġsync ĊĠĠĠĠĠĠĠ Ġreturn ĠgetActivity Records ( page ). let Ġ{ Ġrecords Ġ-> Ġ// TH INK Ġsort ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecords . first OrNull Ġ{ Ġrecord Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecord . state Ġ== ĠActivity Foreground State . RE SU MED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġrecord . is Activity Alive () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// if Ġnot Ġfound , Ġallow Ġcreated Ġor Ġstarted ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġrecords . first OrNull Ġ{ Ġrecord Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( record . state Ġ== ĠActivity Foreground State . CREATED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġrecord . state Ġ== ĠActivity Foreground State . STARTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġrecord . is Activity Alive () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// if Ġnot Ġfound , Ġallow Ġpaused ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġrecords . first OrNull Ġ{ Ġrecord Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecord . state Ġ== ĠActivity Foreground State . PA USED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġrecord . is Activity Alive () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// if Ġnot Ġfound , Ġallow Ġstopped ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġrecords . first OrNull Ġ{ Ġrecord Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecord . state Ġ== ĠActivity Foreground State . STOP PED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġrecord . is Activity Alive () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠTo Ġbe Ġrun Ġon Ġthe Ġui Ġthread Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠgetActivity Record ( activity : ĠActivity ): ĠActivity State Record ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġactivity State Records [ activity . component Name ] Ġ// TH INK Ġsync ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠTo Ġbe Ġrun Ġon Ġthe Ġui Ġthread Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠgetActivity Record ( cls : ĠClass < out ĠActivity >) Ġ: ĠActivity State Record ? Ġ{ Ġ// TH INK Ġsync ĊĠĠĠĠĠĠĠ Ġreturn Ġcomponent Name For ( cls )?. let ( activity State Records :: get ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠTo Ġbe Ġrun Ġon Ġthe Ġui Ġthread Ġ*/ ĊĠĠĠ Ġinternal Ġfun ĠgetActivity Records ( page : ĠClient Page Int f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġpredicate : Ġ(( Activity State Record ) Ġ-> ĠBoolean )? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ): ĠList < Activity State Record > Ġ{ Ġ// TH INK Ġsync ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġreturn Ġactivity State Records . values . filter Ġ{ record Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecord ?. page Ġ== Ġpage Ġ&& Ġpredicate ?. invoke ( record ) Ġ!= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġas ĠList < Activity State Record > Ġ// already Ġchecked Ġfor Ġnull Ġbut Ġthe Ġcompiler Ġdoesn 't Ġknow ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTo Ġbe Ġrun Ġon Ġthe Ġui Ġthread ĊĠĠĠĠ Ġ* Ġ@ param Ġactivity Ġwill Ġoverride Ġany Ġpreviously Ġset Ġrecord 's Ġactivity , Ġif Ġexists ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġadd Activity Record ( activity : ĠActivity , Ġpage : ĠClient Page Int f ) Ġ{ Ġ// TH INK Ġsync ĊĠĠĠĠĠĠĠ Ġactivity State Records [ activity . component Name ] Ġ= ĠActivity State Record . from ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// take Ġnew Ġreference ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// copy Ġprev Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ, ĠgetActivity State ( activity ) Ġ?: ĠActivity Foreground State . NE VER _ CREATED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġpage ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ/* Logger . w ( Activities Monitor :: class ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġ"${ activity . java Class . simple Name } Ġrecord Ġinitialized " ĊĠĠĠĠĠĠĠ Ġ) */ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTo Ġbe Ġrun Ġon Ġthe Ġui Ġthread ĊĠĠĠĠ Ġ* Ġ@ param Ġactivity Ġwill Ġoverride Ġany Ġpreviously Ġset Ġrecord 's Ġactivity , Ġif Ġexists ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġadd Activity Record ( activity : ĠActivity ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġstate : Ġ@ Activity Foreground State ĠInt ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġwas App Foreground Ġ= Ġis App Foreground () ĊĊĠĠĠĠĠĠĠ Ġ// add Ġrecord ĊĠĠĠĠĠĠĠ Ġactivity State Records [ activity . component Name ] Ġ= ĠActivity State Record . from ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// keep Ġreference Ġonly Ġif / while Ġactivity Ġis Ġalive ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . take If Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ!= ĠActivity Foreground State . DESTROY ED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ! activity . is Destroyed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ! activity . is Finish ing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// copy Ġprev Ġpage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ, ĠgetActivity Record ( activity )?. page ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( log Lifecycle ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . d ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠActiv ities Monitor :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġ"${ activity . java Class . simple Name } Ġstate : Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġname For ( state ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// update Ġapp Ġforeground Ġstate ĊĠĠĠĠĠĠĠ Ġval Ġis App Foreground Ġ= Ġis App Foreground () ĊĠĠĠĠĠĠĠ Ġif Ġ( is App Foreground Ġ!= Ġwas App Foreground ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Foreground State Subject . onNext ( is App Foreground ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// notify Ġstate Ġob servers ĊĠĠĠĠĠĠĠ Ġactivities State Subject . onNext ( activity Ġto Ġstate ) ĊĠĠĠ Ġ} Ċ }