package Ġcom . zoom car . u ikit . performance meter Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Corner Path Effect Ċ import Ġandroid . graphics . Paint Ċ import Ġandroid . graphics . Path Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroid . os . Build Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . View Ċ import Ġandroidx . annotation . Color Res Ċ import Ġandroidx . annotation . Drawable Res Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . core . view . isVisible Ċ import Ġcom . zoom car . util . get Null Check Ċ import Ġcom . zoom car . zoom d ls . R Ċ Ċ /** Ċ Ġ* ĠPerformance Ġmeter Ġcustom Ġview . Ċ Ġ* ĠCan Ġdisplay Ġscores Ġr anging Ġfrom Ġ 0 Ġto Ġ 1 0 0 . Ċ Ġ* Ċ Ġ* Ġ@ created Ġ 0 7 / 1 0 / 2 0 2 1 Ġ- Ġ 1 : 0 0 ĠPM Ċ Ġ* Ġ@ project ĠZoom car Ċ Ġ* Ġ@ author ĠSh ish ir Ċ Ġ* Ġ@ author ĠG ide on ĠPaul Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 ĠZoom car . ĠAll Ġrights Ġreserved . Ċ Ġ*/ Ċ // ĠOrigin ally Ġauth ored Ġby ĠSh ish ir . Ċ // Moved Ġto ĠD LS Ġby ĠG ide on ĠPaul . Ċ class ĠZ Performance Meter Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠ Ġcontext : ĠContext , Ġattrs : ĠAttributeSet ? Ġ= Ġnull , Ġdef Style Attr : ĠInt Ġ= Ġ 0 Ċ ) Ġ: ĠView ( context , Ġattrs , Ġdef Style Attr ) Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġdata : ĠZ Performance Meter UI Model ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġpath : ĠPath Ġ= ĠPath () ĊĊĠĠĠ Ġprivate Ġval ĠmarginTop Bottom For Meter Ġ= ĊĠĠĠĠĠĠĠ Ġcontext . resources . get Dimension ( R . dim en . meter _ top _ bottom _ margin ) ĊĠĠĠ Ġprivate Ġval ĠmarginTop For Pointer Ġ= ĊĠĠĠĠĠĠĠ Ġcontext . resources . get Dimension ( R . dim en . meter _ top _ margin _ for _ pointer ) ĊĠĠĠ Ġprivate Ġval Ġpointer Size Ġ= Ġcontext . resources . get Dimension Pixel Size ( R . dim en . meter _ pointer _ size ) ĊĠĠĠ Ġprivate Ġval Ġbar Meter Height Ġ= Ġcontext . resources . get Dimension ( R . dim en . bar _ meter _ height ) ĊĠĠĠ Ġprivate Ġval Ġcorner Radius Ġ= Ġcontext . resources . get Dimension ( R . dim en . meter _ corner _ radius ) ĊĊĠĠĠ Ġprivate Ġval Ġcorner Effect Ġ= ĠCor ner Path Effect ( corner Radius ) ĊĊĠĠĠ Ġ// ĠPaint Ġfor Ġfilling Ġranges Ġinside Ġcolored Ġbar . ĊĠĠĠ Ġprivate Ġval Ġrank Scale Paint Ġ= ĊĠĠĠĠĠĠĠ ĠPaint (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstyle Ġ= ĠPaint . Style . FILL ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠPaint Ġfor Ġtext Ġinside Ġthe Ġcolored Ġbar ĊĠĠĠ Ġprivate Ġval Ġtext Paint Ġ= ĊĠĠĠĠĠĠĠ ĠPaint (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= ĠContext Compat . getColor ( context , ĠR . color . white ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextAlign Ġ= ĠPaint . Align . CENTER ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Size Ġ= Ġcontext . resources . get Dimension ( R . dim en . performance _ meter _ label _ text _ size ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠPaint Ġfor Ġtext Ġfor Ġmiddle Ġcolored Ġbars Ġbottom Ġlabel Ġas Ġtext Ġalignment Ġis Ġneeded Ġcenter ĊĠĠĠ Ġprivate Ġval Ġlabel Paint Ġ= ĊĠĠĠĠĠĠĠ ĠPaint (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= ĠContext Compat . getColor ( context , ĠR . color . phantom _ grey _ 0 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextAlign Ġ= ĠPaint . Align . CENTER ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Size Ġ= Ġcontext . resources . get Dimension ( R . dim en . performance _ meter _ label _ text _ size ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠsetData ( data : ĠZ Performance Meter UI Model ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġdata ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . data Ġ= Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . isVisible Ġ= Ġdata . performance Meter Ranges . get Null Check () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Attached To Window () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Attached To Window () ĊĠĠĠĠĠĠĠ Ġval Ġlp Ġ= Ġlayout Params . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ= Ġcontext . resources . get Dimension Pixel Size ( R . dim en . performance _ meter _ height ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlayout Params Ġ= Ġlp ĊĠĠĠĠĠĠĠ Ġset Will Not Draw ( false ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġcanvas ?. let Ġ{ Ġcanvas Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata ?. performance Meter Ranges ?. map Indexed Ġ{ Ġindex , Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtop Ġ= ĠmarginTop Bottom For Meter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbottom Ġ= Ġbar Meter Height Ġ+ ĠmarginTop Bottom For Meter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft Ġ= Ġ( item . low Ġ?: Ġ 0 ) Ġ* Ġ 1 . 0 f Ġ/ Ġ 1 0 0 . 0 f Ġ* Ġmeasured Width . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġright Ġ= Ġ( item . high Ġ?: Ġ 0 ) Ġ* Ġ 1 . 0 f Ġ/ Ġ 1 0 0 . 0 f Ġ* Ġmeasured Width . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . reset () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPath Ġdrawn Ġconsidering Ġcur ved Ġedges . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . moveTo ( right , Ġtop ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . lineTo ( left , Ġtop ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . lineTo ( left , Ġbottom ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . lineTo ( right , Ġbottom ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( data ?. performance Meter Ranges ?. size Ġ?: Ġ 0 ) Ġ- Ġ 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPath Ġdrawn Ġconsidering Ġcur ved Ġedges . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . moveTo ( left , Ġtop ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . lineTo ( right , Ġtop ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . lineTo ( right , Ġbottom ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . lineTo ( left , Ġbottom ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . moveTo ( left , Ġtop ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . lineTo ( right , Ġtop ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . lineTo ( right , Ġbottom ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . lineTo ( left , Ġbottom ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠChange Ġthe Ġcolor Ġof Ġthe Ġrank Scale Paint Ġaccording Ġto Ġrange 's Ġcolor . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . scale Color ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrank Scale Paint . color Ġ= ĠContext Compat . getColor ( context , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRound Ġthe Ġcorners Ġif Ġeither Ġfirst Ġor Ġlast Ġelements . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== Ġ 0 Ġ|| Ġindex Ġ== Ġdata ?. performance Meter Ranges ?. last Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrank Scale Paint . path Effect Ġ= Ġcorner Effect ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrank Scale Paint . path Effect Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Path ( path , Ġrank Scale Paint ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġlabels Ġinside Ġbars . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġx Pos Ġ= Ġ( left Ġ+ Ġright ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġy Pos Ġ= Ġ(( top Ġ+ Ġbottom ) Ġ/ Ġ 2 ) Ġ- Ġ( text Paint . desc ent () Ġ+ Ġtext Paint . as cent ()) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Text ( item . label Ġ?: Ġ"", Ġx Pos , Ġy Pos , Ġtext Paint ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġlabels Ġbelow Ġbar . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Pos Ġ= Ġbottom Ġ+ Ġbar Meter Height Ġ* Ġ 3 Ġ/ Ġ 5 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Pos Ġ= Ġleft Ġ+ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Text ( item . low . toString (), Ġx Pos , Ġy Pos , Ġlabel Paint . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextAlign Ġ= ĠPaint . Align . LEFT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== Ġ( data ?. performance Meter Ranges ?. size Ġ?: Ġ 0 ) Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Pos Ġ= Ġright Ġ- Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Text ( item . high . toString (), Ġx Pos , Ġy Pos , Ġlabel Paint . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextAlign Ġ= ĠPaint . Align . RIGHT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Pos Ġ= Ġright ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Text ( item . high . toString (), Ġx Pos , Ġy Pos , Ġlabel Paint . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextAlign Ġ= ĠPaint . Align . CENTER ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġpointer Ġfor Ġscore . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpointer X Ġ= Ġwidth Ġ* Ġ(( data ?. score Ġ?: Ġ 0 ) Ġ* Ġ 1 . 0 f Ġ/ Ġ 1 0 0 . 0 f ) Ġ- Ġpointer Size Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpointer Y Ġ= ĠmarginTop For Pointer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . translate ( pointer X , Ġpointer Y ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata ?. performance Meter Ranges ?. forEach Ġ{ Ġrank Scale Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata ?. score ?. let Ġ{ Ġscore Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( score F alls InRange ( score , Ġrank Scale )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrank Scale . pointer Image ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Pointer ( canvas , Ġit , Ġrank Scale . pointer Color ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Draw ( canvas ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Pointer ( ĊĠĠĠĠĠĠĠ Ġcanvas : ĠCanvas , ĊĠĠĠĠĠĠĠ Ġ@ Drawable Res Ġpointer Drawable Res : ĠInt , ĊĠĠĠĠĠĠĠ Ġ@ Color Res Ġt int : ĠInt ? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpointer Drawable Ġ= ĠContext Compat . get Drawable ( context , Ġpointer Drawable Res ) ĊĠĠĠĠĠĠĠ Ġpointer Drawable ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Bounds ( 0 , Ġ 0 , Ġpointer Size , Ġpointer Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt int ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Tint To Drawable ( this , Ġt int ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw ( canvas ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Tint To Drawable ( pointer : ĠDrawable , Ġpointer Color : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . LO L LI POP ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpointer . set Tint ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContext Compat . getColor ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer Color ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġscore F alls InRange ( score : ĠInt , Ġperformance Meter Range : ĠZ Performance Meter Range ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( score Ġ>= Ġperformance Meter Range . low Ġ&& Ġscore Ġ<= Ġperformance Meter Range . high ) ĊĠĠĠ Ġ} Ċ } Ċ