package Ġcom . t ange m . t ange m _ sdk _ new . ui . widget . le ap f rog Widget Ċ Ċ import Ġandroid . animation . Animator Ċ import Ġandroid . animation . Animator Set Ċ import Ġandroid . view . animation . Accel erate De cel erate Interpolator Ċ import Ġandroid . widget . Frame Layout Ċ import Ġandroid . widget . ImageView Ċ import Ġandroidx . core . animation . do On End Ċ import Ġandroidx . core . view . children Ċ import Ġcom . t ange m . common . extensions . Void Callback Ċ import Ġcom . t ange m . t ange m _ sdk _ new . extensions . dp To Px Ċ Ċ /** Ċ Ġ* ĠCreated Ġby ĠAnt on ĠZ hil enk ov Ġon Ġ 0 6 / 1 0 / 2 0 2 1 . Ċ Ġ*/ Ċ class ĠLe ap f rog Widget ( ĊĠĠĠ Ġprivate Ġval Ġparent Container : ĠFrame Layout , ĊĠĠĠ Ġprivate Ġval Ġcalculator : ĠProperty Calculator Ġ= ĠProperty Calculator (), Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġfold Animation Duration Ġ= Ġ 3 0 0 L ĊĠĠĠ Ġprivate Ġval Ġle ap Animation Duration Ġ= Ġ 5 0 0 L ĊĠĠĠ Ġprivate Ġval Ġle ap Back Animation Duration Ġ= Ġ 5 0 0 L ĊĊĠĠĠ Ġprivate Ġval Ġle ap Views Ġ= Ġmutable ListOf < Le ap View >() ĊĊĠĠĠ Ġprivate Ġvar Ġfold Un fold Progress : ĠInt Ġ= Ġ 1 0 0 ĊĠĠĠ Ġprivate Ġvar Ġle ap Progress : ĠInt Ġ= Ġ 1 0 0 ĊĠĠĠ Ġprivate Ġvar Ġle ap Back Progress : ĠInt Ġ= Ġ 1 0 0 ĊĊĠĠĠ Ġprivate Ġval Ġchildren Ġ= Ġparent Container . children . filter Ġ{ Ġit Ġis ĠImageView Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġcalculator . set Translation Converter Ġ{ Ġparent Container . dp To Px ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( view Is Full F led ged ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmax Position Ġ= Ġchildren . count () Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchildren . forEach Indexed Ġ{ Ġindex , Ġview Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinitial Position Ġ= Ġmax Position Ġ- Ġindex ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġle ap Views . add ( Le ap View ( view , Ġindex , Ġinitial Position , Ġmax Position , Ġcalculator )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠApply Ġinitial Ġproperties Ġto Ġthe Ġviews ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġinit Views () Ġ{ ĊĠĠĠĠĠĠĠ Ġle ap Views . forEach Ġ{ Ġit . init View () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfold ( animate : ĠBoolean Ġ= Ġtrue , Ġon End : ĠVoid Callback Ġ= Ġ{}) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġanim ator Ġ= Ġfold Animator ( animate ) ĊĠĠĠĠĠĠĠ Ġif Ġ( anim ator Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon End () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator . do On End Ġ{ Ġon End () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator . start () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġun fold ( animate : ĠBoolean Ġ= Ġtrue , Ġon End : ĠVoid Callback Ġ= Ġ{}) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġanim ator Ġ= Ġun fold Animator ( animate ) ĊĠĠĠĠĠĠĠ Ġif Ġ( anim ator Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon End () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator . do On End Ġ{ Ġon End () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator . start () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfold Animator ( animate : ĠBoolean Ġ= Ġtrue ): ĠAn imator ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! can Fold Un fold ()) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Fold Un fold Animator ( true , Ġanimate , Ġfold Animation Duration ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġun fold Animator ( animate : ĠBoolean Ġ= Ġtrue ): ĠAn imator ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! can Fold Un fold ()) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Fold Un fold Animator ( false , Ġanimate , Ġfold Animation Duration ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Fold Un fold Animator ( is Fold Animation : ĠBoolean , Ġanimate : ĠBoolean , Ġduration : ĠLong ): ĠAn imator Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġanim ators List Ġ= Ġmutable ListOf < Animator >() ĊĠĠĠĠĠĠĠ Ġval Ġanimate Duration Ġ= Ġif Ġ( animate ) Ġduration Ġelse Ġ 0 ĊĠĠĠĠĠĠĠ Ġle ap Views . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Fold Animation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . fold () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim ators List . add ( it . view . fold Animation ( animate Duration , Ġit . state . properties )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . un fold () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim ators List . add ( it . view . un fold Animation ( animate Duration , Ġit . state . properties )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġanim ators List . add ( create Progress Listener ( animate Duration ) Ġ{ Ġfold Un fold Progress Ġ= Ġit Ġ}) ĊĊĠĠĠĠĠĠĠ Ġval Ġanim ator Ġ= ĠAn imator Set () ĊĠĠĠĠĠĠĠ Ġanim ator . interpol ator Ġ= ĠAccel erate De cel erate Interpolator () ĊĠĠĠĠĠĠĠ Ġanim ator . play To gether ( anim ators List . toList ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġanim ator ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġle ap ( animate : ĠBoolean Ġ= Ġtrue , Ġon End : ĠVoid Callback Ġ= Ġ{}) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! can Le ap ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon End () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġduration Ġ= Ġif Ġ( animate ) Ġle ap Animation Duration Ġelse Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġanim ators List Ġ= Ġmutable ListOf < Animator >() ĊĠĠĠĠĠĠĠ Ġle ap Views . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it . le ap ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLe ap F rog Animation . LE AP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġover Lift Ġ= Ġcalculator . over Lift ( le ap Views . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim ators List . add ( it . view . le ap Animation ( duration , Ġit . state . properties , Ġover Lift )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLe ap F rog Animation . PULL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim ators List . add ( it . view . pull Up Animation ( duration , Ġit . state . properties )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġanim ators List . add ( create Progress Listener ( duration ) Ġ{ Ġle ap Progress Ġ= Ġit Ġ}) ĊĊĠĠĠĠĠĠĠ Ġval Ġanim ator Ġ= ĠAn imator Set () ĊĠĠĠĠĠĠĠ Ġanim ator . play To gether ( anim ators List . toList ()) ĊĠĠĠĠĠĠĠ Ġanim ator . do On End Ġ{ Ġon End () Ġ} ĊĠĠĠĠĠĠĠ Ġanim ator . start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġle ap Back ( animate : ĠBoolean Ġ= Ġtrue , Ġon End : ĠVoid Callback Ġ= Ġ{}) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! can Le ap Back ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon End () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġduration Ġ= Ġif Ġ( animate ) Ġle ap Back Animation Duration Ġelse Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġanim ators List Ġ= Ġmutable ListOf < Animator >() ĊĠĠĠĠĠĠĠ Ġle ap Views . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it . le ap Back ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLe ap F rog Animation . LE AP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim ators List . add ( it . view . le ap Back Animation ( duration , Ġit . state . properties , Ġcalculator )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLe ap F rog Animation . PULL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim ators List . add ( it . view . pull Down Animation ( duration , Ġit . state . properties )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġanim ators List . add ( create Progress Listener ( duration ) Ġ{ Ġle ap Back Progress Ġ= Ġit Ġ}) ĊĊĠĠĠĠĠĠĠ Ġval Ġanim ator Ġ= ĠAn imator Set () ĊĠĠĠĠĠĠĠ Ġanim ator . play To gether ( anim ators List . toList ()) ĊĠĠĠĠĠĠĠ Ġanim ator . do On End Ġ{ Ġon End () Ġ} ĊĠĠĠĠĠĠĠ Ġanim ator . start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Views Count (): ĠInt Ġ= Ġchildren . count () ĊĊĠĠĠ Ġfun Ġget View Position ByIndex ( index : ĠInt ): ĠInt Ġ= Ġle ap Views . first Ġ{ Ġit . index Ġ== Ġindex Ġ}. state . current Position ĊĊĠĠĠ Ġfun Ġget View By Position ( position : ĠInt ): ĠLe ap View Ġ= Ġle ap Views . first Ġ{ Ġit . state . current Position Ġ== Ġposition Ġ} ĊĊĠĠĠ Ġfun ĠgetState (): ĠLe ap f rog Widget State Ġ= ĠLe ap f rog Widget State ( le ap Views . map Ġ{ Ġit . state Ġ}) ĊĊĠĠĠ Ġfun Ġapply State ( state : ĠLe ap f rog Widget State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstate . le ap View States . forEach Ġ{ Ġview State Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġle ap Views . first OrNull Ġ{ Ġit . index Ġ== Ġview State . index Ġ} ?. apply State ( view State ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġview Is Full F led ged (): ĠBoolean Ġ= Ġchildren . count () Ġ> Ġ 1 ĊĊĠĠĠ Ġprivate Ġfun Ġcan Fold Un fold (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! view Is Full F led ged () Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfold Un fold InProgress () Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġle ap InProgress () Ġ|| Ġle ap Back InProgress () Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcan Le ap (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! view Is Full F led ged () Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġle ap Back InProgress () Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġle ap Progress Ġ< Ġ 7 0 Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcan Le ap Back (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! view Is Full F led ged () Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġle ap InProgress () Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġle ap Back Progress Ġ< Ġ 7 0 Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfold Un fold InProgress (): ĠBoolean Ġ= Ġfold Un fold Progress Ġ!= Ġ 1 0 0 ĊĠĠĠ Ġprivate Ġfun Ġle ap InProgress (): ĠBoolean Ġ= Ġle ap Progress Ġ!= Ġ 1 0 0 ĊĠĠĠ Ġprivate Ġfun Ġle ap Back InProgress (): ĠBoolean Ġ= Ġle ap Back Progress Ġ!= Ġ 1 0 0 Ċ } Ċ Ċ data Ġclass ĠLe ap f rog Widget State ( ĊĠĠĠ Ġval Ġle ap View States : ĠList < Le ap ViewState > Ċ ) Ċ Ċ class ĠProperty Calculator ( ĊĠĠĠ Ġval Ġelevation Factor : ĠFloat Ġ= Ġ 1 f , ĊĠĠĠ Ġval Ġdecrease Scale Factor : ĠFloat Ġ= Ġ 0 . 1 5 f , ĊĠĠĠ Ġval Ġy Translation Factor : ĠFloat Ġ= Ġ 3 5 f , ĊĠĠĠ Ġval Ġdecrease Over L ifting Factor : ĠFloat Ġ= Ġ 0 . 8 5 f , Ċ ) Ġ{ ĊĠĠĠ Ġ// Ġ 0 Ġview Ġit Ġis Ġview Ġon Ġthe Ġtop Ġof Ġstack , Ġbut Ġit Ġis Ġlast Ġin Ġparent . children ĊĊĠĠĠ Ġprivate Ġvar Ġtranslation Value Converter : Ġ(( Float ) Ġ-> ĠFloat )? Ġ= Ġnull ĊĠĠĠ Ġfun Ġset Translation Converter ( converter : Ġ( Float ) Ġ-> ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtranslation Value Converter Ġ= Ġconverter ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġscale ( position : ĠInt ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ 1 f Ġ- Ġdecrease Scale Factor Ġ* Ġposition ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġelevation ( position : ĠInt , Ġcount : ĠInt ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġelevation Factor Ġ* Ġ( count Ġ- Ġ 1 Ġ- Ġposition ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġy Translation ( position : ĠInt ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġy Translation Ġ= Ġy Translation Factor Ġ* Ġposition ĊĠĠĠĠĠĠĠ Ġreturn Ġconvert Translation ( y Translation ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhas Foreground ( position : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġposition Ġ!= Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġover Lift ( view Count : ĠInt ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinitial Over Lift Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy Translation Factor Ġ< Ġ 0 f Ġ-> Ġy Translation Factor Ġ* Ġdecrease Over L ifting Factor Ġ* Ġview Count Ġ* Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 1 0 f ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġscale Over Lift Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdecrease Scale Factor Ġ== Ġ 0 f Ġ-> Ġinitial Over Lift ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġinitial Over Lift Ġ* Ġdecrease Over L ifting Factor Ġ- Ġinitial Over Lift Ġ* Ġdecrease Scale Factor ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġconvert Translation ( scale Over Lift ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconvert Translation ( value : ĠFloat ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtranslation Value Converter ?. invoke ( value ) Ġ?: Ġvalue ĊĠĠĠ Ġ} Ċ }