package Ġcom . ham z ash ar uf . floor _ planner Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . Motion Event Ċ import Ġandroidx . appcompat . widget . AppCompat ImageView Ċ import Ġcom . ham z ash ar uf . floor _ planner . model . Point Ċ import Ġcom . ham z ash ar uf . floor _ planner . model . Polygon Ċ Ċ /** Ċ Ġ* ĠThis Ġclass Ġrepresents Ġa Ġvirtual Ġfloor Ġpl anner Ġthat Ġcan Ġbe Ġused Ġas Ġa Ġview Ċ Ġ* Ġcomponent Ġin Ġandroid . Ċ Ġ* Ċ Ġ* Ġ@ author ĠH am za ĠSh ar af Ġ< ham z ash ar uf 2 0 @ gmail . com > Ċ Ġ* Ġ@ constructor ĠCreates Ġa Ġview Ġwith Ġgiven Ġattributes Ġand Ġa Ġ[ Floor Planner ] Ġobject . Ċ Ġ*/ Ċ class ĠFloor Planner View Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠ Ġcontext : ĠContext , Ġattrs : ĠAttributeSet ? Ġ= Ġnull , Ġdef Style Attr : ĠInt Ġ= Ġ 0 Ċ ) Ġ: ĠAppCompat ImageView ( context , Ġattrs , Ġdef Style Attr ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġinterface Ġrepresents Ġthe Ġcallback Ġto Ġbe Ġinvoked Ġwhen Ġthe ĊĠĠĠĠ Ġ* Ġuser Ġinteract s Ġwith Ġthe Ġfloor Ġpl anner . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinterface ĠOn Coordinates Updated Listener Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCallback Ġfunction Ġwhen Ġthe Ġuser Ġinteract s Ġwith Ġthe Ġpolygon Ġvertex es . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġpolygon Ġthe Ġupdated Ġpolygon Ġinstance ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġon Coordinates Updated ( polygon : ĠPolygon ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġfloor Ġpl anner Ġobjects Ġwhich Ġholds Ġthe Ġmain Ġfeatures ĊĠĠĠĠ Ġ* Ġand Ġfunctions Ġof Ġthe Ġfloor Ġpl anner . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġfloor Planner Ġ= ĠFloor Planner ( width , Ġheight ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġgraphic Ġcomponent Ġof Ġthe Ġ[ Floor Planner ] Ġwhich Ġis Ġresponsible Ġof ĊĠĠĠĠ Ġ* Ġdrawing Ġand Ġupdating Ġthe Ġpolygon Ġon Ġthe Ġ[ Floor Planner View ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġgraphics Ġ= ĠFloor Planner Graphics ( floor Planner ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġcontrol Ġcomponent Ġof Ġthe Ġ[ Floor Planner ] Ġwhich Ġis Ġresponsible Ġof ĊĠĠĠĠ Ġ* Ġcontrolling Ġthe Ġuser Ġinteractions Ġand Ġmotion Ġgest ures Ġof Ġthe Ġ[ Floor Planner View ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġcontrols Ġ= ĠFloor Planner Controls ( floor Planner ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠListener Ġobject Ġfor Ġprocessing Ġuser Ġinteraction Ġwith Ġthe Ġvertex es . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġon Coordinates Updated Listener : ĠOn Coordinates Updated Listener ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġup Ġthe Ġcomponents Ġand Ġfloor Ġpl anner Ġwith Ġthe Ġsupplied Ġor Ġdefault Ġattributes . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext . theme . obtain Styled Attributes ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattrs , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . style able . Floor Planner View , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 , Ġ 0 ĊĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Marker Radius ( getInt ( R . style able . Floor Planner View _ marker Radius , ĠFloor Planner . DEFAULT _ MARKER _ RADIUS )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Polygon Stroke Width ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Float ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . style able . Floor Planner View _ polygon Stroke Width , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFloor Planner . DEFAULT _ ST RO KE _ WIDTH ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Polygon Width Ratio ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Float ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . style able . Floor Planner View _ polygon Width Ratio , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFloor Planner . INITIAL _ POLYGON _ WIDTH _ RATIO ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Polygon Height Ratio ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Float ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . style able . Floor Planner View _ polygon Height Ratio , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFloor Planner . INITIAL _ POLYGON _ HEIGHT _ RATIO ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Box Padding ( get Float ( R . style able . Floor Planner View _ box Padding , ĠFloor Planner Controls . DEFAULT _ BOX _ P ADDING )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Extended Touch Radius ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Int ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . style able . Floor Planner View _ extended Touch Radius , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFloor Planner Controls . DEFAULT _ EXT ENDED _ VERTEX _ TO UCH _ RADIUS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Marker Color ( getColor ( R . style able . Floor Planner View _ marker Color , ĠFloor Planner Graphics . DEFAULT _ MARKER _ COLOR )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Stroke Color ( getColor ( R . style able . Floor Planner View _ stroke Color , ĠFloor Planner Graphics . DEFAULT _ ST RO KE _ COLOR )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Fill Color ( getColor ( R . style able . Floor Planner View _ fill Color , ĠFloor Planner Graphics . DEFAULT _ FILL _ COLOR )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cycle () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDraw s Ġthe Ġfloor Ġplan 's Ġpolygon Ġand Ġvertex es Ġat Ġtheir Ġspecified ĊĠĠĠĠ Ġ* Ġcoordinates . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcanvas ĠCanvas Ġon Ġwhich Ġto Ġdraw Ġthe Ġpolygon Ġand Ġvertex es . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Draw ( canvas ) ĊĠĠĠĠĠĠĠ Ġcanvas ?. let Ġ{ Ġgraphics . draw ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRes izes Ġand Ġre positions Ġthe Ġfloor Ġpl anner Ġaccording Ġto Ġthe Ġnew Ġwidth Ġand Ġheight . ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġis Ġcalled Ġwhen Ġthe Ġsize Ġof Ġthe Ġview Ġhas Ġchanged . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġw ĠCurrent Ġwidth Ġof Ġthe Ġview ĊĠĠĠĠ Ġ* Ġ@ param Ġh ĠCurrent Ġheight Ġof Ġthe Ġview ĊĠĠĠĠ Ġ* Ġ@ param Ġold W ĠOld Ġwidth Ġof Ġthe Ġview ĊĠĠĠĠ Ġ* Ġ@ param Ġold H ĠOld Ġheight Ġof Ġthe Ġview ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Size Changed ( w : ĠInt , Ġh : ĠInt , Ġold W : ĠInt , Ġold H : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Size Changed ( w , Ġh , Ġold W , Ġold H ) ĊĠĠĠĠĠĠĠ Ġfloor Planner . width Ġ= Ġw ĊĠĠĠĠĠĠĠ Ġfloor Planner . height Ġ= Ġh ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHandles Ġtouch Ġactions Ġto Ġupdate Ġthe Ġposition Ġof Ġthe Ġpolygon Ġaccordingly . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġevent ĠThe Ġmotion Ġevent Ġthat Ġwas Ġfired . ĊĠĠĠĠ Ġ* Ġ@ return ĠTrue Ġif Ġthe Ġevent Ġwas Ġhandled , Ġfalse Ġotherwise . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Touch Event ( event : ĠMotion Event ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Touch Event ( event ) ĊĠĠĠĠĠĠĠ Ġevent ?. let Ġ{ Ġcontrols . handle Event ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠ Ġon Coordinates Updated Listener ?. on Coordinates Updated ( floor Planner . polygon ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġcurrent Ġpolygon Ġobject Ġwhich Ġinclude Ġinformation Ġabout Ġthe ĊĠĠĠĠ Ġ* Ġpolygon , Ġits Ġsides , Ġand Ġthe Ġvertex es Ġwith Ġtheir Ġcoordinates . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġpolygon : ĠPolygon ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġfloor Planner . polygon ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġdirect Ġaccessor Ġfor Ġthe Ġvertex es Ġcoordinates Ġon Ġthe Ġpolygon . ĊĠĠĠĠ Ġ* ĠNote Ġthat Ġthese Ġcoordinates Ġare Ġrelated Ġto Ġthe Ġposition Ġof Ġthe Ġcoordinates ĊĠĠĠĠ Ġ* Ġwith Ġrespect Ġto Ġthe Ġ[ Floor Planner View ] Ġand Ġnot Ġfor Ġthe Ġentire Ġscreen . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġvertex es : ĠList < Point > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġpolygon . vertex es ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġcolor Ġof Ġthe Ġpolygon Ġfill . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Fill Color ( color : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġgraphics . fill Color Ġ= Ġcolor ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġcolor Ġof Ġthe Ġouter Ġborders Ġof Ġthe Ġpolygon . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Stroke Color ( color : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġgraphics . stroke Color Ġ= Ġcolor ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġcolor Ġof Ġthe Ġmarker Ġwhich Ġis Ġused Ġto Ġdescribe ĊĠĠĠĠ Ġ* Ġa Ġpolygon Ġvertex Ġon Ġthe Ġ[ Floor Planner View ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Marker Color ( color : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġgraphics . marker Color Ġ= Ġcolor ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġradius Ġof Ġthe Ġmarker Ġwhich Ġis Ġused Ġto Ġdescribe ĊĠĠĠĠ Ġ* Ġa Ġpolygon Ġvertex Ġon Ġthe Ġ[ Floor Planner View ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Marker Radius ( radius : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfloor Planner . marker Radius Ġ= Ġradius ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġwidth Ġof Ġthe Ġouter Ġborders Ġof Ġthe Ġpolygon . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Polygon Stroke Width ( width : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfloor Planner . stroke Width Ġ= Ġwidth ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDescri bes Ġthe Ġwidth Ġratio Ġthe Ġpolygon Ġwill Ġtake Ġout Ġof Ġthe ĊĠĠĠĠ Ġ* Ġfull Ġ[ Floor Planner ] Ġwidth Ġonce Ġit 's Ġdrawn Ġfor Ġthe Ġfirst Ġtime . ĊĠĠĠĠ Ġ* Ġshould Ġbe Ġbetween Ġ 0 . 6 Ġand Ġ 1 . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Polygon Width Ratio ( ratio : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfloor Planner . polygon Width Ratio Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġratio Ġ< Ġ 0 . 6 Ġ-> Ġ 0 . 6 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġratio Ġ> Ġ 1 Ġ-> Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġratio ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDescri bes Ġthe Ġheight Ġratio Ġthe Ġpolygon Ġwill Ġtake Ġout Ġof Ġthe ĊĠĠĠĠ Ġ* Ġfull Ġ[ Floor Planner ] Ġheight Ġonce Ġit 's Ġdrawn Ġfor Ġthe Ġfirst Ġtime . ĊĠĠĠĠ Ġ* Ġshould Ġbe Ġbetween Ġ 0 . 5 Ġand Ġ 1 . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Polygon Height Ratio ( ratio : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfloor Planner . polygon Height Ratio Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġratio Ġ< Ġ 0 . 6 Ġ-> Ġ 0 . 6 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġratio Ġ> Ġ 1 Ġ-> Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġratio ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġadditional Ġimag inary Ġradius Ġto Ġthe Ġvertex Ġto Ġmake Ġthe Ġtouch Ġevent Ġon Ġthe Ġradius Ġmore ĊĠĠĠĠ Ġ* Ġeasy Ġfor Ġthe Ġuser . ĠDefault Ġvalue Ġis Ġ 3 0 . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġradius Ġthe Ġnew Ġextended Ġradius Ġvalue . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Extended Touch Radius ( radius : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontrols . extended Vertex Touch Radius Ġ= Ġradius ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd Ġpadding Ġto Ġthe Ġsurrounding Ġbox Ġto Ġprevent Ġthe Ġpolygon Ġfrom Ġexceed ing Ġthis Ġpadding ĊĠĠĠĠ Ġ* Ġand Ġto Ġhave Ġa Ġsufficient Ġspace Ġbetween Ġthe Ġbox Ġborders Ġand Ġthe Ġpolygon . ĊĠĠĠĠ Ġ* ĠDefault Ġvalue Ġis Ġ 5 0 . ĊĠĠĠĠ Ġ* ĠNote : ĠDon 't Ġset Ġthe Ġpadding Ġto Ġmore Ġthan Ġthe Ġ[ Floor Planner View ] Ġ< width Ġ/ Ġ 2 > Ġor Ġ< height Ġ/ Ġ 2 > ĊĠĠĠĠ Ġ* Ġas Ġit Ġwill Ġlead Ġto Ġunexpected Ġbehaviour . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġpadding Ġthe Ġpadding Ġvalue . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Box Padding ( padding : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( padding Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontrols . box Padding Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontrols . box Padding Ġ= Ġpadding ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }