package Ġcom . k ro e ger ama . res w ista Ċ Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . view . View Ċ import Ġandroidx . recyclerview . widget . Item Touch Helper Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . k ro e ger ama . ka ite ki . scale Ċ import Ġkotlin . math . absolute Value Ċ Ċ class ĠStack Swipe Touch Helper Callback ( ĊĠĠĠ Ġprivate Ġval Ġlistener : ĠSw ipe Listener , ĊĠĠĠ Ġprivate Ġval Ġconfig : ĠSw iper Config Ċ ) Ġ: ĠItem Touch Helper . Callback () Ġ{ ĊĊĠĠĠ Ġvar Ġallow Swipe Ġ= Ġtrue ĊĊĠĠĠ Ġoverride Ġfun Ġis Item View Swipe Enabled () Ġ= Ġallow Swipe ĊĊĠĠĠ Ġoverride Ġfun Ġget Movement Flags ( re cyclerView : ĠRecyclerView , ĠviewHolder : ĠRecyclerView . ViewHolder ) Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġre cyclerView . layout Manager Ġ! is ĠStack LayoutManager Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠ Ġre cyclerView . is Anim ating Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠ Ġ! listener . is Swipe Allowed ( view Holder ) Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġconfig . swipe Directions ĊĠĠĠ Ġ}. let Ġ{ Ġswipe Flags Ġ-> ĊĠĠĠĠĠĠĠ Ġmake Movement Flags ( 0 , Ġswipe Flags ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Move ( ĊĠĠĠĠĠĠĠ Ġre cyclerView : ĠRecyclerView , ĊĠĠĠĠĠĠĠ ĠviewHolder : ĠRecyclerView . ViewHolder , ĊĠĠĠĠĠĠĠ Ġtarget : ĠRecyclerView . ViewHolder ĊĠĠĠ Ġ) Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun Ġon Sw ip ed ( view Holder : ĠRecyclerView . ViewHolder , Ġdirection : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlistener . on Sw ip ed ( view Holder , Ġdirection ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Swipe Threshold ( view Holder : ĠRecyclerView . ViewHolder ) Ġ= Ġ 0 . 3 f ĊĊĠĠĠ Ġoverride Ġfun Ġon Child Draw ( ĊĠĠĠĠĠĠĠ Ġc : ĠCanvas , ĊĠĠĠĠĠĠĠ Ġre cyclerView : ĠRecyclerView , ĊĠĠĠĠĠĠĠ ĠviewHolder : ĠRecyclerView . ViewHolder , ĊĠĠĠĠĠĠĠ Ġd X : ĠFloat , ĊĠĠĠĠĠĠĠ Ġd Y : ĠFloat , ĊĠĠĠĠĠĠĠ Ġaction State : ĠInt , ĊĠĠĠĠĠĠĠ Ġis Currently Active : ĠBoolean ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Child Draw ( c , Ġre cyclerView , ĠviewHolder , Ġd X , Ġd Y , Ġaction State , Ġis Currently Active ) ĊĠĠĠĠĠĠĠ Ġval ĠitemView Ġ= ĠviewHolder . item View ĊĠĠĠĠĠĠĠ Ġval Ġratio X Ġ= Ġ( dX Ġ/ Ġre cyclerView . x Threshold ). coerce In (- 1 f , Ġ 1 f ) ĊĠĠĠĠĠĠĠ Ġval Ġratio : ĠFloat ĊĠĠĠĠĠĠĠ Ġval Ġdirection : ĠInt ĊĠĠĠĠĠĠĠ Ġif Ġ( dX . absolute Value Ġ> Ġd Y . absolute Value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġratio Ġ= Ġratio X ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdirection Ġ= Ġif Ġ( dX Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Direction . RIGHT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Direction . LEFT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġratio Ġ= Ġ( d Y Ġ/ Ġre cyclerView . y Threshold ). coerce In (- 1 f , Ġ 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdirection Ġ= Ġif Ġ( d Y Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Direction . DOWN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Direction . UP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠitemView . rotation Ġ= Ġratio X Ġ* Ġconfig . item Rotation ĊĊĠĠĠĠĠĠĠ Ġval Ġchild Count Ġ= Ġre cyclerView . child Count ĊĠĠĠĠĠĠĠ Ġval Ġstart Ġ= Ġif Ġ( child Count Ġ> Ġconfig . show Count ) Ġ 1 Ġelse Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( pos Ġin Ġstart Ġuntil Ġchild Count Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġidx Ġ= Ġchild Count Ġ- Ġpos Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġre cyclerView . getChild At ( pos ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale For Position ( idx , Ġratio ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . translate For Position ( idx , Ġratio ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlistener . on Swipe ( view Holder , Ġd X , Ġd Y , Ġdirection ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠView . scale For Position ( pos : ĠInt , Ġratio : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġscale ( 1 Ġ- Ġpos Ġ* Ġconfig . item Scale Ġ+ Ġratio . absolute Value Ġ* Ġconfig . item Scale ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠView . translate For Position ( pos : ĠInt , Ġratio : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtranslation Ġ= Ġconfig . item Translate ĊĠĠĠĠĠĠĠ Ġwhen Ġ( config . stack Direction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStack Direction . Left Ġ-> Ġtranslation X Ġ= Ġ-( pos Ġ- Ġratio . absolute Value ) Ġ* Ġmeasured Width Ġ* Ġtranslation ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStack Direction . Up Ġ-> Ġtranslation Y Ġ= Ġ-( pos Ġ- Ġratio . absolute Value ) Ġ* Ġmeasured Height Ġ* Ġtranslation ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStack Direction . Right Ġ-> Ġtranslation X Ġ= Ġ( pos Ġ- Ġratio . absolute Value ) Ġ* Ġmeasured Width Ġ* Ġtranslation ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStack Direction . Down Ġ-> Ġtranslation Y Ġ= Ġ( pos Ġ- Ġratio . absolute Value ) Ġ* Ġmeasured Height Ġ* Ġtranslation ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclear View ( re cyclerView : ĠRecyclerView , ĠviewHolder : ĠRecyclerView . ViewHolder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . clear View ( re cyclerView , ĠviewHolder ) ĊĠĠĠĠĠĠĠ ĠviewHolder . item View . rotation Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġlistener . on Swipe End ( view Holder ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠRecyclerView . x Threshold Ġget () Ġ= Ġwidth Ġ* Ġ. 4 f ĊĠĠĠ Ġprivate Ġval ĠRecyclerView . y Threshold Ġget () Ġ= Ġx Threshold Ċ } Ċ