package Ġshapes . feature . presentation . editor Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Color . BLUE Ċ import Ġandroid . graphics . Color . GREEN Ċ import Ġandroid . graphics . Color . RED Ċ import Ġandroid . graphics . Paint Ċ import Ġandroid . graphics . Path Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . View Ċ import Ġkotlin . math . min Ċ import Ġshapes . feature . domain . Grid Constants Ċ import Ġshapes . feature . domain . Shape Domain Entity Ċ Ċ class ĠShapes View Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠ Ġcontext : ĠContext , ĊĠĠĠ Ġattrs : ĠAttributeSet ? Ġ= Ġnull , ĊĠĠĠ Ġdef Style Attr : ĠInt Ġ= Ġ 0 Ċ ) Ġ: ĠView ( context , Ġattrs , Ġdef Style Attr ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġcircle Paint : ĠPaint Ġ= ĠPaint (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġcolor Ġ= ĠBL UE ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġsquare Paint : ĠPaint Ġ= ĠPaint (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġcolor Ġ= ĠGREEN ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġtriangle Paint : ĠPaint Ġ= ĠPaint (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġcolor Ġ= ĠRED ĊĠĠĠĠĠĠĠ ĠstrokeWidth Ġ= Ġ 1 0 f ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġpath Ġ= ĠPath () ĊĠĠĠ Ġprivate Ġval Ġlast Touch Down XY Ġ= ĠFloat Array ( 2 ) ĊĠĠĠ Ġinternal Ġvar Ġclick Listener : ĠClick Listener ? Ġ= Ġnull ĊĊĠĠĠ Ġvar Ġshapes Ġ= Ġempty List < Shape Domain Entity >() ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Invalidate () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġset On Touch Listener Ġ{ Ġ_, Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event . action Mask ed Ġ== ĠMotion Event . ACTION _ DOWN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Touch Down XY [ 0 ] Ġ= Ġevent . x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Touch Down XY [ 1 ] Ġ= Ġevent . y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġset OnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Clicked Item ()?. let Ġ{ Ġclick Listener ?. on Grid Item Click ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġset On Long ClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Clicked Item ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclick Listener ?. on Grid Item Long Click ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Draw ( canvas ) ĊĠĠĠĠĠĠĠ Ġshapes . on Each Ġ{ Ġdraw Shape ( it , Ġcanvas ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Shape ( shape : ĠShape Domain Entity , Ġcanvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( shape . type ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠShape Domain Entity . Type . S QUARE Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Square ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Center X ( shape . id ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Center Y ( shape . id ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Radius () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠShape Domain Entity . Type . CIR CLE Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Circle ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Center X ( shape . id ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Center Y ( shape . id ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Radius () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠShape Domain Entity . Type . TRI ANGLE Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Triangle ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Center X ( shape . id ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Center Y ( shape . id ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Radius () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Radius (): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmin ( width Ġ/ ĠGR ID _ SIZE , Ġheight Ġ/ ĠGR ID _ SIZE ) Ġ* ĠITEM _ TO _ GRID _ ITEM _ RADIUS _ RATIO ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Center X ( grid Position : ĠInt ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitem X Position Ġ= Ġ( grid Position Ġ- Ġ 1 ) Ġ% ĠGR ID _ SIZE ĊĠĠĠĠĠĠĠ Ġval Ġitem Width Ġ= Ġwidth Ġ/ ĠGR ID _ SIZE ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ( item X Position Ġ* Ġitem Width ) Ġ+ Ġ( item Width Ġ* Ġ 0 . 5 f ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Center Y ( grid Position : ĠInt ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitem Y Position Ġ= Ġ( grid Position Ġ- Ġ 1 ) Ġ/ ĠGR ID _ SIZE ĊĠĠĠĠĠĠĠ Ġval Ġitem Height Ġ= Ġheight Ġ/ ĠGR ID _ SIZE ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ( item Y Position Ġ* Ġitem Height ) Ġ+ Ġ( item Height Ġ* Ġ 0 . 5 f ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Circle ( canvas : ĠCanvas , Ġcx : ĠFloat , Ġcy : ĠFloat , Ġradius : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcanvas . draw Circle ( cx , Ġcy , Ġradius , Ġcircle Paint ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Square ( canvas : ĠCanvas , Ġcx : ĠFloat , Ġcy : ĠFloat , Ġradius : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġleft Ġ= Ġcx Ġ- Ġradius ĊĠĠĠĠĠĠĠ Ġval Ġtop Ġ= Ġcy Ġ- Ġradius ĊĠĠĠĠĠĠĠ Ġval Ġright Ġ= Ġcx Ġ+ Ġradius ĊĠĠĠĠĠĠĠ Ġval Ġbottom Ġ= Ġcy Ġ+ Ġradius ĊĊĠĠĠĠĠĠĠ Ġcanvas . draw Rect ( left , Ġtop , Ġright , Ġbottom , Ġsquare Paint ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" Un necessary Variable ") ĊĠĠĠ Ġprivate Ġfun Ġdraw Triangle ( canvas : ĠCanvas , Ġcx : ĠFloat , Ġcy : ĠFloat , Ġradius : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġunnecessary Ġvariable Ġfor Ġbetter Ġnaming ĊĠĠĠĠĠĠĠ Ġval Ġtop X Ġ= Ġcx ĊĠĠĠĠĠĠĠ Ġval Ġtop Y Ġ= Ġcy Ġ- Ġradius ĊĊĠĠĠĠĠĠĠ Ġval Ġleft X Ġ= Ġcx Ġ- Ġradius ĊĠĠĠĠĠĠĠ Ġval Ġleft Y Ġ= Ġcy Ġ+ Ġradius ĊĊĠĠĠĠĠĠĠ Ġval Ġright X Ġ= Ġcx Ġ+ Ġradius ĊĠĠĠĠĠĠĠ Ġval Ġright Y Ġ= Ġcy Ġ+ Ġradius ĊĊĠĠĠĠĠĠĠ Ġif Ġ( FIL LED _ TRI ANGLE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath . moveTo ( top X , Ġtop Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath . lineTo ( right X , Ġright Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath . lineTo ( left X , Ġleft Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath . lineTo ( top X , Ġtop Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath . close () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Path ( path , Ġtriangle Paint ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Line ( top X , Ġtop Y , Ġright X , Ġright Y , Ġtriangle Paint ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Line ( right X , Ġright Y , Ġleft X , Ġleft Y , Ġtriangle Paint ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Line ( left X , Ġleft Y , Ġtop X , Ġtop Y , Ġtriangle Paint ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Clicked Item (): ĠShape Domain Entity ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgrid Width Ġ= Ġwidth Ġ/ ĠGR ID _ SIZE ĊĠĠĠĠĠĠĠ Ġval Ġgrid Height Ġ= Ġheight Ġ/ ĠGR ID _ SIZE ĊĊĠĠĠĠĠĠĠ Ġvar Ġclicked Item X Position Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġclicked Item Y Position Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. GRID _ SIZE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Touch Down XY [ 0 ] Ġ> Ġ( i Ġ- Ġ 1 ) Ġ* Ġgrid Width Ġ&& Ġlast Touch Down XY [ 0 ] Ġ< Ġ( i ) Ġ* Ġgrid Width ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclicked Item X Position Ġ= Ġi ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Touch Down XY [ 1 ] Ġ> Ġ( i Ġ- Ġ 1 ) Ġ* Ġgrid Height Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Touch Down XY [ 1 ] Ġ< Ġ( i ) Ġ* Ġgrid Height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclicked Item Y Position Ġ= Ġi ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġclicked Item X Position Ġ+ Ġ(( clicked Item Y Position Ġ- Ġ 1 ) Ġ* ĠGR ID _ SIZE ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġshapes . first OrNull Ġ{ Ġit . id Ġ== Ġposition Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠClick Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġon Grid Item Click ( shape Domain Entity : ĠShape Domain Entity ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġon Grid Item Long Click ( shape Domain Entity : ĠShape Domain Entity ): ĠBoolean ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠGR ID _ SIZE Ġ= ĠGrid Constants . GRID _ SIZE ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠITEM _ TO _ GRID _ ITEM _ RADIUS _ RATIO Ġ= Ġ 0 . 3 5 f ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠFIL LED _ TRI ANGLE Ġ= Ġfalse ĊĠĠĠ Ġ} Ċ } Ċ