package Ġcom . ude sh coffee . android . ui . common . view models Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroid . arch . lifecycle . Android ViewModel Ċ import Ġandroid . arch . lifecycle . Mutable LiveData Ċ import Ġandroid . content . Intent Filter Ċ import Ġcom . cant row itz . r xb roadcast . R xB roadcast Ċ import Ġcom . ude sh coffee . android . App Ċ import Ġcom . ude sh coffee . android . extensions . getService Ċ import Ġcom . ude sh coffee . android . model . Song Ċ import Ġcom . ude sh coffee . android . service . Music Service Ċ import Ġio . reactivex . dis pos ables . Disposable Ċ Ċ abstract Ġclass ĠBase Player ViewModel ( application : ĠApplication ): ĠAndroid ViewModel ( application ) Ġ{ ĊĊĠĠĠ Ġval Ġcurrent Song Ġ= ĠMutable LiveData < Song >() ĊĠĠĠ Ġval Ġduration Ġ= ĠMutable LiveData < Long >() ĊĠĠĠ Ġvar Ġis Playing Ġ= ĠMutable LiveData < Boolean >() ĊĊĠĠĠ Ġprivate Ġvar Ġbroadcast Disposable : ĠDis posable ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġis Loaded : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġis Playing . value Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġstart () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfilter Ġ= ĠIntent Filter () ĊĠĠĠĠĠĠĠ Ġfilter . addAction ( Music Service . Internal Intent s . METADATA _ CHANGED ) ĊĠĠĠĠĠĠĠ Ġfilter . addAction ( Music Service . Internal Intent s . PLAY BACK _ STATE _ CHANGED ) ĊĠĠĠĠĠĠĠ Ġfilter . addAction ( Music Service . Internal Intent s . SERVICE _ CONNECTED ) ĊĊĠĠĠĠĠĠĠ Ġbroadcast Disposable Ġ= ĠR xB roadcast . from Local Broadcast ( App . instance , Ġfilter ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMusic Service . Internal Intent s . METADATA _ CHANGED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Service ()?. let Ġ{ Ġon Metadata Change ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMusic Service . Internal Intent s . PLAY BACK _ STATE _ CHANGED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Service ()?. let Ġ{ Ġon Playback Change ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMusic Service . Internal Intent s . SERVICE _ CONNECTED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Loaded ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Service ()?. let Ġ{ Ġon Init Metadata ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Loaded Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġservice Ġ= Ġget Service () ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Loaded Ġ&& Ġservice Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Init Metadata ( service ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Loaded Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ Ġbroadcast Disposable ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . is Disposed ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . dispose () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġplay Pause Toggle () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġservice Ġ= Ġget Service () ĊĠĠĠĠĠĠĠ Ġif Ġ( is Playing . value !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice ?. pause () ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice ?. play () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġon Init Metadata ( service : ĠMusic Service ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Song . value Ġ= Ġservice . current Song () ĊĠĠĠĠĠĠĠ Ġduration . value Ġ= Ġservice . duration ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġon Metadata Change ( service : ĠMusic Service ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Song . value Ġ= Ġservice . current Song () ĊĠĠĠĠĠĠĠ Ġduration . value Ġ= Ġservice . duration ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġon Playback Change ( service : ĠMusic Service ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis Playing . value Ġ= Ġservice . is Playing () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġfun Ġset Progress () ĊĊĠĠĠ Ġabstract Ġfun Ġdispose Progress () Ċ }