/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 Ġ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 . focus Ċ Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . focus . Focus State . Active Ċ import Ġandroidx . compose . ui . focus . Focus State . Active Parent Ċ import Ġandroidx . compose . ui . focus . Focus State . Capt ured Ċ import Ġandroidx . compose . ui . focus . Focus State . Disabled Ċ import Ġandroidx . compose . ui . focus . Focus State . Inactive Ċ import Ġandroidx . compose . ui . geometry . Offset Ċ import Ġandroidx . compose . ui . input . pointer . Pointer Event Ċ import Ġandroidx . compose . ui . input . pointer . Pointer Event Pass Ċ import Ġandroidx . compose . ui . input . pointer . Pointer Id Ċ import Ġandroidx . compose . ui . input . pointer . Pointer Input Change Ċ import Ġandroidx . compose . ui . input . pointer . Pointer Input Filter Ċ import Ġandroidx . compose . ui . input . pointer . Pointer Input Modifier Ċ import Ġandroidx . compose . ui . input . pointer . changed To Down Ċ import Ġandroidx . compose . ui . input . pointer . changed To Up Ċ import Ġandroidx . compose . ui . input . pointer . changed To Up Ignore Cons umed Ċ import Ġandroidx . compose . ui . input . pointer . consume Down Change Ċ import Ġandroidx . compose . ui . input . pointer . position Change Cons umed Ċ import Ġandroidx . compose . ui . unit . Int Size Ċ import Ġandroidx . compose . ui . util . fast All Ċ import Ġandroidx . compose . ui . util . fast Any Ċ import Ġandroidx . compose . ui . util . fast ForEach Ċ Ċ interface ĠFocus Manager Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCall Ġthis Ġfunction Ġto Ġclear Ġfocus Ġfrom Ġthe Ġcurrently Ġfocused Ġcomponent , Ġand Ġset Ġthe Ġfocus Ġto ĊĠĠĠĠ Ġ* Ġthe Ġroot Ġfocus Ġmodifier . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ Ġ@ param Ġforced Clear : ĠWhether Ġwe Ġshould Ġforce fully Ġclear Ġfocus Ġregardless Ġof Ġwhether Ġwe Ġhave ĊĠĠĠĠ Ġ* Ġ Ġany Ġcomponents Ġthat Ġhave Ġ[ Capt ured ][ Focus State . Capt ured ] Ġfocus . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġclear Focus ( forced Clear : ĠBoolean Ġ= Ġfalse ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMov es Ġfocus Ġin Ġthe Ġspecified Ġdirection . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠFocus Ġmoving Ġis Ġstill Ġbeing Ġimplemented . ĠRight Ġnow , Ġfocus Ġwill Ġmove Ġonly Ġif Ġthe Ġuser ĊĠĠĠĠ Ġ* Ġspecified Ġa Ġcustom Ġfocus Ġtraversal Ġorder Ġfor Ġthe Ġitem Ġthat Ġis Ġcurrently Ġfocused . Ġ( Using Ġthe ĊĠĠĠĠ Ġ* Ġ[ Modifier . focus Order () ][ focus Order ] ĠAPI ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġfocus Ġwas Ġmoved Ġsuccessfully . Ġfalse Ġif Ġthe Ġfocused Ġitem Ġis Ġunchanged . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġmove Focus ( focus Direction : ĠFocus Direction ): ĠBoolean Ċ } Ċ Ċ /** Ċ Ġ* ĠThe Ġfocus Ġmanager Ġis Ġused Ġby Ġdifferent Ġ[ Owner ][ android x . compose . ui . node . Owner ] Ġimplementations Ċ Ġ* Ġto Ġcontrol Ġfocus . Ċ Ġ* Ċ Ġ* Ġ@ param Ġfocus Modifier ĠThe Ġmodifier Ġthat Ġwill Ġbe Ġused Ġas Ġthe Ġroot Ġfocus Ġmodifier . Ċ Ġ*/ Ċ internal Ġclass ĠFocus ManagerImpl ( ĊĠĠĠ Ġprivate Ġval Ġfocus Modifier : ĠFocus Modifier Ġ= ĠFocus Modifier ( Inactive ) Ċ ) Ġ: ĠFocus Manager Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġgesture Ġis Ġfired Ġwhen Ġthe Ġuser Ġclicks Ġon Ġa Ġnon - click able Ġ/ Ġnon - focus able Ġpart Ġof Ġthe ĊĠĠĠĠ Ġ* Ġscreen . ĠSince Ġno Ġother Ġgesture Ġhandled Ġthis Ġclick , Ġwe Ġhandle Ġit Ġhere . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġpass Through Click Modifier Ġ= ĠPointer Input Modifier Impl ( ĊĠĠĠĠĠĠĠ ĠFocus Tap Gesture Filter (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonTap Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġuser Ġclicked Ġon Ġa Ġnon - click able Ġpart Ġof Ġthe Ġscreen Ġwhen Ġsomething Ġwas ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfocused . ĠThis Ġis Ġan Ġindication Ġthat Ġthe Ġuser Ġwants Ġto Ġclear Ġfocus . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear Focus () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconsume Changes Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġ[ Modifier ] Ġthat Ġcan Ġbe Ġadded Ġto Ġthe Ġ[ Owners ][ android x . compose . ui . node . Owner ] Ġmodifier ĊĠĠĠĠ Ġ* Ġlist Ġthat Ġcontains Ġthe Ġmodifiers Ġrequired Ġby Ġthe Ġfocus Ġsystem . Ġ( Eg , Ġa Ġroot Ġfocus Ġmodifier ). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġmodifier : ĠModifier ĊĠĠĠĠĠĠĠ Ġ// ĠTODO ( b / 1 6 8 8 3 1 2 4 7 ): Ġreturn Ġan Ġempty ĠModifier Ġwhen Ġthere Ġare Ġno Ġfocus able Ġchildren . ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġpass Through Click Modifier ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. then ( focus Modifier ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġ[ Owner ][ android x . compose . ui . node . Owner ] Ġcalls Ġthis Ġfunction Ġwhen Ġit Ġg ains Ġfocus . ĠThis ĊĠĠĠĠ Ġ* Ġinform s Ġthe Ġ[ focus Ġmanager ][ Focus ManagerImpl ] Ġthat Ġthe ĊĠĠĠĠ Ġ* Ġ[ Owner ][ android x . compose . ui . node . Owner ] Ġg ained Ġfocus , Ġand Ġthat Ġit Ġshould Ġpropagate Ġthis ĊĠĠĠĠ Ġ* Ġfocus Ġto Ġone Ġof Ġthe Ġfocus Ġmodifiers Ġin Ġthe Ġcomponent Ġhierarchy . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġtake Focus () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġfocus Ġstate Ġis Ġnot ĠIn active , Ġit Ġindicates Ġthat Ġthe Ġfocus Ġstate Ġis Ġalready ĊĠĠĠĠĠĠĠ Ġ// Ġset Ġ( possibly Ġby Ġdispatch Window Focus Changed ). ĠSo Ġwe Ġdon 't Ġupdate Ġthe Ġstate . ĊĠĠĠĠĠĠĠ Ġif Ġ( focus Modifier . focus State Ġ== ĠIn active ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfocus Modifier . focus State Ġ= ĠActive ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO ( b / 1 5 2 5 3 5 7 1 5 ): Ġpropagate Ġfocus Ġto Ġchildren Ġbased Ġon Ġchild Ġfocus ability . ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġ[ Owner ][ android x . compose . ui . node . Owner ] Ġcalls Ġthis Ġfunction Ġwhen Ġit Ġlo ses Ġfocus . ĠThis ĊĠĠĠĠ Ġ* Ġinform s Ġthe Ġ[ focus Ġmanager ][ Focus ManagerImpl ] Ġthat Ġthe ĊĠĠĠĠ Ġ* Ġ[ Owner ][ android x . compose . ui . node . Owner ] Ġlost Ġfocus , Ġand Ġthat Ġit Ġshould Ġclear Ġfocus Ġfrom ĊĠĠĠĠ Ġ* Ġall Ġthe Ġfocus Ġmodifiers Ġin Ġthe Ġcomponent Ġhierarchy . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġrelease Focus () Ġ{ ĊĠĠĠĠĠĠĠ Ġfocus Modifier . focus Node . clear Focus ( forced Clear Ġ= Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCall Ġthis Ġfunction Ġto Ġset Ġthe Ġfocus Ġto Ġthe Ġroot Ġfocus Ġmodifier . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġforced Clear : ĠWhether Ġwe Ġshould Ġforce fully Ġclear Ġfocus Ġregardless Ġof Ġwhether Ġwe Ġhave ĊĠĠĠĠ Ġ* Ġany Ġcomponents Ġthat Ġhave Ġ[ Capt ured ][ Focus State . Capt ured ] Ġfocus . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġcould Ġbe Ġused Ġto Ġclear Ġfocus Ġwhen Ġa Ġuser Ġclicks Ġon Ġempty Ġspace Ġoutside Ġa Ġfocus able ĊĠĠĠĠ Ġ* Ġcomponent . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġclear Focus ( forced Clear : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġthis Ġhierarchy Ġhad Ġfocus Ġbefore Ġclearing Ġit , Ġit Ġindicates Ġthat Ġthe Ġhost Ġview Ġhas ĊĠĠĠĠĠĠĠ Ġ// Ġfocus . ĠSo Ġafter Ġclearing Ġfocus Ġwithin Ġthe Ġcompose Ġhierarchy , Ġwe Ġshould Ġreset Ġthe Ġroot ĊĠĠĠĠĠĠĠ Ġ// Ġfocus Ġmodifier Ġto Ġ" Active " Ġto Ġmaintain Ġconsistency Ġwith Ġthe Ġhost Ġview . ĊĠĠĠĠĠĠĠ Ġval Ġroot Was Focused Ġ= Ġwhen Ġ( focus Modifier . focus State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠActive , ĠActive Parent , ĠCapt ured Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDisabled , ĠIn active Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( focus Modifier . focus Node . clear Focus ( forced Clear ) Ġ&& Ġroot Was Focused ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfocus Modifier . focus State Ġ= ĠActive ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMov es Ġfocus Ġin Ġthe Ġspecified Ġdirection . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠFocus Ġmoving Ġis Ġstill Ġbeing Ġimplemented . ĠRight Ġnow , Ġfocus Ġwill Ġmove Ġonly Ġif Ġthe Ġuser ĊĠĠĠĠ Ġ* Ġspecified Ġa Ġcustom Ġfocus Ġtraversal Ġorder Ġfor Ġthe Ġitem Ġthat Ġis Ġcurrently Ġfocused . Ġ( Using Ġthe ĊĠĠĠĠ Ġ* Ġ[ Modifier . focus Order () ][ focus Order ] ĠAPI ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġfocus Ġwas Ġmoved Ġsuccessfully . Ġfalse Ġif Ġthe Ġfocused Ġitem Ġis Ġunchanged . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġmove Focus ( focus Direction : ĠFocus Direction ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfocus Modifier . focus Node . move Focus ( focus Direction ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġdata Ġclass ĠPointer Input Modifier Impl ( override Ġval Ġpointer Input Filter : ĠPointer Input Filter ) Ġ: ĊĠĠĠ ĠPointer Input Modifier Ċ Ċ // ĠTODO : Ġremove Ġin Ġb / 1 7 9 6 0 2 5 3 9 Ċ private Ġclass ĠFocus Tap Gesture Filter Ġ: ĠPointer Input Filter () Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġto Ġindicate Ġthat Ġa Ġpress Ġgesture Ġhas Ġsuccessfully Ġcompleted . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġshould Ġbe Ġused Ġto Ġfire Ġa Ġstate Ġchanging Ġevent Ġas Ġif Ġa Ġbutton Ġwas Ġpressed . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġlateinit Ġvar ĠonTap : Ġ( Offset ) Ġ-> ĠUnit ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWhether Ġor Ġnot Ġto Ġconsume Ġchanges . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġconsume Changes : ĠBoolean Ġ= Ġtrue ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTrue Ġwhen Ġwe Ġare Ġpri med Ġto Ġcall Ġ[ on Tap ] Ġand Ġmay Ġbe Ġconsuming Ġall Ġdown Ġchanges . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġpri med Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġvar Ġdown Pointers : ĠMutable Set < Pointer Id > Ġ= Ġmutable Set Of () ĊĠĠĠ Ġprivate Ġvar Ġup Blocked Pointers : ĠMutable Set < Pointer Id > Ġ= Ġmutable Set Of () ĊĠĠĠ Ġprivate Ġvar Ġlast Px Position : ĠOffset ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġon Pointer Event ( ĊĠĠĠĠĠĠĠ Ġpointer Event : ĠPointer Event , ĊĠĠĠĠĠĠĠ Ġpass : ĠPointer Event Pass , ĊĠĠĠĠĠĠĠ Ġbounds : ĠInt Size ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchanges Ġ= Ġpointer Event . changes ĊĊĠĠĠĠĠĠĠ Ġif Ġ( pass Ġ== ĠPointer Event Pass . Main ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pri med Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchanges . fast All Ġ{ Ġit . changed To Up () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpointer Px Position : ĠOffset Ġ= Ġchanges [ 0 ]. previous Position ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( changes . fast Any Ġ{ Ġ! up Blocked Pointers . contains ( it . id ) Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe Ġare Ġpri med , Ġall Ġpointers Ġwent Ġup , Ġand Ġat Ġleast Ġone Ġof Ġthe Ġpointers Ġis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġnot Ġblocked , Ġwe Ġcan Ġfire , Ġreset , Ġand Ġconsume Ġall Ġof Ġthe Ġup Ġevents . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonTap . invoke ( pointer Px Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( consume Changes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchanges . fast ForEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . consume Down Change () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Px Position Ġ= Ġpointer Px Position ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( changes . fast All Ġ{ Ġit . changed To Down () Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠReset Ġin Ġcase Ġwe Ġwere Ġincorrectly Ġleft Ġwaiting Ġon Ġa Ġdelay Up Ġmessage . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġall Ġof Ġthe Ġchanges Ġare Ġdown , Ġcan Ġbecome Ġpri med . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpri med Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pri med ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchanges . fast ForEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . changed To Down ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdown Pointers . add ( it . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . changed To Up Ignore Cons umed ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdown Pointers . remove ( it . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( pass Ġ== ĠPointer Event Pass . Final Ġ&& Ġpri med ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġany Position Change Cons umed Ġ= Ġchanges . fast Any Ġ{ Ġit . position Change Cons umed () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġno Pointers In Bounds Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup Blocked Pointers . isEmpty () Ġ&& Ġ! changes . any Pointers In Bounds ( bounds ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( any Position Change Cons umed Ġ|| Ġno Pointers In Bounds ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe Ġare Ġon Ġthe Ġfinal Ġpass , Ġwe Ġare Ġpri med , Ġand Ġeither Ġwe Ġaren 't Ġblocked Ġand ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġall Ġpointers Ġare Ġout Ġof Ġbounds . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTODO ( she p sh ap ard ): ĠThis Ġcontinues Ġto Ġbe Ġvery Ġconfusing Ġto Ġuse . Ġ ĠHave Ġto Ġcome Ġup Ġwith Ġa Ġbetter Ċ // Ġ Ġway Ġof Ġeasily Ġexpress ing Ġthis . ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUtility Ġmethod Ġthat Ġdetermines Ġif Ġany Ġpointers Ġare Ġcurrently Ġin Ġ[ bounds ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠA Ġpointer Ġis Ġconsidered Ġin Ġbounds Ġif Ġit Ġis Ġcurrently Ġdown Ġand Ġit 's Ġcurrent ĊĠĠĠĠ Ġ* Ġposition Ġis Ġwithin Ġthe Ġprovided Ġ[ bounds ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠTrue Ġif Ġat Ġleast Ġone Ġpointer Ġis Ġin Ġbounds . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠList < Pointer Input Change >. any Pointers In Bounds ( bounds : ĠInt Size ) Ġ= ĊĠĠĠĠĠĠĠ Ġfast Any Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . pressed Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . position . x Ġ>= Ġ 0 Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . position . x Ġ< Ġbounds . width Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . position . y Ġ>= Ġ 0 Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . position . y Ġ< Ġbounds . height ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Cancel () Ġ{ ĊĠĠĠĠĠĠĠ Ġreset () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠ Ġpri med Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġup Blocked Pointers . clear () ĊĠĠĠĠĠĠĠ Ġdown Pointers . clear () ĊĠĠĠĠĠĠĠ Ġlast Px Position Ġ= Ġnull ĊĠĠĠ Ġ} Ċ }