package Ġio . met ropol is lab . sample architecture . architecture Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . app . Application Ċ import Ġandroid . arch . lifecycle . ViewModel Ċ import Ġandroid . arch . lifecycle . ViewModel Provider Ċ import Ġandroid . arch . lifecycle . ViewModel Providers Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . Bundle Ċ import Ġio . met ropol is lab . sample architecture . extensions . weak Ċ import Ġjava . lang . ref . Weak Reference ĊĊ Ċ abstract Ġclass ĠCoord inator Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġparent : ĠWeak Reference < Coordinator >? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġchild : ĠCoord inator ? Ġ= Ġnull ĊĊĠĠĠ Ġprotected Ġval Ġtop Activity : ĠCoord inated Activity < *> ? ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġforeground Activity ?. get ()?. let Ġ{ Ġreturn Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( vm Bindings . isEmpty ()) Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvm Bindings . find Ġ{ Ġit . weak Activity ?. get () Ġ!= Ġnull Ġ} ?. weak Activity ?. get () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġprotected Ġval Ġtop Or Parent Activity : ĠCoord inated Activity < *> ? ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtop Activity Ġ?: Ġparent ?. get ()?. top Activity ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġvar Ġmain Activity La unched Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġmain Activity Created Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġval Ġvm Bindings : ĠMutable List < V MB ind ing < *, Ġ* >> Ġ= Ġmutable ListOf () ĊĠĠĠ Ġprivate Ġvar Ġforeground Activity : ĠWeak Reference < Coord inated Activity <* >> ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġopen Main ( app : ĠApplication ) Ġ{ ĊĠĠĠĠĠĠĠ Ġapp . register Activity Lifecycle Callbacks ( Coordinator Lifecycle Callbacks ( this )) ĊĠĠĠĠĠĠĠ Ġopen () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġfun Ġopen () ĊĊĠĠĠ Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġchild ?. close () ĊĠĠĠĠĠĠĠ Ġvm Bindings . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . weak Activity ?. get ()?. finish () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvm Bindings . clear () ĊĠĠĠĠĠĠĠ Ġparent ?. get ()?. on Child Closed ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Child Closed ( coordinator : ĠCoord inator ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( child Ġ== Ġcoord inator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġopen Child ( coordinator : ĠCoord inator ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcoord inator . parent Ġ= Ġthis . weak () ĊĠĠĠĠĠĠĠ Ġchild Ġ= Ġcoord inator ĊĠĠĠĠĠĠĠ Ġcoord inator . open () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġ< A , ĠV > Ġset Main ViewModel ( activity Class : ĠClass < A >, ĠviewModel : ĠV ) Ġwhere ĠA Ġ: ĠCoord inated Activity < V >, ĠV Ġ: ĠBase ViewModel Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbinding Ġ= ĠV MB ind ing ( activity Class , ĠviewModel ) ĊĠĠĠĠĠĠĠ Ġvm Bindings . add ( 0 , Ġbinding ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġ< A , ĠV > Ġlaunch Activity ( activity Class : ĠClass < A >, ĠviewModel : ĠV ) Ġwhere ĠA Ġ: ĠCoord inated Activity < V >, ĠV Ġ: ĠBase ViewModel Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbinding Ġ= ĠV MB ind ing ( activity Class , ĠviewModel ) ĊĠĠĠĠĠĠĠ Ġvm Bindings . add ( 0 , Ġbinding ) ĊĊĠĠĠĠĠĠĠ Ġval Ġparent Ġ= Ġtop Or Parent Activity Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( parent , Ġactivity Class ) ĊĊĠĠĠĠĠĠĠ Ġparent . startActivity ( intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġon Activity Finished ( activity : ĠCoord inated Activity < *> Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchild Result Ġ= Ġchild ?. on Activity Finished ( activity ) ĊĠĠĠĠĠĠĠ Ġif Ġ( child Result Ġ!= Ġnull Ġ&& Ġchild Result ) Ġreturn Ġtrue ĊĊĠĠĠĠĠĠĠ Ġval Ġfound Index Ġ= Ġvm Bindings . indexOf First Ġ{ Ġit . weak Activity ?. get () Ġ== Ġactivity Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( found Index Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvm Bindings . remove At ( found Index ). un Bind Activity () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( vm Bindings . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon MainActivity Destroyed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġon Activity Created ( activity : ĠActivity , Ġbundle : ĠBundle ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchild Result Ġ= Ġchild ?. on Activity Created ( activity , Ġbundle ) ĊĠĠĠĠĠĠĠ Ġif Ġ( child Result Ġ!= Ġnull Ġ&& Ġchild Result ) Ġreturn Ġtrue ĊĊĠĠĠĠĠĠĠ Ġactivity Ġas ? ĠCoord inated Activity < *> Ġ?: Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġbinding Ġ= Ġvm Bindings . find Ġ{ Ġit . matches Activity ( activity ) Ġ} Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġbinding . bind Activity ( activity , Ġthis ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! main Activity Created ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmain Activity Created Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon MainActivity Created () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġon Activity Started ( activity : ĠActivity ) Ġ{ ĊĠĠĠĠĠĠĠ Ġactivity Ġas ? ĠCoord inated Activity < *> Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ(! main Activity La unched ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmain Activity La unched Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon MainActivity La unched () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġon Activity Res umed ( activity : ĠActivity ) Ġ{ ĊĠĠĠĠĠĠĠ Ġactivity Ġas ? ĠCoord inated Activity < *> Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġforeground Activity Ġ= Ġactivity . weak () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġfun Ġon MainActivity Created () ĊĊĠĠĠ Ġabstract Ġfun Ġon MainActivity La unched () ĊĊĠĠĠ Ġopen Ġfun Ġon MainActivity Destroyed () Ġ{ ĊĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġopen Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġchild ?. on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġon Request Permissions Result ( request Code : ĠInt , Ġpermissions : ĠArray < String >, Ġgrant Results : ĠInt Array ) Ġ{ ĊĠĠĠĠĠĠĠ Ġchild ?. on Request Permissions Result ( request Code , Ġpermissions , Ġgrant Results ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠV MB ind ing < V Ġ: ĠBase ViewModel , ĠA Ġ: ĠCoord inated Activity < V >> Ġconstructor ( private Ġval Ġact Class : ĠClass < A >, Ġval ĠviewModel : ĠV ) Ġ{ ĊĠĠĠ Ġvar Ġweak Activity : ĠWeak Reference < Coord inated Activity <* >> ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġmatches Activity ( activity : ĠCoord inated Activity < *> ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġact Class . isAssignableFrom ( activity . java Class ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġun Bind Activity () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . on Un Bind () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġbind Activity ( activity : ĠCoord inated Activity <* >, Ġcoord inator : ĠCoord inator ) Ġ{ ĊĠĠĠĠĠĠĠ Ġweak Activity Ġ= Ġactivity . weak () ĊĠĠĠĠĠĠĠ Ġactivity . inject Coord ination ( coordinator , ĠviewModel ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠCoord inator Lifecycle Callbacks ( main Coordinator : ĠCoord inator ) Ġ: ĠApplication . Activity Lifecycle Callbacks Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġcoord inator : ĠWeak Reference < Coordinator > Ġ= Ġmain Coordinator . weak () ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Paused ( activity : ĠActivity ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠNOT ĠUSE D ĠY ET ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Res umed ( activity : ĠActivity ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcoord inator . get ()?. on Activity Res umed ( activity ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Started ( activity : ĠActivity ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcoord inator . get ()?. on Activity Started ( activity ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Destroyed ( activity : ĠActivity ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠNOT ĠUSE D ĠY ET ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Save InstanceState ( activity : ĠActivity , Ġbundle : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠNOT ĠUSE D ĠY ET ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Stopped ( activity : ĠActivity ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠNOT ĠUSE D ĠY ET ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Created ( activity : ĠActivity , Ġbundle : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġcoord inator . get ()?. on Activity Created ( activity , Ġbundle ) ĊĠĠĠ Ġ} Ċ } Ċ