package Ġio . ben ic . shopping list . view Ċ Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . graphics . drawable . Color Drawable Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġandroidx . lifecycle . Lifecycle Coroutine Scope Ċ import Ġandroidx . recyclerview . widget . Item Touch Helper Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġandroidx . recyclerview . widget . RecyclerView . Item Decoration Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ import Ġio . ben ic . shopping list . R Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . launch ĊĊ Ċ class ĠSw ipe Helper ( ĊĠĠĠ Ġprivate Ġval Ġlifecycle Coroutine Scope : ĠLifecycle Coroutine Scope , ĊĠĠĠ Ġprivate Ġval Ġcallback : Ġ( remove : ĠBoolean , Ġposition : ĠInt ) Ġ-> ĠUnit Ċ ) Ġ: ĠItem Touch Helper . Simple Callback ( ĊĠĠĠĠ 0 , ĊĠĠĠ ĠItem Touch Helper . LEFT Ċ ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Swipe Helper " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠUN DO _ TIME Ġ= Ġ 1 5 0 0 L ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġitem Adapter : ĠItem Re cycle Adapter ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġdelete Background : ĠDrawable Ġ= ĠColor Drawable ( Color . RED ) ĊĊĠĠĠ Ġprivate Ġvar Ġis Sw ip ing : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġfun Ġset Adapter ( adapter : ĠItem Re cycle Adapter ) Ġ{ ĊĠĠĠĠĠĠĠ Ġitem Adapter Ġ= Ġadapter ĊĠĠĠĠĠĠĠ ĠsetDefault Drag Dirs ( Item Touch Helper . UP Ġor ĠItem Touch Helper . DOWN ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Move ( ĊĠĠĠĠĠĠĠ Ġre cyclerView : ĠRecyclerView , ĊĠĠĠĠĠĠĠ ĠviewHolder : ĠRecyclerView . ViewHolder , ĊĠĠĠĠĠĠĠ Ġtarget : ĠRecyclerView . ViewHolder ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( item Adapter Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(!( item Adapter !!. is Filtered ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Adapter !!. move Item ( view Holder . adapter Position , Ġtarget . adapter Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Sw ip ed ( view Holder : ĠRecyclerView . ViewHolder , Ġdirection : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġi Ġ= ĠviewHolder . adapter Position ĊĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" sw ip ed Ġon Ġitem Ġ$ i ") ĊĊĠĠĠĠĠĠĠ ĠsetDefault Swipe Dirs ( 0 ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġund one Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġlifecycle Coroutine Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( UN DO _ TIME ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! und one ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ( true , Ġi ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetDefault Swipe Dirs ( Item Touch Helper . LEFT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠSn ackbar . make ( view Holder . item View , ĠR . string . item _ deleted , ĠSn ackbar . LENGTH _ IN DEFIN ITE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAction ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . undo ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" undo ing ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġund one Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ( false , Ġi ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetDefault Swipe Dirs ( Item Touch Helper . LEFT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. set Duration ( UN DO _ TIME . toInt ()). show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWe 're Ġgonna Ġsetup Ġanother ĠItem Decorator Ġthat Ġwill Ġdraw Ġthe Ġred Ġbackground Ġin Ġthe Ġempty Ġspace Ġwhile Ġthe Ġitems Ġare Ġanim ating Ġto Ġtheir Ġnew Ġpositions ĊĠĠĠĠ Ġ* Ġafter Ġan Ġitem Ġis Ġremoved . ĊĠĠĠĠ Ġ* Ġhttps :// github . com / n eman ja - kov ace vic / recycler - view - swipe - to - delete ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠsetUp Animation Decorator Helper ( re cyclerView : ĠRecyclerView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġre cyclerView . addItem Decoration ( object Ġ: ĠItem Decoration () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġwant Ġto Ġcache Ġthis Ġand Ġnot Ġallocate Ġanything Ġrepeatedly Ġin Ġthe Ġon Draw Ġmethod ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbackground : ĠDrawable Ġ= Ġdelete Background ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Draw ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc : ĠCanvas , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent : ĠRecyclerView , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate : ĠRecyclerView . State ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġonly Ġif Ġanimation Ġis Ġin Ġprogress ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent . item Animator !!. isRunning Ġ&& Ġis Sw ip ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsome Ġitems Ġmight Ġbe Ġanim ating Ġdown Ġand Ġsome Ġitems Ġmight Ġbe Ġanim ating Ġup Ġto Ġclose Ġthe Ġgap Ġleft Ġby Ġthe Ġremoved Ġitem ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthis Ġis Ġnot Ġexclusive , Ġboth Ġmovement Ġcan Ġbe Ġhappening Ġat Ġthe Ġsame Ġtime ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġto Ġreproduce Ġthis Ġleave Ġjust Ġenough Ġitems Ġso Ġthe Ġfirst Ġone Ġand Ġthe Ġlast Ġone Ġwould Ġbe Ġjust Ġa Ġlittle Ġoff Ġscreen ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthen Ġremove Ġone Ġfrom Ġthe Ġmiddle ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfind Ġfirst Ġchild Ġwith Ġtranslation Y Ġ> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġand Ġlast Ġone Ġwith Ġtranslation Y Ġ< Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe 're Ġafter Ġa Ġrect Ġthat Ġis Ġnot Ġcovered Ġin Ġre cycler - view Ġviews Ġat Ġthis Ġpoint Ġin Ġtime ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlast View Com ing Down : ĠView ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfirst View Com ing Up : ĠView ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthis Ġis Ġfixed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġright Ġ= Ġparent . width ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthis Ġwe Ġneed Ġto Ġfind Ġout ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtop Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbottom Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfind Ġrelevant Ġtrans lating Ġviews ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Count Ġ= Ġparent . layout Manager !!. child Count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġchild Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild : ĠView Ġ= Ġparent . layout Manager !!. getChild At ( i ) !! ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child . translation Y Ġ< Ġ 0 ) Ġ{ Ġ// Ġview Ġis Ġcoming Ġdown ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast View Com ing Down Ġ= Ġchild ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( child . translation Y Ġ> Ġ 0 ) Ġ{ Ġ// Ġview Ġis Ġcoming Ġup ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( first View Com ing Up Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst View Com ing Up Ġ= Ġchild ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last View Com ing Down Ġ!= Ġnull Ġ&& Ġfirst View Com ing Up Ġ!= Ġnull ) Ġ{ Ġ// Ġviews Ġare Ġcoming Ġdown ĠAND Ġgoing Ġup Ġto Ġfill Ġthe Ġvoid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Ġ= Ġlast View Com ing Down . bottom Ġ+ Ġlast View Com ing Down . translation Y . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Ġ= Ġfirst View Com ing Up . top Ġ+ Ġfirst View Com ing Up . translation Y . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( last View Com ing Down Ġ!= Ġnull ) Ġ{ Ġ// Ġviews Ġare Ġgoing Ġdown Ġto Ġfill Ġthe Ġvoid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Ġ= Ġlast View Com ing Down . bottom Ġ+ Ġlast View Com ing Down . translation Y . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Ġ= Ġlast View Com ing Down . bottom ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( first View Com ing Up Ġ!= Ġnull ) Ġ{ Ġ// Ġviews Ġare Ġcoming Ġup Ġto Ġfill Ġthe Ġvoid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Ġ= Ġfirst View Com ing Up . top ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Ġ= Ġfirst View Com ing Up . top Ġ+ Ġfirst View Com ing Up . translation Y . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbackground . setBounds ( left , Ġtop , Ġright , Ġbottom ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbackground . draw ( c ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Draw ( c , Ġparent , Ġstate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ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 ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġview Ġ= ĠviewHolder . item View ĊĊĠĠĠĠĠĠĠ Ġis Sw ip ing Ġ= Ġaction State Ġ== ĠItem Touch Helper . ACTION _ STATE _ SW I PE ĊĊĠĠĠĠĠĠĠ Ġdelete Background . setBounds ( view . right Ġ+ Ġd X . toInt (), Ġview . top , Ġview . right , Ġview . bottom ) ĊĠĠĠĠĠĠĠ Ġdelete Background . draw ( c ) ĊĊĠĠĠĠĠĠĠ Ġsuper . on Child Draw ( c , Ġre cyclerView , ĠviewHolder , Ġd X , Ġd Y , Ġaction State , Ġis Currently Active ) ĊĠĠĠ Ġ} Ċ }