/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 ĠSquare ĠInc . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġcom . squareup . workflow . ui . back stack Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Parcelable Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . Gravity Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . view . ViewGroup . LayoutParams . MATCH _ PARENT Ċ import Ġandroid . widget . Frame Layout Ċ import Ġandroidx . transition . Fade Ċ import Ġandroidx . transition . Scene Ċ import Ġandroidx . transition . Slide Ċ import Ġandroidx . transition . Transition Manager Ċ import Ġandroidx . transition . Transition Set Ċ import Ġcom . squareup . workflow . ui . Back Stack Screen Ċ import Ġcom . squareup . workflow . ui . Builder Binding Ċ import Ġcom . squareup . workflow . ui . Experimental Workflow Ui Ċ import Ġcom . squareup . workflow . ui . Handles Back Ċ import Ġcom . squareup . workflow . ui . Named Ċ import Ġcom . squareup . workflow . ui . R Ċ import Ġcom . squareup . workflow . ui . View Binding Ċ import Ġcom . squareup . workflow . ui . View Registry Ċ import Ġcom . squareup . workflow . ui . bind Show Rendering Ċ import Ġcom . squareup . workflow . ui . can Show Rendering Ċ import Ġcom . squareup . workflow . ui . show Rendering Ċ Ċ /** Ċ Ġ* ĠA Ġcontainer Ġview Ġthat Ġcan Ġdisplay Ġa Ġstream Ġof Ġ[ Back Stack Screen ] Ġinstances . Ċ Ġ* Ċ Ġ* ĠThis Ġview Ġis Ġback Ġbutton Ġfriendly Ġ-- Ġit Ġimplements Ġ[ Handles Back ], Ġdeleg ating Ċ Ġ* Ġto Ġdisplayed Ġviews Ġthat Ġimplement Ġthat Ġinterface Ġthemselves . Ċ Ġ*/ Ċ @ Experimental Workflow Ui Ċ open Ġclass ĠBack Stack Container ( ĊĠ Ġcontext : ĠContext , ĊĠ Ġattribute Set : ĠAttributeSet ? Ċ ) Ġ: ĠFrame Layout ( context , Ġattribute Set ), ĠHandles Back Ġ{ ĊĠ Ġconstructor ( context : ĠContext ) Ġ: Ġthis ( context , Ġnull ) ĊĊĠ Ġprivate Ġval Ġview State Cache Ġ= ĠView State Cache () ĊĊĠ Ġprivate Ġval Ġshowing : ĠView ? Ġget () Ġ= Ġif Ġ( child Count Ġ> Ġ 0 ) Ġget Child At ( 0 ) Ġelse Ġnull ĊĊĠ Ġprivate Ġlateinit Ġvar Ġregistry : ĠView Registry ĊĊĠ Ġprivate Ġfun Ġupdate ( new Rendering : ĠBack Stack Screen <* >) Ġ{ ĊĠĠĠ Ġ// ĠView State Cache Ġrequires Ġthat Ġeverything Ġbe ĠNamed , Ġfor Ġease Ġof Ġcomparison Ġand ĊĠĠĠ Ġ// Ġserialization Ġ( that ĠNamed . key Ġstring Ġis Ġvery Ġhandy ). ĠIt 's Ġfine Ġif Ġclient Ġcode Ġis ĊĠĠĠ Ġ// Ġalready Ġusing ĠNamed Ġfor Ġits Ġown Ġpurposes , Ġrecursion Ġworks . ĊĠĠĠ Ġval Ġnamed : ĠBack Stack Screen < Named <* >> Ġ= ĊĠĠĠĠĠ ĠBack Stack Screen ( new Rendering . stack . map Ġ{ ĠNamed ( it , Ġ" back stack ") Ġ}, Ġnew Rendering . on Go Back ) ĊĊĠĠĠ Ġval Ġold View Maybe Ġ= Ġshowing ĊĊĠĠĠ Ġ// ĠIf Ġexisting Ġview Ġis Ġcompatible , Ġjust Ġupdate Ġit . ĊĠĠĠ Ġold View Maybe ĊĠĠĠĠĠĠĠ Ġ? . take If Ġ{ Ġit . can Show Rendering ( named . top ) Ġ} ĊĠĠĠĠĠĠĠ Ġ? . let Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġview State Cache . prune ( named . stack ) ĊĠĠĠĠĠĠĠĠĠ Ġit . show Rendering ( named . top ) ĊĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġnew View Ġ= Ġregistry . build View ( named . top , Ġthis ) ĊĠĠĠ Ġval Ġpop ped Ġ= Ġview State Cache . update ( named . back Stack , Ġold View Maybe , Ġnew View ) ĊĊĠĠĠ Ġperform Transition ( old View Maybe , Ġnew View , Ġpop ped ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠCalled Ġfrom Ġ[ View . show Rendering ] Ġto Ġswap Ġbetween Ġviews . ĊĠĠ Ġ* ĠSub classes Ġcan Ġoverride Ġto Ġcustomize Ġvisual Ġeffects . ĠThere Ġis Ġno Ġneed Ġto Ġcall Ġsuper . ĊĠĠ Ġ* ĠNote Ġthat Ġviews Ġare Ġshowing Ġrender ings Ġof Ġtype Ġ[ Named ]` < Back Stack Screen <* >> `. ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġold View Maybe Ġthe Ġoutgoing Ġview , Ġor Ġnull Ġif Ġthis Ġis Ġthe Ġinitial Ġrendering . ĊĠĠ Ġ* Ġ@ param Ġnew View Ġthe Ġview Ġthat Ġshould Ġreplace Ġ[ old View Maybe ] Ġ( if Ġit Ġexists ), Ġand Ġbecome ĊĠĠ Ġ* Ġthis Ġview 's Ġonly Ġchild ĊĠĠ Ġ* Ġ@ param Ġpop ped Ġtrue Ġif Ġwe Ġshould Ġgive Ġthe Ġappearance Ġof Ġpop ping Ġ" back " Ġto Ġa Ġprevious Ġrendering , ĊĠĠ Ġ* Ġfalse Ġif Ġa Ġnew Ġrendering Ġis Ġbeing Ġ" pus hed ". ĠShould Ġbe Ġignored Ġif Ġ[ old View Maybe ] Ġis Ġnull . ĊĠĠ Ġ*/ ĊĠ Ġprotected Ġopen Ġfun Ġperform Transition ( ĊĠĠĠ Ġold View Maybe : ĠView ?, ĊĠĠĠ Ġnew View : ĠView , ĊĠĠĠ Ġpop ped : ĠBoolean ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġ// ĠShow ing Ġsomething Ġalready , Ġtransition Ġwith Ġpush Ġor Ġpop Ġeffect . ĊĠĠĠ Ġold View Maybe ĊĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġold View Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġval Ġnew Scene Ġ= ĠScene ( this , Ġnew View ) ĊĊĠĠĠĠĠĠĠĠĠ Ġval Ġ( out Edge , Ġin Edge ) Ġ= Ġwhen Ġ( pop ped ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ-> ĠGr avity . START Ġto ĠGr avity . END ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> ĠGr avity . END Ġto ĠGr avity . START ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġval Ġout Set Ġ= ĠTransition Set () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Transition ( Slide ( out Edge ). add Target ( old View )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Transition ( Fade ( Fade . OUT )) ĊĊĠĠĠĠĠĠĠĠĠ Ġval Ġfull Set Ġ= ĠTransition Set () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Transition ( out Set ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Transition ( Slide ( in Edge ). exclude Target ( old View , Ġtrue )) ĊĊĠĠĠĠĠĠĠĠĠ ĠTransition Manager . go ( new Scene , Ġfull Set ) ĊĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠThis Ġis Ġthe Ġfirst Ġview , Ġjust Ġshow Ġit . ĊĠĠĠ Ġadd View ( new View ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Back Pressed (): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġshowing ĊĠĠĠĠĠĠĠ Ġ? . let Ġ{ ĠHandles Back . Helper . on Back Pressed ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ?: Ġfalse ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Save InstanceState (): ĠParcel able Ġ{ ĊĠĠĠ Ġreturn ĠView State Cache . Saved State ( super . on Save InstanceState (), Ġview State Cache ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Restore InstanceState ( state : ĠParcel able ) Ġ{ ĊĠĠĠ Ġ( state Ġas ? ĠView State Cache . Saved State ) ĊĠĠĠĠĠĠĠ Ġ? . let Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġview State Cache . restore ( it . view State Cache ) ĊĠĠĠĠĠĠĠĠĠ Ġsuper . on Restore InstanceState ( state . super State ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ?: Ġsuper . on Restore InstanceState ( state ) ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ: ĠView Binding < Back Stack Screen <* >> ĊĠ Ġby ĠBuilder Binding ( ĊĠĠĠĠĠ Ġtype Ġ= ĠBack Stack Screen :: class , ĊĠĠĠĠĠ Ġview Constructor Ġ= Ġ{ Ġview Registry , Ġinitial Rendering , Ġcontext , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠ ĠBack Stack Container ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= ĠR . id . workflow _ back _ stack _ container ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Params Ġ= Ġ( ViewGroup . LayoutParams ( MATCH _ PARENT , ĠMATCH _ PARENT )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregistry Ġ= Ġview Registry ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbind Show Rendering ( initial Rendering , Ġ:: update ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠ Ġ) Ċ } Ċ