package Ġcom . otal i ast ud ios . zoom . internal Ċ Ċ import Ġandroid . view . Motion Event Ċ import Ġandroidx . annotation . Int Def Ċ import Ġcom . otal i ast ud ios . zoom . Zoom Logger Ċ Ċ /** Ċ Ġ* ĠDe als Ġwith Ġtouch Ġinput , Ġholds Ġthe Ġinternal Ġ[ state ] Ġinteger , Ċ Ġ* Ġand Ġapplies Ġspecial Ġlogic Ġto Ġtouch Ġinputs Ġand Ġstate Ġchanges Ġto Ċ Ġ* Ġprefer Ġone Ġgesture Ġover Ġthe Ġother , Ġfor Ġexample . Ċ Ġ* Ċ Ġ* ĠNote : Ġthe Ġ[ Callback ] Ġis Ġresponsible Ġfor Ġactually Ġtrying Ġto Ġstart Ċ Ġ* Ġthe Ġgesture Ġin Ġthe Ġcallbacks . ĠWh enever Ġneeded , Ġ[ setState ] Ġmust Ġbe Ġcalled Ġto Ġkeep Ċ Ġ* Ġthis Ġclass Ġin Ġsync Ġwith Ġwhat 's Ġhappening . Ċ Ġ*/ Ċ internal Ġclass ĠState Controller ( private Ġval Ġcallback : ĠCallback ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRe ceiv es Ġcallbacks Ġfrom Ġthis Ġcontroller . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġinterface ĠCallback Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠState Ġcallbacks ĊĠĠĠĠĠĠĠ Ġfun Ġis State Allowed (@ State ĠnewState : ĠInt ): ĠBoolean ĊĠĠĠĠĠĠĠ Ġfun Ġon State Idle () ĊĠĠĠĠĠĠĠ Ġfun Ġcleanup State (@ State Ġold State : ĠInt ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠTouch Ġcallbacks ĊĠĠĠĠĠĠĠ Ġfun Ġmaybe Start Pin ch Gesture ( event : ĠMotion Event ): ĠBoolean ĊĠĠĠĠĠĠĠ Ġfun Ġmaybe Start Scroll Fl ing Gesture ( event : ĠMotion Event ): ĠBoolean ĊĠĠĠĠĠĠĠ Ġfun Ġend Scroll Gesture () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġcurrent Ġstate . ĊĠĠĠĠ Ġ* ĠOne Ġof Ġthe Ġ[ State ] Ġconstants . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ State ĊĠĠĠ Ġinternal Ġvar Ġstate : ĠInt Ġ= ĠID LE ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWhether Ġthis Ġstate Ġneeds Ġcleanup Ġeven Ġif Ġcalled Ġtwice . ĊĠĠĠĠ Ġ* ĠThe Ġ[ ANIM ATING ] Ġstate Ġcurrently Ġneeds Ġit . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġneeds Cleanup When Called Tw ice (@ State Ġstate : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġstate Ġ== ĠAN IM ATING ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPrivate Ġfunction Ġto Ġset Ġthe Ġcurrent Ġstate . ĊĠĠĠĠ Ġ* ĠExternal Ġcall ers Ġshould Ġuse Ġ[ set Pin ch ing ], Ġ[ set Scrolling ], Ġ[ make Idle ] ... Ġinstead . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠsetState (@ State ĠnewState : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ ĠLOG . v (" try Set State :", ĠnewState . to State Name ()) ĊĠĠĠĠĠĠĠ Ġif Ġ(! callback . is State Allowed ( newState )) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( newState Ġ== Ġstate Ġ&& Ġ! needs Cleanup When Called Tw ice ( newState )) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġold State Ġ= Ġstate ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( newState ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSC ROLL ING Ġ-> Ġif Ġ( old State Ġ== ĠPIN CH ING Ġ|| Ġold State Ġ== ĠAN IM ATING ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFL ING ING Ġ-> Ġif Ġ( old State Ġ== ĠAN IM ATING ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPIN CH ING Ġ-> Ġif Ġ( old State Ġ== ĠAN IM ATING ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ ĠID LE Ġ-> Ġcallback . on State Idle () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠNow Ġthat Ġit Ġsucceeded , Ġdo Ġsome Ġcleanup . ĊĠĠĠĠĠĠĠ Ġcallback . cleanup State ( old State ) ĊĠĠĠĠĠĠĠ ĠLOG . i (" setState :", ĠnewState . to State Name ()) ĊĠĠĠĠĠĠĠ Ġstate Ġ= ĠnewState ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPro cesses Ġthe Ġevent . ĠShould Ġbe Ġcalled Ġduring Ġthe ĊĠĠĠĠ Ġ* Ġ[ android . view . ViewGroup . on Intercept Touch Event ] Ġcallback . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġon Intercept Touch Event ( ev : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġprocess Touch Event ( ev ) Ġ> ĠTO UCH _ LIST EN ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPro cesses Ġthe Ġevent . ĠShould Ġbe Ġcalled Ġduring Ġthe ĊĠĠĠĠ Ġ* Ġ[ android . view . View . on Touch Event ] Ġcallback . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġon Touch Event ( ev : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġprocess Touch Event ( ev ) Ġ> ĠTO UCH _ NO ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPro cesses Ġthe Ġtouch Ġevent Ġand Ġreturns Ġone Ġof Ġ[ TO UCH _ LIST EN ], ĊĠĠĠĠ Ġ* Ġ[ TO UCH _ STE AL ] Ġor Ġ[ TO UCH _ NO ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġprocess Touch Event ( event : ĠMotion Event ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ ĠLOG . v (" process Touch Event :", Ġ" start .") ĊĠĠĠĠĠĠĠ Ġif Ġ( is Anim ating ()) Ġreturn ĠTO UCH _ STE AL ĊĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġcallback . maybe Start Pin ch Gesture ( event ) ĊĠĠĠĠĠĠĠ ĠLOG . v (" process Touch Event :", Ġ" scale Result :", Ġresult ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠPin ch Ġdetector Ġalways Ġreturns Ġtrue . ĠIf Ġwe Ġactually Ġstarted Ġa Ġpin ch , ĊĠĠĠĠĠĠĠ Ġ// ĠDon 't Ġpass Ġto Ġfl ing Ġdetector . ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Pin ch ing ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġresult Ġor Ġcallback . maybe Start Scroll Fl ing Gesture ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . v (" process Touch Event :", Ġ" fl ing Result :", Ġresult ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠDetect Ġscroll Ġends , Ġthis Ġappears Ġto Ġbe Ġthe Ġonly Ġway . ĊĠĠĠĠĠĠĠ Ġif Ġ( is Scrolling ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġevent . action Mask ed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( a Ġ== ĠMotion Event . ACTION _ UP Ġ|| Ġa Ġ== ĠMotion Event . ACTION _ CANCEL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . i (" process Touch Event :", Ġ" up Ġevent Ġwhile Ġscrolling , Ġdispatch ing Ġend Scroll Gesture .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġare Ġnot Ġsimply Ġcalling Ġmake Idle () Ġbecause Ġwe Ġmight Ġbe Ġin Ġover pan . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIn Ġthat Ġcase , Ġthe ĠCallback Ġwill Ġanimate Ġback Ġto Ġle git Ġposition . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . end Scroll Gesture () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( result Ġ&& Ġ! is Idle ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . v (" process Touch Event :", Ġ" return ing : ĠTO UCH _ STE AL ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTO UCH _ STE AL ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . v (" process Touch Event :", Ġ" return ing : ĠTO UCH _ LIST EN ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTO UCH _ LIST EN ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . v (" process Touch Event :", Ġ" return ing : ĠTO UCH _ NO ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmake Idle () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTO UCH _ NO ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠWhether Ġwe Ġare Ġin Ġ[ FL ING ING ] Ġstate . Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġis Fl ing ing () Ġ= Ġstate Ġ== ĠFL ING ING ĊĊĠĠĠ Ġ/** ĠWhether Ġwe Ġare Ġin Ġ[ SCROLL ING ] Ġstate . Ġ*/ ĊĠĠĠ Ġ@ Suppress (" Member Visibility Can Be Private ") ĊĠĠĠ Ġinternal Ġfun Ġis Scrolling () Ġ= Ġstate Ġ== ĠSC ROLL ING ĊĊĠĠĠ Ġ/** ĠWhether Ġwe Ġare Ġin Ġ[ PIN CH ING ] Ġstate . Ġ*/ ĊĠĠĠ Ġ@ Suppress (" Member Visibility Can Be Private ") ĊĠĠĠ Ġinternal Ġfun Ġis Pin ch ing () Ġ= Ġstate Ġ== ĠPIN CH ING ĊĊĠĠĠ Ġ/** ĠWhether Ġwe Ġare Ġin Ġ[ ANIM ATING ] Ġstate . Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġis Anim ating () Ġ= Ġstate Ġ== ĠAN IM ATING ĊĊĠĠĠ Ġ/** ĠWhether Ġwe Ġare Ġin Ġ[ IDLE ] Ġstate . Ġ*/ ĊĠĠĠ Ġ@ Suppress (" Member Visibility Can Be Private ") ĊĠĠĠ Ġinternal Ġfun Ġis Idle () Ġ= Ġstate Ġ== ĠID LE ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMov es Ġstate Ġto Ġ[ FL ING ING ]. ĠReturns Ġtrue Ġif Ġsuccessful . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġset Fl ing ing () Ġ= ĠsetState ( FL ING ING ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMov es Ġstate Ġto Ġ[ SCROLL ING ]. ĠReturns Ġtrue Ġif Ġsuccessful . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġset Scrolling () Ġ= ĠsetState ( SCROLL ING ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMov es Ġstate Ġto Ġ[ PIN CH ING ]. ĠReturns Ġtrue Ġif Ġsuccessful . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġset Pin ch ing () Ġ= ĠsetState ( PIN CH ING ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMov es Ġstate Ġto Ġ[ ANIM ATING ]. ĠReturns Ġtrue Ġif Ġsuccessful . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġset Anim ating () Ġ= ĠsetState ( ANIM ATING ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMov es Ġstate Ġto Ġ[ IDLE ]. ĠReturns Ġtrue Ġif Ġsuccessful . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġmake Idle () Ġ= ĠsetState ( IDLE ) ĊĊĠĠĠ Ġprivate Ġfun ĠInt . to State Name (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠID LE Ġ-> Ġ" IDLE " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFL ING ING Ġ-> Ġ" FL ING ING " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSC ROLL ING Ġ-> Ġ" SCROLL ING " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPIN CH ING Ġ-> Ġ" PIN CH ING " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAN IM ATING Ġ-> Ġ" ANIM ATING " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Retention ( Annotation Retention . SOURCE ) ĊĠĠĠ Ġ@ Int Def ( IDLE , ĠSC ROLL ING , ĠPIN CH ING , ĠAN IM ATING , ĠFL ING ING ) ĊĠĠĠ Ġinternal Ġannotation Ġclass ĠState ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠState Controller :: class . java . simple Name ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠLOG Ġ= ĠZoom Logger . create ( TAG ) ĊĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠID LE Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠSC ROLL ING Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠPIN CH ING Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠAN IM ATING Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠFL ING ING Ġ= Ġ 4 ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠConstant Ġfor Ġ[ process Touch Event ]. ĊĠĠĠĠĠĠĠĠ Ġ* ĠIndicates Ġthat Ġwe Ġare Ġnot Ġinterested Ġin Ġthis Ġevent Ġstream . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTO UCH _ NO Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠConstant Ġfor Ġ[ process Touch Event ]. ĊĠĠĠĠĠĠĠĠ Ġ* ĠIndicates Ġthat Ġwe Ġare Ġinterested Ġin Ġthis Ġevent Ġstream , ĊĠĠĠĠĠĠĠĠ Ġ* Ġbut Ġwe 're Ġnot Ġsure Ġwe Ġhave Ġsomething Ġjust Ġyet . ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġgesture Ġmight Ġstart Ġat Ġa Ġlater Ġpoint . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTO UCH _ LIST EN Ġ= Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠConstant Ġfor Ġ[ process Touch Event ]. ĊĠĠĠĠĠĠĠĠ Ġ* ĠIndicates Ġthat Ġwe Ġwant Ġto Ġown Ġthis Ġstream Ġand Ġintercept ĊĠĠĠĠĠĠĠĠ Ġ* Ġit Ġas Ġlong Ġas Ġthis Ġvalue Ġis Ġreturned . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTO UCH _ STE AL Ġ= Ġ 2 ĊĠĠĠ Ġ} Ċ }