package Ġcom . github . ale xj lock wood . ky rie Ċ Ċ import Ġandroid . view . animation . Linear Interpolator Ċ import Ġandroidx . annotation . Int Range Ċ import Ġcom . github . ale xj lock wood . ky rie . Animation . Repeat Mode Ċ import Ġjava . util . ArrayList Ċ import Ġjava . util . Collections Ċ import Ġjava . util . Comparator Ċ Ċ internal Ġclass ĠProperty < V >( animations : ĠList < Animation < *, ĠV >>) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġanimations : ĠList < Animation < *, ĠV >> ĊĠĠĠ Ġprivate Ġval Ġlisteners Ġ= ĠArrayList < Listener >() ĊĠĠĠ Ġprivate Ġvar Ġcurrent Play Time : ĠLong Ġ= Ġ 0 ĊĊĠĠĠ Ġval Ġtotal Duration : ĠLong ĊĊĠĠĠ Ġ// ĠIterate Ġbackwards Ġthrough Ġthe Ġlist Ġand Ġstop Ġat Ġthe Ġfirst ĊĠĠĠ Ġ// Ġanimation Ġthat Ġhas Ġa Ġstart Ġtime Ġless Ġthan Ġor Ġequal Ġto Ġthe ĊĠĠĠ Ġ// Ġcurrent Ġplay Ġtime . ĊĠĠĠ Ġprivate Ġval Ġcurrent Animation : ĠAnimation < *, ĠV > ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġcan Ġthis Ġsearch Ġbe Ġfaster ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġanimations . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Animation Ġ= Ġanimations [ size Ġ- Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Animation . start Delay Ġ<= Ġcurrent Play Time ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlast Animation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġanimation Ġ= Ġlast Animation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġsize Ġ- Ġ 1 Ġdown To Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanimation Ġ= Ġanimations [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠstartTime Ġ= Ġanimation . start Delay ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( startTime Ġ<= Ġcurrent Play Time ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġanimation ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġanimated Value : ĠV ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanimation Ġ= Ġcurrent Animation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġanimation . get Animated Value ( get Interpol ated Current Animation Fraction ( animation )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠSort Ġthe Ġanimations . ĊĠĠĠĠĠĠĠ Ġthis . animations Ġ= ĠArrayList ( animations ) ĊĠĠĠĠĠĠĠ ĠCollections . sort ( this . animations , ĠAN IM ATION _ COMP AR ATOR ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCompute Ġthe Ġtotal Ġduration . ĊĠĠĠĠĠĠĠ Ġvar Ġtotal Duration : ĠLong Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġthis . animations . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurr Total Duration Ġ= Ġthis . animations [ i ]. total Duration ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( curr Total Duration Ġ== ĠAnimation . INF IN ITE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Duration Ġ= ĠAnimation . INF IN ITE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Duration Ġ= ĠMath . max ( curr Total Duration , Ġtotal Duration ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . total Duration Ġ= Ġtotal Duration ĊĊĠĠĠĠĠĠĠ Ġ// ĠFill Ġin Ġany Ġmissing Ġstart Ġvalues . ĊĠĠĠĠĠĠĠ Ġvar Ġprev Animation : ĠAnimation < *, ĠV >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġthis . animations . size ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurr Animation Ġ= Ġthis . animations [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( prev Animation Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurr Animation . setup Start Value ( prev Animation . get Animated Value ( 1 f )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprev Animation Ġ= Ġcurr Animation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠsetCurrent Play Time (@ Int Range ( from Ġ= Ġ 0 L ) Ġcurrent Play Time : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Play Time Ġ= Ġcurrent Play Time ĊĠĠĠĠĠĠĠ Ġif Ġ( current Play Time Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Play Time Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( total Duration Ġ!= ĠAnimation . INF IN ITE Ġ&& Ġtotal Duration Ġ< Ġcurrent Play Time ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Play Time Ġ= Ġtotal Duration ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( this . current Play Time Ġ!= Ġcurrent Play Time ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . current Play Time Ġ= Ġcurrent Play Time ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġoptimize Ġthis Ġby Ġnotify ing Ġonly Ġwhen Ġwe Ġknow Ġthe Ġcomputed Ġvalue Ġhas Ġchanged ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġadd Ġa Ġcompute Value () Ġmethod Ġor Ġsomething Ġon ĠAnimation ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Listeners () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Listener ( listener : ĠListener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlisteners . add ( listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnotify Listeners () Ġ{ ĊĠĠĠĠĠĠĠ Ġlisteners . forEach Ġ{ Ġit . on Current Play Time Changed ( this ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġprogress Ġinto Ġthe Ġcurrent Ġanimation Ġbetween Ġ 0 Ġand Ġ 1 . ĠThis Ġdoes Ġnot Ġtake Ġinto ĊĠĠĠĠ Ġ* Ġaccount Ġany Ġinterpolation Ġthat Ġthe Ġanimation Ġmay Ġhave . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Linear Current Animation Fraction ( animation : ĠAnimation < *, ĠV >): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠstartTime Ġ= Ġanimation . start Delay . toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġduration Ġ= Ġanimation . duration . toFloat () ĊĠĠĠĠĠĠĠ Ġif Ġ( duration Ġ== Ġ 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 1 f ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtotal Duration Ġ= Ġanimation . total Duration ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Play Time Ġ= Ġthis . current Play Time ĊĠĠĠĠĠĠĠ Ġif Ġ( total Duration Ġ!= ĠAnimation . INF IN ITE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDon 't Ġlet Ġthe Ġcurrent Ġplay Ġtime Ġexceed Ġthe Ġanimation 's Ġtotal Ġduration Ġif Ġit Ġisn 't Ġinfinite . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Play Time Ġ= ĠMath . min ( current Play Time , Ġtotal Duration ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġfraction Ġ= Ġ( current Play Time Ġ- ĠstartTime ) Ġ/ Ġduration ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Iteration Ġ= ĠgetCurrent Iteration ( fraction ) ĊĠĠĠĠĠĠĠ Ġval Ġrepeat Count Ġ= Ġanimation . repeat Count ĊĠĠĠĠĠĠĠ Ġval Ġrepeat Mode Ġ= Ġanimation . repeat Mode ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Fraction Ġ= Ġfraction Ġ- Ġcurrent Iteration ĊĠĠĠĠĠĠĠ Ġif Ġ( 0 Ġ< Ġcurrent Iteration ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġrepeat Mode Ġ== ĠRepeat Mode . RE VERSE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ( current Iteration Ġ< Ġrepeat Count Ġ+ Ġ 1 Ġ|| Ġrepeat Count Ġ== ĠAnimation . INF IN ITE )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġwhen Ġre ver sing , Ġcheck Ġif Ġcurrent Iteration Ġ% Ġ 2 Ġ== Ġ 0 Ġinstead ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Iteration Ġ% Ġ 2 Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Fraction Ġ= Ġ 1 Ġ- Ġcurrent Fraction ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcurrent Fraction ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTakes Ġthe Ġvalue Ġof Ġ[. get Linear Current Animation Fraction ] Ġand Ġinterpol ates Ġit ĊĠĠĠĠ Ġ* Ġwith Ġthe Ġcurrent Ġanimation 's Ġinterpol ator . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Interpol ated Current Animation Fraction ( animation : ĠAnimation < *, ĠV >): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġinterpol ator Ġ= Ġanimation . interpol ator ĊĠĠĠĠĠĠĠ Ġif Ġ( interpol ator Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterpol ator Ġ= ĠDEFAULT _ INTER POL ATOR ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġinterpol ator . get Interpolation ( get Linear Current Animation Fraction ( animation )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠListener Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġon Current Play Time Changed ( property : ĠProperty <* >) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠDEFAULT _ INTER POL ATOR Ġ= ĠLinear Interpolator () ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠAN IM ATION _ COMP AR ATOR Ġ= ĠComparator < Animation < *, Ġ* >> Ġ{ Ġa 1 , Ġa 2 Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAnim ations Ġwith Ġsmaller Ġstart Ġtimes Ġare Ġsorted Ġfirst . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs 1 Ġ= Ġa 1 . start Delay ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs 2 Ġ= Ġa 2 . start Delay ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( s 1 Ġ!= Ġs 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ Comparator Ġif Ġ( s 1 Ġ< Ġs 2 ) Ġ- 1 Ġelse Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd 1 Ġ= Ġa 1 . total Duration ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd 2 Ġ= Ġa 2 . total Duration ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( d 1 Ġ== ĠAnimation . INF IN ITE Ġ|| Ġd 2 Ġ== ĠAnimation . INF IN ITE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIn finite Ġanimations Ġare Ġsorted Ġlast . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ Comparator Ġif Ġ( d 1 Ġ== Ġd 2 ) Ġ 0 Ġelse Ġif Ġ( d 1 Ġ== ĠAnimation . INF IN ITE ) Ġ 1 Ġelse Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAnim ations Ġwith Ġsmaller Ġend Ġtimes Ġare Ġsorted Ġfirst . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġe 1 Ġ= Ġs 1 Ġ+ Ġd 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġe 2 Ġ= Ġs 2 Ġ+ Ġd 2 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e 1 Ġ< Ġe 2 ) Ġ- 1 Ġelse Ġif Ġ( e 1 Ġ> Ġe 2 ) Ġ 1 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠgetCurrent Iteration ( fraction : ĠFloat ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġoverall Ġfraction Ġis Ġa Ġpositive Ġinteger , Ġwe Ġconsider Ġthe Ġcurrent Ġiteration Ġto Ġbe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcomplete . ĠIn Ġother Ġwords , Ġthe Ġfraction Ġfor Ġthe Ġcurrent Ġiteration Ġwould Ġbe Ġ 1 , Ġand Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcurrent Ġiteration Ġwould Ġbe Ġoverall Ġfraction Ġ- Ġ 1 . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġiteration Ġ= ĠMath . floor ( fraction . toDouble ()). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fraction Ġ== Ġiteration Ġ&& Ġfraction Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiteration -- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġiteration . toInt () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ