/* Ċ Ġ* Ġ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 . input . pointer Ċ Ċ import Ġandroid . os . System Clock Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . Motion Event . ACTION _ CANCEL Ċ import Ġandroid . view . Motion Event . ACTION _ DOWN Ċ import Ġandroid . view . Motion Event . ACTION _ MOVE Ċ import Ġandroid . view . Motion Event . ACTION _ OUT SIDE Ċ import Ġandroid . view . Motion Event . ACTION _ POINTER _ DOWN Ċ import Ġandroid . view . Motion Event . ACTION _ POINTER _ UP Ċ import Ġandroid . view . Motion Event . ACTION _ UP Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . view . View Parent Ċ import Ġandroidx . compose . runtime . remember Ċ import Ġandroidx . compose . ui . Experimental Compose Ui Api Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . composed Ċ import Ġandroidx . compose . ui . geometry . Offset Ċ import Ġandroidx . compose . ui . platform . debug Inspector Info Ċ 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 Ċ import Ġandroidx . compose . ui . view interop . Android ViewHolder Ċ Ċ /** Ċ Ġ* ĠA Ġspecial ĠPointer Input Modifier Ġthat Ġprovides Ġaccess Ġto Ġthe Ġunderlying Ġ[ Motion Event ] s Ġoriginally Ċ Ġ* Ġdis patched Ġto ĠCompose . ĠP refer Ġ[ pointer Input ] Ġand Ġuse Ġthis Ġonly Ġfor Ġinter operation Ġwith Ċ Ġ* Ġexisting Ġcode Ġthat Ġconsume s Ġ[ Motion Event ] s . Ċ Ġ* Ċ Ġ* ĠWhile Ġthe Ġmain Ġintent Ġof Ġthis ĠModifier Ġis Ġto Ġallow Ġarbitrary Ġcode Ġto Ġaccess Ġthe Ġoriginal Ċ Ġ* Ġ[ Motion Event ] Ġdis patched Ġto ĠCompose , Ġfor Ġcomplet eness , Ġanalog s Ġare Ġprovided Ġto Ġallow Ġarbitrary Ċ Ġ* Ġcode Ġto Ġinteract Ġwith Ġthe Ġsystem Ġas Ġif Ġit Ġwere Ġan ĠAndroid ĠView . Ċ Ġ* Ċ Ġ* ĠThis Ġincludes Ġ 2 ĠAPIs , Ċ Ġ* Ċ Ġ* Ġ 1 . Ġ[ on Touch Event ] Ġhas Ġa ĠBoolean Ġreturn Ġtype Ġwhich Ġis Ġa kin Ġto Ġthe Ġreturn Ġtype Ġof Ċ Ġ* Ġ[ View . on Touch Event ]. ĠIf Ġthe Ġprovided Ġ[ on Touch Event ] Ġreturns Ġtrue , Ġit Ġwill Ġcontinue Ġto Ġreceive Ċ Ġ* Ġthe Ġevent Ġstream Ġ( unless Ġthe Ġevent Ġstream Ġhas Ġbeen Ġintercept ed ) Ġand Ġif Ġit Ġreturns Ġfalse , Ġit Ġwill Ċ Ġ* Ġnot . Ċ Ġ* Ċ Ġ* Ġ 2 . Ġ[ request Dis allow Intercept Touch Event ] Ġis Ġa Ġlambda Ġthat Ġyou Ġcan Ġoptionally Ġprovide Ġso Ġthat Ċ Ġ* Ġyou Ġcan Ġlater Ġcall Ġit Ġ( yes , Ġin Ġthis Ġcase , Ġyou Ġcall Ġthe Ġlambda Ġthat Ġyou Ġprovided ) Ġwhich Ġis Ġa kin Ċ Ġ* Ġto Ġcalling Ġ[ View Parent . request Dis allow Intercept Touch Event ]. ĠWhen Ġthis Ġis Ġcalled , Ġany Ċ Ġ* Ġassociated Ġan cestors Ġin Ġthe Ġtree Ġthat Ġab ide Ġby Ġthe Ġcontract Ġwill Ġact Ġaccordingly Ġand Ġwill Ġnot Ċ Ġ* Ġintercept Ġthe Ġeven Ġstream . Ċ Ġ* Ċ Ġ* Ġ@ see Ġ[ View . on Touch Event ] Ċ Ġ* Ġ@ see Ġ[ View Parent . request Dis allow Intercept Touch Event ] Ċ Ġ*/ Ċ @ Experimental Compose Ui Api Ċ fun ĠModifier . pointer Interop Filter ( ĊĠĠĠ Ġrequest Dis allow Intercept Touch Event : Ġ( Request Dis allow Intercept Touch Event )? Ġ= Ġnull , ĊĠĠĠ Ġon Touch Event : Ġ( Motion Event ) Ġ-> ĠBoolean Ċ ): ĠModifier Ġ= Ġcomposed ( ĊĠĠĠ Ġinspector Info Ġ= Ġdebug Inspector Info Ġ{ ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġ" pointer Interop Filter " ĊĠĠĠĠĠĠĠ Ġproperties [" request Dis allow Intercept Touch Event "] Ġ= Ġrequest Dis allow Intercept Touch Event ĊĠĠĠĠĠĠĠ Ġproperties [" on Touch Event "] Ġ= Ġon Touch Event ĊĠĠĠ Ġ} Ċ ) Ġ{ ĊĠĠĠ Ġval Ġfilter Ġ= Ġremember Ġ{ ĠPointer Interop Filter () Ġ} ĊĠĠĠ Ġfilter . on Touch Event Ġ= Ġon Touch Event ĊĠĠĠ Ġfilter . request Dis allow Intercept Touch Event Ġ= Ġrequest Dis allow Intercept Touch Event ĊĠĠĠ Ġfilter Ċ } Ċ Ċ /** Ċ Ġ* ĠFunction Ġthat Ġcan Ġbe Ġpassed Ġto Ġ[ pointer Interop Filter ] Ġand Ġthen Ġlater Ġinvoked Ġwhich Ġprovides Ġan Ċ Ġ* Ġanalog Ġto Ġ[ View Parent . request Dis allow Intercept Touch Event ]. Ċ Ġ*/ Ċ @ Experimental Compose Ui Api Ċ class ĠRequest Dis allow Intercept Touch Event Ġ: Ġ( Boolean ) Ġ-> ĠUnit Ġ{ ĊĠĠĠ Ġinternal Ġvar Ġpointer Interop Filter : ĠPointer Interop Filter ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġinvoke ( dis allow Intercept : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpointer Interop Filter ?. dis allow Intercept Ġ= Ġdis allow Intercept ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠSimilar Ġto Ġthe Ġ 2 Ġargument Ġoverload Ġof Ġ[ pointer Interop Filter ], Ġbut Ġconnects Ċ Ġ* Ġdirectly Ġto Ġan Ġ[ Android ViewHolder ] Ġfor Ġmore Ġse am less Ġinter op Ġwith ĠAndroid . Ċ Ġ*/ Ċ @ Experimental Compose Ui Api Ċ internal Ġfun ĠModifier . pointer Interop Filter ( view : ĠAndroid ViewHolder ): ĠModifier Ġ{ ĊĠĠĠ Ġval Ġfilter Ġ= ĠPointer Interop Filter () ĊĠĠĠ Ġfilter . on Touch Event Ġ= Ġ{ Ġmotion Event Ġ-> ĊĠĠĠĠĠĠĠ Ġwhen Ġ( motion Event . action Mask ed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ DOWN , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ POINTER _ DOWN , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ MOVE , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ UP , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ POINTER _ UP , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ OUT SIDE , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ CANCEL Ġ-> Ġview . dispatch Touch Event ( motion Event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠACTION _ HO VER _ ENTER , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠACTION _ HO VER _ MOVE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠACTION _ HO VER _ EXIT , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠACTION _ BUTTON _ PRESS , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠACTION _ BUTTON _ RELEASE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġview . dispatch Generic Motion Event ( motion Event ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġrequest Dis allow Intercept Touch Event Ġ= ĠRequest Dis allow Intercept Touch Event () ĊĠĠĠ Ġfilter . request Dis allow Intercept Touch Event Ġ= Ġrequest Dis allow Intercept Touch Event ĊĠĠĠ Ġview . on Request Dis allow Intercept Touch Event Ġ= Ġrequest Dis allow Intercept Touch Event ĊĠĠĠ Ġreturn Ġthis . then ( filter ) Ċ } Ċ Ċ /** Ċ Ġ* ĠThe Ġstate ful Ġpart Ġof Ġpointer Interop Filter Ġthat Ġmanages Ġthe Ġinter op Ġwith ĠAndroid . Ċ Ġ* Ċ Ġ* ĠThe Ġintent Ġof Ġthis ĠPointer Input Modifier Ġis Ġto Ġallow ĠAndroid ĠViews Ġand ĠPointer Input Modifiers Ġto Ċ Ġ* Ġinteract Ġse am lessly Ġdespite Ġthe Ġdifferences Ġin Ġthe Ġ 2 Ġsystems . ĠBelow Ġis Ġa Ġdetailed Ġexplanation Ċ Ġ* Ġfor Ġhow Ġthe Ġinter op Ġis Ġaccomp lished . Ċ Ġ* Ċ Ġ* ĠWhen Ġthe Ġtype Ġof Ġevent Ġis Ġnot Ġa Ġmovement Ġevent , Ġwe Ġdispatch Ġto Ġthe ĠAndroid ĠView Ġas Ġsoon Ġas Ċ Ġ* Ġpossible Ġ( during Ġ[ Pointer Event Pass . Initial ]) Ġso Ġthat Ġthe ĠAndroid ĠView Ġcan Ġreact Ġto Ġdown Ċ Ġ* Ġand Ġup Ġevents Ġbefore ĠCompose ĠPointer Input Modifiers Ġnormally Ġwould . Ċ Ġ* Ċ Ġ* ĠWhen Ġthe Ġtype Ġof Ġevent Ġis Ġa Ġmovement Ġevent , Ġwe Ġdispatch Ġto Ġthe ĠAndroid ĠView Ġduring Ċ Ġ* Ġ[ Pointer Event Pass . Final ] Ġto Ġallow ĠCompose ĠPointer Input Modifiers Ġto Ġreact Ġto Ġmovement Ġfirst , Ċ Ġ* Ġwhich Ġm im ics Ġa Ġparent Ġ[ ViewGroup ] Ġintercept ing Ġthe Ġevent Ġstream . Ċ Ġ* Ċ Ġ* ĠWh enever Ġwe Ġare Ġabout Ġto Ġcall Ġ[ on Touch Event ], Ġwe Ġcheck Ġto Ġsee Ġif Ġanything Ġin ĠCompose Ċ Ġ* Ġconsumed Ġany Ġaspect Ġof Ġthe Ġpointer Ġinput Ġchanges , Ġand Ġif Ġthey Ġdid , Ġwe Ġintercept Ġthe Ġstream Ġand Ċ Ġ* Ġdispatch ĠACTION _ CANCEL Ġto Ġthe ĠAndroid ĠView Ġif Ġthey Ġhave Ġalready Ġreturned Ġtrue Ġfor Ġa Ġcall Ġto Ċ Ġ* ĠView # dispatch Touch Event (... ). Ċ Ġ* Ċ Ġ* ĠIf Ġwe Ġdo Ġcall Ġ[ on Touch Event ], Ġand Ġit Ġreturns Ġtrue , Ġwe Ġconsume Ġall Ġof Ġthe Ġchanges Ġso Ġthat Ċ Ġ* Ġnothing Ġin ĠCompose Ġalso Ġrespon ds . Ċ Ġ* Ċ Ġ* ĠIf Ġthe Ġ[ request Dis allow Intercept Touch Event ] Ġis Ġprovided Ġand Ġcalled Ġwith Ġtrue , Ġwe Ġsimply Ġdispatch Ġmove Ċ Ġ* Ġevents Ġduring Ġ[ Pointer Event Pass . Initial ] Ġso Ġthat Ġnormal ĠPointer Input Modifiers Ġdon 't Ġget Ġa Ċ Ġ* Ġchance Ġto Ġconsume Ġfirst . Ġ ĠNote : Ġ ĠThis Ġdoes Ġmean Ġthat Ġit Ġis Ġpossible Ġfor Ġa ĠCompose Ċ Ġ* ĠPointer Input Modifier Ġto Ġ" intercept " Ġeven Ġafter Ġrequest Dis allow Intercept Touch Event Ġhas Ġbeen Ċ Ġ* Ġcalled Ġbecause Ġconsumption Ġcan Ġoccur Ġduring Ġ[ Pointer Event Pass . Initial ]. Ġ ĠThis Ġmay Ġseem Ċ Ġ* Ġlike Ġa Ġfl aw , Ġbut Ġin Ġreality , Ġany ĠPointer Input Modifier Ġthat Ġconsume s Ġthat Ġag gress ively Ġwould Ċ Ġ* Ġlikely Ġonly Ġdo Ġso Ġafter Ġsome Ġconsumption Ġalready Ġoccurred Ġon Ġa Ġlater Ġpass , Ġand Ġthis Ġability Ġto Ċ Ġ* Ġdo Ġso Ġis Ġon Ġpar Ġwith Ġa Ġ[ ViewGroup ]' s Ġability Ġto Ġoverride Ġ[ ViewGroup . dispatch Touch Event ] Ċ Ġ* Ġinstead Ġof Ġoverriding Ġthe Ġmore Ġusual Ġ[ ViewGroup . on Touch Event ] Ġand Ġ[ ViewGroup Ċ Ġ* Ġ. on Intercept Touch Event ]. Ċ Ġ* Ċ Ġ* ĠIf Ġ[ request Dis allow Intercept Touch Event ] Ġis Ġlater Ġcalled Ġwith Ġfalse Ġ( the ĠAndroid Ġequivalent Ġof Ċ Ġ* Ġcalling Ġ[ View Parent . request Dis allow Intercept Touch Event ] Ġis Ġexceed ingly Ġrare ), Ġwe Ġrevert Ġback Ġto Ċ Ġ* Ġthe Ġnormal Ġbehavior . Ċ Ġ* Ċ Ġ* ĠIf Ġall Ġpointers Ġgo Ġup Ġon Ġthe Ġpointer Ġinter op Ġfilter , Ġparents Ġwill Ġbe Ġset Ġto Ġbe Ġallowed Ġto Ċ Ġ* Ġintercept Ġwhen Ġnew Ġpointers Ġgo Ġdown . Ġ[ request Dis allow Intercept Touch Event ] Ġmust Ġbe Ġcalled Ġagain Ġto Ċ Ġ* Ġchange Ġthat Ġstate . Ċ Ġ*/ Ċ @ Experimental Compose Ui Api Ċ internal Ġclass ĠPointer Interop Filter Ġ: ĠPointer Input Modifier Ġ{ ĊĊĠĠĠ Ġlateinit Ġvar Ġon Touch Event : Ġ( Motion Event ) Ġ-> ĠBoolean ĊĊĠĠĠ Ġvar Ġrequest Dis allow Intercept Touch Event : ĠRequest Dis allow Intercept Touch Event ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield ?. pointer Interop Filter Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield ?. pointer Interop Filter Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġinternal Ġvar Ġdis allow Intercept Ġ= Ġfalse ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġ 3 Ġpossible Ġstates ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġenum Ġclass ĠDispatch To ViewState Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠWe Ġhave Ġyet Ġto Ġdispatch Ġa Ġnew Ġevent Ġstream Ġto Ġthe Ġchild ĠAndroid ĠView . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ ĠUnknown , ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠWe Ġhave Ġdis patched Ġto Ġthe Ġchild ĠAndroid ĠView Ġand Ġit Ġwants Ġto Ġcontinue Ġto Ġreceive ĊĠĠĠĠĠĠĠĠ Ġ* Ġevents Ġfor Ġthe Ġcurrent Ġevent Ġstream . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ ĠDispatch ing , ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠWe Ġintercept ed Ġthe Ġevent Ġstream , Ġor Ġthe ĠAndroid ĠView Ġno Ġlonger Ġwanted Ġto Ġreceive ĊĠĠĠĠĠĠĠĠ Ġ* Ġevents Ġfor Ġthe Ġcurrent Ġevent Ġstream . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ ĠNot Dispatch ing ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġpointer Input Filter Ġ= ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠPointer Input Filter () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġvar Ġstate Ġ= ĠDispatch To ViewState . Unknown ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġshare With S iblings ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Pointer Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer Event : ĠPointer Event , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpass : ĠPointer Event Pass , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbounds : ĠInt Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchanges Ġ= Ġpointer Event . changes ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe Ġwere Ġtold Ġto Ġdis allow Ġintercept , Ġor Ġif Ġthe Ġevent Ġwas Ġa Ġdown Ġor Ġup Ġevent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġdispatch Ġto ĠAndroid Ġas Ġearly Ġas Ġpossible . Ġ ĠIf Ġthe Ġevent Ġis Ġa Ġmove Ġevent Ġand ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġcan Ġstill Ġintercept , Ġwe Ġdispatch Ġto ĠAndroid Ġafter Ġwe Ġhave Ġa Ġchance Ġto ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġintercept Ġdue Ġto Ġmovement . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdispatch During Initial Tunnel Ġ= Ġdis allow Intercept Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchanges . fast Any Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . changed To Down Ignore Cons umed () Ġ|| Ġit . changed To Up Ignore Cons umed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Ġ!== ĠDispatch To ViewState . Not Dispatch ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pass Ġ== ĠPointer Event Pass . Initial Ġ&& Ġdispatch During Initial Tunnel ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch To View ( pointer Event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pass Ġ== ĠPointer Event Pass . Final Ġ&& Ġ! dispatch During Initial Tunnel ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch To View ( pointer Event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pass Ġ== ĠPointer Event Pass . Final ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġall Ġof Ġthe Ġchanges Ġwere Ġup Ġchanges , Ġthen Ġthe Ġ" event Ġstream " Ġhas Ġended ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġand Ġwe Ġreset . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( changes . fast All Ġ{ Ġit . changed To Up Ignore Cons umed () Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cancel () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe Ġare Ġstill Ġdispatch ing Ġto Ġthe ĠAndroid ĠView , Ġwe Ġhave Ġto Ġsend Ġthem Ġa ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcancel Ġevent , Ġotherwise , Ġwe Ġshould Ġnot . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Ġ=== ĠDispatch To ViewState . Dispatch ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty Cancel Motion Event Scope ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem Clock . uptime Millis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġmotion Event Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Touch Event ( motion Event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠRe sets Ġall Ġof Ġour Ġstate Ġto Ġbe Ġready Ġfor Ġa Ġ" new Ġevent Ġstream ". ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠDispatch To ViewState . Unknown ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdis allow Intercept Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠDis patches Ġto Ġthe ĠAndroid ĠView . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠAlso Ġconsume s Ġaspects Ġof Ġ[ pointer Event ] Ġand Ġupdates Ġour Ġ[ state ] Ġaccordingly . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠWill Ġdispatch ĠACTION _ CANCEL Ġif Ġany Ġaspect Ġof Ġ[ pointer Event ] Ġhas Ġbeen Ġconsumed Ġand ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġupdate Ġour Ġ[ state ] Ġaccordingly . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġpointer Event ĠThe Ġchange Ġto Ġdispatch . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĠThe Ġresulting Ġchanges Ġ( fully Ġconsumed Ġor Ġun touched ). ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun Ġdispatch To View ( pointer Event : ĠPointer Event ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchanges Ġ= Ġpointer Event . changes ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( changes . fast Any Ġ{ Ġit . any Change Cons umed () Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġshould Ġno Ġlonger Ġdispatch Ġto Ġthe ĠAndroid ĠView . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Ġ=== ĠDispatch To ViewState . Dispatch ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe Ġwere Ġdispatch ing , Ġsend ĠACTION _ CANCEL . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer Event . to Cancel Motion Event Scope ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . layout Coordinates ?. local To Root ( Offset . Zero ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġerror (" layout Coordinates Ġnot Ġset ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġmotion Event Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Touch Event ( motion Event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠDispatch To ViewState . Not Dispatch ing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDispatch Ġand Ġupdate Ġour Ġstate Ġwith Ġthe Ġresult . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer Event . to Motion Event Scope ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . layout Coordinates ?. local To Root ( Offset . Zero ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġerror (" layout Coordinates Ġnot Ġset ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġmotion Event Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( motion Event . action Mask ed Ġ== ĠMotion Event . ACTION _ DOWN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġaction Ġis ĠACTION _ DOWN , Ġwe Ġcare Ġabout Ġthe Ġreturn Ġvalue Ġof ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġon Touch Event Ġand Ġuse Ġit Ġto Ġset Ġour Ġinitial Ġdispatch ing Ġstate . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= Ġif Ġ( on Touch Event ( motion Event )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDispatch To ViewState . Dispatch ing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDispatch To ViewState . Not Dispatch ing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOtherwise , Ġwe Ġdon 't Ġcare Ġabout Ġthe Ġreturn Ġvalue . ĠThis Ġis Ġintended ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġto Ġbe Ġin Ġaccordance Ġwith Ġhow Ġthe ĠAndroid ĠView Ġsystem Ġworks . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Touch Event ( motion Event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Ġ=== ĠDispatch To ViewState . Dispatch ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe ĠAndroid ĠView Ġclaimed Ġthe Ġevent , Ġconsume Ġall Ġchanges . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchanges . fast ForEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . consume All Changes () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer Event . internal Pointer Event ?. suppress Movement Consumption Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! dis allow Intercept ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCalls Ġ[ watcher ] Ġwith Ġeach Ġ[ Motion Event ] Ġthat Ġthe Ġlayout Ġarea Ġor Ġany Ġchild Ġ[ pointer Input ] Ċ Ġ* Ġreceives . ĠThe Ġ[ Motion Event ] Ġmay Ġor Ġmay Ġnot Ġhave Ġbeen Ġtransformed Ġto Ġthe Ġlocal Ġcoordinate Ġsystem . Ċ Ġ* ĠThe ĠCompose ĠView Ġwill Ġbe Ġconsidered Ġas Ġhandling Ġthe Ġ[ Motion Event ] Ġin Ġthe Ġarea Ġthat Ġthe Ċ Ġ* Ġ[ motion Event Spy ] Ġis Ġactive . Ċ Ġ* Ċ Ġ* ĠThis Ġmethod Ġcan Ġonly Ġbe Ġused Ġto Ġobserve Ġ[ Motion Event ] s Ġand Ġcan Ġnot Ġbe Ġused Ġto Ġcapture Ġan Ġevent Ċ Ġ* Ġstream . ĠUse Ġ[ pointer Interop Filter ] Ġto Ġhandle Ġ[ Motion Event ] s Ġand Ġconsume Ġthe Ġevents . Ċ Ġ* Ċ Ġ* Ġ[ watcher ] Ġis Ġcalled Ġduring Ġthe Ġ[ Pointer Event Pass . Initial ] Ġpass . Ċ Ġ* Ċ Ġ* ĠDevelopers Ġshould Ġprefer Ġto Ġuse Ġ[ pointer Input ] Ġto Ġhandle Ġpointer Ġinput Ġprocessing Ġwithin Ċ Ġ* ĠCompose . Ġ[ motion Event Spy ] Ġis Ġonly Ġuseful Ġas Ġpart Ġof ĠAndroid ĠView Ġinter oper ability . Ċ Ġ*/ Ċ @ Experimental Compose Ui Api Ċ fun ĠModifier . motion Event Spy ( watcher : Ġ( motion Event : ĠMotion Event ) Ġ-> ĠUnit ): ĠModifier Ġ= ĊĠĠĠ Ġthis . pointer Input ( watcher ) Ġ{ ĊĠĠĠĠĠĠĠ Ġintercept OutOfBounds Child Events Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġawait Pointer Event Scope Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent Ġ= Ġawait Pointer Event ( Pointer Event Pass . Initial ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . motion Event ?. let ( watcher ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ