package Ġcom . jay new st rom . screens witch er Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Context Wrapper Ċ import Ġandroid . os . Parcelable Ċ import Ġandroid . util . Sparse Array Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . view . input method . Input Method Manager Ċ Ċ internal Ġclass ĠReal Screen Switch er ( ĊĠĠĠ Ġprivate Ġval Ġstate : ĠScreen Switch er State , ĊĠĠĠ Ġprivate Ġval Ġhost : ĠScreen Switch er Host Ċ ) Ġ: ĠScreen Switch er Ġ{ ĊĠĠĠ Ġprivate Ġval Ġactivity : ĠActivity ĊĠĠĠ Ġprivate Ġval Ġscreen View Map : ĠMutable Map < Screen , ĠView > ĊĊĠĠĠ Ġoverride Ġvar Ġis Transition ing : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Argument ( state . screens . isNotEmpty ()) Ġ{ Ġ" state Ġneeds Ġscreens Ġin Ġorder Ġto Ġinitialize Ġa ĠScreen Switch er " Ġ} ĊĊĠĠĠĠĠĠĠ Ġthis . activity Ġ= ĠgetActivity ( host . host View (). context ) ĊĠĠĠĠĠĠĠ Ġthis . screen View Map Ġ= ĠLinkedHashMap () ĊĠĠĠĠĠĠĠ Ġhost . host View (). setup For View Extensions ( this , Ġstate ) ĊĠĠĠĠĠĠĠ Ġsetup Host View For H iding Keyboard () ĊĠĠĠĠĠĠĠ Ġstate . screen Switch er Created ( this ) ĊĠĠĠĠĠĠĠ Ġinitialize ViewState () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinitialize ViewState () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscreens Ġ= Ġstate . screens ĊĠĠĠĠĠĠĠ Ġfor Ġ( screen Ġin Ġscreens ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate View ( screen ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġstate . lifecycle Listener . on Screen B ec ame Active ( screens [ screens . size Ġ- Ġ 1 ]) ĊĠĠĠĠĠĠĠ Ġhide All But Top Screen () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate View ( screen : ĠScreen ): ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġscreen . create View ( host . host View (), Ġstate ) ĊĠĠĠĠĠĠĠ Ġview . setTag ( R . id . screen _ switch er _ screen , Ġscreen ) ĊĠĠĠĠĠĠĠ Ġscreen View Map [ screen ] Ġ= Ġview ĊĠĠĠĠĠĠĠ Ġscreen . bind View ( view ) ĊĠĠĠĠĠĠĠ Ġcheck Argument ( view . parent Ġ== Ġnull ) Ġ{ Ġ" create View / bind View Ġshould Ġnot Ġreturn Ġa Ġview Ġthat Ġhas Ġa Ġparent ." Ġ} ĊĠĠĠĠĠĠĠ Ġhost . addView ( view ) ĊĠĠĠĠĠĠĠ Ġstate . remove View Hierarchy State ( screen )?. let ( view :: restore Hierarchy State ) ĊĠĠĠĠĠĠĠ Ġreturn Ġview ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Host View For H iding Keyboard () Ġ{ ĊĠĠĠĠĠĠĠ Ġhost . host View (). is Focus able Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġhost . host View (). is Focus able In Touch Mode Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpush ( screen : ĠScreen ) Ġ{ ĊĠĠĠĠĠĠĠ Ġensure Transition IsNot Occ ur ring (" push ") ĊĠĠĠĠĠĠĠ Ġval Ġscreens Ġ= Ġstate . screens ĊĠĠĠĠĠĠĠ Ġcheck State ( screens . isNotEmpty ()) Ġ{ Ġ" no Ġscreens Ġto Ġtransition Ġfrom " Ġ} ĊĊĠĠĠĠĠĠĠ Ġhide Keyboard () ĊĊĠĠĠĠĠĠĠ Ġval Ġbackground Screen Ġ= Ġscreens [ screens . size Ġ- Ġ 1 ] ĊĠĠĠĠĠĠĠ Ġval Ġbackground View Ġ= Ġscreen View Map . getValue ( background Screen ) ĊĠĠĠĠĠĠĠ Ġstate . lifecycle Listener . on Screen B ec ame Inactive ( background Screen ) ĊĊĠĠĠĠĠĠĠ Ġstate . add Screen ( screen ) ĊĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġcreate View ( screen ) ĊĊĠĠĠĠĠĠĠ Ġscreen . transition (). transition In ( view , Ġbackground View , ĠEnd Transition Runnable ()) ĊĠĠĠĠĠĠĠ Ġstate . lifecycle Listener . on Screen B ec ame Active ( screen ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpop ( number To Pop : ĠInt , Ġpop Context : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġensure Transition IsNot Occ ur ring (" pop ") ĊĠĠĠĠĠĠĠ Ġcheck Number To Pop ( number To Pop ) ĊĊĠĠĠĠĠĠĠ Ġhide Keyboard () ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! pop Listener Cons umed Pop ( number To Pop , Ġpop Context )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġperform Pop ( number To Pop ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġreplace Scre ens With ( number To Pop : ĠInt , Ġnew Scre ens : ĠList < Screen >, Ġpop Context : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġensure Transition IsNot Occ ur ring (" replace Scre ens With ") ĊĠĠĠĠĠĠĠ Ġcheck Number To Pop ( number To Pop ) ĊĠĠĠĠĠĠĠ Ġcheck Argument ( new Scre ens . isNotEmpty ()) Ġ{ Ġ" screens Ġmust Ġcontain Ġat Ġleast Ġone Ġscreen " Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġscreens Ġ= ĠArrayList ( new Scre ens ) Ġ// ĠMake Ġdef ensive Ġcopy . ĊĊĠĠĠĠĠĠĠ Ġhide Keyboard () ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! pop Listener Cons umed Pop ( number To Pop , Ġpop Context )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscreens ToRemove Ġ= ĠArrayList < Screen >( number To Pop ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġnumber To Pop Ġdown To Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscreens ToRemove . add ( state . screens [ state . screens . size Ġ- Ġi ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbackground Screen Ġ= Ġstate . screens [ state . screens . size Ġ- Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbackground View Ġ= Ġscreen View Map . getValue ( background Screen ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . lifecycle Listener . on Screen B ec ame Inactive ( background Screen ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRemove Ġthe Ġprevious Ġscreens Ġfrom Ġstate Ġbefore Ġadding Ġthe Ġnew Ġones . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġon Transition Completed Ġ= ĠRemove Screen Runnable ( screens ToRemove ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( screen Ġin Ġscreens ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . add Screen ( screen ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġcreate View ( screen ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtop Screen Ġ= Ġscreens [ screens . size Ġ- Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtop View Ġ= Ġscreen View Map . getValue ( top Screen ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtop View . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . lifecycle Listener . on Screen B ec ame Active ( top Screen ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtop Screen . transition (). transition In ( top View , Ġbackground View , Ġon Transition Completed ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsave View Hierarchy State To Screen Switch er State () Ġ{ ĊĠĠĠĠĠĠĠ Ġscreen View Map . forEach Ġ{ Ġ( screen , Ġview ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparcel able Sparse Array Ġ= ĠSparse Array < Parcelable >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . save Hierarchy State ( parcel able Sparse Array ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . save View Hierarchy State ( screen , Ġparcel able Sparse Array ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhide Keyboard () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Focus Ġ= Ġactivity . current Focus ĊĠĠĠĠĠĠĠ Ġif Ġ( current Focus Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimm Ġ= Ġactivity . getSystem Service ( Context . INPUT _ METHOD _ SERVICE ) Ġas ĠInput Method Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimm . hide Soft Input From Window ( current Focus . window Token , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhost . host View (). request Focus () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġensure Transition IsNot Occ ur ring ( transition Type : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck State (! is Transition ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠString . format ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Can 't Ġ% s Ġwhile Ġa Ġtransition Ġis Ġoccur ring .", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransition Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Number To Pop ( number To Pop : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Argument ( number To Pop Ġ>= Ġ 1 ) Ġ{ Ġ" number To Pop Ġ< Ġ 1 " Ġ} ĊĠĠĠĠĠĠĠ Ġcheck Argument ( number To Pop Ġ<= Ġstate . screens . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠString . format ("% d Ġscreens Ġexists , Ġcan 't Ġpop Ġ% d Ġscreens .", Ġstate . screens . size , Ġnumber To Pop ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpop Listener Cons umed Pop ( number To Pop : ĠInt , Ġpop Context : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscreens Ġ= Ġstate . screens ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. number To Pop ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscreen Ġ= Ġscreens [ screens . size Ġ- Ġi ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġscreen View Map . getValue ( screen ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state . handles Pop ( view , Ġscreen , Ġpop Context )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġperform Pop ( i Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġperform Pop ( number To Pop : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscreens Ġ= Ġstate . screens ĊĠĠĠĠĠĠĠ Ġif Ġ( screens . size Ġ> Ġnumber To Pop ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 Ġuntil Ġnumber To Pop ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Screen ( screens [ screens . size Ġ- Ġ 2 ], Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġperform Pop Transition ( screens [ screens . size Ġ- Ġ 1 ], Ġscreens [ screens . size Ġ- Ġ 2 ]) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! host . finish Handler . screen Switch er Should Finish ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . lifecycle Listener . on Screen B ec ame Inactive ( screens [ screens . size Ġ- Ġ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Transition ing Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( screen Ġin ĠArrayList ( state . screens )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . remove Screen ( screen ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhost . finish Handler . on Screen Switch er Finished ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠScreen Switch er Finish Handler . Finish Complete Handler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfinish Complete () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( screen Ġin ĠArrayList ( screen View Map . keys )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Screen ( screen , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġperform Pop Transition ( screen ToRemove : ĠScreen , Ġscreen ToBe come Visible : ĠScreen ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstate . lifecycle Listener . on Screen B ec ame Inactive ( screen ToRemove ) ĊĠĠĠĠĠĠĠ Ġval Ġview ToBe come Visible Ġ= Ġscreen View Map . getValue ( screen ToBe come Visible ) ĊĠĠĠĠĠĠĠ Ġview ToBe come Visible . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġval Ġview ToRemove Ġ= Ġscreen View Map . getValue ( screen ToRemove ) ĊĠĠĠĠĠĠĠ Ġval Ġcompletion Runnable Ġ= ĠRemove Screen Runnable ( screen ToRemove ) ĊĠĠĠĠĠĠĠ Ġscreen ToRemove . transition (). transition Out ( view ToRemove , Ġview ToBe come Visible , Ġcompletion Runnable ) ĊĠĠĠĠĠĠĠ Ġstate . lifecycle Listener . on Screen B ec ame Active ( screen ToBe come Visible ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhide All But Top Screen () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscreens Ġ= Ġstate . screens ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġmax Ġ= Ġscreens . size Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġmax ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscreen View Map . getValue ( screens [ i ]). visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Screen ( screen : ĠScreen , Ġremove From State : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġscreen View Map . remove ( screen ) !! ĊĠĠĠĠĠĠĠ Ġscreen . destroy Screen ( view ) ĊĠĠĠĠĠĠĠ Ġ( view . parent Ġas ĠViewGroup ). remove View ( view ) ĊĠĠĠĠĠĠĠ Ġif Ġ( remove From State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . remove Screen ( screen ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠEnd Transition Runnable Ġ: ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġexecuted : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Transition ing Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck State (! executed ) Ġ{ Ġ" Transition Ġcomplete Ġrunnable Ġalready Ġexecuted ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecuted Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Transition ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhide All But Top Screen () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransition Function Ġ= Ġstate . remove Active Screen Transition () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransition Function ?. invoke ( current Screen Switch er Data ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠRemove Screen Runnable ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġscreens ToRemove : ĠList < Screen > ĊĠĠĠ Ġ) Ġ: ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġexecuted : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġconstructor ( screen : ĠScreen ) Ġ: Ġthis ( listOf < Screen >( screen )) ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( screen Ġin Ġscreens ToRemove ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . remove Screen ( screen ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Transition ing Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck State (! executed ) Ġ{ Ġ" Remove Screen Runnable Ġalready Ġexecuted ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecuted Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( screen Ġin Ġscreens ToRemove ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Screen ( screen , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Transition ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhide All But Top Screen () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransition Function Ġ= Ġstate . remove Active Screen Transition () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransition Function ?. invoke ( current Screen Switch er Data ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcurrent Screen Switch er Data (): ĠScreen Switch er Data Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠScreen Switch er Data ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscreen Switch er Ġ= Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscreen Switch er State Ġ= Ġstate , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscreen Ġ= Ġstate . screens . last (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhost View Ġ= Ġhost . host View () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static Ġprivate Ġfun ĠgetActivity ( context : ĠContext ): ĠActivity Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( context Ġis ĠActivity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcontext ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( context Ġis ĠContext Wrapper ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠgetActivity ( context . base Context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" context Ġis Ġnot Ġan Ġinstance Ġof ĠActivity ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ