package Ġd io zz . echo . adapters Ċ Ċ import Ġandroid . content . Content U ris Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . DialogInterface Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . provider . Media Store Ċ import Ġandroid . support . v 4 . app . Fragment Activity Ċ import Ġandroid . support . v 7 . app . AlertDialog Ċ import Ġandroid . support . v 7 . widget . RecyclerView Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . LinearLayout Ċ import Ġandroid . widget . TextView Ċ import Ġandroid . widget . Toast Ċ import Ġd io zz . echo . R Ċ import Ġd io zz . echo . S ongs Ċ import Ġd io zz . echo . databases . Echo Database Ċ import Ġd io zz . echo . fragments . Player Fragment Ċ import Ġjava . io . File Ċ Ċ class ĠMain Screen Adapter ( song Details : ĠArrayList < S ongs >, Ġcontext : ĠContext ) Ġ: ĠRecyclerView . Adapter < Main Screen Adapter . My ViewHolder >() Ċ { ĊĠĠĠ Ġvar Ġsong Details : ĠArrayList < S ongs >? Ġ= Ġnull ĊĠĠĠ Ġvar Ġsong Details Copy : ĠArrayList < S ongs >? Ġ= Ġnull ĊĠĠĠ Ġvar Ġcontext : ĠContext ? Ġ= Ġnull ĊĊĠĠĠ Ġinit ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . song Details Ġ= Ġsong Details ĊĠĠĠĠĠĠĠ Ġthis . song Details Copy Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġthis . song Details Copy ?. addAll ( song Details ) ĊĊĠĠĠĠĠĠĠ Ġthis . context Ġ= Ġcontext ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfilter ( text : ĠString ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġtext Ġ= Ġtext ĊĊĠĠĠĠĠĠĠ Ġsong Details ?. clear () ĊĠĠĠĠĠĠĠ Ġ// something 's Ġwrong Ġhere . ĊĠĠĠĠĠĠĠ Ġ// after Ġclearing , Ġwe Ġend Ġup Ġwith Ġa Ġnon Ġscroll able , Ġnon Ġresponsive ( to Ġtouch ) Ġlist Ġof Ġold Ġitems Ġin ĠRecyclerView . ĊĠĠĠĠĠĠĠ Ġ// look s Ġlike Ġthe ĠRecyclerView Ġwas Ġupdated Ġwith Ġthe Ġcleared Ġlist , Ġbut Ġthe Ġ" dead " Ġitems Ġare Ġstill Ġshowing Ġup ! Ġ:( ĊĊĠĠĠĠĠĠĠ Ġif Ġ( text . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsong Details ?. addAll ( song Details Copy . or Empty ()) ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġtext . toLowerCase () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġsong Details Copy . or Empty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item ?. song Title . toLowerCase (). contains ( text ) Ġ|| Ġitem ?. song Artist . toLowerCase (). contains ( text )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsong Details ?. add ( item ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġnotify DataSet Changed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( p 0 : ĠMy ViewHolder , Ġp 1 : ĠInt ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsong Object Ġ= Ġsong Details ?. get ( p 1 ) ĊĠĠĠĠĠĠĠ Ġp 0 . track Title ?. text Ġ= Ġsong Object ?. song Title ĊĠĠĠĠĠĠĠ Ġp 0 . track Artist ?. text Ġ= Ġsong Object ?. song Artist ĊĊĠĠĠĠĠĠĠ Ġp 0 . content Holder ?. setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplayer Fragment Ġ= ĠPlayer Fragment () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġargs Ġ= ĠBundle () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġargs . putString (" song Artist ", Ġsong Object ?. song Artist ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġargs . putString (" path ", Ġsong Object ?. song Data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġargs . putString (" song Title ", Ġsong Object ?. song Title ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġargs . put Int (" song Id ", Ġsong Object ?. song Id ?. toInt () Ġas ĠInt ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġargs . put Int (" song Position ", Ġp 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġargs . put Parcelable ArrayList (" song Data ", Ġsong Details ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Fragment . arguments Ġ= Ġargs ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Player Fragment . Statics . media Player Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Player Fragment . Statics . media Player ?. is Playing Ġas ĠBoolean ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlayer Fragment . Statics . media Player ?. stop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠException ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( context Ġas ĠFragment Activity ). support FragmentManager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( R . id . details _ fragment , Ġplayer Fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addTo Back Stack (" Song Playing Fragment ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġp 0 . content Holder ?. setOn Long ClickListener Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠAlertDialog . Builder ( context Ġas ĠContext ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . setTitle ( song Object ?. song Title ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeletion Builder Ġ= ĠAlertDialog . Builder ( context Ġas ĠContext ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeletion Builder . setTitle (" S ure ?") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeletion Builder . setMessage (" This Ġwill Ġremove Ġ\"" Ġ+ Ġsong Object ?. song Title Ġ+ Ġ"\" Ġfrom Ġyour Ġdevice . ĠThis Ġcan 't Ġbe Ġund one .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeletion Builder . set Negative Button (" Cancel ", Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeletion Builder . set Positive Button (" Delete ") Ġ{ Ġ_: ĠDialog Interface , Ġ_: ĠInt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// if Ġfile Ġto Ġbe Ġdeleted Ġis Ġplaying Ġnow , Ġchange Ġthe Ġsong ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Player Fragment . Statics . media Player Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Player Fragment . Statics . media Player ?. is Playing Ġas ĠBoolean Ġ&& ĠPlayer Fragment . Statics . current Song Helper ?. song Id Ġ== Ġsong Object ?. song Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Player Fragment . Statics . current Song Helper ?. is Sh uff ling Ġas ĠBoolean ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlayer Fragment . Statics . play Next (" Play Next Normal Shuffle ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlayer Fragment . Statics . play Next (" Play Next Normal ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠException ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// de letes Ġfile . Ġbut Ġthis Ġis Ġleaving Ġa Ġblank Ġfile Ġof Ġsize Ġ 0 Ġbytes . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf Delete Ġ= ĠFile ( song Object ?. song Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( f Delete . delete ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// remove Ġfrom Ġfavor ites Ġfirst ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfavour ite Content Ġ= ĠEcho Database ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fav our ite Content ?. check If Id Exists ( song Object ?. song Id ?. toInt () Ġas ĠInt )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfavour ite Content ?. de Let e Favorite ( song Object ?. song Id ?. toInt () Ġas ĠInt ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove From List Using Id ( song Object ?. song Id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// this Ġwill Ġcompletely Ġremove Ġthe Ġ( blank ) file Ġfrom Ġdisk ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġuri Ġ= ĠContent U ris . with App ended Id ( Media Store . Audio . Play lists . EXTERNAL _ CONTENT _ URI , Ġsong Object ?. song Id Ġas ĠLong ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext ?. content Resolver ?. delete ( uri , Ġnull , Ġnull ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( context , Ġ" Music Ġwas Ġdeleted ", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( context , Ġ" Deletion ĠFailed ", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠException ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( context , Ġ" Deletion ĠFailed ", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdeletion Dialog Ġ= Ġdeletion Builder . create () ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġ Ġval Ġrename Builder Ġ= ĠAlertDialog . Builder ( context Ġas ĠContext ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrename Builder . setTitle (" Rename ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrename Builder . set Negative Button (" Cancel ", null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrename Builder . set Positive Button (" Rename ") Ġ{ Ġdialog Interface : ĠDialog Interface , Ġi : ĠInt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf delete Ġ= ĠFile ( song Object ?. song Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif (! f delete . rename To ( File ( song Object ?. song Data ?. substring Before Last ("/") Ġ+ Ġ" wu hh oo "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( context ," Deletion ĠFailed !", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcatch Ġ( e : Exception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( context ," Deletion ĠFailed :\ n " Ġ+ Ġe . message , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġrename Dialog Ġ= Ġrename Builder . create () */ ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfavour ite Content Ġ= ĠEcho Database ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfav String : ĠString ? Ġ= Ġ" Add ĠTo ĠF avorites " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fav our ite Content ?. check If Id Exists ( song Object ?. song Id ?. toInt () Ġas ĠInt )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfav String Ġ= Ġ" Remove ĠFrom ĠF avorites " ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanimal s Ġ= ĠarrayOf (" Delete ĠSong ", Ġfav String ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . set Items ( animal s ) Ġ{ Ġdialog , Ġwhich Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( which ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// 0 Ġ-> Ġrename Dialog . show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġdeletion Dialog . show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fav String Ġ== Ġ" Add ĠTo ĠF avorites ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfavour ite Content ?. store As Favorite ( song Object ?. song Id ?. toInt () Ġas ĠInt , Ġsong Object ?. song Artist , Ġsong Object ?. song Title , Ġsong Object ?. song Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( context , Ġ"\"" Ġ+ Ġsong Object ?. song Title Ġ+ Ġ"\" ĠWas ĠAdded ĠTo ĠF avour ites ", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfavour ite Content ?. de Let e Favorite ( song Object ?. song Id ?. toInt () Ġas ĠInt ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( context , Ġ"\"" Ġ+ Ġsong Object ?. song Title Ġ+ Ġ"\" ĠWas ĠRemoved ĠFrom ĠF avour ites ", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdialog Ġ= Ġbuilder . create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . show () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġremove From List Using Id ( song Id : ĠLong ?) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġc Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġsong Details . or Empty ()) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item ?. song Id Ġ== Ġsong Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsong Details ?. remove ( item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Item Removed ( c ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġc ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġsong Details Copy . or Empty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item ?. song Id Ġ== Ġsong Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsong Details Copy ?. remove ( item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġnotify DataSet Changed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( p 0 : ĠViewGroup , Ġp 1 : ĠInt ): ĠMy ViewHolder ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMy ViewHolder ( LayoutInflater . from ( p 0 ?. context ). inflate ( R . layout . song _ item , Ġp 0 , Ġfalse )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem Count (): ĠInt ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( song Details Ġ== Ġnull ) Ġ 0 Ġelse Ġ( song Details Ġas ĠArrayList < S ongs >). size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠMy ViewHolder ( item View : ĠView ) Ġ: ĠRecyclerView . ViewHolder ( item View ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġtrack Title : ĠTextView ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġtrack Artist : ĠTextView ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġcontent Holder : ĠLinearLayout ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġinit ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrack Title Ġ= ĠitemView ?. findViewById ( R . id . track Title ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrack Artist Ġ= ĠitemView ?. findViewById ( R . id . track Artist ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Holder Ġ= ĠitemView ?. findViewById ( R . id . content Row ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ