package Ġcom . k rm . step per count Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . res . Typed Array Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Path Ċ import Ġandroid . graphics . Rect Ċ import Ġandroid . graphics . Rect F Ċ import Ġandroid . graphics . drawable . Gradient Drawable Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . View Ċ import Ġandroidx . constraint layout . widget . Constraint Layout Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . core . view . View Compat Ċ import Ġandroidx . dynamic animation . animation . Spring Animation Ċ import Ġkotlinx . android . synt hetic . main . step per _ touch . view .* Ċ import Ġkotlin . properties . Deleg ates Ċ Ċ class ĠStep per Touch Ġ: ĠConstraint Layout Ġ{ ĊĊĠĠĠ Ġconstructor ( context : ĠContext ) Ġ: Ġsuper ( context ) ĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ) Ġ: Ġsuper ( context , Ġattrs ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhandle Attrs ( attrs ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet , Ġdef Style Attr : ĠInt ) Ġ: Ġsuper ( ĊĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠ Ġattrs , ĊĠĠĠĠĠĠĠ Ġdef Style Attr ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhandle Attrs ( attrs ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠDraw ing Ġproperties ĊĠĠĠ Ġprivate Ġval Ġclipping Bounds : ĠRect F Ġ= ĠRect F () ĊĠĠĠ Ġprivate Ġval Ġclip Path Ġ= ĠPath () ĊĊĠĠĠ Ġ// ĠAnimation Ġproperties ĊĠĠĠ Ġprivate Ġval Ġst iff ness : ĠFloat Ġ= Ġ 2 0 0 f ĊĠĠĠ Ġprivate Ġval Ġd amping : ĠFloat Ġ= Ġ 0 . 6 f ĊĠĠĠ Ġprivate Ġvar Ġstart X : ĠFloat Ġ= Ġ 0 f ĊĊĠĠĠ Ġ// ĠIndic ation Ġif Ġt apping Ġpositive Ġand Ġnegative Ġsides Ġis Ġallowed ĊĠĠĠ Ġvar Ġside Tap Enabled : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġallow Dragging Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġis T apped : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġvar ĠmaxValue : ĠInt Ġ= ĠInteger . MAX _ VALUE ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Side Controls () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġvar Ġmin Value : ĠInt Ġ= ĠInteger . MIN _ VALUE ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Side Controls () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġcallbacks : ĠMutable List < On Step Callback > Ġ= Ġmutable ListOf () ĊĠĠĠ Ġvar Ġcount : ĠInt Ġby ĠDeleg ates . observable ( 0 ) Ġ{ Ġ_, Ġold , Ġnew Ġ-> ĊĠĠĠĠĠĠĠ Ġview Counter Text . text Ġ= Ġnew . toString () ĊĠĠĠĠĠĠĠ Ġupdate Side Controls () ĊĠĠĠĠĠĠĠ Ġnotify Step Callback ( new , Ġnew Ġ> Ġold ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠStyle Ġproperties ĊĠĠĠ Ġprivate Ġvar Ġstep per Background Ġ= ĠR . color . step per _ background ĊĠĠĠ Ġprivate Ġvar Ġstep per Action Color Ġ= ĠR . color . step per _ actions ĊĠĠĠ Ġprivate Ġvar Ġstep per Action Color Disabled Ġ= ĠR . color . step per _ actions _ disabled ĊĠĠĠ Ġprivate Ġvar Ġstep per TextColor Ġ= ĠR . color . step per _ text ĊĠĠĠ Ġprivate Ġvar Ġstep per Button Color Ġ= ĠR . color . step per _ button ĊĠĠĠ Ġprivate Ġvar Ġstep per Text Size Ġ= Ġ 2 0 ĊĠĠĠ Ġprivate Ġvar Ġallow Negative Ġ= Ġtrue ĊĠĠĠ Ġprivate Ġvar Ġallow Positive Ġ= Ġtrue ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠLayoutInflater . from ( context ). inflate ( R . layout . step per _ touch , Ġthis , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġclip Children Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġif Ġ( android . os . Build . VERSION . SDK _ INT Ġ>= Ġ 2 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Counter . elevation Ġ= Ġ 4 f ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġset Will Not Draw ( false ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Attrs ( attrs : ĠAttributeSet ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstyles : ĠTyped Array Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . theme . obtain Styled Attributes ( attrs , ĠR . style able . Step per Touch , Ġ 0 , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstep per Background Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstyles . getResource Id ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . style able . Step per Touch _ step per BackgroundColor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . color . step per _ background ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstep per Action Color Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstyles . getResource Id ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . style able . Step per Touch _ step per Actions Color , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . color . step per _ actions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstep per Action Color Disabled Ġ= Ġstyles . getResource Id ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . style able . Step per Touch _ step per Actions Disabled Color , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . color . step per _ actions _ disabled ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstep per TextColor Ġ= Ġstyles . getResource Id ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . style able . Step per Touch _ step per TextColor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . color . step per _ text ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstep per Button Color Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstyles . getResource Id ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . style able . Step per Touch _ step per Button Color , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . color . step per _ button ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstep per Text Size Ġ= Ġstyles . get Dimension Pixel Size ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . style able . Step per Touch _ step per Text Size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep per Text Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġallow Negative Ġ= Ġstyles . getBoolean ( R . style able . Step per Touch _ step per Allow Negative , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġallow Positive Ġ= Ġstyles . getBoolean ( R . style able . Step per Touch _ step per Allow Positive , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstyles . recycle () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġupdate St yling () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate St yling () Ġ{ ĊĠĠĠĠĠĠĠ Ġview Background . set BackgroundColor ( Context Compat . getColor ( context , Ġstep per Background )) ĊĠĠĠĠĠĠĠ Ġview Counter Text . setTextColor ( Context Compat . getColor ( context , Ġstep per TextColor )) ĊĠĠĠĠĠĠĠ Ġview Counter Text . text Size Ġ= Ġstep per Text Size . toFloat () ĊĠĠĠĠĠĠĠ Ġupdate Side Controls () ĊĊĠĠĠĠĠĠĠ Ġview Counter . background ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Ġis ĠGradient Drawable ) Ġset Color ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContext Compat . getColor ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep per Button Color ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Touch Event ( event : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( event . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event . isIn Bounds ( view Counter )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart X Ġ= Ġevent . x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġallow Dragging Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( side Tap Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis T apped Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Counter . x Ġ= Ġevent . x Ġ- Ġview Counter . width Ġ* Ġ 0 . 5 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent . request Dis allow Intercept Touch Event ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ MOVE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( allow Dragging ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Counter . translation X Ġ= Ġevent . x Ġ- Ġstart X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ UP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġallow Dragging Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Counter . translation X Ġ> Ġview Counter . width Ġ* Ġ 0 . 5 Ġ&& Ġallow Positive Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is LTR ()) Ġadd () Ġelse Ġsubtract () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Counter . translation X Ġ< Ġ-( view Counter . width Ġ* Ġ 0 . 5 ) Ġ&& Ġallow Negative Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is LTR ()) Ġsubtract () Ġelse Ġadd () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( view Counter . translation X Ġ!= Ġ 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanim X Ġ= ĠSpring Animation ( view Counter , ĠSpring Animation . TRANSL ATION _ X , Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim X . spring . st iff ness Ġ= Ġst iff ness ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim X . spring . d amping Ratio Ġ= Ġd amping ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim X . start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent . request Dis allow Intercept Touch Event ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġallow Negative ( allow : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġallow Negative Ġ= Ġallow ĊĠĠĠĠĠĠĠ Ġupdate Side Controls () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġallow Positive ( allow : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġallow Positive Ġ= Ġallow ĊĠĠĠĠĠĠĠ Ġupdate Side Controls () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Side Controls () Ġ{ ĊĠĠĠĠĠĠĠ ĠtextView Negative . setVisibility ( allow Negative ) ĊĠĠĠĠĠĠĠ ĠtextView Positive . setVisibility ( allow Positive ) ĊĊĠĠĠĠĠĠĠ ĠtextView Negative . setTextColor ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠContext Compat . getColor ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( count Ġ== Ġmin Value ) Ġstep per Action Color Disabled Ġelse Ġstep per Action Color ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠtextView Positive . setTextColor ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠContext Compat . getColor ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( count Ġ== ĠmaxValue ) Ġstep per Action Color Disabled Ġelse Ġstep per Action Color ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Text Size ( pixels : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġview Counter Text . text Size Ġ= Ġpixels ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Step Callback ( callback : ĠOn Step Callback ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcallbacks . add ( callback ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Step Callback ( callback : ĠOn Step Callback ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcallbacks . remove ( callback ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnotify Step Callback ( value : ĠInt , Ġpositive : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcallbacks . forEach Ġ{ Ġit . on Step ( value , Ġpositive ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( count Ġ!= ĠmaxValue ) Ġcount Ġ+= Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsubtract () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( count Ġ!= Ġmin Value ) Ġcount -- ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġclipping Bounds . set ( canvas . clip Bounds ) ĊĠĠĠĠĠĠĠ Ġval Ġr : ĠFloat Ġ= Ġheight . toFloat () Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġclip Path . add Round Rect ( cli pping Bounds , Ġr , Ġr , ĠPath . Direction . CW ) ĊĠĠĠĠĠĠĠ Ġcanvas . clip Path ( clip Path ) ĊĠĠĠĠĠĠĠ Ġsuper . on Draw ( canvas ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠMotion Event . isIn Bounds ( view : ĠView ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrect Ġ= ĠRect () ĊĠĠĠĠĠĠĠ Ġview . get Hit Rect ( rect ) ĊĠĠĠĠĠĠĠ Ġreturn Ġrect . contains ( x . toInt (), Ġy . toInt ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠView . setVisibility ( isVisible : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvisibility Ġ= Ġif Ġ( isVisible ) ĠView . VISIBLE Ġelse ĠView . IN VISIBLE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠView . is LTR (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠView Compat . get Layout Direction ( this ) Ġ== ĠView Compat . LAYOUT _ DIRECTION _ LTR ĊĠĠĠ Ġ} Ċ } Ċ