package Ġcom . music player . a ow . ui . main Ċ Ċ import Ġandroid . content . Component Name Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . Service Connection Ċ import Ġandroid . os . IB inder Ċ import Ġcom . music player . a ow . bus . Rx Bus Ċ import Ġcom . music player . a ow . deleg ates . data . model . Song Ċ import Ġcom . music player . a ow . deleg ates . data . source . App Repository Ċ import Ġcom . music player . a ow . deleg ates . data . source . Preference Manager Ċ import Ġcom . music player . a ow . deleg ates . event . Favorite ChangeEvent Ċ import Ġcom . music player . a ow . deleg ates . player . Playback Service Ċ import Ġrx . Subscriber Ċ import Ġrx . android . schedul ers . Android Schedulers Ċ import Ġrx . schedul ers . Schedulers Ċ import Ġrx . subscriptions . Composite Subscription ĊĊ Ċ class ĠMusic Player Presenter ( private Ġvar ĠmContext : ĠContext ?, Ġprivate Ġvar Ġm View : ĠMusic Player Contract . View ?) Ġ: ĠMusic Player Contract . Presenter Ġ{ ĊĠĠĠ Ġprivate Ġval Ġm Subscriptions : ĠComposite Subscription Ġ= ĠComposite Subscription () ĊĊĠĠĠ Ġprivate Ġvar Ġm Playback Service : ĠPlay back Service ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Is Service Bound : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġval Ġm Connection Ġ= Ġobject Ġ: ĠService Connection Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Service Connected ( className : ĠComponent Name , Ġservice : ĠI Binder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġcalled Ġwhen Ġthe Ġconnection Ġwith Ġthe Ġservice Ġhas Ġbeen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġestablished , Ġgiving Ġus Ġthe Ġservice Ġobject Ġwe Ġcan Ġuse Ġto ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġinteract Ġwith Ġthe Ġservice . Ġ ĠBecause Ġwe Ġhave Ġbound Ġto Ġa Ġexplicit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġservice Ġthat Ġwe Ġknow Ġis Ġrunning Ġin Ġour Ġown Ġprocess , Ġwe Ġcan ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcast Ġits ĠI Binder Ġto Ġa Ġconcrete Ġclass Ġand Ġdirectly Ġaccess Ġit . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Playback Service Ġ= Ġ( service Ġas ĠPlay back Service . Local Binder ). service ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm View !!. on Playback Service Bound ( m Playback Service !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Playback Service !!. playing Song Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm View !!. on Song Updated ( m Playback Service !!. playing Song ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Service Disconnected ( className : ĠComponent Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġcalled Ġwhen Ġthe Ġconnection Ġwith Ġthe Ġservice Ġhas Ġbeen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġunexpected ly Ġdisconnected Ġ-- Ġthat Ġis , Ġits Ġprocess Ġcr ashed . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBecause Ġit Ġis Ġrunning Ġin Ġour Ġsame Ġprocess , Ġwe Ġshould Ġnever ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsee Ġthis Ġhappen . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Playback Service Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm View !!. on Playback Service Un bound () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġm View !!. set Presenter ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsubscribe () Ġ{ ĊĠĠĠĠĠĠĠ Ġbind Playback Service () ĊĊĠĠĠĠĠĠĠ Ġretrieve Last Play Mode () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( m Playback Service Ġ!= Ġnull Ġ&& Ġm Playback Service !!. is Playing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm View !!. on Song Updated ( m Playback Service !!. playing Song ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ- Ġload Ġlast Ġplay Ġlist / folder / song ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġunsubscribe () Ġ{ ĊĠĠĠĠĠĠĠ Ġun bind Playback Service () ĊĠĠĠĠĠĠĠ Ġ// ĠRelease Ġcontext Ġreference ĊĠĠĠĠĠĠĠ ĠmContext Ġ= Ġnull Ċ // ĠĠĠĠĠĠĠ Ġm View Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġm Subscriptions . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġretrieve Last Play Mode () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlast Play Mode Ġ= ĠPreference Manager . last Play Mode ( mContext !!. application Context ) ĊĠĠĠĠĠĠĠ Ġm View !!. update Play Mode ( last Play Mode ) ĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġoverride Ġfun Ġset Song As Favorite ( song : ĠSong , Ġfavorite : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsubscription Ġ= ĠApp Repository (). set Song As Favorite ( song , Ġfavorite ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ( object Ġ: ĠSubscriber < Song >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Completed () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEmpty ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm View !!. handleError ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Next ( song : ĠSong ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm View !!. on Song Set As Favorite ( song ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRx Bus . instance ?. post ( Favorite ChangeEvent ( song )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġm Subscriptions . add ( subscription ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbind Playback Service () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠEst ablish Ġa Ġconnection Ġwith Ġthe Ġservice . Ġ ĠWe Ġuse Ġan Ġexplicit ĊĠĠĠĠĠĠĠ Ġ// Ġclass Ġname Ġbecause Ġwe Ġwant Ġa Ġspecific Ġservice Ġimplementation Ġthat ĊĠĠĠĠĠĠĠ Ġ// Ġwe Ġknow Ġwill Ġbe Ġrunning Ġin Ġour Ġown Ġprocess Ġ( and Ġthus Ġwon 't Ġbe ĊĠĠĠĠĠĠĠ Ġ// Ġsupporting Ġcomponent Ġreplacement Ġby Ġother Ġapplications ). ĊĠĠĠĠĠĠĠ ĠmContext !!. bind Service ( Intent ( mContext !!. application Context , ĠPlay back Service :: class . java ), Ġm Connection , ĠContext . BIND _ AUTO _ CREATE ) ĊĠĠĠĠĠĠĠ Ġm Is Service Bound Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġun bind Playback Service () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Is Service Bound ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDet ach Ġour Ġexisting Ġconnection . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠmContext !!. unbind Service ( m Connection ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Service Bound Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ