package Ġcom . jo er ac osta . library . activity Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . support . v 7 . app . AppCompatActivity Ċ import Ġjava . util .* Ċ import Ġkotlin . collections . ArrayList Ċ Ċ /** Ċ Ġ* ĠCreated Ġby ĠJo e Ġon Ġ 8 / 1 4 / 2 0 1 7 . Ċ Ġ* ĠMe ant Ġto Ġbe Ġa Ġshell Ġstack Ġactivity Ġthat Ġhas Ġa Ġstack Ġof ĠSimple Fragments . ĠBack Ġp resses Ġetc Ġare Ġhandled Ġfor Ġyou . ĠIf Ġthere Ġis Ġonly Ġone Ġfragment Ġin Ġthis Ġstack , Ċ Ġ* Ġand Ġyou Ġpress Ġback , Ġinstead Ġof Ġbeing Ġpop ped , Ġthis Ġactivity Ġwill Ġget Ġthe Ġback Ġpress . ĠSo Ġyou Ġshouldn 't Ġinf late Ġa Ġlayout Ġhere Ġinside Ġthe Ġfragment Ġcontainer Ġthat Ġis Ġmeant Ġto Ġbe Ġvisible Ċ Ġ* Ġto Ġthe Ġuser . ĠThere Ġshould Ġalways Ġbe Ġat Ġleast Ġone ĠSimple Fragment Ġin Ġthe Ġstack . Ċ Ġ*/ Ċ abstract Ġclass ĠFragment Stack Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġprotected Ġvar ĠmCurrent Fragment : ĠSimple Fragment ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġprivate Ġvar Ġm Back stack Tags Ġ= ĠStack < String >() ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ ĠsavedInstanceState ?. get Serializable ( BACK STACK _ FRAG _ TAGS )?. let Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠArrayList <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠarrayOf Tags Ġ= Ġit Ġas ĠArrayList < String > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( tag Ġin ĠarrayOf Tags ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Back stack Tags . push ( tag ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! m Back stack Tags . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmCurrent Fragment Ġ= Ġsupport FragmentManager . find Fragment By Tag ( m Back stack Tags . peek ()) Ġas ĠSimple Fragment ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Save InstanceState ( out State : ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠarrayOf Tags Ġ= ĠArrayList < String >() Ġ// stacks Ġdon 't Ġalways Ġserialize ... lets Ġpre empt ively Ġput Ġit Ġin Ġan Ġarray list ĊĠĠĠĠĠĠĠ ĠarrayOf Tags . addAll ( m Back stack Tags ) ĊĠĠĠĠĠĠĠ Ġout State . put Serializable ( BACK STACK _ FRAG _ TAGS , ĠarrayOf Tags ) ĊĠĠĠĠĠĠĠ Ġsuper . on Save InstanceState ( out State ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd Ġa ĠSimple Fragment Ġto Ġthe Ġstack ĊĠĠĠĠ Ġ* Ġ@ param Ġfragment ToAdd ĠNew ĠInstance Ġof Ġthe ĠFragment Ġyou Ġwant ĊĠĠĠĠ Ġ* Ġ@ param Ġfragment Container Id Ġcontainer ĠId Ġfor Ġthe Ġfragment ĊĠĠĠĠ Ġ* Ġ@ param Ġtag ĊĠĠĠĠ Ġ* Ġ@ param Ġback stack Tag ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd Fragment To Stack ( fragment ToAdd : ĠSimple Fragment , Ġfragment Container Id : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag : ĠString ?, Ġback stack Tag : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġtag ToUse Ġ= Ġtag ĊĊĠĠĠĠĠĠĠ Ġif Ġ( tag ToUse Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtag ToUse Ġ= Ġfragment ToAdd . hashCode (). toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠmCurrent Fragment ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . set At Fo refront ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . on Hidden () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġm Back stack Tags . add ( tag ToUse ) ĊĠĠĠĠĠĠĠ ĠmCurrent Fragment Ġ= Ġfragment ToAdd ĊĠĠĠĠĠĠĠ ĠmCurrent Fragment ?. set At Fo refront ( true ) ĊĊĠĠĠĠĠĠĠ Ġval Ġfragment Transaction Ġ= Ġsupport FragmentManager . beginTransaction (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreplace ( fragment Container Id , Ġfragment ToAdd , Ġtag ToUse ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠaddTo Back Stack ( back stack Tag ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfragment Transaction . commit Allow ing State Loss () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhas Fragments (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsupport FragmentManager . back Stack Entry Count Ġ> Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Back Pressed () Ġ{ ĊĠĠĠĠĠĠ Ġif Ġ(! handle Back Press ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Back Pressed () ĊĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠP asses Ġthe Ġback Ġpress Ġto Ġchildren Ġfragments Ġso Ġthey Ġcan Ġconsume Ġit Ġif Ġthey 'd Ġlike , ĊĠĠĠĠ Ġ* Ġotherwise Ġp ops Ġthe Ġtop Ġfragment Ġin Ġthis Ġstack ĊĠĠĠĠ Ġ* Ġ@ return Ġwhether Ġor Ġnot Ġthe Ġback Ġpress Ġwas Ġconsumed Ġby Ġa Ġchild Ġfragment ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġhandle Back Press () Ġ: ĠBoolean { ĊĠĠĠĠĠĠĠ Ġif Ġ( m Current Fragment ?. on Simple Back Pressed () Ġ?: Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( support FragmentManager . back Stack Entry Count Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Back stack Tags . pop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! m Back stack Tags . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsupport FragmentManager . pop Back Stack Immediate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmCurrent Fragment Ġ= Ġsupport FragmentManager . find Fragment By Tag ( m Back stack Tags . peek ()) Ġas ĠSimple Fragment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmCurrent Fragment ?. set At Fo refront ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmCurrent Fragment ?. on Shown () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () Ġ// have Ġto Ġcall Ġfinish Ġto Ġfinish Ġthe Ġactivity Ġwhen Ġthere 's Ġone Ġfragment Ġleft Ġin Ġthe Ġstack ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ private Ġconst Ġval ĠBACK STACK _ FRAG _ TAGS Ġ= Ġ" com . jo er ac osta . back _ stack _ frag _ tags _ activity "