/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 Ġ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 . animation Ċ Ċ import Ġandroidx . compose . animation . core . Animation Spec Ċ import Ġandroidx . compose . animation . core . Finite Animation Spec Ċ import Ġandroidx . compose . animation . core . Mutable Transition State Ċ import Ġandroidx . compose . animation . core . animate Float Ċ import Ġandroidx . compose . animation . core . t ween Ċ import Ġandroidx . compose . animation . core . update Transition Ċ import Ġandroidx . compose . foundation . layout . Box Ċ import Ġandroidx . compose . runtime . Composable Ċ import Ġandroidx . compose . runtime . getValue Ċ import Ġandroidx . compose . runtime . key Ċ import Ġandroidx . compose . runtime . mutable State ListOf Ċ import Ġandroidx . compose . runtime . remember Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . draw . alpha Ċ import Ġandroidx . compose . ui . util . fast ForEach Ċ Ċ /** Ċ Ġ* Ġ[ Cross fade ] Ġallows Ġto Ġswitch Ġbetween Ġtwo Ġlayouts Ġwith Ġa Ġcross fade Ġanimation . Ċ Ġ* Ċ Ġ* Ġ@ sample Ġandroidx . compose . animation . samples . Cross fade Sample Ċ Ġ* Ċ Ġ* Ġ@ param Ġtarget State Ġis Ġa Ġkey Ġrepresenting Ġyour Ġtarget Ġlayout Ġstate . ĠEvery Ġtime Ġyou Ġchange Ġa Ġkey Ċ Ġ* Ġthe Ġanimation Ġwill Ġbe Ġtriggered . ĠThe Ġ[ content ] Ġcalled Ġwith Ġthe Ġold Ġkey Ġwill Ġbe Ġfa ded Ġout Ġwhile Ċ Ġ* Ġthe Ġ[ content ] Ġcalled Ġwith Ġthe Ġnew Ġkey Ġwill Ġbe Ġfa ded Ġin . Ċ Ġ* Ġ@ param Ġmodifier ĠModifier Ġto Ġbe Ġapplied Ġto Ġthe Ġanimation Ġcontainer . Ċ Ġ* Ġ@ param Ġanimation Spec Ġthe Ġ[ Animation Spec ] Ġto Ġconfigure Ġthe Ġanimation . Ċ Ġ*/ Ċ @ Composable Ċ fun Ġ< T > ĠCross fade ( ĊĠĠĠ Ġtarget State : ĠT , ĊĠĠĠ Ġmodifier : ĠModifier Ġ= ĠModifier , ĊĠĠĠ Ġanimation Spec : ĠFin ite Animation Spec < Float > Ġ= Ġt ween (), ĊĠĠĠ Ġcontent : Ġ@ Composable Ġ( T ) Ġ-> ĠUnit Ċ ) Ġ{ ĊĠĠĠ Ġval Ġitems Ġ= Ġremember Ġ{ Ġmutable State ListOf < Cross fade Animation Item < T >>() Ġ} ĊĠĠĠ Ġval Ġtransition State Ġ= Ġremember Ġ{ ĠMutable Transition State ( target State ) Ġ} ĊĠĠĠ Ġval Ġtarget Changed Ġ= Ġ( target State Ġ!= Ġtransition State . target State ) ĊĠĠĠ Ġtransition State . target State Ġ= Ġtarget State ĊĠĠĠ Ġval Ġtransition Ġ= Ġupdate Transition ( transition State ) ĊĠĠĠ Ġif Ġ( target Changed Ġ|| Ġitems . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠOnly Ġmanipulate Ġthe Ġlist Ġwhen Ġthe Ġstate Ġis Ġchanged , Ġor Ġin Ġthe Ġfirst Ġrun . ĊĠĠĠĠĠĠĠ Ġval Ġkeys Ġ= Ġitems . map Ġ{ Ġit . key Ġ}. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! contains ( target State )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Mutable List (). also Ġ{ Ġit . add ( target State ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġitems . clear () ĊĠĠĠĠĠĠĠ Ġkeys . map To ( items ) Ġ{ Ġkey Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCross fade Animation Item ( key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalpha Ġby Ġtransition . animate Float ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransition Spec Ġ= Ġ{ Ġanimation Spec Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġif Ġ( it Ġ== Ġkey ) Ġ 1 f Ġelse Ġ 0 f Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBox ( Modifier . alpha ( alpha Ġ= Ġalpha )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġif Ġ( transition State . currentState Ġ== Ġtransition State . target State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠRemove Ġall Ġthe Ġintermediate Ġitems Ġfrom Ġthe Ġlist Ġonce Ġthe Ġanimation Ġis Ġfinished . ĊĠĠĠĠĠĠĠ Ġitems . removeAll Ġ{ Ġit . key Ġ!= Ġtransition State . target State Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠBox ( modifier ) Ġ{ ĊĠĠĠĠĠĠĠ Ġitems . fast ForEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey ( it . key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . content () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġdata Ġclass ĠCross fade Animation Item < T >( ĊĠĠĠ Ġval Ġkey : ĠT , ĊĠĠĠ Ġval Ġcontent : Ġ@ Composable Ġ() Ġ-> ĠUnit Ċ ) Ċ