/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 Ġ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 . ui . test . android Ċ Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġandroid . os . System Clock Ċ import Ġandroid . util . Log Ċ 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 _ POINTER _ DOWN Ċ import Ġandroid . view . Motion Event . ACTION _ POINTER _ UP Ċ import Ġandroid . view . Motion Event . ACTION _ UP Ċ import Ġandroidx . compose . ui . geometry . Offset Ċ import Ġandroidx . ui . test . Android Base Input Dispatcher Ċ import Ġandroidx . ui . test . Partial Gesture Ċ import Ġjava . util . concurrent . Count DownLatch Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ internal Ġclass ĠAndroid Input Dispatcher ( ĊĠĠĠ Ġprivate Ġval Ġsend Event : Ġ( Motion Event ) Ġ-> ĠUnit Ċ ) Ġ: ĠAndroid Base Input Dispatcher () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġhandler Ġ= ĠHandler ( Looper . get Main Looper ()) ĊĊĠĠĠ Ġoverride Ġval Ġnow : ĠLong Ġget () Ġ= ĠSystem Clock . uptime Millis () ĊĊĠĠĠ Ġoverride Ġfun ĠPartial Gesture . send Down ( pointer Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsend Motion Event ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Positions . size () Ġ== Ġ 1 ) ĠACTION _ DOWN Ġelse ĠACTION _ POINTER _ DOWN , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Positions . indexOf Key ( pointer Id ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠPartial Gesture . send Move () Ġ{ ĊĠĠĠĠĠĠĠ Ġsend Motion Event ( ACTION _ MOVE , Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠPartial Gesture . send Up ( pointer Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsend Motion Event ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Positions . size () Ġ== Ġ 1 ) ĠACTION _ UP Ġelse ĠACTION _ POINTER _ UP , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Positions . indexOf Key ( pointer Id ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠPartial Gesture . send Cancel () Ġ{ ĊĠĠĠĠĠĠĠ Ġsend Motion Event ( ACTION _ CANCEL , Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSends Ġa ĠMotion Event Ġwith Ġthe Ġgiven Ġ[ action ] Ġand Ġ[ action Index ], Ġadding Ġall Ġpointers Ġthat ĊĠĠĠĠ Ġ* Ġare Ġcurrently Ġin Ġthe Ġgesture . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see ĠMotion Event . getAction ĊĠĠĠĠ Ġ* Ġ@ see ĠMotion Event . getAction Index ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠPartial Gesture . send Motion Event ( action : ĠInt , Ġaction Index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsend Motion Event ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdown Time , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Event Time , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Index , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠList ( last Positions . size ()) Ġ{ Ġlast Positions . value At ( it ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠList ( last Positions . size ()) Ġ{ Ġlast Positions . key At ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSends Ġan Ġevent Ġwith Ġthe Ġgiven Ġparameters . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġsend Motion Event ( ĊĠĠĠĠĠĠĠ Ġdown Time : ĠLong , ĊĠĠĠĠĠĠĠ Ġevent Time : ĠLong , ĊĠĠĠĠĠĠĠ Ġaction : ĠInt , ĊĠĠĠĠĠĠĠ Ġaction Index : ĠInt , ĊĠĠĠĠĠĠĠ Ġcoordinates : ĠList < Offset >, ĊĠĠĠĠĠĠĠ Ġpointer Ids : ĠList < Int > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsleep Until ( event Time ) ĊĠĠĠĠĠĠĠ Ġsend And Re cycle Event ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . obtain ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġdown Time Ġ= Ġ*/ Ġdown Time , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġevent Time Ġ= Ġ*/ Ġevent Time , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġaction Ġ= Ġ*/ Ġaction Ġ+ Ġ( action Index Ġshl ĠMotion Event . ACTION _ POINTER _ INDEX _ SHIFT ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġpointer Count Ġ= Ġ*/ Ġcoordinates . size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġpointer Properties Ġ= Ġ*/ ĠArray ( coordinates . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . Pointer Properties (). apply Ġ{ Ġid Ġ= Ġpointer Ids [ it ] Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġpointer Coords Ġ= Ġ*/ ĠArray ( coordinates . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . Pointer Coords (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ= Ġcoordinates [ it ]. x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Ġ= Ġcoordinates [ it ]. y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġmeta State Ġ= Ġ*/ Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġbutton State Ġ= Ġ*/ Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġx Precision Ġ= Ġ*/ Ġ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġy Precision Ġ= Ġ*/ Ġ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠdeviceId Ġ= Ġ*/ Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġedge Flags Ġ= Ġ*/ Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġsource Ġ= Ġ*/ Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġflags Ġ= Ġ*/ Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSends Ġthe Ġ[ event ] Ġto Ġthe ĠMotion Event Ġdispatcher Ġand Ġ[ re cycles ][ Motion Event . recycle ] Ġit ĊĠĠĠĠ Ġ* Ġregardless Ġof Ġthe Ġresult . ĠThis Ġmethod Ġblocks Ġuntil Ġthe Ġevent Ġis Ġsent . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġsend And Re cycle Event ( event : ĠMotion Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġl atch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġhandler . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Event ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . recycle () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! latch . await ( 5 , ĠTimeUnit . SECONDS )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w (" Android Input Dispatcher ", Ġ" Dispatch ing Ġof ĠMotion Event Ġ$ event Ġtook Ġlonger Ġthan Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 5 Ġseconds Ġto Ġcomplete . ĠThis Ġshould Ġtypically Ġonly Ġtake Ġa Ġfew Ġmilliseconds .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . await () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ