/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠV ital iy ĠSy cho v Ċ Ġ* Ċ Ġ* Ġ ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġ Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* Ġ ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠĠ ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* ĠĠ Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠĠ ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠĠ ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* ĠĠ Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġcom . jav av ir ys . sector progressbar Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . graphics . Paint Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . widget . Frame Layout Ċ import Ġandroidx . annotation . Drawable Res Ċ import Ġandroidx . appcompat . content . res . AppCompat Resources Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlin . coroutines . Coroutine Context Ċ import Ġkotlin . math . min Ċ Ċ @ Suppress (" unused ") Ċ class ĠS ector ProgressBar Ċ @ Jvm Over loads Ġconstructor ( ĊĠĠĠ Ġcontext : ĠContext , ĊĠĠĠ Ġattrs : ĠAttributeSet ? Ġ= Ġnull , ĊĠĠĠ Ġdef Style Attr : ĠInt Ġ= Ġ 0 , ĊĠĠĠ Ġdef Style Res : ĠInt Ġ= Ġ 0 Ċ ) Ġ: ĠFrame Layout ( context , Ġattrs , Ġdef Style Attr , Ġdef Style Res ), ĠCor outine Scope Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġjob Ġ= ĠJob () ĊĊĠĠĠ Ġoverride Ġval Ġcoroutine Context : ĠCor outine Context Ġ= ĠDispatch ers . Main Ġ+ Ġjob ĊĊĠĠĠ Ġprivate Ġval Ġcoroutine Scope Ġ= ĠCor outine Scope ( coroutine Context ) ĊĊĠĠĠ Ġprivate Ġval Ġouter Circle Paint Ġ= ĠPaint ( Paint . ANTI _ ALIAS _ FLAG ) ĊĊĠĠĠ Ġprivate Ġval Ġradial Paint Ġ= ĠPaint ( Paint . ANTI _ ALIAS _ FLAG ) ĊĊĠĠĠ Ġprivate Ġval Ġouter Rad ial Paint : ĠPaint ĊĊĠĠĠ Ġprivate Ġval Ġcenter Background Image : ĠDrawable ? ĊĊĠĠĠ Ġprivate Ġvar Ġcenter Foreground Image : ĠDrawable ? ĊĊĠĠĠ Ġprivate Ġvar Ġr cp From Progress : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġvar Ġr cp Progress : ĠInt ĊĊĠĠĠ Ġprivate Ġvar Ġprogress Animation Flag : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtyped Array Ġ= Ġcontext . obtain Styled Attributes ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattrs , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . style able . Sector ProgressBar , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdef Style Attr , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdef Style Res ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġcenter Background Image Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtyped Array . get Drawable ( R . style able . Sector ProgressBar _ spb Center Background Image ) ĊĊĠĠĠĠĠĠĠ Ġcenter Foreground Image Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtyped Array . get Drawable ( R . style able . Sector ProgressBar _ spb Center Foreground Image ) ĊĊĠĠĠĠĠĠĠ Ġval Ġouter Circle Color Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtyped Array . getColor ( R . style able . Sector ProgressBar _ spb Outer Circle Color , Ġ 0 x 3 3 FFFFFF ) ĊĊĠĠĠĠĠĠĠ Ġval Ġouter Circle Width Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtyped Array . get Dimension ( R . style able . Sector ProgressBar _ spb Outer Circle Width , Ġ 6 f ) ĊĊĠĠĠĠĠĠĠ Ġval Ġr cp Background Rad ial Color Ġ= Ġtyped Array . getColor ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . style able . Sector ProgressBar _ spb Background Rad ial Color , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 3 3 FFFFFF ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġr cp Foreground Rad ial Color Ġ= Ġtyped Array . getColor ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . style able . Sector ProgressBar _ spb Foreground Rad ial Color , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠColor . WHITE ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġr cp Progress Ġ= Ġtyped Array . getInt ( R . style able . Sector ProgressBar _ spb Progress , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġouter Circle Paint . style Ġ= ĠPaint . Style . ST RO KE ĊĠĠĠĠĠĠĠ Ġouter Circle Paint . stroke Width Ġ= Ġouter Circle Width ĊĠĠĠĠĠĠĠ Ġouter Circle Paint . color Ġ= Ġouter Circle Color ĊĊĠĠĠĠĠĠĠ Ġradial Paint . style Ġ= ĠPaint . Style . FILL ĊĠĠĠĠĠĠĠ Ġradial Paint . stroke Width Ġ= Ġ 4 f ĊĠĠĠĠĠĠĠ Ġradial Paint . color Ġ= Ġr cp Background Rad ial Color ĊĊĠĠĠĠĠĠĠ Ġouter Rad ial Paint Ġ= ĠPaint ( radial Paint ) ĊĠĠĠĠĠĠĠ Ġouter Rad ial Paint . color Ġ= Ġr cp Foreground Rad ial Color ĊĊĠĠĠĠĠĠĠ Ġtyped Array . recycle () ĊĊĠĠĠĠĠĠĠ Ġset BackgroundColor ( Color . TRANSP ARENT ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Attached To Window () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Attached To Window () ĊĠĠĠĠĠĠĠ Ġjob . start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Detached From Window () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Detached From Window () ĊĠĠĠĠĠĠĠ Ġjob . cancel () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Draw ( canvas ) ĊĠĠĠĠĠĠĠ Ġdraw Center Images ( canvas ) ĊĠĠĠĠĠĠĠ Ġdraw Rad ial s ( canvas ) ĊĠĠĠĠĠĠĠ Ġdraw Outer Circle ( canvas ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Rad ial s ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġmin ( width , Ġheight ) ĊĠĠĠĠĠĠĠ Ġval Ġstart Pos Ġ= Ġ( size Ġ* Ġ 0 . 0 1 Ġ* Ġ 7 ). toInt () ĊĠĠĠĠĠĠĠ Ġval Ġend Pos Ġ= Ġ( size Ġ* Ġ 0 . 0 1 Ġ* Ġ 1 4 ). toInt () ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. 3 6 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( i Ġ/ Ġ 2 ) Ġ% Ġ 2 Ġ== Ġ 0 ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . save () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . translate ( width Ġ/ Ġ 2 f , Ġheight Ġ/ Ġ 2 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . rotate ( i . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Line ( 0 f , Ġ- height Ġ/ Ġ 2 f Ġ+ Ġstart Pos , Ġ 0 f , Ġ- height Ġ/ Ġ 2 f Ġ+ Ġend Pos , Ġradial Paint ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . restore () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdraw Progress ( canvas , Ġstart Pos , Ġend Pos ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Progress ( canvas : ĠCanvas , Ġstart Pos : ĠInt , Ġend Pos : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfrom Value Ġ= Ġ( 3 6 0 Ġ* Ġr cp From Progress ) Ġ/ Ġ 1 0 0 ĊĠĠĠĠĠĠĠ Ġval Ġto Value Ġ= Ġ( 3 6 0 Ġ* Ġr cp Progress ) Ġ/ Ġ 1 0 0 ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġfrom Value .. to Value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( i Ġ/ Ġ 2 ) Ġ% Ġ 2 Ġ== Ġ 0 ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . save () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . translate ( width Ġ/ Ġ 2 f , Ġheight Ġ/ Ġ 2 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . rotate ( i . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Line ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- height Ġ/ Ġ 2 f Ġ+ Ġstart Pos , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- height Ġ/ Ġ 2 f Ġ+ Ġend Pos , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġouter Rad ial Paint ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . restore () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Center Images ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcenter Background Image ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġmin ( width , Ġheight ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Pos Ġ= Ġ( size Ġ* Ġ 0 . 0 1 Ġ* Ġ 1 9 . 4 4 ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . setBounds ( start Pos , Ġstart Pos , Ġsize Ġ- Ġstart Pos , Ġsize Ġ- Ġstart Pos ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . draw ( canvas ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcenter Foreground Image ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . save () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . setBounds ( 0 , Ġ 0 , Ġit . intrinsic Width , Ġit . intrinsic Height ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . translate (( width Ġ- Ġit . intrinsic Width ) Ġ/ Ġ 2 f , Ġ( height Ġ- Ġit . intrinsic Height ) Ġ/ Ġ 2 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . draw ( canvas ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . restore () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Outer Circle ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġradius Ġ= Ġmin ( width , Ġheight ) Ġ/ Ġ 2 f Ġ- Ġouter Circle Paint . stroke Width ĊĠĠĠĠĠĠĠ Ġcanvas . draw Circle ( width Ġ/ Ġ 2 f , Ġheight Ġ/ Ġ 2 f , Ġradius , Ġouter Circle Paint ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Measure ( width Measure Spec : ĠInt , Ġheight Measure Spec : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Measure ( width Measure Spec , Ġheight Measure Spec ) ĊĠĠĠĠĠĠĠ Ġval Ġdefault Width Ġ= Ġ 1 9 0 Ġ+ Ġpadding Left Ġ+ Ġpadding Right ĊĠĠĠĠĠĠĠ Ġval Ġdefault Height Ġ= Ġ 1 9 0 Ġ+ Ġpadding Top Ġ+ Ġpadding Bottom ĊĠĠĠĠĠĠĠ Ġval Ġmeasured Width Ġ= Ġre concile Size ( default Width , Ġwidth Measure Spec ) ĊĠĠĠĠĠĠĠ Ġval Ġmeasured Height Ġ= Ġre concile Size ( default Height , Ġheight Measure Spec ) ĊĊĠĠĠĠĠĠĠ Ġset Measured Dimension ( meas ured Width , Ġmeasured Height ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġre concile Size ( size : ĠInt , Ġmeasure Spec : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmeasure Spec Mode Ġ= ĠMeasure Spec . get Mode ( measure Spec ) ĊĠĠĠĠĠĠĠ Ġval Ġmeasure Spec Size Ġ= ĠMeasure Spec . getSize ( measure Spec ) ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( measure Spec Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMeasure Spec . EX ACT LY Ġ-> Ġmeasure Spec Size ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMeasure Spec . UNSPECIFIED Ġ-> Ġsize ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMeasure Spec . AT _ MO ST Ġ-> Ġif Ġ( measure Spec Size Ġ< Ġsize ) Ġmeasure Spec Size Ġelse Ġsize ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsize ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Progress () Ġ= Ġr cp Progress ĊĊĠĠĠ Ġfun Ġset Progress ( progress : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( progress Ġ== ĠIN FIN ITE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Animation Progress () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Animation Progress () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( progress Ġ!= Ġr cp Progress ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr cp Progress Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Ġ> Ġ 1 0 0 Ġ-> Ġ 1 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Ġ< Ġ 0 Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġprogress ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Animation Progress () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( progress Animation Flag ) Ġreturn ĊĠĠĠĠĠĠĠ Ġprogress Animation Flag Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġcoroutine Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( progress Animation Flag ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr cp From Progress Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġincrement Value With Delay Ġ{ Ġr cp Progress Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġincrement Value With Delay Ġ{ Ġr cp From Progress Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr cp Progress Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr cp From Progress Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġincrement Value With Delay ( ĊĠĠĠĠĠĠĠ Ġrange : ĠInt Range Ġ= Ġ 0 .. 1 0 0 , ĊĠĠĠĠĠĠĠ Ġcallback : Ġ( value : ĠInt ) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġrange ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( progress Animation Flag . not ()) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate With Delay ( 5 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġinvalidate With Delay ( delay In Ms : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Main ) Ġ{ Ġinvalidate () Ġ} ĊĠĠĠĠĠĠĠ Ġdelay ( delay In Ms ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstop Animation Progress () Ġ{ ĊĠĠĠĠĠĠĠ Ġprogress Animation Flag Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Center Foreground Image (@ Drawable Res Ġdrawable Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcenter Foreground Image Ġ= ĠAppCompat Resources . get Drawable ( context , Ġdrawable Id ) ĊĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠIN FIN ITE Ġ= ĠInt . MIN _ VALUE ĊĠĠĠ Ġ} Ċ }