package Ġcom . example . music player . ui . playlist Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Handler Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . appcompat . widget . AppCompat TextView Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . bump tech . glide . G lide Ċ import Ġcom . example . music player . R Ċ import Ġcom . example . music player . data . model . Song Ċ import Ġcom . example . music player . ext . to Uri Ċ import Ġcom . i ams dt . and roi dex t ension . add Text K Ċ import Ġcom . i ams dt . and roi dex t ension . g one Ċ import Ġcom . i ams dt . and roi dex t ension . show Ċ import Ġde . hd od enh of . circle image view . Circle ImageView Ċ import Ġkotlinx . android . synt hetic . main . list _ item . view .* Ċ import Ġkotlinx . android . synt hetic . main . playlist _ item . view .* Ċ import Ġkotlinx . android . synt hetic . main . undo _ layout . view .* Ċ Ċ class ĠPlaylist Details Adapter ( private Ġval Ġcontext : ĠContext , Ġprivate Ġval Ġlistener : ĠPlay List Listener < Song >) Ġ: ĊĠĠĠ ĠRecyclerView . Adapter < Playlist Details Adapter . Play List VH >() Ġ{ ĊĊĠĠĠ Ġvar Ġcurrent List Ġ= ĠArrayList < Song >() ĊĊĠĠĠ Ġprivate Ġval Ġpending Item Removal Ġ= Ġ 3 0 0 0 Ġ// Ġ 3 sec ĊĠĠĠ Ġprivate Ġval Ġhandler Ġ= ĠHandler () Ġ// Ġhandler Ġfor Ġrunning Ġdelayed Ġrunnable ĊĠĠĠ Ġprivate Ġval Ġpending Runnable : ĠMutable Map < Song ?, ĠRunnable > Ġ= ĠHashMap () Ġ// Ġmap Ġof Ġitems Ġto Ġpending Ġrun n ables , Ġso Ġwe Ġcan Ġcancel Ġa Ġremoval Ġif Ġneed Ġbe ĊĊĠĠĠ Ġprivate Ġvar Ġitems Pending Removal : ĠArrayList < Song ?> Ġ= ĠArrayList () ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠPlay List VH Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġview Ġ= ĠLayoutInflater . from ( parent . context ). inflate ( R . layout . playlist _ item , Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġreturn ĠPlay List VH ( view ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsubmit List ( songs : List < Song > ){ ĊĠĠĠĠĠĠĠ Ġcurrent List . clear () ĊĠĠĠĠĠĠĠ Ġcurrent List . addAll ( songs ) ĊĠĠĠĠĠĠĠ Ġnotify DataSet Changed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġundo Opt ( post Table : ĠSong ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpending Removal Runnable Ġ= Ġpending Runnable [ post Table ] ĊĠĠĠĠĠĠĠ Ġpending Runnable . remove ( post Table ) ĊĠĠĠĠĠĠĠ Ġif Ġ( pending Removal Runnable Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . remove Callbacks ( pending Removal Runnable ) ĊĠĠĠĠĠĠĠ Ġitems Pending Removal . remove ( post Table ) ĊĠĠĠĠĠĠĠ Ġ// Ġthis Ġwill Ġre bind Ġthe Ġrow Ġin Ġ" normal " Ġstate ĊĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġcurrent List . indexOf ( post Table ) ĊĊĠĠĠĠĠĠĠ Ġnotify Item Changed ( id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreorder ( from : Int , Ġto : Int ){ ĊĠĠĠĠĠĠĠ Ġval Ġfrom Model Ġ= Ġcurrent List [ from ] ĊĠĠĠĠĠĠĠ Ġcurrent List [ from ] Ġ= Ġcurrent List [ to ] ĊĠĠĠĠĠĠĠ Ġcurrent List [ to ] Ġ= Ġfrom Model ĊĠĠĠĠĠĠĠ Ġnotify Item Moved ( from , Ġto ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠPlay List VH , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= Ġcurrent List [ position ] ĊĊĠĠĠĠĠĠĠ Ġholder . bind ( model , Ġcontext ) ĊĠĠĠĠĠĠĠ Ġholder . item View . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . click ( model ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmodel . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( items Pending Removal . contains ( model )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . regular . g one () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . swipe . show () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . undo . setOnClickListener Ġ{ Ġundo Opt ( model ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . swipe . g one () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . regular . show () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . bind ( model , Ġcontext ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item View . tag Ġ= Ġmodel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item View . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . click ( model ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpending Removal ( position : ĠInt ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġdata : ĠSong ? Ġ= Ġcurrent List [ position ] ĊĠĠĠĠĠĠĠ Ġif Ġ(! items Pending Removal . contains ( data )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitems Pending Removal . add ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthis Ġwill Ġredraw Ġrow Ġin Ġ" undo " Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Item Changed ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġlet 's Ġcreate , Ġstore Ġand Ġpost Ġa Ġrunnable Ġto Ġremove Ġthe Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpending Removal Runnable Ġ= Ġkotlinx . coroutines . Runnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove ( current List . indexOf ( data )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . post Delayed ( pending Removal Runnable , Ġpending Item Removal . to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpending Runnable [ data ] Ġ= Ġpending Removal Runnable ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġremove ( position : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġcurrent List [ position ] ĊĊĠĠĠĠĠĠĠ Ġif Ġ( items Pending Removal . contains ( data )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitems Pending Removal . remove ( data ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( current List . contains ( data )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . delete ( data ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Pending Removal ( position : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġcurrent List [ position ] ĊĠĠĠĠĠĠĠ Ġreturn Ġitems Pending Removal . contains ( data ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠPlay List VH ( view : ĠView ) Ġ: ĠRecyclerView . ViewHolder ( view ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġimg : ĠCircle ImageView Ġ= Ġview . main _ list _ icon ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtitle : ĠAppCompat TextView Ġ= Ġview . main _ list _ title ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġsubtitle : ĠAppCompat TextView Ġ= Ġview . main _ list _ subtitle ĊĠĠĠĠĠĠĠ Ġval Ġregular : ĠView Ġ= Ġview . regular _ layout ĊĠĠĠĠĠĠĠ Ġval Ġswipe : ĠView Ġ= Ġview . swipe Layout ĊĠĠĠĠĠĠĠ Ġval Ġdelete : ĠTextView Ġ= Ġview . undo _ delete Txt ĊĠĠĠĠĠĠĠ Ġval Ġundo : ĠTextView Ġ= Ġview . undo Btn ĊĊĠĠĠĠĠĠĠ Ġfun Ġbind ( model : ĠSong , Ġcontext : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle . add Text K ( model . title ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubtitle . add Text K ( model . artist ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri Ġ= Ġmodel . album Id . to Uri () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠG lide . with ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. load ( uri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. placeholder ( R . drawable . ic _ audio _ player ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. error ( R . drawable . ic _ audio _ player ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. into ( img ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem Count (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcurrent List . size ĊĠĠĠ Ġ} Ċ }