package Ġcom . github . l ion 4 ik . arch . share de lement s Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . res . Resources Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . support . annotation . Id Res Ċ import Ġandroid . support . annotation . Restrict To Ċ import Ġandroid . support . v 4 . app . Fragment Ċ import Ġandroid . support . v 4 . app . FragmentManager Ċ import Ġandroidx . navigation . Nav Options Ċ import Ġandroidx . navigation . Navigator Ċ import Ġandroidx . navigation . fragment . Fragment Navigator Ċ Ċ @ Navigator . Name (" fragment ") Ċ class ĠShared Elements Transition Fragment Navigator Ġconstructor ( private Ġval Ġcontext : ĠContext , Ġprivate Ġval Ġfragment Manager : ĠFragment Manager , Ġprivate Ġval Ġcontainer Id : ĠInt ) Ġ: ĊĠĠĠĠĠĠĠ ĠNavigator < Fragment Navigator . Destination >() Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġback Stack Count : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġval Ġon Back Stack Changed Listener : ĠFragment Manager . On Back Stack Changed Listener ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠNO _ FRAGMENT _ ANIM ATION Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠFR AG MENT _ ANIM ATION _ NOT _ SET Ġ= Ġ- 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġback Stack Count Ġ= Ġfragment Manager . back Stack Entry Count ĊĠĠĠĠĠĠĠ Ġon Back Stack Changed Listener Ġ= ĠFragment Manager . On Back Stack Changed Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Count Ġ= Ġfragment Manager . back Stack Entry Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġback Stack Effect : ĠInt Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Count Ġ< Ġback Stack Count Ġ-> ĠNavigator . BACK _ STACK _ DEST INATION _ POP PED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Count Ġ> Ġback Stack Count Ġ-> ĠNavigator . BACK _ STACK _ DEST INATION _ AD DED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠNavigator . BACK _ STACK _ UN CHANGED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġback Stack Count Ġ= Ġnew Count ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= ĠgetState () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdest Id Ġ= Ġstate ?. current Dest Id Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch On Navigator Navig ated ( dest Id , Ġback Stack Effect ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfragment Manager . add On Back Stack Changed Listener ( on Back Stack Changed Listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpop Back Stack (): ĠBoolean Ġ= Ġfragment Manager . pop Back Stack Immediate () ĊĠĠĠ Ġoverride Ġfun Ġcreate Destination (): ĠFragment Navigator . Destination Ġ= ĠFragment Navigator . Destination ( this ) ĊĊĠĠĠ Ġprivate Ġfun Ġget Back Stack Name (@ Id Res Ġdestination Id : ĠInt ): ĠString Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . resources . getResource Name ( destination Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠResources . NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInteger . toString ( destination Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġnavigate ( destination : ĠFragment Navigator . Destination , Ġargs : ĠBundle ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnav Options : ĠNav Options ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfrag Ġ= Ġdestination . create Fragment ( args ) ĊĠĠĠĠĠĠĠ Ġval Ġft Ġ= Ġfragment Manager . beginTransaction () ĊĊĠĠĠĠĠĠĠ Ġnav Options ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġenter Anim Ġ= Ġif Ġ( it . enter Anim Ġ== ĠFR AG MENT _ ANIM ATION _ NOT _ SET ) ĠNO _ FRAGMENT _ ANIM ATION Ġelse Ġit . enter Anim ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexit Anim Ġ= Ġif Ġ( it . exit Anim Ġ== ĠFR AG MENT _ ANIM ATION _ NOT _ SET ) ĠNO _ FRAGMENT _ ANIM ATION Ġelse Ġit . exit Anim ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpop Enter Anim Ġ= Ġif Ġ( it . pop Enter Anim Ġ== ĠFR AG MENT _ ANIM ATION _ NOT _ SET ) ĠNO _ FRAGMENT _ ANIM ATION Ġelse Ġit . pop Enter Anim ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpop Exit Anim Ġ= Ġif Ġ( it . pop Exit Anim Ġ== ĠFR AG MENT _ ANIM ATION _ NOT _ SET ) ĠNO _ FRAGMENT _ ANIM ATION Ġelse Ġit . pop Exit Anim ĊĠĠĠĠĠĠĠĠĠĠĠ Ġft . set Custom Animations ( enter Anim , Ġexit Anim , Ġpop Enter Anim , Ġpop Exit Anim ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcurrent Frag Ġ= Ġfragment Manager . find Fragment ById ( container Id ) ĊĠĠĠĠĠĠĠ Ġif Ġ( current Frag Ġis ĠHas Shared Elements ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshared Elements Ġ= Ġcurrent Frag . get Shared Elements () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġft . set Re ordering Allowed ( current Frag . has Re ordering Allowed ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( key , Ġvalue ) Ġin Ġshared Elements ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġft . add Shared Element ( value , Ġkey ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġft . replace ( container Id , Ġfrag ) ĊĊĠĠĠĠĠĠĠ Ġval Ġold State Ġ= ĠgetState () ĊĠĠĠĠĠĠĠ Ġold State ?. let Ġ{ Ġft . remove ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Id Res Ġval Ġdest Id Ġ= Ġdestination . id ĊĠĠĠĠĠĠĠ Ġval ĠnewState Ġ= ĠState Fragment () ĊĠĠĠĠĠĠĠ ĠnewState . current Dest Id Ġ= Ġdest Id ĊĠĠĠĠĠĠĠ Ġft . add ( newState , ĠState Fragment . FRAGMENT _ TAG ) ĊĊĠĠĠĠĠĠĠ Ġval Ġinitial Navigation Ġ= Ġfragment Manager . fragments . isEmpty () ĊĠĠĠĠĠĠĠ Ġval Ġis Clear Task Ġ= Ġnav Options ?. should Clear Task () Ġ?: Ġfalse ĊĠĠĠĠĠĠĠ Ġ// ĠTODO ĠBuild Ġfirst Ġclass Ġsingle Top Ġbehavior Ġfor Ġfragments ĊĠĠĠĠĠĠĠ Ġval Ġis Single Top Replacement Ġ= Ġ( nav Options Ġ!= Ġnull Ġ&& Ġold State Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġnav Options . should Launch Single Top () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġold State . current Dest Id Ġ== Ġdest Id ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! initial Navigation Ġ&& Ġ! is Clear Task Ġ&& Ġ! is Single Top Replacement ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġft . addTo Back Stack ( get Back Stack Name ( dest Id )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġft . run On Commit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch On Navigator Navig ated ( dest Id , Ġif Ġ( is Single Top Replacement ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNavigator . BACK _ STACK _ UN CHANGED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNavigator . BACK _ STACK _ DEST INATION _ AD DED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġft . commit () ĊĠĠĠĠĠĠĠ Ġfragment Manager . execute Pending Transactions () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetState (): ĠState Fragment ? Ġ= Ġfragment Manager . find Fragment By Tag ( State Fragment . FRAGMENT _ TAG ) Ġas ĠState Fragment ? ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAn Ġinternal Ġfragment Ġused Ġby ĠFragment Navigator Ġto Ġtrack Ġadditional Ġnavigation Ġstate . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ hide ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Restrict To ( Restrict To . Scope . LIBRARY ) ĊĠĠĠ Ġclass ĠState Fragment Ġ: ĠFragment () Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġvar Ġcurrent Dest Id : ĠInt Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsavedInstanceState ?. let Ġ{ Ġcurrent Dest Id Ġ= ĠsavedInstanceState . getInt ( KEY _ CURRENT _ DEST _ ID ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Save InstanceState ( out State : ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Save InstanceState ( out State ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout State . put Int ( KEY _ CURRENT _ DEST _ ID , Ġcurrent Dest Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Ġval ĠFR AG MENT _ TAG Ġ= Ġ" android - support - nav : Fragment Navigator . State Fragment " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval ĠKEY _ CURRENT _ DEST _ ID Ġ= Ġ" current Dest Id " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }