/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* Ġ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 Ġandroidx . compose . runtime . save able Ċ Ċ import Ġandroidx . compose . runtime . Composable Ċ import Ġandroidx . compose . runtime . Disposable Effect Ċ import Ġandroidx . compose . runtime . Composition Local Provider Ċ import Ġandroidx . compose . runtime . key Ċ import Ġandroidx . compose . runtime . remember Ċ Ċ /** Ċ Ġ* ĠAllows Ġto Ġsave Ġthe Ġstate Ġdefined Ġwith Ġ[ remember Save able ] Ġfor Ġthe Ġsubtree Ġbefore Ġdisposing Ġit Ċ Ġ* Ġto Ġmake Ġit Ġpossible Ġto Ġcompose Ġit Ġback Ġnext Ġtime Ġwith Ġthe Ġrestored Ġstate . ĠIt Ġallows Ġdifferent Ċ Ġ* Ġnavigation Ġpatterns Ġto Ġkeep Ġthe Ġui Ġstate Ġlike Ġscroll Ġposition Ġfor Ġthe Ġcurrently Ġnot Ġcomposed Ċ Ġ* Ġscreens Ġfrom Ġthe Ġback stack . Ċ Ġ* Ċ Ġ* Ġ@ sample Ġandroidx . compose . runtime . save able . samples . Simple Navigation With Save able State Sample Ċ Ġ* Ċ Ġ* ĠThe Ġcontent Ġshould Ġbe Ġcomposed Ġusing Ġ[ Save able State Provider ] Ġwhile Ġproviding Ġa Ġkey Ġrepresenting Ċ Ġ* Ġthis Ġcontent . ĠNext Ġtime Ġ[ Save able State Provider ] Ġwill Ġbe Ġused Ġwith Ġthe Ġsame Ġkey Ġits Ġstate Ġwill Ġbe Ċ Ġ* Ġrestored . Ċ Ġ*/ Ċ interface ĠSave able State Holder Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPut Ġyour Ġcontent Ġassociated Ġwith Ġa Ġ[ key ] Ġinside Ġthe Ġ[ content ]. ĠThis Ġwill Ġautomatically ĊĠĠĠĠ Ġ* Ġsave Ġall Ġthe Ġstates Ġdefined Ġwith Ġ[ remember Save able ] Ġbefore Ġdisposing Ġthe Ġcontent Ġand Ġwill ĊĠĠĠĠ Ġ* Ġrestore Ġthe Ġstates Ġwhen Ġyou Ġcompose Ġwith Ġthis Ġkey Ġagain . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġkey Ġto Ġbe Ġused Ġfor Ġsaving Ġand Ġrest oring Ġthe Ġstates Ġfor Ġthe Ġsubtree . ĠNote Ġthat Ġon ĊĠĠĠĠ Ġ* ĠAndroid Ġyou Ġcan Ġonly Ġuse Ġtypes Ġwhich Ġcan Ġbe Ġstored Ġinside Ġthe ĠBundle . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Composable ĊĠĠĠ Ġfun ĠSave able State Provider ( key : ĠAny , Ġcontent : Ġ@ Composable Ġ() Ġ-> ĠUnit ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemoves Ġthe Ġsaved Ġstate Ġassociated Ġwith Ġthe Ġpassed Ġ[ key ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġremove State ( key : ĠAny ) Ċ } Ċ Ċ /** Ċ Ġ* ĠCreates Ġand Ġre members Ġthe Ġinstance Ġof Ġ[ Save able State Holder ]. Ċ Ġ*/ Ċ @ Composable Ċ fun Ġremember Save able State Holder (): ĠSave able State Holder Ġ= ĊĠĠĠ Ġremember Save able ( ĊĠĠĠĠĠĠĠ Ġsa ver Ġ= ĠSave able State Holder Impl . Saver ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠSave able State Holder Impl () ĊĠĠĠ Ġ}. apply Ġ{ ĊĠĠĠĠĠĠĠ Ġparent Save able State Registry Ġ= ĠLocal Save able State Registry . current ĊĠĠĠ Ġ} Ċ Ċ private Ġclass ĠSave able State Holder Impl ( ĊĠĠĠ Ġprivate Ġval Ġsaved States : ĠMutable Map < Any , ĠMap < String , ĠList < Any ? >>> Ġ= Ġmutable Map Of () Ċ ) Ġ: ĠSave able State Holder Ġ{ ĊĠĠĠ Ġprivate Ġval Ġregistry Hold ers Ġ= Ġmutable Map Of < Any , ĠRegistry Holder >() ĊĠĠĠ Ġvar Ġparent Save able State Registry : ĠSave able State Registry ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ Composable ĊĠĠĠ Ġoverride Ġfun ĠSave able State Provider ( key : ĠAny , Ġcontent : Ġ@ Composable Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġkey ( key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġregistry Holder Ġ= Ġremember Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( parent Save able State Registry ?. can Be Saved ( key ) Ġ?: Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Type Ġof Ġthe Ġkey Ġ$ key Ġis Ġnot Ġsupported . ĠOn ĠAndroid Ġyou Ġcan Ġonly Ġuse Ġtypes Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" which Ġcan Ġbe Ġstored Ġinside Ġthe ĠBundle ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRegistry Holder ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠComp osition Local Provider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocal Save able State Registry Ġprovides Ġregistry Holder . registry , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= Ġcontent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDis posable Effect ( key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( key Ġ! in Ġregistry Hold ers ) Ġ{ Ġ" Key Ġ$ key Ġwas Ġused Ġmultiple Ġtimes Ġ" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsaved States Ġ-= Ġkey ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregistry Hold ers [ key ] Ġ= Ġregistry Holder ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Dispose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregistry Holder . save To ( saved States ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregistry Hold ers Ġ-= Ġkey ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave All (): ĠMutable Map < Any , ĠMap < String , ĠList < Any ? >>> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġsaved States . to Mutable Map () ĊĠĠĠĠĠĠĠ Ġregistry Hold ers . values . forEach Ġ{ Ġit . save To ( map ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġmap ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġremove State ( key : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġregistry Holder Ġ= Ġregistry Hold ers [ key ] ĊĠĠĠĠĠĠĠ Ġif Ġ( registry Holder Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregistry Holder . should Save Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsaved States Ġ-= Ġkey ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠRegistry Holder Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġval Ġkey : ĠAny ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġshould Save Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġregistry : ĠSave able State Registry Ġ= ĠSave able State Registry ( saved States [ key ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent Save able State Registry ?. can Be Saved ( it ) Ġ?: Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġsave To ( map : ĠMutable Map < Any , ĠMap < String , ĠList < Any ? >> >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( should Save ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ key ] Ġ= Ġregistry . perform Save () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠS aver : ĠS aver < Save able State Holder Impl , Ġ*> Ġ= ĠS aver ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Ġ= Ġ{ Ġit . save All () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrestore Ġ= Ġ{ ĠSave able State Holder Impl ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ