package Ġcom . d inar ap aran id . pri ma . fragments Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . provider . Media Store Ċ import Ġandroid . view .* Ċ import Ġandroid . widget . Image Button Ċ import Ġandroid . widget . Search View Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . constraint layout . widget . Constraint Layout Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġandroidx . swiper ef resh layout . widget . Swipe Refresh Layout Ċ import Ġcom . d inar ap aran id . pri ma . Main Application Ċ import Ġcom . d inar ap aran id . pri ma . MainActivity Ċ import Ġcom . d inar ap aran id . pri ma . R Ċ import Ġcom . d inar ap aran id . pri ma . core . Default Playlist Ċ import Ġcom . d inar ap aran id . pri ma . core . Playlist Ċ import Ġcom . d inar ap aran id . pri ma . core . Track Ċ import Ġcom . d inar ap aran id . pri ma . utils . Params Ċ import Ġcom . d inar ap aran id . pri ma . utils . Vertical Space Item Decoration Ċ import Ġcom . d inar ap aran id . pri ma . utils . View Setter Ċ import Ġcom . d inar ap aran id . pri ma . utils . pol ym orphism .* Ċ import Ġcom . d inar ap aran id . pri ma . view models . Track List ViewModel Ċ import Ġcom . google . android . material . bottom sheet . Bottom Sheet Behavior Ċ import Ġkotlin . concurrent . thread Ċ Ċ class ĠTrack List Fragment Ġ: ĊĠĠĠ ĠFragment (), ĊĠĠĠ ĠSearch View . On Query Text Listener , ĊĠĠĠ ĠContent Up datable < Playlist >, ĊĠĠĠ ĠFilter Fragment < Track >, ĊĠĠĠ ĠRecyclerView Up , ĊĠĠĠ ĠLoader Ġ{ ĊĠĠĠ Ġinterface ĠCallback s Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġon Track Selected ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrack : ĠTrack , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtracks : ĠPlaylist , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġind : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġneed To Play : ĠBoolean Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtrack RecyclerView : ĠRecyclerView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmain Label Old Text : ĠString ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmain Label Cur Text : ĠString ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtitle Default : ĠString ĊĊĠĠĠ Ġinternal Ġvar Ġadapter : ĠTrack Adapter ? Ġ= Ġnull ĊĠĠĠ Ġinternal Ġvar Ġgen Func : Ġ(() Ġ-> ĠPlaylist )? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcallbacks : ĠCallback s ? Ġ= Ġnull ĊĠĠĠ Ġinternal Ġval Ġplaylist : ĠPlaylist Ġ= ĠDefault Playlist () ĊĠĠĠ Ġprivate Ġval Ġplaylist Search : ĠPlaylist Ġ= ĠDefault Playlist () ĊĊĠĠĠ Ġprivate Ġval Ġtrack List ViewModel : ĠTrack List ViewModel Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠViewModel Provider ( this )[ Track List ViewModel :: class . java ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMAIN _ LABEL _ OLD _ TEXT _ KEY Ġ= Ġ" main _ label _ old _ text " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMAIN _ LABEL _ CUR _ TEXT _ KEY Ġ= Ġ" main _ label _ cur _ text " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSTART _ KEY Ġ= Ġ" start " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠH IG HL IGHT ED _ START _ KEY Ġ= Ġ" highlighted _ start " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMAIN _ LABEL _ KEY Ġ= Ġ" main _ label " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠNO _ HIG HL IGHT Ġ= Ġ" ______ Ð « Ð « Ð « Ð « Ð « Ð « Ð « Ð « ______ " ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġnew Instance ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmain Label Old Text : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmain Label Cur Text : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ first To Highlight : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ): ĠTrack List Fragment Ġ= ĠTrack List Fragment (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments Ġ= ĠBundle (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput String ( MAIN _ LABEL _ OLD _ TEXT _ KEY , Ġmain Label Old Text ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput String ( MAIN _ LABEL _ CUR _ TEXT _ KEY , Ġmain Label Cur Text ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput String ( START _ KEY , Ġ_ first To Highlight Ġ?: ĠNO _ HIG HL IGHT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Attach ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Attach ( context ) ĊĠĠĠĠĠĠĠ Ġcallbacks Ġ= Ġcontext Ġas ĠCallback s ? ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġset Has Options Menu ( true ) ĊĠĠĠĠĠĠĠ Ġgen Func ?. let Ġ{ Ġplaylist . addAll ( it ()) Ġ} Ġ?: Ġload () ĊĠĠĠĠĠĠĠ Ġplaylist Search . addAll ( playlist ) ĊĠĠĠĠĠĠĠ Ġadapter Ġ= ĠTrack Adapter ( playlist ) ĊĊĠĠĠĠĠĠĠ Ġtrack List ViewModel . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload ( savedInstanceState ?. getBoolean ( HIG HL IGHT ED _ START _ KEY )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmain Label Old Text Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Arguments (). getString ( MAIN _ LABEL _ OLD _ TEXT _ KEY ) Ġ?: Ġtitle Default ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmain Label Cur Text Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Arguments (). getString ( MAIN _ LABEL _ CUR _ TEXT _ KEY ) Ġ?: Ġtitle Default ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! highlighted Start LiveData . value !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Arguments (). getString ( START _ KEY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . take If Ġ{ Ġit Ġ!= ĠNO _ HIG HL IGHT Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( require Activity (). application Ġas ĠMain Application ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhighlighted Rows . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhighlighted Rows Ġ= Ġhighlighted Rows . distinct (). to Mutable List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhighlighted Start LiveData . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġinflater . inflate ( R . layout . fragment _ track _ list , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġtitle Default Ġ= Ġresources . getString ( R . string . tracks ) ĊĊĠĠĠĠĠĠĠ Ġval Ġupdater Ġ= Ġview ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. findViewById < Swipe Refresh Layout >( R . id . track _ swipe _ refresh _ layout ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Color Scheme Colors ( Params . getInstance (). theme . rgb ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset On Refresh Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( this @ Track List Fragment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. require Activity () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. application Ġas ĠMain Application ). load () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplaylist . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgen Func ?. let Ġ{ Ġplaylist . addAll ( it ()) Ġ} Ġ?: Ġload () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Content ( playlist ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Refresh ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtrack RecyclerView Ġ= Ġupdater ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. findViewById < Constraint Layout >( R . id . track _ constraint _ layout ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. findViewById < RecyclerView >( R . id . track _ recycler _ view ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager Ġ= ĠLinearLayoutManager ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġthis @ Track List Fragment . adapter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Item Decoration ( Vertical Space Item Decoration ( 3 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(( require Activity (). application Ġas ĠMain Application ). playing Bar Is Visible ) Ġup () ĊĠĠĠĠĠĠĠ Ġ( require Activity () Ġas ĠMainActivity ). main Label . text Ġ= Ġmain Label Cur Text ĊĠĠĠĠĠĠĠ Ġreturn Ġview ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate UI ( playlist ) ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Detach () Ġ{ ĊĠĠĠĠĠĠĠ Ġcallbacks Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġsuper . on Detach () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġ( require Activity () Ġas ĠMainActivity ). main Label . text Ġ= Ġmain Label Old Text ĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Save InstanceState ( out State : ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġout State . put Boolean ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠH IG HL IGHT ED _ START _ KEY , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrack List ViewModel . highlighted Start LiveData . value !! ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġsuper . on Save InstanceState ( out State ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġ( require Activity () Ġas ĠMainActivity ). main Label . text Ġ= Ġmain Label Cur Text ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu , Ġinflater : ĠMenu Inflater ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate Options Menu ( menu , Ġinflater ) ĊĠĠĠĠĠĠĠ Ġinflater . inflate ( R . menu . fragment _ search , Ġmenu ) ĊĠĠĠĠĠĠĠ Ġ( menu . find Item ( R . id . find ). action View Ġas ĠSearch View ). setOn Query Text Listener ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Query Text Change ( query : ĠString ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfiltered Model List Ġ= Ġfilter ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaylist Search , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġplaylist . clear () ĊĠĠĠĠĠĠĠ Ġplaylist . addAll ( filtered Model List ) ĊĠĠĠĠĠĠĠ Ġadapter ?. notify DataSet Changed () ĊĊĠĠĠĠĠĠĠ Ġtrack RecyclerView . scrollTo Position ( 0 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Query Text Submit ( query : ĠString ?): ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun Ġupdate UI ( src : ĠPlaylist ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadapter Ġ= ĠTrack Adapter ( src ) ĊĠĠĠĠĠĠĠ Ġtrack RecyclerView . adapter Ġ= Ġadapter ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfilter ( models : ĠCollection < Track > ?, Ġquery : ĠString ): ĠList < Track > Ġ= ĊĠĠĠĠĠĠĠ Ġquery . lowercase (). let Ġ{ Ġlower Case Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodels ?. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlower Case Ġin Ġit . title . lowercase () Ġ|| Ġlower Case Ġin Ġit . artist . lowercase () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: ĠlistOf () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġup () Ġ{ ĊĠĠĠĠĠĠĠ Ġtrack RecyclerView . layout Params Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( track RecyclerView . layout Params Ġas ĠConstraint Layout . LayoutParams ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Margin Ġ= Ġ 2 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġload () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġselection Ġ= ĠMedia Store . Audio . Media . IS _ M US IC Ġ+ Ġ" Ġ!= Ġ 0 " ĊĠĠĠĠĠĠĠ Ġval Ġorder Ġ= ĠMedia Store . Audio . Media . TITLE Ġ+ Ġ" ĠASC " ĊĊĠĠĠĠĠĠĠ Ġval Ġprojection Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Audio . Media . TITLE , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Audio . Media . AR TI ST , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Audio . Media . AL BU M , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Audio . Media . DATA , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Audio . Media . DURATION ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġrequire Activity (). content Resolver . query ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Audio . Media . EXTERNAL _ CONTENT _ URI , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprojection , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselection , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorder ĊĠĠĠĠĠĠĠ Ġ). use Ġ{ Ġcursor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaylist . clear () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cursor Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( cursor . moveTo Next ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplaylist . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTrack ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . getString ( 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . getString ( 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . getString ( 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . getString ( 3 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . getLong ( 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġinner Ġclass ĠTrack Adapter ( private Ġval Ġtracks : ĠPlaylist ) Ġ: ĊĠĠĠĠĠĠĠ ĠRecyclerView . Adapter < Track Adapter . Track Holder >() Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġinner Ġclass ĠTrack Holder ( view : ĠView ) Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRecyclerView . ViewHolder ( view ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠView . OnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġtrack : ĠTrack ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġvar Ġind : ĠInt Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtitle TextView : ĠTextView Ġ= ĠitemView . findViewById ( R . id . track _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsettings Button : ĠImage Button Ġ= ĠitemView . findViewById ( R . id . track _ item _ settings ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġartists Album TextView : ĠTextView Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . findViewById ( R . id . track _ author _ album ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġtrack Number TextView : ĠTextView Ġ= ĠitemView . findViewById ( R . id . track _ number ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . setOnClickListener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle TextView . setTextColor ( View Setter . textColor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartists Album TextView . setTextColor ( View Setter . textColor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsettings Button . setImage Resource ( View Setter . settings Button Image ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonClick ( v : ĠView ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallbacks ?. on Track Selected ( track , Ġtracks , Ġind ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġbind (_ track : ĠTrack , Ġ_ ind : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrack Ġ= Ġ_ track ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġind Ġ= Ġ_ ind ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġartist Album Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrack . artist ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġif Ġ( it Ġ== Ġ"< unknown >") Ġresources . getString ( R . string . unknown _ artist ) Ġelse Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ/ Ġ${ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrack . playlist ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ== Ġ"< unknown >" Ġ|| Ġit Ġ== Ġtrack ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. split ('/') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. take Last ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ" Unknown Ġalbum " Ġelse Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}" ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle TextView . text Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrack . title . let Ġ{ Ġif Ġ( it Ġ== Ġ"< unknown >") Ġresources . getString ( R . string . unknown _ track ) Ġelse Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartists Album TextView . text Ġ= Ġartist Album ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrack Number TextView . text Ġ= Ġ( layout Position Ġ+ Ġ 1 ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠTrack Holder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTrack Holder ( layout Inflater . inflate ( R . layout . list _ item _ track , Ġparent , Ġfalse )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetItem Count () Ġ= Ġtracks . size ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠTrack Holder , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . bind ( tracks [ position ], Ġposition ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtrack Title Ġ= Ġholder . title TextView ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtrack Album Artist Ġ= Ġholder . artists Album TextView ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsettings Button Ġ= Ġholder . settings Button ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhighlighted Rows Ġ= Ġ( require Activity (). application Ġas ĠMain Application ). highlighted Rows ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsettings Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( require Activity () Ġas ĠMainActivity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. track Settings Button Action ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtracks [ position ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBottom Sheet Behavior . STATE _ COLL AP SED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 1 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( tracks [ position ]. path ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġhighlighted Rows Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolor Ġ= ĠParams . getInstance (). theme . rgb ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrack Title . setTextColor ( color ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrack Album Artist . setTextColor ( color ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolor Ġ= ĠView Setter . textColor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrack Title . setTextColor ( color ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrack Album Artist . setTextColor ( color ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġhighlight ( track : ĠTrack ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( require Activity (). application Ġas ĠMain Application ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhighlighted Rows . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhighlighted Rows . add ( track . path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhighlighted Rows Ġ= Ġhighlighted Rows . distinct (). to Mutable List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify DataSet Changed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }