package Ġcom . er iv era . apps . top charts . top list Ċ Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . er iv era . apps . top charts . repository . Repository Ċ import Ġcom . er iv era . apps . top charts . repository . pers istance . artist . Artist Ċ import Ġcom . er iv era . apps . top charts . repository . pers istance . tracks . Track Ċ import Ġcom . er iv era . apps . top charts . spotify . Spot ify Remote Manager Ċ import Ġdagger . h ilt . android . lifecycle . H ilt ViewModel Ċ import Ġkotlinx . coroutines . flow .* Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjavax . inject . Inject Ċ Ċ @ H ilt ViewModel Ċ class ĠTop List Category Section ViewModel Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġrepository : ĠRepository , ĊĠĠĠ Ġprivate Ġval Ġspot ify Remote Manager : ĠSpotify Remote Manager Ċ ) Ġ: ĊĠĠĠ ĠViewModel () Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠS ONG S Ġ= Ġ" S ongs " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠAR TI STS Ġ= Ġ" Art ists " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠGEN RES Ġ= Ġ" Gen res " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġtitle Ġ= Ġ"" ĊĊĠĠĠ Ġfun Ġset Category Section ( title : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this . title Ġ!= Ġtitle ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . title Ġ= Ġtitle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit ( title ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġ_ state Ġ= ĠMutable State Flow < Category Section ViewState ? >( null ) ĊĊĠĠĠ Ġval Ġstate : ĠState Flow < Category Section ViewState ?> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ state ĊĊĠĠĠ Ġprivate Ġfun Ġinit ( title : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġflow Ġ= Ġwhen Ġ( title ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS ONG S Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Song Category Section ViewState ( is Mock Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAR TI STS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Artist Category Section ViewState ( is Mock Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflow ?. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ state . value Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġget Song Category Section ViewState ( is Mock : ĠBoolean Ġ= Ġfalse ): ĠFlow < Category Section ViewState > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( is Mock ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock Results () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcombine ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . get Short Term Tracks (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . get Medium Term Tracks (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . getLong Term Tracks () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġshort Term , Ġmed Term , Ġlong Term Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCategory Section ViewState ( build Tracks Category Section ( short Term , Ġmed Term , Ġlong Term )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Tracks Category Section ( ĊĠĠĠĠĠĠĠ Ġshort Term Tracks : ĠList < Track >, ĊĠĠĠĠĠĠĠ Ġmedium Term Tracks : ĠList < Track >, ĊĠĠĠĠĠĠĠ Ġlong Term Tracks : ĠList < Track > ĊĠĠĠ Ġ): ĠMutable List < Category Item > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcategory Items Ġ= Ġmutable ListOf < Category Item >() ĊĠĠĠĠĠĠĠ Ġcategory Items . add ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSub Category Header (" Short ĠTerm ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġcategory Items . addAll ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshort Term Tracks . map Ġ{ Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSub Category Item . Song Category Item ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġitem . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartist Ġ= Ġitem . artist Concat en ated , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition Ġ= Ġitem . current Short Term Position . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠimageUrl Ġ= Ġitem . imageUrl , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuri Ġ= Ġitem . uri ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġcategory Items . add ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSub Category Header (" Medium ĠTerm ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġcategory Items . addAll ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedium Term Tracks . map Ġ{ Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSub Category Item . Song Category Item ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġitem . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartist Ġ= Ġitem . artist Concat en ated , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition Ġ= Ġitem . current Mid Term Position . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠimageUrl Ġ= Ġitem . imageUrl , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuri Ġ= Ġitem . uri ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġcategory Items . add ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSub Category Header (" Long ĠTerm ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġcategory Items . addAll ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlong Term Tracks . map Ġ{ Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSub Category Item . Song Category Item ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġitem . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartist Ġ= Ġitem . artist Concat en ated , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition Ġ= Ġitem . current Long Term Position . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠimageUrl Ġ= Ġitem . imageUrl , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuri Ġ= Ġitem . uri ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcategory Items ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġget Artist Category Section ViewState ( is Mock : ĠBoolean Ġ= Ġfalse ): ĠFlow < Category Section ViewState > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( is Mock ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock Results () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcombine ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . get Short Term Art ists (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . get Medium Term Art ists (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . getLong Term Art ists () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġshort Term , Ġmed Term , Ġlong Term Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCategory Section ViewState ( build Artist Category Section ( short Term , Ġmed Term , Ġlong Term )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmock Results (): ĠFlow < Category Section ViewState > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcategory Items Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSub Category Header (" Short ĠTerm "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSub Category Item . Song Category Item ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ" Random Ġ 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition Ġ= Ġ" 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartist Ġ= Ġ" Here Ġis Ġthe Ġartist ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠimageUrl Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuri Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSub Category Item . Song Category Item ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ" Random Ġ 2 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition Ġ= Ġ" 2 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartist Ġ= Ġ" Here Ġis Ġthe Ġartist ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠimageUrl Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuri Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSub Category Item . Song Category Item ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ" Random Ġ 3 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition Ġ= Ġ" 3 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠimageUrl Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuri Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġflow Ġ{ Ġemit ( Category Section ViewState ( category Items )) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Artist Category Section ( ĊĠĠĠĠĠĠĠ Ġshort Term Art ists : ĠList < Artist >, ĊĠĠĠĠĠĠĠ Ġmedium Term Art ists : ĠList < Artist >, ĊĠĠĠĠĠĠĠ Ġlong Term Art ists : ĠList < Artist > ĊĠĠĠ Ġ): ĠMutable List < Category Item > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcategory Items Ġ= Ġmutable ListOf < Category Item >() ĊĠĠĠĠĠĠĠ Ġcategory Items . add ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSub Category Header (" Short ĠTerm ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġcategory Items . addAll ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshort Term Art ists . map Ġ{ Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSub Category Item . Artist Category Item ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġitem . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition Ġ= Ġitem . current Short Term Position . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠimageUrl Ġ= Ġitem . images , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuri Ġ= Ġitem . uri ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġcategory Items . add ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSub Category Header (" Medium ĠTerm ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġcategory Items . addAll ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedium Term Art ists . map Ġ{ Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSub Category Item . Artist Category Item ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġitem . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition Ġ= Ġitem . current Mid Term Position . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠimageUrl Ġ= Ġitem . images , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuri Ġ= Ġitem . uri ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġcategory Items . add ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSub Category Header (" Long ĠTerm ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġcategory Items . addAll ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlong Term Art ists . map Ġ{ Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSub Category Item . Artist Category Item ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġitem . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition Ġ= Ġitem . current Long Term Position . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠimageUrl Ġ= Ġitem . images , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuri Ġ= Ġitem . uri ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcategory Items ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġplay ( uri : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( uri . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġspot ify Remote Manager . play ( uri ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠCategory Section ViewState ( val Ġcategory List : ĠList < Category Item >) ĊĊĠĠĠ Ġinterface ĠCategory Item ĊĊĠĠĠ Ġdata Ġclass ĠSub Category Header ( ĊĠĠĠĠĠĠĠ Ġval Ġtitle : ĠString ĊĠĠĠ Ġ) Ġ: ĠCategory Item ĊĊĠĠĠ Ġsealed Ġclass ĠSub Category Item ( ĊĠĠĠĠĠĠĠ Ġval Ġtitle : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġartist : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġval Ġposition : ĠString , ĊĠĠĠĠĠĠĠ Ġval ĠimageUrl : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġuri : ĠString ĊĠĠĠ Ġ) Ġ: ĠCategory Item Ġ{ ĊĠĠĠĠĠĠĠ Ġclass ĠSong Category Item ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġartist : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠimageUrl : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuri : ĠString ĊĠĠĠĠĠĠĠ Ġ) Ġ: ĠSub Category Item ( title , Ġartist , Ġposition , ĠimageUrl , Ġuri ) ĊĊĠĠĠĠĠĠĠ Ġclass ĠArtist Category Item ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġartist : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠimageUrl : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuri : ĠString ĊĠĠĠĠĠĠĠ Ġ) Ġ: ĠSub Category Item ( title , Ġartist , Ġposition , ĠimageUrl , Ġuri ) ĊĠĠĠ Ġ} Ċ }