package Ġcom . github . ap og nu . ot ter . fragments Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . Gravity Ċ import Ġandroid . view . View Ċ import Ġandroidx . appcompat . widget . PopupMenu Ċ import Ġandroidx . core . os . bundle Of Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . github . ap og nu . ot ter . R Ċ import Ġcom . github . ap og nu . ot ter . adapters . Playlist Tracks Adapter Ċ import Ġcom . github . ap og nu . ot ter . repositories . F avorites Repository Ċ import Ġcom . github . ap og nu . ot ter . repositories . Management Play lists Repository Ċ import Ġcom . github . ap og nu . ot ter . repositories . Playlist Tracks Repository Ċ import Ġcom . github . ap og nu . ot ter . repositories . Repository Ċ import Ġcom . github . ap og nu . ot ter . utils .* Ċ import Ġcom . squareup . pic asso . Pic asso Ċ import Ġjp . was ab eef . pic asso . transform ations . Rounded C orners Transformation Ċ import Ġkotlinx . android . synt hetic . main . fragment _ tracks .* Ċ import Ġkotlinx . coroutines . Dispatch ers . Main Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . launch Ċ Ċ class ĠPlaylist Tracks Fragment Ġ: ĠO t ter Fragment < Playlist Track , ĠPlaylist Tracks Adapter >() Ġ{ ĊĠ Ġoverride Ġval Ġview Res Ġ= ĠR . layout . fragment _ tracks ĊĠ Ġoverride Ġval Ġre cycler : ĠRecyclerView Ġget () Ġ= Ġtracks ĊĊĠ Ġlateinit Ġvar Ġfavor ites Repository : ĠF avorites Repository ĊĠ Ġlateinit Ġvar Ġplay lists Repository : ĠManagement Play lists Repository ĊĊĠ Ġvar Ġalbum Id Ġ= Ġ 0 ĊĠ Ġvar Ġalbum Artist Ġ= Ġ"" ĊĠ Ġvar Ġalbum Title Ġ= Ġ"" ĊĠ Ġvar Ġalbum Cover Ġ= Ġ"" ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġfun Ġnew ( playlist : ĠPlaylist ): ĠPlaylist Tracks Fragment Ġ{ ĊĠĠĠĠĠ Ġreturn ĠPlaylist Tracks Fragment (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġarguments Ġ= Ġbundle Of ( ĊĠĠĠĠĠĠĠĠĠ Ġ" album Id " Ġto Ġplaylist . id , ĊĠĠĠĠĠĠĠĠĠ Ġ" album Artist " Ġto Ġ" N / A ", ĊĠĠĠĠĠĠĠĠĠ Ġ" album Title " Ġto Ġplaylist . name , ĊĠĠĠĠĠĠĠĠĠ Ġ" album Cover " Ġto Ġ"" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠ Ġarguments ?. apply Ġ{ ĊĠĠĠĠĠ Ġalbum Id Ġ= Ġget Int (" album Id ") ĊĠĠĠĠĠ Ġalbum Artist Ġ= ĠgetString (" album Artist ") Ġ?: Ġ"" ĊĠĠĠĠĠ Ġalbum Title Ġ= ĠgetString (" album Title ") Ġ?: Ġ"" ĊĠĠĠĠĠ Ġalbum Cover Ġ= ĠgetString (" album Cover ") Ġ?: Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġadapter Ġ= ĠPlaylist Tracks Adapter ( context , ĠF avorite Listener (), ĠPlaylist Listener ()) ĊĠĠĠ Ġrepository Ġ= ĠPlaylist Tracks Repository ( context , Ġalbum Id ) ĊĠĠĠ Ġfavor ites Repository Ġ= ĠF avorites Repository ( context ) ĊĠĠĠ Ġplay lists Repository Ġ= ĠManagement Play lists Repository ( context ) ĊĊĠĠĠ Ġwatch EventBus () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĊĠĠĠ Ġcover . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠ Ġcovers . visibility Ġ= ĠView . VISIBLE ĊĊĠĠĠ Ġartist . text Ġ= Ġ" Playlist " ĊĠĠĠ Ġtitle . text Ġ= Ġalbum Title ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠ Ġsuper . on Resume () ĊĊĠĠĠ Ġlifecycle Scope . launch ( Main ) Ġ{ ĊĠĠĠĠĠ ĠRequest Bus . send ( Request . GetCurrent Track ). wait < Response . Current Track >() ?. let Ġ{ Ġresponse Ġ-> ĊĠĠĠĠĠĠĠ Ġadapter . current Track Ġ= Ġresponse . track ĊĠĠĠĠĠĠĠ Ġadapter . notify DataSet Changed () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġcover Height : ĠFloat ? Ġ= Ġnull ĊĊĠĠĠ Ġsc roller . setOn Scroll ChangeListener Ġ{ Ġ_: ĠView ?, Ġ_: ĠInt , Ġscroll Y : ĠInt , Ġ_: ĠInt , Ġ_: ĠInt Ġ-> ĊĠĠĠĠĠ Ġif Ġ( cover Height Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcover Height Ġ= Ġcovers . meas ured Height . toFloat () ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġcovers . translation Y Ġ= Ġ( scroll Y Ġ/ Ġ 2 ). toFloat () ĊĊĠĠĠĠĠ Ġcover Height ?. let Ġ{ Ġheight Ġ-> ĊĠĠĠĠĠĠĠ Ġcovers . alpha Ġ= Ġ( height Ġ- Ġscroll Y . toFloat ()) Ġ/ Ġheight ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġplay . setOnClickListener Ġ{ ĊĠĠĠĠĠ ĠCommand Bus . send ( Command . Replace Queue ( adapter . data . map Ġ{ Ġit . track Ġ}. sh uffled ())) ĊĊĠĠĠĠĠ Ġcontext . toast (" All Ġtracks Ġwere Ġadded Ġto Ġyour Ġqueue ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcontext ?. let Ġ{ Ġcontext Ġ-> ĊĠĠĠĠĠ Ġactions . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠ ĠPopup Menu ( context , Ġactions , ĠGr avity . START , ĠR . attr . action Overflow Menu Style , Ġ 0 ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġinf late ( R . menu . album ) ĊĊĠĠĠĠĠĠĠĠĠ Ġset On MenuItem ClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . add _ to _ queue Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommand Bus . send ( Command . AddTo Queue ( adapter . data . map Ġ{ Ġit . track Ġ})) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . toast (" All Ġtracks Ġwere Ġadded Ġto Ġyour Ġqueue ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . download Ġ-> ĠCommand Bus . send ( Command . Pin Tracks ( adapter . data . map Ġ{ Ġit . track Ġ})) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġshow () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Data F etched ( data : ĠList < Playlist Track >) Ġ{ ĊĠĠĠ Ġdata . map Ġ{ Ġit . track . album Ġ}. toSet (). map Ġ{ Ġit ?. cover () Ġ}. take ( 4 ). forEach Indexed Ġ{ Ġindex , Ġurl Ġ-> ĊĠĠĠĠĠ Ġval ĠimageView Ġ= Ġwhen Ġ( index ) Ġ{ ĊĠĠĠĠĠĠĠĠ 0 Ġ-> Ġcover _ top _ left ĊĠĠĠĠĠĠĠĠ 1 Ġ-> Ġcover _ top _ right ĊĠĠĠĠĠĠĠĠ 2 Ġ-> Ġcover _ bottom _ left ĊĠĠĠĠĠĠĠĠ 3 Ġ-> Ġcover _ bottom _ right ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġcover _ top _ left ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġval Ġcorner Ġ= Ġwhen Ġ( index ) Ġ{ ĊĠĠĠĠĠĠĠĠ 0 Ġ-> ĠRo unded C orners Transformation . Corner Type . TOP _ LEFT ĊĠĠĠĠĠĠĠĠ 1 Ġ-> ĠRo unded C orners Transformation . Corner Type . TOP _ RIGHT ĊĠĠĠĠĠĠĠĠ 2 Ġ-> ĠRo unded C orners Transformation . Corner Type . BOTTOM _ LEFT ĊĠĠĠĠĠĠĠĠ 3 Ġ-> ĠRo unded C orners Transformation . Corner Type . BOTTOM _ RIGHT ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠRo unded C orners Transformation . Corner Type . TOP _ LEFT ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ ĠimageView ?. let Ġ{ Ġview Ġ-> ĊĠĠĠĠĠĠĠ Ġlifecycle Scope . launch ( Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠPic asso . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. maybe Load ( maybe Normalize Url ( url )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. fit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. center Crop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. transform ( Rounded C orners Transformation ( 1 6 , Ġ 0 , Ġcorner )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. into ( view ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġwatch EventBus () Ġ{ ĊĠĠĠ Ġlifecycle Scope . launch ( Main ) Ġ{ ĊĠĠĠĠĠ ĠCommand Bus . get (). collect Ġ{ Ġcommand Ġ-> ĊĠĠĠĠĠĠĠ Ġwhen Ġ( command ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġis ĠCommand . Refresh Track Ġ-> Ġrefresh Current Track ( command . track ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġrefresh Current Track ( track : ĠTrack ?) Ġ{ ĊĠĠĠ Ġtrack ?. let Ġ{ ĊĠĠĠĠĠ Ġadapter . current Track Ġ= Ġtrack ĊĠĠĠĠĠ Ġadapter . notify DataSet Changed () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġinner Ġclass ĠF avorite Listener Ġ: ĠPlaylist Tracks Adapter . On Favorite Listener Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġon Toggle Favorite ( id : ĠInt , Ġstate : ĠBoolean ) Ġ{ ĊĠĠĠĠĠ Ġwhen Ġ( state ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġfavor ites Repository . add Favorite ( id ) ĊĠĠĠĠĠĠĠ Ġfalse Ġ-> Ġfavor ites Repository . delete Favorite ( id ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġinner Ġclass ĠPlaylist Listener Ġ: ĠPlaylist Tracks Adapter . On Playlist Listener Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġon Move Track ( from : ĠInt , Ġto : ĠInt ) Ġ{ ĊĠĠĠĠĠ Ġplay lists Repository . move ( album Id , Ġfrom , Ġto ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Remove Track From Playlist ( track : ĠTrack , Ġindex : ĠInt ) Ġ{ ĊĠĠĠĠĠ Ġlifecycle Scope . launch ( Main ) Ġ{ ĊĠĠĠĠĠĠĠ Ġplay lists Repository . remove ( album Id , Ġtrack , Ġindex ) ĊĠĠĠĠĠĠĠ Ġupdate () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ }