/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* Ġ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 Ġandroidx . compose . ui . test Ċ Ċ import Ġandroidx . compose . ui . geometry . Offset Ċ import Ġandroidx . compose . ui . platform . View Configuration Ċ import Ġandroidx . compose . ui . unit . Density Ċ import Ġandroidx . compose . ui . unit . Int Size Ċ Ċ /** Ċ Ġ* ĠThe Ġreceiver Ġscope Ġof Ġall Ġinput Ġinjection Ġlamb das Ġoffered Ġin Ġ` ui - test `, Ġsuch Ġas Ċ Ġ* Ġ[ perform Touch Input ] Ġand Ġ[ perform Mouse Input ]. Ċ Ġ* Ċ Ġ* ĠThis Ġscope Ġoffers Ġseveral Ġproperties Ġthat Ġallow Ġyou Ġto Ġget Ġ[ coordinates ][ Offset ] Ġwithin Ġthe Ċ Ġ* Ġnode Ġyou 're Ġinteracting Ġon , Ġlike Ġthe Ġ[ top Left ] Ġcorner , Ġits Ġ[ center ], Ġor Ġsome Ġpercentage Ġof Ġthe Ċ Ġ* Ġsize Ġ([ percent Offset ]). Ċ Ġ* Ċ Ġ* ĠAll Ġpositional Ġproperties Ġare Ġexpressed Ġin Ġpixels . Ġ[ Injection Scope ] Ġimplements Ġ[ Density ] Ġso Ċ Ġ* Ġyou Ġcan Ġconvert Ġbetween Ġpx Ġand Ġdp Ġas Ġyou Ġwish . ĠThe Ġdensity Ġused Ġis Ġtaken Ġfrom Ġthe Ċ Ġ* Ġ[ Semantics Node ][ android x . compose . ui . semantics . Semantics Node ] Ġfrom Ġthe Ċ Ġ* Ġ[ Semantics Node Interaction ] Ġon Ġwhich Ġthe Ġinput Ġinjection Ġmethod Ġis Ġcalled . Ċ Ġ*/ Ċ interface ĠInjection Scope Ġ: ĠD ensity Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġdefault Ġtime Ġbetween Ġtwo Ġsuccess ive Ġevents . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġevent Period Millis Ġget () Ġ= ĠInput Dispatcher . event Period Millis ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġthe Ġgiven Ġ[ duration Millis ] Ġto Ġthe Ġcurrent Ġevent Ġtime , Ġdelay ing Ġthe Ġnext Ġevent Ġby Ġthat ĊĠĠĠĠ Ġ* Ġtime . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadvance Event Time ( duration Millis : ĠLong Ġ= Ġevent Period Millis ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġsize Ġof Ġthe Ġvisible Ġpart Ġof Ġthe Ġnode Ġwe 're Ġinteracting Ġwith Ġin Ġpx , Ġi . e . Ġits Ġcli pped ĊĠĠĠĠ Ġ* Ġbounds . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġvisible Size : ĠInt Size ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġ[ View Configuration ] Ġin Ġuse Ġby Ġthe ĊĠĠĠĠ Ġ* Ġ[ Semantics Node ][ android x . compose . ui . semantics . Semantics Node ] Ġfrom Ġthe ĊĠĠĠĠ Ġ* Ġ[ Semantics Node Interaction ] Ġon Ġwhich Ġthe Ġinput Ġinjection Ġmethod Ġis Ġcalled . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġview Configuration : ĠView Configuration ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġwidth Ġof Ġthe Ġnode Ġin Ġpx . ĠSh orthand Ġfor Ġ[ visible Size . width ][ visible Size ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġwidth : ĠInt Ġget () Ġ= Ġvisible Size . width ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġheight Ġof Ġthe Ġnode Ġin Ġpx . ĠSh orthand Ġfor Ġ[ visible Size . height ][ visible Size ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġheight : ĠInt Ġget () Ġ= Ġvisible Size . height ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġx - coordinate Ġfor Ġthe Ġleft Ġedge Ġof Ġthe Ġnode Ġwe 're Ġinteracting Ġwith Ġin Ġpx , Ġin Ġthe ĊĠĠĠĠ Ġ* Ġnode 's Ġlocal Ġcoordinate Ġsystem , Ġwhere Ġ( 0 , Ġ 0 ) Ġis Ġthe Ġtop Ġleft Ġcorner Ġof Ġthe Ġnode . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġleft : ĠFloat Ġget () Ġ= Ġ 0 f ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġy - coordinate Ġfor Ġthe Ġbottom Ġof Ġthe Ġnode Ġwe 're Ġinteracting Ġwith Ġin Ġpx , Ġin Ġthe ĊĠĠĠĠ Ġ* Ġnode 's Ġlocal Ġcoordinate Ġsystem , Ġwhere Ġ( 0 , Ġ 0 ) Ġis Ġthe Ġtop Ġleft Ġcorner Ġof Ġthe Ġnode . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġtop : ĠFloat Ġget () Ġ= Ġ 0 f ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġx - coordinate Ġfor Ġthe Ġcenter Ġof Ġthe Ġnode Ġwe 're Ġinteracting Ġwith Ġin Ġpx , Ġin Ġthe ĊĠĠĠĠ Ġ* Ġnode 's Ġlocal Ġcoordinate Ġsystem , Ġwhere Ġ( 0 , Ġ 0 ) Ġis Ġthe Ġtop Ġleft Ġcorner Ġof Ġthe Ġnode . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġcenter X : ĠFloat Ġget () Ġ= Ġwidth Ġ/ Ġ 2 f ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġy - coordinate Ġfor Ġthe Ġcenter Ġof Ġthe Ġnode Ġwe 're Ġinteracting Ġwith Ġin Ġpx , Ġin Ġthe ĊĠĠĠĠ Ġ* Ġnode 's Ġlocal Ġcoordinate Ġsystem , Ġwhere Ġ( 0 , Ġ 0 ) Ġis Ġthe Ġtop Ġleft Ġcorner Ġof Ġthe Ġnode . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġcenter Y : ĠFloat Ġget () Ġ= Ġheight Ġ/ Ġ 2 f ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġx - coordinate Ġfor Ġthe Ġright Ġedge Ġof Ġthe Ġnode Ġwe 're Ġinteracting Ġwith Ġin Ġpx , Ġin Ġthe ĊĠĠĠĠ Ġ* Ġnode 's Ġlocal Ġcoordinate Ġsystem , Ġwhere Ġ( 0 , Ġ 0 ) Ġis Ġthe Ġtop Ġleft Ġcorner Ġof Ġthe Ġnode . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNote Ġthat , Ġunless Ġ` width Ġ== Ġ 0 `, Ġ` right Ġ!= Ġwidth `. ĠIn Ġparticular , Ġ` right Ġ== Ġwidth Ġ- Ġ 1 f `, ĊĠĠĠĠ Ġ* Ġbecause Ġpixels Ġare Ġ 0 - based . ĠIf Ġ` width Ġ== Ġ 0 `, Ġ` right Ġ== Ġ 0 ` Ġtoo . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġright : ĠFloat Ġget () Ġ= Ġwidth . let Ġ{ Ġif Ġ( it Ġ== Ġ 0 ) Ġ 0 f Ġelse Ġit Ġ- Ġ 1 f Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġy - coordinate Ġfor Ġthe Ġbottom Ġof Ġthe Ġnode Ġwe 're Ġinteracting Ġwith Ġin Ġpx , Ġin Ġthe ĊĠĠĠĠ Ġ* Ġnode 's Ġlocal Ġcoordinate Ġsystem , Ġwhere Ġ( 0 , Ġ 0 ) Ġis Ġthe Ġtop Ġleft Ġcorner Ġof Ġthe Ġnode . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNote Ġthat , Ġunless Ġ` height Ġ== Ġ 0 `, Ġ` bottom Ġ!= Ġheight `. ĠIn Ġparticular , Ġ` bottom Ġ== Ġheight Ġ- Ġ 1 f `, ĊĠĠĠĠ Ġ* Ġbecause Ġpixels Ġare Ġ 0 - based . ĠIf Ġ` height Ġ== Ġ 0 `, Ġ` bottom Ġ== Ġ 0 ` Ġtoo . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġbottom : ĠFloat Ġget () Ġ= Ġheight . let Ġ{ Ġif Ġ( it Ġ== Ġ 0 ) Ġ 0 f Ġelse Ġit Ġ- Ġ 1 f Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġtop Ġleft Ġcorner Ġof Ġthe Ġnode Ġwe 're Ġinteracting Ġwith , Ġin Ġthe Ġnode 's ĊĠĠĠĠ Ġ* Ġlocal Ġcoordinate Ġsystem , Ġwhere Ġ( 0 , Ġ 0 ) Ġis Ġthe Ġtop Ġleft Ġcorner Ġof Ġthe Ġnode . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġtop Left : ĠOffset Ġget () Ġ= ĠOffset ( left , Ġtop ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġcenter Ġof Ġthe Ġtop Ġedge Ġof Ġthe Ġnode Ġwe 're Ġinteracting Ġwith , Ġin Ġthe Ġnode 's ĊĠĠĠĠ Ġ* Ġlocal Ġcoordinate Ġsystem , Ġwhere Ġ( 0 , Ġ 0 ) Ġis Ġthe Ġtop Ġleft Ġcorner Ġof Ġthe Ġnode . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġtop Center : ĠOffset Ġget () Ġ= ĠOffset ( center X , Ġtop ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġtop Ġright Ġcorner Ġof Ġthe Ġnode Ġwe 're Ġinteracting Ġwith , Ġin Ġthe Ġnode 's ĊĠĠĠĠ Ġ* Ġlocal Ġcoordinate Ġsystem , Ġwhere Ġ( 0 , Ġ 0 ) Ġis Ġthe Ġtop Ġleft Ġcorner Ġof Ġthe Ġnode . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNote Ġthat Ġ` top Right . x Ġ!= Ġwidth `, Ġsee Ġ[ right ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġtop Right : ĠOffset Ġget () Ġ= ĠOffset ( right , Ġtop ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġcenter Ġof Ġthe Ġleft Ġedge Ġof Ġthe Ġnode Ġwe 're Ġinteracting Ġwith , Ġin Ġthe ĊĠĠĠĠ Ġ* Ġnode 's Ġlocal Ġcoordinate Ġsystem , Ġwhere Ġ( 0 , Ġ 0 ) Ġis Ġthe Ġtop Ġleft Ġcorner Ġof Ġthe Ġnode . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġcenter Left : ĠOffset Ġget () Ġ= ĠOffset ( left , Ġcenter Y ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġcenter Ġof Ġthe Ġnode Ġwe 're Ġinteracting Ġwith , Ġin Ġthe Ġnode 's ĊĠĠĠĠ Ġ* Ġlocal Ġcoordinate Ġsystem , Ġwhere Ġ( 0 , Ġ 0 ) Ġis Ġthe Ġtop Ġleft Ġcorner Ġof Ġthe Ġnode . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġcenter : ĠOffset Ġget () Ġ= ĠOffset ( center X , Ġcenter Y ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġcenter Ġof Ġthe Ġright Ġedge Ġof Ġthe Ġnode Ġwe 're Ġinteracting Ġwith , Ġin Ġthe ĊĠĠĠĠ Ġ* Ġnode 's Ġlocal Ġcoordinate Ġsystem , Ġwhere Ġ( 0 , Ġ 0 ) Ġis Ġthe Ġtop Ġleft Ġcorner Ġof Ġthe Ġnode . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNote Ġthat Ġ` center Right . x Ġ!= Ġwidth `, Ġsee Ġ[ right ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġcenter Right : ĠOffset Ġget () Ġ= ĠOffset ( right , Ġcenter Y ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġbottom Ġleft Ġcorner Ġof Ġthe Ġnode Ġwe 're Ġinteracting Ġwith , Ġin Ġthe Ġnode 's ĊĠĠĠĠ Ġ* Ġlocal Ġcoordinate Ġsystem , Ġwhere Ġ( 0 , Ġ 0 ) Ġis Ġthe Ġtop Ġleft Ġcorner Ġof Ġthe Ġnode . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNote Ġthat Ġ` bottom Left . y Ġ!= Ġheight `, Ġsee Ġ[ bottom ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġbottom Left : ĠOffset Ġget () Ġ= ĠOffset ( left , Ġbottom ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġcenter Ġof Ġthe Ġbottom Ġedge Ġof Ġthe Ġnode Ġwe 're Ġinteracting Ġwith , Ġin Ġthe Ġnode 's ĊĠĠĠĠ Ġ* Ġlocal Ġcoordinate Ġsystem , Ġwhere Ġ( 0 , Ġ 0 ) Ġis Ġthe Ġtop Ġleft Ġcorner Ġof Ġthe Ġnode . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNote Ġthat Ġ` bottom Center . y Ġ!= Ġheight `, Ġsee Ġ[ bottom ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġbottom Center : ĠOffset Ġget () Ġ= ĠOffset ( center X , Ġbottom ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġbottom Ġright Ġcorner Ġof Ġthe Ġnode Ġwe 're Ġinteracting Ġwith , Ġin Ġthe Ġnode 's ĊĠĠĠĠ Ġ* Ġlocal Ġcoordinate Ġsystem , Ġwhere Ġ( 0 , Ġ 0 ) Ġis Ġthe Ġtop Ġleft Ġcorner Ġof Ġthe Ġnode . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNote Ġthat Ġ` bottom Right . x Ġ!= Ġwidth ` Ġand Ġ` bottom Right . y Ġ!= Ġheight `, Ġsee Ġ[ right ] Ġand Ġ[ bottom ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġbottom Right : ĠOffset Ġget () Ġ= ĠOffset ( right , Ġbottom ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġan Ġ[ Offset ] Ġrelative Ġto Ġthe Ġsize Ġof Ġthe Ġnode Ġwe 're Ġinteracting Ġwith . Ġ[ x ] Ġand Ġ[ y ] ĊĠĠĠĠ Ġ* Ġare Ġfr actions Ġof Ġthe Ġ[ width ] Ġand Ġ[ height ], Ġbetween Ġ`- 1 ` Ġand Ġ` 1 `. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNote Ġthat Ġ` percent Offset ( 1 f , Ġ 1 f ) Ġ!= Ġbottom Right `, Ġsee Ġ[ right ] Ġand Ġ[ bottom ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠFor Ġexample : Ġ` percent Offset (. 5 f , Ġ. 5 f )` Ġis Ġthe Ġsame Ġas Ġthe Ġ[ center ]; Ġ` center Left Ġ+ ĊĠĠĠĠ Ġ* Ġpercent Offset (. 1 f , Ġ 0 f )` Ġis Ġa Ġpoint Ġ 1 0 % Ġin ward Ġfrom Ġthe Ġmiddle Ġof Ġthe Ġleft Ġedge ; Ġand ĊĠĠĠĠ Ġ* Ġ` bottom Right Ġ- Ġpercent Offset (. 2 f , Ġ. 1 f )` Ġis Ġa Ġpoint Ġ 2 0 % Ġto Ġthe Ġleft Ġand Ġ 1 0 % Ġto Ġthe Ġtop Ġof Ġthe ĊĠĠĠĠ Ġ* Ġbottom Ġright Ġcorner . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġpercent Offset ( ĊĠĠĠĠĠĠĠ Ġ/*@ Float Range ( from Ġ= Ġ- 1 . 0 , Ġto Ġ= Ġ 1 . 0 ) */ ĊĠĠĠĠĠĠĠ Ġx : ĠFloat Ġ= Ġ 0 f , ĊĠĠĠĠĠĠĠ Ġ/*@ Float Range ( from Ġ= Ġ- 1 . 0 , Ġto Ġ= Ġ 1 . 0 ) */ ĊĠĠĠĠĠĠĠ Ġy : ĠFloat Ġ= Ġ 0 f ĊĠĠĠ Ġ): ĠOffset Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠOffset ( x Ġ* Ġwidth , Ġy Ġ* Ġheight ) ĊĠĠĠ Ġ} Ċ } Ċ