/* Ċ Ġ* Ġ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 . ui . platform Ċ Ċ import Ġandroid . os . Binder Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Parcelable Ċ import Ġandroid . util . Size Ċ import Ġandroid . util . Size F Ċ import Ġandroid . util . Sparse Array Ċ import Ġandroid . view . View Ċ import Ġandroidx . compose . runtime . saved instance state . Ui Saved State Registry Ċ import Ġandroidx . saved state . Saved State Registry Ċ import Ġandroidx . saved state . Saved State Registry Owner Ċ import Ġjava . io . Serializable Ċ Ċ /** Ċ Ġ* ĠCreates Ġ[ Disposable Ui Saved State Registry ] Ġassociated Ġwith Ġthese Ġ[ view ] Ġand Ġ[ owner ]. Ċ Ġ*/ Ċ internal Ġfun ĠDis posable Ui Saved State Registry ( ĊĠĠĠ Ġview : ĠView , ĊĠĠĠ Ġowner : ĠSaved State Registry Owner Ċ ): ĠDis posable Ui Saved State Registry Ġ{ ĊĠĠĠ Ġ// ĠWhen ĠAndroid Compose View Ġis Ġcomposed Ġinto Ġsome ĠViewGroup Ġwe Ġjust Ġadded Ġas Ġa Ġchild Ġfor Ġthis ĊĠĠĠ Ġ// ĠViewGroup . ĠAnd Ġwe Ġdon 't Ġhave Ġany Ġid Ġon ĠAndroid Compose View Ġas Ġwe Ġcan 't Ġmake Ġit Ġunique , Ġbut ĊĠĠĠ Ġ// Ġwe Ġrequire Ġthis Ġparent ĠViewGroup Ġto Ġhave Ġan Ġunique Ġid Ġfor Ġthe Ġsaved Ġinstance Ġstate Ġmechanism ĊĠĠĠ Ġ// Ġto Ġwork Ġ( similar ly Ġto Ġhow Ġit Ġworks Ġwithout ĠCompose ). ĠWhen Ġwe Ġcomposed Ġinto ĠActivity Ġour ĊĠĠĠ Ġ// Ġparent Ġis Ġthe ĠViewGroup Ġwith Ġandroid . R . id . content . ĊĠĠĠ Ġval ĠparentId : ĠInt Ġ= Ġ( view . parent Ġas ? ĠView )?. id Ġ?: ĠView . NO _ ID ĊĠĠĠ Ġreturn ĠDis posable Ui Saved State Registry ( parentId , Ġowner ) Ċ } Ċ Ċ /** Ċ Ġ* ĠCreates Ġ[ Disposable Ui Saved State Registry ] Ġwith Ġthe Ġrestored Ġvalues Ġusing Ġ[ Saved State Registry ] Ġand Ċ Ġ* Ġsaves Ġthe Ġvalues Ġwhen Ġ[ Saved State Registry ] Ġperforms Ġsave . Ċ Ġ* Ċ Ġ* ĠTo Ġprovide Ġa Ġnamespace Ġwe Ġrequire Ġunique Ġ[ id ]. ĠWe Ġcan 't Ġuse Ġthe Ġdefault Ġway Ġof Ġdoing Ġit Ġwhen Ġwe Ċ Ġ* Ġhave Ġunique Ġid Ġon Ġ[ Android Compose View ] Ġbecause Ġwe Ġdynamically Ġcreate Ġ[ Android Compose View ] s Ġand Ċ Ġ* Ġthere Ġis Ġno Ġway Ġto Ġhave Ġa Ġunique Ġid Ġgiven Ġthere Ġare Ġcould Ġbe Ġany Ġnumber Ġof Ċ Ġ* Ġ[ Android Compose View ] s Ġinside Ġthe Ġsame ĠActivity . ĠIf Ġwe Ġuse Ġ[ View . generate View Id ] Ċ Ġ* Ġthis Ġid Ġwill Ġnot Ġsurv ive ĠActivity Ġre creation . Ċ Ġ* ĠBut Ġit Ġis Ġreasonable Ġto Ġask Ġour Ġusers Ġto Ġhave Ġan Ġunique Ġid Ġon Ġthe Ġparent ĠViewGroup Ġin Ġwhich Ġwe Ċ Ġ* Ġcompose Ġour Ġ[ Android Compose View ]. ĠIf ĠActivity . setContent Ġis Ġused Ġthen Ġit Ġwill Ġbe Ġa ĠView Ġwith Ċ Ġ* Ġ[ android . R . id . content ], Ġif ĠViewGroup . setContent Ġis Ġused Ġthen Ġwe Ġwill Ġask Ġusers Ġto Ġprovide Ġan Ċ Ġ* Ġid Ġfor Ġthis ĠViewGroup . ĠIf Ġ@ Generate View Ġwill Ġbe Ġused Ġthen Ġwe Ġwill Ġask Ġusers Ġto Ġset Ġan Ġid Ġon Ċ Ġ* Ġthis Ġgenerated ĠView . Ċ Ġ*/ Ċ internal Ġfun ĠDis posable Ui Saved State Registry ( ĊĠĠĠ Ġid : ĠInt , ĊĠĠĠ Ġsaved State Registry Owner : ĠSaved State Registry Owner Ċ ): ĠDis posable Ui Saved State Registry Ġ{ ĊĠĠĠ Ġval Ġkey Ġ= Ġ"${ Ui Saved State Registry :: java Class }: $ id }" ĊĊĠĠĠ Ġval Ġandroidx Registry Ġ= Ġsaved State Registry Owner . saved State Registry ĊĠĠĠ Ġval Ġbundle Ġ= Ġandroidx Registry . consume Restore d State ForKey ( key ) ĊĠĠĠ Ġval Ġrestored : ĠMap < String , ĠList < Any ? >> ? Ġ= Ġbundle ?. toMap () ĊĊĠĠĠ Ġval Ġui Saved State Registry Ġ= ĠUi Saved State Registry ( restore d ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcan Be Saved To Bundle ( it ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġregistered Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġandroidx Registry . register Saved State Provider ( key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui Saved State Registry . perform Save (). to Bundle () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠ Ġ} Ġcatch Ġ( ignore : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġthis Ġmeans Ġthere Ġare Ġtwo ĠAndroid Compose Views Ġcomposed Ġinto Ġdifferent Ġparents Ġwith Ġthe ĊĠĠĠĠĠĠĠ Ġ// Ġsame Ġview Ġid . Ġcurrently Ġwe Ġwill Ġjust Ġnot Ġsave / restore Ġstate Ġfor Ġthe Ġsecond ĊĠĠĠĠĠĠĠ Ġ// ĠAndroid Compose View . ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġwe Ġshould Ġverify Ġour Ġstrategy Ġfor Ġsuch Ġcases Ġand Ġimprove Ġit . Ġb / 1 6 2 3 9 7 3 2 2 ĊĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠDis posable Ui Saved State Registry ( ui Saved State Registry ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( registered ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroidx Registry . unregister Saved State Provider ( key ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* Ġ[ Ui Saved State Registry ] Ġwhich Ġcan Ġbe Ġdisposed Ġusing Ġ[ dispose ]. Ċ Ġ*/ Ċ internal Ġclass ĠDis posable Ui Saved State Registry ( ĊĠĠĠ Ġui Saved State Registry : ĠUi Saved State Registry , ĊĠĠĠ Ġprivate Ġval Ġon Dispose : Ġ() Ġ-> ĠUnit Ċ ) Ġ: ĠUi Saved State Registry Ġby Ġui Saved State Registry Ġ{ ĊĊĠĠĠ Ġfun Ġdispose () Ġ{ ĊĠĠĠĠĠĠĠ Ġon Dispose () ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠChecks Ġthat Ġ[ value ] Ġcan Ġbe Ġstored Ġinside Ġ[ Bundle ]. Ċ Ġ*/ Ċ private Ġfun Ġcan Be Saved To Bundle ( value : ĠAny ): ĠBoolean Ġ{ ĊĠĠĠ Ġfor Ġ( cl Ġin ĠAccept able Classes ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( cl . is Instance ( value )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġfalse Ċ } Ċ Ċ /** Ċ Ġ* ĠContains ĠClasses Ġwhich Ġcan Ġbe Ġstored Ġinside Ġ[ Bundle ]. Ċ Ġ* Ċ Ġ* ĠSome Ġof Ġthe Ġclasses Ġare Ġnot Ġadded Ġseparately Ġbecause : Ċ Ġ* Ċ Ġ* ĠThis Ġclasses Ġimplement ĠSerializable : Ċ Ġ* Ġ- ĠArrays Ġ( Double Array , ĠBoolean Array , ĠInt Array , ĠLong Array , ĠByteArray , ĠFloat Array , ĠShort Array , Ċ Ġ* ĠChar Array , ĠArray < Parcelable , ĠArray < String >) Ċ Ġ* Ġ- ĠArrayList Ċ Ġ* Ġ- ĠPri mitives Ġ( Boolean , ĠInt , ĠLong , ĠDouble , ĠFloat , ĠByte , ĠShort , ĠChar ) Ġwill Ġbe Ġbox ed Ġwhen Ġcast ed Ċ Ġ* Ġto ĠAny , Ġand Ġall Ġthe Ġbox ed Ġclasses Ġimplements ĠSerializable . Ċ Ġ* ĠThis Ġclass Ġimplements ĠParcel able : Ċ Ġ* Ġ- ĠBundle Ċ Ġ* Ċ Ġ* ĠNote : Ġit Ġis Ġsimplified Ġcopy Ġof Ġthe Ġarray Ġfrom ĠSaved State Handle Ġ( lifecycle - view model - saved state ). Ċ Ġ*/ Ċ private Ġval ĠAccept able Classes Ġ= ĠarrayOf ( ĊĠĠĠ ĠSerializable :: class . java , ĊĠĠĠ ĠParcel able :: class . java , ĊĠĠĠ ĠCharSequence :: class . java , ĊĠĠĠ ĠSparse Array :: class . java , ĊĠĠĠ ĠB inder :: class . java , ĊĠĠĠ ĠSize :: class . java , ĊĠĠĠ ĠSize F :: class . java Ċ ) Ċ Ċ private Ġfun ĠBundle . toMap (): ĠMap < String , ĠList < Any ? >> ? Ġ{ ĊĠĠĠ Ġval Ġmap Ġ= Ġmutable Map Of < String , ĠList < Any ? >>() ĊĠĠĠ Ġthis . keySet (). forEach Ġ{ Ġkey Ġ-> ĊĠĠĠĠĠĠĠ Ġmap [ key ] Ġ= Ġget Parcelable ArrayList < Parcelable ? >( key ) Ġas ĠList < Any ?> ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġmap Ċ } Ċ Ċ private Ġfun ĠMap < String , ĠList < Any ? >> . to Bundle (): ĠBundle Ġ{ ĊĠĠĠ Ġval Ġbundle Ġ= ĠBundle () ĊĠĠĠ ĠforEach Ġ{ Ġ( key , Ġlist ) Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġarray List Ġ= Ġif Ġ( list Ġis ĠArrayList <* >) Ġlist Ġelse ĠArrayList ( list ) ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġbundle . put Parcelable ArrayList ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarray List Ġas ĠArrayList < Parcelable ?> ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġbundle Ċ } Ċ