package Ġcom . example . music player . ui . playlist Ċ Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . provider . Media Store Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . Menu Ċ import Ġandroid . view . MenuItem Ċ import Ġandroidx . appcompat . app . AlertDialog Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . recyclerview . widget . Divider Item Decoration Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġcom . example . music player . MainActivity Ċ import Ġcom . example . music player . R Ċ import Ġcom . example . music player . data . model . Playlist Ċ import Ġcom . example . music player . data . repo . Content LiveData Ċ import Ġcom . example . music player . data . repo . Playlist Repository Ċ import Ġcom . example . music player . utils . Constants Ċ import Ġcom . i ams dt . and roi dex t ension . My Coroutine Context Ċ import Ġcom . i ams dt . and roi dex t ension . g one Ċ import Ġcom . i ams dt . and roi dex t ension . next Activity Ċ import Ġcom . i ams dt . and roi dex t ension . show Ċ import Ġes . dm oral . toast y . Toast y Ċ import Ġkotlinx . android . synt hetic . main . activity _ playlist .* Ċ import Ġkotlinx . android . synt hetic . main . content _ playlist .* Ċ import Ġkotlinx . android . synt hetic . main . playlist _ dialogs . view .* Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġorg . k oin . android x . view model . ext . android . viewModel ĊĊ Ċ class ĠPlaylist Activity Ġ: ĠAppCompatActivity (), ĠLong ClickListener < Playlist > Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġui Scope Ġ= ĠMy Coroutine Context () ĊĊĠĠĠ Ġprivate Ġval Ġvm : ĠPlaylist VM Ġby ĠviewModel () ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ playlist ) ĊĠĠĠĠĠĠĠ Ġset Support ActionBar ( toolbar ) ĊĠĠĠĠĠĠĠ Ġ// add Ġobserver Ġto Ġcor outines ĊĠĠĠĠĠĠĠ Ġlifecycle . add Observer ( ui Scope ) ĊĊĠĠĠĠĠĠĠ Ġload Type Data ( intent ) ĊĊĠĠĠĠĠĠĠ Ġ// text ĊĠĠĠĠĠĠĠ Ġplaylist _ text . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Playlist Dialog () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// recyclerview ĊĠĠĠĠĠĠĠ Ġval Ġadapter Ġ= ĠPlaylist Adapter ( this , Ġthis ) ĊĠĠĠĠĠĠĠ Ġval Ġmanager Ġ= ĠLinearLayoutManager ( this ) ĊĠĠĠĠĠĠĠ Ġplaylist _ rcv . layout Manager Ġ= Ġmanager ĊĠĠĠĠĠĠĠ Ġplaylist _ rcv . adapter Ġ= Ġadapter ĊĊĠĠĠĠĠĠĠ Ġ// item Ġdecoration ĊĠĠĠĠĠĠĠ Ġval Ġdivider Item Decoration Ġ= ĠDiv ider Item Decoration ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmanager . orientation ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġplaylist _ rcv . addItem Decoration ( divider Item Decoration ) ĊĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠMedia Store . Audio . Play lists . EXTERNAL _ CONTENT _ URI ĊĠĠĠĠĠĠĠ Ġval Ġprovider Ġ= ĠContent LiveData ( uri , Ġthis ) ĊĠĠĠĠĠĠĠ Ġ// observer Ġprovider ĊĠĠĠĠĠĠĠ Ġprovider . observe ( this , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ== Ġnull Ġ|| Ġit . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty View () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregular View () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// submit Ġlist Ġto Ġthe Ġadapter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . submit List ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġvm . is Updated . observe ( this , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġprovider . getContent Provider Value () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty View () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregular View () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . submit List ( list ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġprovider . getContent Provider Value () ĊĠĠĠĠĠĠĠ Ġif Ġ( list . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġempty View () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregular View () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . submit List ( list ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsupport ActionBar ?. set Display Home As Up Enabled ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Type Data ( intent : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġintent . getString Extra ( Constants . Type . Type ) Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġintent . getLong Extra ( Constants . Playlist . Playlist ID , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= Ġintent . getString Extra ( Constants . Playlist . Playlist Name ) Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġval Ġplay Immediate ly Ġ= Ġintent . getBoolean Extra (" playlist ", Ġfalse ) ĊĠĠĠĠĠĠĠ Ġval Ġwidget Ġ= Ġintent . getBoolean Extra (" widget ", Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( widget ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( Constants . Type . Type , Ġtype ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( Constants . Playlist . Playlist ID , Ġid ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( Constants . Playlist . Playlist Name , Ġtitle ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair (" playlist ", Ġplay Immediate ly ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair (" widget ", Ġwidget ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Activity < Play List Details >( list Ġ= Ġmap ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Playlist Dialog () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠAlertDialog . Builder ( this ) ĊĠĠĠĠĠĠĠ Ġval Ġview Ġ= ĠLayoutInflater . from ( this ). inflate ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . layout . playlist _ dialogs , Ġplaylist _ root , Ġfalse ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġbuilder . setView ( view ) ĊĠĠĠĠĠĠĠ Ġval Ġdialog Ġ= Ġbuilder . create () ĊĊĠĠĠĠĠĠĠ Ġview . playlist _ dialog _ btn . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġview . playlist _ dialog _ et . text . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( name . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast y . warning ( this , Ġ" Please Ġinput Ġvalid Ġname "). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrepo Ġ= ĠPlaylist Repository . getInstance ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepo ?. create Playlist ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dialog . is Showing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdialog . show () ĊĠĠĠĠĠĠĠ Ġdialog . window ?. setBackground Drawable Resource ( android . R . color . transparent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġregular View () Ġ{ ĊĠĠĠĠĠĠĠ Ġplaylist _ rcv . show () ĊĠĠĠĠĠĠĠ Ġplaylist _ text . g one () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġempty View () Ġ{ ĊĠĠĠĠĠĠĠ Ġplaylist _ rcv . g one () ĊĠĠĠĠĠĠĠ Ġplaylist _ text . show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclick ( model : ĠPlaylist ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( Constants . Type . Type , ĠConstants . Type . Type Playlist ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( Constants . Playlist . Playlist ID , Ġmodel . id ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( Constants . Playlist . Playlist Name , Ġmodel . name ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġnext Activity < Play List Details >( list Ġ= Ġmap ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġlong Click ( model : ĠPlaylist ) Ġ{ ĊĠĠĠĠĠĠĠ Ġshow Warning ( model ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Warning ( model : ĠPlaylist ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠAlertDialog . Builder ( this ) ĊĠĠĠĠĠĠĠ Ġbuilder . setTitle (" Delete ?") ĊĠĠĠĠĠĠĠ Ġbuilder . setMessage (" Are Ġyou Ġwant Ġto Ġdelete Ġ${ model . name } Ġplaylist ?") ĊĠĠĠĠĠĠĠ Ġbuilder . set Positive Button (" yes ") Ġ{ Ġdialog , Ġwhich Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrepo Ġ= ĠPlaylist Repository . getInstance ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepo ?. delete Playlist ( model . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbuilder . set Negative Button (" cancel ") Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// nothing Ġto Ġdo ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdialog Ġ= Ġbuilder . create () ĊĠĠĠĠĠĠĠ Ġdialog . show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġmenu Inflater . inflate ( R . menu . playlist _ menu , Ġmenu ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( item . itemId Ġ== Ġandroid . R . id . home ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Activity < MainActivity >( finish Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( item . itemId Ġ== ĠR . id . action _ add ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Playlist Dialog () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ