package Ġcom . cle ver o ad . bootstrap . kotlin _ core . ui . adapter . listeners Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . view . Gesture Detector Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . cle ver o ad . bootstrap . kotlin _ core . ui . NO _ ITEM _ ID Ċ Ċ /** Ċ Ġ* ĠHelper Ġclass Ġfor Ġdetect ing Ġclick Ġon ĠRecyclerView 's Ġitem Ċ Ġ*/ Ċ abstract Ġclass ĠClick Item Touch Listener Ġinternal Ġconstructor ( host View : ĠRecyclerView ) Ġ: ĠRecyclerView . On Item Touch Listener Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġgesture Detector : ĠGest ure Detector Ġ= ĠItem Click Gesture Detector ( host View . context , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠItem Click Gesture Listener ( host View )) ĊĊĠĠĠ Ġprivate Ġfun Ġis Attached To Window ( host View : ĠRecyclerView ): ĠBoolean Ġ= Ġhost View . handler Ġ!= Ġnull ĊĊĊĠĠĠ Ġprivate Ġfun Ġhas Adapter ( host View : ĠRecyclerView ): ĠBoolean Ġ= Ġhost View . adapter Ġ!= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġon Intercept Touch Event ( re cyclerView : ĠRecyclerView , Ġevent : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Attached To Window ( re cyclerView ) Ġ|| Ġ! has Adapter ( re cyclerView )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgesture Detector . on Touch Event ( event ) ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Touch Event ( re cyclerView : ĠRecyclerView , Ġevent : ĠMotion Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġcan Ġsilently Ġtrack Ġtap Ġand Ġand Ġlong Ġp resses Ġby Ġsilently ĊĠĠĠĠĠĠĠ Ġ// Ġintercept ing Ġtouch Ġevents Ġin Ġthe Ġhost ĠRecyclerView . ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġabstract Ġfun Ġperform Item Click ( parent : ĠRecyclerView , Ġview : ĠView , Ġposition : ĠInt , Ġid : ĠLong ): ĠBoolean ĊĠĠĠ Ġinternal Ġabstract Ġfun Ġperform Item Long Click ( parent : ĠRecyclerView , Ġview : ĠView , Ġposition : ĠInt , Ġid : ĠLong ): ĠBoolean ĊĊĠĠĠ Ġprivate Ġclass ĠItem Click Gesture Detector ( context : ĠContext , Ġgesture Listener : ĠItem Click Gesture Listener ) ĊĠĠĠĠĠĠĠ Ġ: ĠGest ure Detector ( context , Ġgesture Listener ) ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠItem Click Gesture Listener ( private Ġval Ġhost View : ĠRecyclerView ) Ġ: ĠGest ure Detector . Simple On Gesture Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġtarget Child : ĠView ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġfun Ġdispatch Single Tap Up IfNeeded ( event : ĠMotion Event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen Ġthe Ġlong Ġpress Ġhook Ġis Ġcalled Ġbut Ġthe Ġlong Ġpress Ġlistener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġreturns Ġfalse , Ġthe Ġtarget Ġchild Ġwill Ġbe Ġleft Ġaround Ġto Ġbe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhandled Ġlater . ĠIn Ġthis Ġcase , Ġwe Ġshould Ġstill Ġtreat Ġthe Ġgesture ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġas Ġpotential Ġitem Ġclick . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Child ?. let Ġ{ Ġon Single Tap Up ( event ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Down ( event : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġevent . x . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġevent . y . toInt () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Child Ġ= Ġhost View . find Child View Under ( x . toFloat (), Ġy . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtarget Child Ġ!= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Show Press ( event : ĠMotion Event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Child ?. is Pressed Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Single Tap Up ( event : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġhandled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Child ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Pressed Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġhandled By Child Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Ġis ĠViewGroup ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandled By Child Ġ= Ġchild Is Clickable ( this , Ġevent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! handled By Child ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġhost View . getChild Adapter Position ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġhost View . adapter ?. getItem Id ( position ) Ġ?: ĠNO _ ITEM _ ID ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandled Ġ= Ġperform Item Click ( host View , Ġthis , Ġposition , Ġid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Child Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġhandled ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġchild Is Clickable ( view : ĠView , Ġevent : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Point Inside View ( event . raw X , Ġevent . raw Y , Ġview )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( view Ġis ĠViewGroup ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġview . child Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhandled By Child Ġ= Ġchild Is Clickable ( view . getChild At ( i ), Ġevent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( handled By Child ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġview . is Clickable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠDetermines Ġif Ġgiven Ġpoints Ġare Ġinside Ġview ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġx Ġ- Ġx Ġcoordinate Ġof Ġpoint ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġy Ġ- Ġy Ġcoordinate Ġof Ġpoint ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġview Ġ- Ġview Ġobject Ġto Ġcompare ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġthe Ġpoints Ġare Ġwithin Ġview Ġbounds , Ġfalse Ġotherwise ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġis Point Inside View ( x : ĠFloat , Ġy : ĠFloat , Ġview : ĠView ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocation Ġ= ĠInt Array ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . getLocation On Screen ( location ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview X Ġ= Ġlocation [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Y Ġ= Ġlocation [ 1 ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// point Ġis Ġinside Ġview Ġbounds ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġx Ġ> Ġview X Ġ&& Ġx Ġ< Ġview X Ġ+ Ġview . width Ġ&& Ġy Ġ> Ġview Y Ġ&& Ġy Ġ< Ġview Y Ġ+ Ġview . height ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scroll ( event : ĠMotion Event , Ġevent 2 : ĠMotion Event , Ġv : ĠFloat , Ġv 2 : ĠFloat ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtarget Child ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . is Pressed Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Child Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Long Press ( event : ĠMotion Event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Child ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġhost View . getChild Layout Position ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġhost View . adapter ?. getItem Id ( position ) Ġ?: ĠNO _ ITEM _ ID ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhandled Ġ= Ġperform Item Long Click ( host View , Ġit , Ġposition , Ġid ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( handled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . is Pressed Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Child Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }