package Ġcom . mx al bert . share de lement s Ċ Ċ import Ġandroid . view . Ch oreo grapher Ċ import Ġandroidx . compose . animation . core . Anim atable Ċ import Ġandroidx . compose . animation . core . t ween Ċ import Ġandroidx . compose . foundation . layout . Box Ċ import Ġandroidx . compose . foundation . layout . Spacer Ċ import Ġandroidx . compose . foundation . layout . fill MaxSize Ċ import Ġandroidx . compose . runtime .* Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . draw . alpha Ċ import Ġandroidx . compose . ui . geometry . Offset Ċ import Ġandroidx . compose . ui . geometry . Rect Ċ import Ġandroidx . compose . ui . graphics . Transform Origin Ċ import Ġandroidx . compose . ui . layout .* Ċ import Ġandroidx . compose . ui . unit . Constraints Ċ import Ġandroidx . compose . ui . unit . to Size Ċ import Ġandroidx . compose . ui . util . fast ForEach Ċ import Ġandroidx . compose . ui . util . fast Map Ċ import Ġcom . mx al bert . share de lement s . Shared Element Transition . InProgress Ċ import Ġcom . mx al bert . share de lement s . Shared Element Transition . Waiting For End Element Position Ċ import Ġcom . mx al bert . share de lement s . Shared Elements Tracker . State .* Ċ Ċ @ Composable Ċ internal Ġfun ĠBase Shared Element ( ĊĠĠĠ Ġelement Info : ĠShared Element Info , ĊĠĠĠ Ġis Fullscreen : ĠBoolean , ĊĠĠĠ Ġplaceholder : Ġ@ Composable Ġ() Ġ-> ĠUnit , ĊĠĠĠ Ġoverlay : Ġ@ Composable Ġ( Shared Elements Transition State ) Ġ-> ĠUnit , ĊĠĠĠ Ġcontent : Ġ@ Composable Ġ( Modifier ) Ġ-> ĠUnit Ċ ) Ġ{ ĊĠĠĠ Ġval Ġ( saved Should Hide , Ġset Should Hide ) Ġ= Ġremember Ġ{ Ġmutable State Of ( false ) Ġ} ĊĠĠĠ Ġval Ġroot State Ġ= ĠLocal Shared Elements Root State . current ĊĠĠĠ Ġval Ġshould Hide Ġ= Ġroot State . on Element Registered ( element Info ) ĊĠĠĠ Ġset Should Hide ( should Hide ) ĊĊĠĠĠ Ġval Ġcomposition Local Values Ġ= Ġcomposition Local Values ĊĠĠĠ Ġif Ġ( is Fullscreen ) Ġ{ ĊĠĠĠĠĠĠĠ Ġroot State . on Element Position ed ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement Info , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomposition Local Values , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholder , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverlay , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Should Hide ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠSp acer ( modifier Ġ= ĠModifier . fill MaxSize ()) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontent Modifier Ġ= ĠModifier . on Glob ally Position ed Ġ{ Ġcoordinates Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot State . on Element Position ed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement Info , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomposition Local Values , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholder , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverlay , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoordinates , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Should Hide ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ}. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( should Hide Ġ|| Ġsaved Should Hide ) Ġalpha ( 0 f ) Ġelse Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcontent ( content Modifier ) ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠDis posable Effect ( element Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġon Dispose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot State . on Element Disposed ( element Info ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Composable Ċ fun ĠShared Elements Root ( ĊĠĠĠ Ġcontent : Ġ@ Composable ĠShared Elements Root Scope . () Ġ-> ĠUnit Ċ ) Ġ{ ĊĠĠĠ Ġval Ġroot State Ġ= Ġremember Ġ{ ĠShared Elements Root State () Ġ} ĊĊĠĠĠ ĠBox ( modifier Ġ= ĠModifier . on Glob ally Position ed Ġ{ Ġlayout Coordinates Ġ-> ĊĠĠĠĠĠĠĠ Ġroot State . root Coordinates Ġ= Ġlayout Coordinates ĊĠĠĠĠĠĠĠ Ġroot State . root Bounds Ġ= ĠRect ( Offset . Zero , Ġlayout Coordinates . size . to Size ()) ĊĠĠĠ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠ ĠComp osition Local Provider ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocal Shared Elements Root State Ġprovides Ġroot State , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocal Shared Elements Root Scope Ġprovides Ġroot State . scope ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot State . scope . content () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUn bounded Box Ġ{ ĠShared Element Transitions Overlay ( root State ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠDis posable Effect ( Unit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġon Dispose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot State . on Dispose () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ interface ĠShared Elements Root Scope Ġ{ ĊĠĠĠ Ġval Ġis Running Transition : ĠBoolean ĊĠĠĠ Ġfun Ġprepare Transition ( var arg Ġelements : ĠAny ) Ċ } Ċ Ċ val ĠLocal Shared Elements Root Scope Ġ= Ġstatic Composition Local Of < Shared Elements Root Scope ?> Ġ{ Ġnull Ġ} Ċ Ċ @ Composable Ċ private Ġfun ĠUn bounded Box ( content : Ġ@ Composable Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ ĠLayout ( content ) Ġ{ Ġmeas ur ables , Ġconstraints Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġinfinite Constraints Ġ= ĠConstraints () ĊĠĠĠĠĠĠĠ Ġval Ġplace ables Ġ= Ġmeas ur ables . fast Map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Fullscreen Ġ= Ġit . layout Id Ġ=== ĠFull screen Layout Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . measure ( if Ġ( is Fullscreen ) Ġconstraints Ġelse Ġinfinite Constraints ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlayout ( constraints . maxWidth , Ġconstraints . max Height ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplace ables . fast ForEach Ġ{ Ġit . place ( 0 , Ġ 0 ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Composable Ċ private Ġfun ĠShared Element Transitions Overlay ( root State : ĠShared Elements Root State ) Ġ{ ĊĠĠĠ Ġroot State . re compose Scope Ġ= Ġcurrent Re compose Scope ĊĠĠĠ Ġroot State . track ers . forEach Ġ{ Ġ( key , Ġtracker ) Ġ-> ĊĠĠĠĠĠĠĠ Ġkey ( key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransition Ġ= Ġtracker . transition ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Ġ= Ġ( tracker . state Ġas ? ĠStart Element Position ed )?. start Element ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( transition Ġ!= Ġnull Ġ|| Ġ( start Ġ!= Ġnull Ġ&& Ġstart . bounds Ġ== Ġnull )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Element Ġ= Ġstart Ġ?: Ġtransition !!. start Element ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Screen Key Ġ= Ġstart Element . info . screen Key ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Element Ġ= Ġ( transition Ġas ? ĠIn Progress )?. end Element ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġspec Ġ= Ġstart Element . info . spec ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanimated Ġ= Ġremember ( start Screen Key ) Ġ{ ĠAnim atable ( 0 f ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfraction Ġ= Ġanimated . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Element . info . on Fraction Changed ?. invoke ( fraction ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Element ?. info ?. on Fraction Changed ?. invoke ( 1 Ġ- Ġfraction ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdirection Ġ= Ġif Ġ( end Element Ġ== Ġnull ) Ġnull Ġelse Ġremember ( start Screen Key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdirection Ġ= Ġspec . direction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( direction Ġ!= ĠTransition Direction . Auto ) Ġdirection Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalculate Direction ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Element . bounds Ġ?: Ġroot State . root Bounds !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Element . bounds Ġ?: Ġroot State . root Bounds !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Element . Placeholder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot State , Ġfraction , Ġend Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirection , Ġspec , Ġtracker . path Motion ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( transition Ġis ĠIn Progress ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLa unched Effect ( transition , Ġanimated ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( spec . waitFor Frames ) Ġ{ Ġwith Frame Nan os Ġ{} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanimated . animate To ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Value Ġ= Ġ 1 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanimation Spec Ġ= Ġt ween ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Millis Ġ= Ġspec . duration Millis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay Millis Ġ= Ġspec . delay Millis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeasing Ġ= Ġspec . easing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransition . on Transition Finished () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Composable Ċ private Ġfun ĠPosition ed Shared Element . Placeholder ( ĊĠĠĠ Ġroot State : ĠShared Elements Root State , ĊĠĠĠ Ġfraction : ĠFloat , ĊĠĠĠ Ġend : ĠPosition ed Shared Element ? Ġ= Ġnull , ĊĠĠĠ Ġdirection : ĠTransition Direction ? Ġ= Ġnull , ĊĠĠĠ Ġspec : ĠShared Elements Transition Spec ? Ġ= Ġnull , ĊĠĠĠ Ġpath Motion : ĠPath Motion ? Ġ= Ġnull Ċ ) Ġ{ ĊĠĠĠ Ġoverlay ( ĊĠĠĠĠĠĠĠ ĠShared Elements Transition State ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfraction Ġ= Ġfraction , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Info Ġ= Ġinfo , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Bounds Ġ= Ġif Ġ( end Ġ== Ġnull ) Ġbounds Ġelse Ġbounds Ġ?: Ġroot State . root Bounds , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Composition Local Values Ġ= Ġcomposition Local Values , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Placeholder Ġ= Ġplaceholder , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Info Ġ= Ġend ?. info , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Bounds Ġ= Ġend ?. run Ġ{ Ġbounds Ġ?: Ġroot State . root Bounds Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Composition Local Values Ġ= Ġend ?. composition Local Values , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Placeholder Ġ= Ġend ?. placeholder , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdirection Ġ= Ġdirection , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġspec Ġ= Ġspec , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath Motion Ġ= Ġpath Motion ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) Ċ } Ċ Ċ private Ġval ĠLocal Shared Elements Root State Ġ= Ġstatic Composition Local Of < Shared Elements Root State > Ġ{ ĊĠĠĠ Ġerror (" Shared Elements Root Ġnot Ġfound . ĠShared Element Ġmust Ġbe Ġhosted Ġin ĠShared Elements Root .") Ċ } Ċ Ċ private Ġclass ĠShared Elements Root State Ġ{ ĊĠĠĠ Ġprivate Ġval Ġch oreo grapher Ġ= ĠCh oreo grapher Wrapper () ĊĠĠĠ Ġval Ġscope : ĠShared Elements Root Scope Ġ= ĠScope () ĊĠĠĠ Ġval Ġtrack ers Ġ= Ġmutable Map Of < Any , ĠShared Elements Tracker >() ĊĠĠĠ Ġvar Ġre compose Scope : ĠRe compose Scope ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġroot Coordinates : ĠLayout Coordinates ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġroot Bounds : ĠRect ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġon Element Registered ( element Info : ĠShared Element Info ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġch oreo grapher . remove Callback ( element Info ) ĊĠĠĠĠĠĠĠ Ġreturn Ġget Tracker ( element Info ). on Element Registered ( element Info ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Element Position ed ( ĊĠĠĠĠĠĠĠ Ġelement Info : ĠShared Element Info , ĊĠĠĠĠĠĠĠ Ġcomposition Local Values : ĠComp osition Local Values , ĊĠĠĠĠĠĠĠ Ġplaceholder : Ġ@ Composable Ġ() Ġ-> ĠUnit , ĊĠĠĠĠĠĠĠ Ġoverlay : Ġ@ Composable Ġ( Shared Elements Transition State ) Ġ-> ĠUnit , ĊĠĠĠĠĠĠĠ Ġcoordinates : ĠLayout Coordinates ?, ĊĠĠĠĠĠĠĠ Ġset Should Hide : Ġ( Boolean ) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġelement Ġ= ĠPosition ed Shared Element ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfo Ġ= Ġelement Info , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomposition Local Values Ġ= Ġcomposition Local Values , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholder Ġ= Ġplaceholder , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverlay Ġ= Ġoverlay , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbounds Ġ= Ġcoordinates ?. calculate Bounds In Root () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġget Tracker ( element Info ). on Element Position ed ( element , Ġset Should Hide ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Element Disposed ( element Info : ĠShared Element Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġch oreo grapher . post Callback ( element Info ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtracker Ġ= Ġget Tracker ( element Info ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtracker . on Element Un registered ( element Info ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tracker . isEmpty ) Ġtrack ers . remove ( element Info . key ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Dispose () Ġ{ ĊĠĠĠĠĠĠĠ Ġch oreo grapher . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Tracker ( element Info : ĠShared Element Info ): ĠShared Elements Tracker Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtrack ers . get Or Put ( element Info . key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠShared Elements Tracker Ġ{ Ġtransition Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre compose Scope ?. invalidate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( scope Ġas ĠScope ). isRunning Transition Ġ= Ġif Ġ( transition Ġ!= Ġnull ) Ġtrue Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrack ers . values . any Ġ{ Ġit . transition Ġ!= Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠLayout Coordinates . calculate Bounds In Root (): ĠRect Ġ= ĊĠĠĠĠĠĠĠ ĠRect ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot Coordinates ?. local Position Of ( this , ĠOffset . Zero ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġposition In Root (), Ġsize . to Size () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠScope Ġ: ĠShared Elements Root Scope Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġvar Ġis Running Transition : ĠBoolean Ġby Ġmutable State Of ( false ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġprepare Transition ( var arg Ġelements : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelements . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrack ers [ it ]?. prepare Transition () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ private Ġclass ĠShared Elements Tracker ( ĊĠĠĠ Ġprivate Ġval Ġon Transition Changed : Ġ( Shared Element Transition ?) Ġ-> ĠUnit Ċ ) Ġ{ ĊĠĠĠ Ġvar Ġstate : ĠState Ġ= ĠEmpty ĊĊĠĠĠ Ġvar Ġpath Motion : ĠPath Motion ? Ġ= Ġnull ĊĊĠĠĠ Ġvar Ġtransition : ĠShared Element Transition ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Ġ!= Ġvalue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ== Ġnull ) Ġpath Motion Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Transition Changed ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval ĠisEmpty : ĠBoolean Ġget () Ġ= Ġstate Ġis ĠEmpty ĊĊĠĠĠ Ġprivate Ġfun ĠStart Element Position ed . prepare Transition () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( transition Ġ! is ĠWaiting For End Element Position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransition Ġ= ĠWaiting For End Element Position ( start Element ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġprepare Transition () Ġ{ ĊĠĠĠĠĠĠĠ Ġ( state Ġas ? ĠStart Element Position ed )?. prepare Transition () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Element Registered ( element Info : ĠShared Element Info ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġshould Hide Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġtransition Ġ= Ġtransition ĊĠĠĠĠĠĠĠ Ġif Ġ( transition Ġis ĠIn Progress ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġelement Info Ġ!= Ġtransition . start Element . info ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġelement Info Ġ!= Ġtransition . end Element . info ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠStart Element Position ed ( start Element Ġ= Ġtransition . end Element ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . transition Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġstate Ġ= Ġstate ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠStart Element Position ed Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! state . is Registered ( element Info )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshould Hide Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . state Ġ= ĠEnd Element Registered ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Element Ġ= Ġstate . start Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Element Info Ġ= Ġelement Info ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . prepare Transition () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠStart Element Registered Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element Info Ġ!= Ġstate . start Element Info ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . state Ġ= ĠStart Element Registered ( start Element Info Ġ= Ġelement Info ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEmpty Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . state Ġ= ĠStart Element Registered ( start Element Info Ġ= Ġelement Info ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġshould Hide Ġ|| Ġtransition Ġ!= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Element Position ed ( element : ĠPosition ed Shared Element , Ġset Should Hide : Ġ( Boolean ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġstate ĊĠĠĠĠĠĠĠ Ġif Ġ( state Ġis ĠStart Element Position ed Ġ&& Ġelement . info Ġ== Ġstate . start Element Info ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . start Element Ġ= Ġelement ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEnd Element Registered Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element . info Ġ== Ġstate . end Element Info ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . state Ġ= ĠIn Transition ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġspec Ġ= Ġelement . info . spec ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . path Motion Ġ= Ġspec . path Motion Factory () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransition Ġ= ĠIn Progress ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Element Ġ= Ġstate . start Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Element Ġ= Ġelement , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Transition Finished Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . state Ġ= ĠStart Element Position ed ( start Element Ġ= Ġelement ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransition Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Should Hide ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠStart Element Registered Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element . info Ġ== Ġstate . start Element Info ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . state Ġ= ĠStart Element Position ed ( start Element Ġ= Ġelement ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠUnit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Element Un registered ( element Info : ĠShared Element Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġstate Ġ= Ġstate ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEnd Element Registered Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element Info Ġ== Ġstate . end Element Info ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . state Ġ= ĠStart Element Position ed ( start Element Ġ= Ġstate . start Element ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransition Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( element Info Ġ== Ġstate . start Element . info ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . state Ġ= ĠStart Element Registered ( start Element Info Ġ= Ġstate . end Element Info ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransition Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠStart Element Registered Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element Info Ġ== Ġstate . start Element Info ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . state Ġ= ĠEmpty ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransition Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsealed Ġclass ĠState Ġ{ ĊĠĠĠĠĠĠĠ Ġobject ĠEmpty Ġ: ĠState () ĊĊĠĠĠĠĠĠĠ Ġopen Ġclass ĠStart Element Registered ( val Ġstart Element Info : ĠShared Element Info ) Ġ: ĠState () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġopen Ġfun Ġis Registered ( element Info : ĠShared Element Info ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġelement Info Ġ== Ġstart Element Info ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġopen Ġclass ĠStart Element Position ed ( var Ġstart Element : ĠPosition ed Shared Element ) Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStart Element Registered ( start Element . info ) ĊĊĠĠĠĠĠĠĠ Ġclass ĠEnd Element Registered ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Element : ĠPosition ed Shared Element , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Element Info : ĠShared Element Info ĊĠĠĠĠĠĠĠ Ġ) Ġ: ĠStart Element Position ed ( start Element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġis Registered ( element Info : ĠShared Element Info ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . is Registered ( element Info ) Ġ|| Ġelement Info Ġ== Ġend Element Info ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġobject ĠIn Transition Ġ: ĠState () ĊĠĠĠ Ġ} Ċ } Ċ Ċ enum Ġclass ĠTransition Direction Ġ{ ĊĠĠĠ ĠAuto , ĠEnter , ĠReturn Ċ } Ċ Ċ enum Ġclass ĠF ade Mode Ġ{ ĊĠĠĠ ĠIn , ĠOut , ĠCross , ĠThrough Ċ } Ċ Ċ const Ġval ĠF ade Through Progress Threshold Ġ= Ġ 0 . 3 5 f Ċ Ċ internal Ġclass ĠShared Elements Transition State ( ĊĠĠĠ Ġval Ġfraction : ĠFloat , ĊĠĠĠ Ġval Ġstart Info : ĠShared Element Info , ĊĠĠĠ Ġval Ġstart Bounds : ĠRect ?, ĊĠĠĠ Ġval Ġstart Composition Local Values : ĠComp osition Local Values , ĊĠĠĠ Ġval Ġstart Placeholder : Ġ@ Composable Ġ() Ġ-> ĠUnit , ĊĠĠĠ Ġval Ġend Info : ĠShared Element Info ?, ĊĠĠĠ Ġval Ġend Bounds : ĠRect ?, ĊĠĠĠ Ġval Ġend Composition Local Values : ĠComp osition Local Values ?, ĊĠĠĠ Ġval Ġend Placeholder : Ġ(@ Composable Ġ() Ġ-> ĠUnit )? , ĊĠĠĠ Ġval Ġdirection : ĠTransition Direction ?, ĊĠĠĠ Ġval Ġspec : ĠShared Elements Transition Spec ?, ĊĠĠĠ Ġval Ġpath Motion : ĠPath Motion ? Ċ ) Ċ Ċ internal Ġval ĠTop Left Ġ= ĠTransform Origin ( 0 f , Ġ 0 f ) Ċ Ċ internal Ġopen Ġclass ĠShared Element Info ( ĊĠĠĠ Ġval Ġkey : ĠAny , ĊĠĠĠ Ġval Ġscreen Key : ĠAny , ĊĠĠĠ Ġval Ġspec : ĠShared Elements Transition Spec , ĊĠĠĠ Ġval Ġon Fraction Changed : Ġ(( Float ) Ġ-> ĠUnit )? Ċ ) Ġ{ ĊĊĠĠĠ Ġfinal Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġother Ġis ĠShared Element Info Ġ&& Ġother . key Ġ== Ġkey Ġ&& Ġother . screen Key Ġ== Ġscreen Key ĊĊĠĠĠ Ġfinal Ġoverride Ġfun ĠhashCode (): ĠInt Ġ= Ġ 3 1 Ġ* Ġkey . hashCode () Ġ+ Ġscreen Key . hashCode () Ċ Ċ } Ċ Ċ private Ġclass ĠPosition ed Shared Element ( ĊĠĠĠ Ġval Ġinfo : ĠShared Element Info , ĊĠĠĠ Ġval Ġcomposition Local Values : ĠComp osition Local Values , ĊĠĠĠ Ġval Ġplaceholder : Ġ@ Composable Ġ() Ġ-> ĠUnit , ĊĠĠĠ Ġval Ġoverlay : Ġ@ Composable Ġ( Shared Elements Transition State ) Ġ-> ĠUnit , ĊĠĠĠ Ġval Ġbounds : ĠRect ? Ċ ) Ċ Ċ private Ġsealed Ġclass ĠShared Element Transition ( val Ġstart Element : ĠPosition ed Shared Element ) Ġ{ ĊĊĠĠĠ Ġclass ĠWaiting For End Element Position ( start Element : ĠPosition ed Shared Element ) Ġ: ĊĠĠĠĠĠĠĠ ĠShared Element Transition ( start Element ) ĊĊĠĠĠ Ġclass ĠIn Progress ( ĊĠĠĠĠĠĠĠ Ġstart Element : ĠPosition ed Shared Element , ĊĠĠĠĠĠĠĠ Ġval Ġend Element : ĠPosition ed Shared Element , ĊĠĠĠĠĠĠĠ Ġval Ġon Transition Finished : Ġ() Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ: ĠShared Element Transition ( start Element ) Ċ Ċ } Ċ Ċ private Ġclass ĠCh oreo grapher Wrapper Ġ{ ĊĠĠĠ Ġprivate Ġval Ġcallbacks Ġ= Ġmutable Map Of < Shared Element Info , ĠCh oreo grapher . Frame Callback >() ĊĠĠĠ Ġprivate Ġval Ġch oreo grapher Ġ= ĠCh oreo grapher . getInstance () ĊĊĠĠĠ Ġfun Ġpost Callback ( element Info : ĠShared Element Info , Ġcallback : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( callbacks . containsKey ( element Info )) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġframe Callback Ġ= ĠCh oreo grapher . Frame Callback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallbacks . remove ( element Info ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcallbacks [ element Info ] Ġ= Ġframe Callback ĊĠĠĠĠĠĠĠ Ġch oreo grapher . post Frame Callback ( frame Callback ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Callback ( element Info : ĠShared Element Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcallbacks . remove ( element Info )?. also ( ch oreo grapher :: remove Frame Callback ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠ Ġcallbacks . values . forEach ( ch oreo grapher :: remove Frame Callback ) ĊĠĠĠĠĠĠĠ Ġcallbacks . clear () ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġval ĠFull screen Ġ= ĠModifier . fill MaxSize () Ċ internal Ġval ĠFull screen Layout Id Ġ= ĠAny () Ċ