package Ġcom . g no e mes . shim ori . common . compose Ċ Ċ import Ġandroid . view . Motion Event Ċ import Ġandroidx . compose . foundation . Canvas Ċ import Ġandroidx . compose . foundation . background Ċ import Ġandroidx . compose . foundation . layout .* Ċ import Ġandroidx . compose . foundation . shape . Generic Shape Ċ import Ġandroidx . compose . material . Material Theme Ċ import Ġandroidx . compose . runtime .* Ċ import Ġandroidx . compose . ui . Experimental Compose Ui Api Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . draw . clip Ċ import Ġandroidx . compose . ui . geometry . Offset Ċ import Ġandroidx . compose . ui . geometry . Size Ċ import Ġandroidx . compose . ui . graphics . Color Ċ import Ġandroidx . compose . ui . graphics . Path Ċ import Ġandroidx . compose . ui . graphics . Solid Color Ċ import Ġandroidx . compose . ui . input . pointer . pointer Interop Filter Ċ import Ġandroidx . compose . ui . layout . on Size Changed Ċ import Ġandroidx . compose . ui . tool ing . preview . Preview Ċ import Ġandroidx . compose . ui . unit . dp Ċ import Ġandroidx . compose . ui . unit . to Size Ċ import Ġcom . g no e mes . shim ori . common . compose . theme . Sh im ori Theme Ċ import Ġkotlin . math . cos Ċ import Ġkotlin . math . round ToInt Ċ import Ġkotlin . math . sin Ċ Ċ @ Opt In ( Experimental Compose Ui Api :: class ) Ċ @ Composable Ċ fun ĠRating Bar ( ĊĠĠĠ Ġmodifier : ĠModifier Ġ= ĠModifier , ĊĠĠĠ Ġrating : ĠFloat , ĊĠĠĠ Ġcolor : ĠColor Ġ= ĠMaterial Theme . colors . secondary , ĊĠĠĠ Ġstep Size : ĠStep Size Ġ= ĠStep Size . Half , ĊĠĠĠ Ġnum St ars : ĠInt Ġ= Ġ 5 , ĊĠĠĠ Ġon Rating Changed : Ġ( rating : ĠFloat ) Ġ-> ĠUnit Ġ= Ġ{} Ċ ) Ġ{ ĊĠĠĠ Ġvar Ġinternal Rating Ġ= Ġrating ĊĠĠĠ Ġvar Ġrow Size Ġby Ġremember Ġ{ Ġmutable State Of ( Size . Zero ) Ġ} ĊĊĠĠĠ ĠRow ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= Ġmodifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. wrap Content Size () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Size Changed Ġ{ Ġrow Size Ġ= Ġit . to Size () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. pointer Interop Filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Rating Ġ= Ġcalculate Rating ( it . x , Ġrow Size . width ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Rating Changed ( internal Rating . step Round ( step Size )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ MOVE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx 1 Ġ= Ġit . x . coerce In ( 0 f , Ġrow Size . width ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Rating Ġ= Ġcalculate Rating ( x 1 , Ġrow Size . width ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Rating Changed ( internal Rating . step Round ( step Size )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ( 1 .. num St ars ). forEach Ġ{ Ġstep Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstep Rating Ġ= Ġinternal Rating . step Round ( step Size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstar Progress Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep Rating Ġ> Ġstep Ġ-> Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep . rem ( step Rating ) Ġ< Ġ 1 Ġ-> Ġstep Rating Ġ- Ġ( step Ġ- Ġ 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠRating Star ( star Progress , Ġcolor ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Composable Ċ private Ġfun ĠRating Star ( ĊĠĠĠ Ġrating : ĠFloat , ĊĠĠĠ Ġrating Color : ĠColor Ġ= ĠMaterial Theme . colors . secondary , ĊĠĠĠ ĠbackgroundColor : ĠColor Ġ= ĠMaterial Theme . colors . secondary Variant Ċ ) Ġ{ ĊĊĊĠĠĠ ĠBox With Constraints ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fill Max Height () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. aspect Ratio ( 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. clip ( star Shape ) ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠCanvas ( modifier Ġ= ĠModifier . size ( max Height )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Rect ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbrush Ġ= ĠSolid Color ( backgroundColor ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ= ĠSize ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ= Ġsize . height Ġ* Ġ 1 . 4 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Ġ= Ġsize . width Ġ* Ġ 1 . 4 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Left Ġ= ĠOffset ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ= Ġ-( size . width Ġ* Ġ 0 . 1 f ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Ġ= Ġ-( size . height Ġ* Ġ 0 . 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rating Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Rect ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbrush Ġ= ĠSolid Color ( rating Color ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ= ĠSize ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ= Ġsize . height Ġ* Ġ 1 . 1 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Ġ= Ġsize . width Ġ* Ġrating ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġval Ġstar Shape Ġ= ĠGeneric Shape Ġ{ Ġsize , Ġ_ Ġ-> ĊĠĠĠ Ġadd Path ( star Path ( size . height )) Ċ } Ċ Ċ private Ġval Ġstar Path Ġ= Ġ{ Ġsize : ĠFloat Ġ-> ĊĊĠĠĠ ĠPath (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġouter Radius : ĠFloat Ġ= Ġsize Ġ/ Ġ 3 f ĊĠĠĠĠĠĠĠ Ġval Ġinner Radius : ĠDouble Ġ= Ġouter Radius Ġ/ Ġ 2 . 0 ĊĠĠĠĠĠĠĠ Ġvar Ġrot : ĠDouble Ġ= ĠMath . PI Ġ/ Ġ 2 Ġ* Ġ 3 ĊĠĠĠĠĠĠĠ Ġval Ġcx : ĠFloat Ġ= Ġsize Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġval Ġcy : ĠFloat Ġ= Ġsize Ġ/ Ġ 2 0 Ġ* Ġ 1 1 ĊĠĠĠĠĠĠĠ Ġvar Ġx : ĠFloat Ġ= Ġcx ĊĠĠĠĠĠĠĠ Ġvar Ġy : ĠFloat Ġ= Ġcy ĊĠĠĠĠĠĠĠ Ġval Ġstep Ġ= ĠMath . PI Ġ/ Ġ 5 ĊĊĊĠĠĠĠĠĠĠ Ġmove To ( cx , Ġcy Ġ- Ġouter Radius ) ĊĠĠĠĠĠĠĠ Ġrepeat ( 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ= Ġ( cx Ġ+ Ġcos ( rot ) Ġ* Ġouter Radius ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy Ġ= Ġ( cy Ġ+ Ġsin ( rot ) Ġ* Ġouter Radius ). toFloat () ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġline To ( x , Ġy ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrot Ġ+= Ġstep ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ= Ġ( cx Ġ+ Ġcos ( rot ) Ġ* Ġinner Radius ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy Ġ= Ġ( cy Ġ+ Ġsin ( rot ) Ġ* Ġinner Radius ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline To ( x , Ġy ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrot Ġ+= Ġstep ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠ Ġ} Ċ } Ċ Ċ sealed Ġclass ĠStep Size Ġ{ ĊĠĠĠ Ġobject ĠRaw Ġ: ĠStep Size () ĊĠĠĠ Ġobject ĠHalf Ġ: ĠStep Size () ĊĠĠĠ Ġobject ĠOne Ġ: ĠStep Size () Ċ } Ċ Ċ private Ġfun Ġcalculate Rating ( x : ĠFloat , Ġrow Width : ĠFloat , Ġnum St ars : ĠInt Ġ= Ġ 5 ): ĠFloat Ġ{ ĊĠĠĠ Ġreturn Ġ( x Ġ/ Ġ( row Width Ġ/ Ġnum St ars )). coerce In ( 0 f , Ġnum St ars . toFloat ()) Ċ } Ċ Ċ private Ġfun ĠFloat . step Round ( step Size : ĠStep Size ): ĠFloat Ġ{ ĊĠĠĠ Ġreturn Ġ( when Ġ( step Size ) Ġ{ ĊĠĠĠĠĠĠĠ ĠStep Size . Raw Ġ-> Ġthis ĊĠĠĠĠĠĠĠ ĠStep Size . Half Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpart Ġ= Ġ( this Ġ* Ġ 1 0 ). toInt () Ġ% Ġ 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpart Ġ> Ġ 5 Ġ-> Ġthis . toInt (). plus ( 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpart Ġ> Ġ 0 Ġ-> Ġthis . toInt (). plus ( 0 . 5 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthis . toInt (). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠStep Size . One Ġ-> Ġthis . round ToInt (). toFloat () ĊĠĠĠ Ġ}) Ċ } Ċ Ċ @ Preview Ċ @ Composable Ċ fun ĠRating Bar Preview () Ġ{ ĊĠĠĠ ĠSh im ori Theme ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuse Dark Colors Ġ= Ġtrue ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠColumn ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fill MaxSize () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. background ( Material Theme . colors . surface ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRating Bar ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . height ( 4 0 . dp ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 3 . 5 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }