package Ġhu . m rol csi . mu z ik . ui . albums Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . support . v 4 . media . Media Browser Compat . Media Item Ċ import Ġandroid . view . View Ċ import Ġandroidx . core . view . View Compat Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . navigation . fragment . Fragment Navigator Extras Ċ import Ġhu . m rol csi . mu z ik . R Ċ import Ġhu . m rol csi . mu z ik . data . model . media . album Art Uri Ċ import Ġhu . m rol csi . mu z ik . data . model . media . album Key Ċ import Ġhu . m rol csi . mu z ik . data . model . media . artist Key Ċ import Ġhu . m rol csi . mu z ik . data . model . media . id Ċ import Ġhu . m rol csi . mu z ik . data . repository . media . Media Repository Ċ import Ġhu . m rol csi . mu z ik . ui . base . Data Binding ViewModel Ċ import Ġhu . m rol csi . mu z ik . ui . base . The med ViewModel Ċ import Ġhu . m rol csi . mu z ik . ui . base . The med ViewModel Impl Ċ import Ġhu . m rol csi . mu z ik . ui . common . Execute Once Nav Command Source Ċ import Ġhu . m rol csi . mu z ik . ui . common . Execute Once Ui Command Source Ċ import Ġhu . m rol csi . mu z ik . ui . common . Observable Impl Ċ import Ġhu . m rol csi . mu z ik . ui . common . extensions . to Key String Ċ import Ġhu . m rol csi . mu z ik . ui . library . Library Fragment Directions Ċ import Ġhu . m rol csi . mu z ik . ui . library . Sorting Mode Ċ import Ġio . reactivex . android . schedul ers . Android Schedulers Ċ import Ġio . reactivex . rx kotlin . Observable s Ċ import Ġio . reactivex . rx kotlin . subscribe By Ċ import Ġio . reactivex . subjects . Behavior Subject Ċ import Ġorg . k oin . core . K oin Component Ċ import Ġorg . k oin . core . inject Ċ import Ġkotlin . properties . Deleg ates Ċ Ċ class ĠAlbum s ViewModel Impl Ġconstructor ( ĊĠ Ġobservable : ĠObservable Impl , ĊĠ Ġui Command Source : ĠExecute Once Ui Command Source , ĊĠ Ġnav Command Source : ĠExecute Once Nav Command Source , ĊĠ Ġthe med ViewModel : ĠThe med ViewModel Impl Ċ ) Ġ: ĠData Binding ViewModel ( observable , Ġui Command Source , Ġnav Command Source ), ĊĠ ĠThe med ViewModel Ġby Ġthe med ViewModel , ĊĠ ĠAlbum s ViewModel , ĊĠ ĠK oin Component Ġ{ ĊĊĠ Ġprivate Ġval Ġcontext : ĠContext Ġby Ġinject () ĊĠ Ġprivate Ġval Ġmedia Repo : ĠMedia Repository Ġby Ġinject () ĊĊĠ Ġoverride Ġval Ġprogress Visible : ĠBoolean Ġ= Ġfalse ĊĠ Ġoverride Ġval ĠlistView Visible : ĠBoolean Ġ= Ġtrue ĊĠ Ġoverride Ġval Ġempty View Visible : ĠBoolean Ġ= Ġfalse ĊĊĠ Ġoverride Ġval Ġitems Ġ= ĠMutable LiveData < List < Album Item >>() ĊĊĠ Ġoverride Ġvar Ġsorting Mode : ĠSort ingMode Ġby ĠDeleg ates . observable ( Sorting Mode . SORT _ BY _ TITLE ) Ġ{ Ġ_, Ġold , Ġnew Ġ-> ĊĠĠĠ Ġif Ġ( old Ġ!= Ġnew ) Ġsorting Mode Subject . onNext ( new ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġval Ġsorting Mode Subject Ġ= ĠBehavior Subject . create Default ( Sorting Mode . SORT _ BY _ TITLE ) ĊĊĠ Ġoverride Ġfun Ġon Album Click ( item : ĠAlbum Item , Ġtransition ed View : ĠView ) Ġ{ ĊĠĠĠ Ġval Ġtransition Name Ġ= ĠView Compat . get Transition Name ( transition ed View ) !! ĊĠĠĠ Ġsend Nav Command Ġ{ ĊĠĠĠĠĠ Ġnavigate ( ĊĠĠĠĠĠĠĠ ĠLibrary Fragment Directions . action To Album Details ( item . id , Ġtransition Name ), ĊĠĠĠĠĠĠĠ ĠFragment Navigator Extras ( transition ed View Ġto Ġtransition Name ) ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġinit Ġ{ ĊĠĠĠ ĠObservable s . combine Latest ( ĊĠĠĠĠĠ Ġsorting Mode Subject , ĊĠĠĠĠĠ Ġmedia Repo . get Album s () ĊĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ. map Ġ{ Ġ( sorting Mode , Ġalbum s ) Ġ-> Ġalbum s . apply Sorting ( sorting Mode ) Ġ} ĊĠĠĠĠĠ Ġ. map Ġ{ Ġit . as Album Items ( context ) Ġ} ĊĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠ Ġ. subscribe By ( ĊĠĠĠĠĠĠĠ Ġon Next Ġ= Ġ{ Ġitems . value Ġ= Ġit Ġ}, ĊĠĠĠĠĠĠĠ ĠonError Ġ= Ġ{ Ġshow Error ( this , Ġit ) Ġ} ĊĠĠĠĠĠ Ġ). dispose On Cle ared () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠList < Media Item >. apply Sorting ( sorting Mode : ĠSort ingMode ): ĠList < Media Item > Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( sorting Mode ) Ġ{ ĊĠĠĠĠĠ ĠSort ingMode . SORT _ BY _ AR TI ST Ġ-> Ġsorted By Ġ{ Ġit . description . artist Key Ġ} ĊĠĠĠĠĠ ĠSort ingMode . SORT _ BY _ TITLE Ġ-> Ġsorted By Ġ{ Ġit . description . album Key Ġ} ĊĠĠĠĠĠ ĠSort ingMode . SORT _ BY _ DATE Ġ-> Ġthrow ĠIllegalArgumentException (" Invalid Ġsorting Ġmode Ġfor Ġalbum s !") ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġget Section Text ( item : ĠAlbum Item ): ĠCharSequence Ġ= ĊĠĠĠ Ġwhen Ġ( sorting Mode ) Ġ{ ĊĠĠĠĠĠ ĠSort ingMode . SORT _ BY _ AR TI ST Ġ-> Ġitem . artist Text . to Key String (). first (). toUpperCase (). toString () ĊĠĠĠĠĠ ĠSort ingMode . SORT _ BY _ TITLE Ġ-> Ġitem . album Text . toString (). to Key String (). first (). toUpperCase (). toString () ĊĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Invalid Ġsorting Ġmode !") ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠList < Media Item >. as Album Items ( context : ĠContext ) Ġ= Ġmap Ġ{ Ġitem Ġ-> ĊĠ ĠAlbum Item ( ĊĠĠĠ Ġitem . description . id , ĊĠĠĠ Ġitem . description . title Ġ?: Ġcontext . getText ( R . string . songs _ no Title ), ĊĠĠĠ Ġitem . description . subtitle Ġ?: Ġcontext . getText ( R . string . songs _ unknown Artist ), ĊĠĠĠ Ġitem . description . album Art Uri ĊĠ Ġ) Ċ }