package Ġcom . example . music player . adapters Ċ Ċ import Ġandroid . app . AlertDialog Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . View Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . databinding . ViewData Binding Ċ import Ġandroidx . lifecycle . Lifecycle Owner Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . example . music player . R Ċ import Ġcom . example . music player . databinding .* Ċ import Ġcom . example . music player . music . Album Ċ import Ġcom . example . music player . music . Artist Ċ import Ġcom . example . music player . music . BaseModel Ċ import Ġcom . example . music player . music . Track Ċ import Ġcom . example . music player . player . state . Queue Constructor Ċ import Ġcom . example . music player . utils . Preferences Manager Ċ import Ġcom . example . music player . utils . in flater Ċ import Ġcom . example . music player . view models . F avorites ViewModel Ċ import Ġcom . example . music player . view models . Player ViewModel Ċ Ċ abstract Ġclass ĠBase Holder < T Ġ: ĠBase Model >( ĊĠĠĠ Ġprivate Ġval Ġbinding : ĠView Data Binding , ĊĠĠĠ Ġprivate Ġval Ġon Item Click : Ġ(( data : ĠT ) Ġ-> ĠUnit )? Ġ= Ġnull , Ċ ) Ġ: ĠRecyclerView . ViewHolder ( binding . root ) Ġ{ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . root . layout Params Ġ= ĠRecyclerView . LayoutParams ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRecyclerView . LayoutParams . MATCH _ PARENT , ĠRecyclerView . LayoutParams . WRAP _ CONTENT ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbind ( data : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġon Item Click ?. let Ġ{ ĠonClick Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . root . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonClick ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġon Bind ( data ) ĊĠĠĠĠĠĠĠ Ġbinding . execute Pending Bindings () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġabstract Ġfun Ġon Bind ( data : ĠT ) Ċ } Ċ Ċ class ĠTrack s ViewHolder Ġprivate Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġbinding : ĠItem Track Binding , ĊĠĠĠ Ġprivate Ġval Ġplayer Model : ĠPlayer ViewModel , ĊĠĠĠ Ġon Item Click : Ġ( data : ĠTrack ) Ġ-> ĠUnit Ċ ) Ġ: ĠBase Holder < Track >( binding , Ġon Item Click ) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ( data : ĠTrack ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . track Ġ= Ġdata ĊĊĠĠĠĠĠĠĠ Ġbinding . track Title . request Layout () ĊĠĠĠĠĠĠĠ Ġbinding . track Artist . request Layout () ĊĊĠĠĠĠĠĠĠ Ġplayer Model . track . observe ( item View . context Ġas ĠLifecycle Owner , Ġ{ Ġtrack Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( track ?. id Ġ== Ġdata . id ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . track Title . setTextColor ( Context Compat . getColor ( item View . context , ĠR . color . accent )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . track Title . setTextColor ( Context Compat . getColor ( item View . context , ĠR . color . white )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġbinding . root . setOn Touch Listener Ġ{ Ġview , Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( event . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale X Ġ= Ġ 0 . 9 8 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale Y Ġ= Ġ 0 . 9 8 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ UP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . perform Click () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale X Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale Y Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ CANCEL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale X Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale Y Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġcreate ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Model : ĠPlayer ViewModel , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Item Click : Ġ( data : ĠTrack ) Ġ-> ĠUnit ĊĠĠĠĠĠĠĠ Ġ): ĠTrack s ViewHolder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTrack s ViewHolder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠItem Track Binding . inflate ( context . in flater ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Model , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Item Click ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠAlbum GridView Holder Ġprivate Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġbinding : ĠItem Album Grid Binding , ĊĠĠĠ Ġprivate Ġval Ġplayer Model : ĠPlayer ViewModel , ĊĠĠĠ Ġon Item Click : Ġ( data : ĠAlbum ) Ġ-> ĠUnit Ċ ) Ġ: ĠBase Holder < Album >( binding , Ġon Item Click ) Ġ{ ĊĊĠĠĠ Ġval Ġpreferences Manager Ġ= ĠPreferences Manager . getInstance () ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ( data : ĠAlbum ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . album Ġ= Ġdata ĊĠĠĠĠĠĠĠ Ġbinding . album Name . request Layout () ĊĠĠĠĠĠĠĠ Ġbinding . album Artist . request Layout () ĊĊĠĠĠĠĠĠĠ Ġplayer Model . current Playing Album . observe ( item View . context Ġas ĠLifecycle Owner , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ== Ġdata ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . play Album . setImage Resource ( R . drawable . ic _ pause _ circle ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . play Album . setImage Resource ( R . drawable . ic _ play _ circle ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġplayer Model . is Playing . observe ( item View . context Ġas ĠLifecycle Owner , Ġ{ Ġis Playing Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Playing Ġ&& Ġplayer Model . current Playing Album . value Ġ== Ġdata ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . play Album . setImage Resource ( R . drawable . ic _ pause _ circle ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . play Album . setImage Resource ( R . drawable . ic _ play _ circle ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġbinding . play Album . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( player Model . current Playing Album . value Ġ== Ġdata ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Model . invert Playing Status () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Model . play Album ( data , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif ( data . id Ġ== ĠLong . MAX _ VALUE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . play Album . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . root . setOn Touch Listener Ġ{ Ġview , Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( event . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale X Ġ= Ġ 0 . 9 8 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale Y Ġ= Ġ 0 . 9 8 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . alpha Ġ= Ġ 0 . 8 5 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ UP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . perform Click () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale X Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale Y Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . alpha Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ CANCEL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale X Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale Y Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . alpha Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġcreate ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Model : ĠPlayer ViewModel , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Item Click : Ġ( data : ĠAlbum ) Ġ-> ĠUnit ĊĠĠĠĠĠĠĠ Ġ): ĠAlbum GridView Holder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAlbum GridView Holder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠItem Album Grid Binding . inflate ( context . in flater ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Model , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Item Click ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠAlbum Linear ViewHolder Ġprivate Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġbinding : ĠItem Album Linear Binding , ĊĠĠĠ Ġprivate Ġval Ġplayer Model : ĠPlayer ViewModel , ĊĠĠĠ Ġon Item Click : Ġ( data : ĠAlbum ) Ġ-> ĠUnit Ċ ) Ġ: ĠBase Holder < Album >( binding , Ġon Item Click ) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ( data : ĠAlbum ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . album Ġ= Ġdata ĊĠĠĠĠĠĠĠ Ġbinding . album Name . request Layout () ĊĠĠĠĠĠĠĠ Ġbinding . album Artist . request Layout () ĊĊĠĠĠĠĠĠĠ Ġplayer Model . current Playing Album . observe ( item View . context Ġas ĠLifecycle Owner , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( it Ġ== Ġdata ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . play Album . setImage Resource ( R . drawable . ic _ pause _ circle ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . play Album . setImage Resource ( R . drawable . ic _ play _ circle ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġplayer Model . is Playing . observe ( item View . context Ġas ĠLifecycle Owner , Ġ{ Ġis Playing Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( is Playing Ġ&& Ġplayer Model . current Playing Album . value Ġ== Ġdata ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . play Album . setImage Resource ( R . drawable . ic _ pause _ circle ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . play Album . setImage Resource ( R . drawable . ic _ play _ circle ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġbinding . play Album . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( player Model . current Playing Album . value Ġ== Ġdata ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Model . invert Playing Status () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Model . play Album ( data , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif ( data . id Ġ== ĠLong . MAX _ VALUE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . play Album . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . root . setOn Touch Listener Ġ{ Ġview , Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( event . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale X Ġ= Ġ 0 . 9 8 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale Y Ġ= Ġ 0 . 9 8 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . alpha Ġ= Ġ 0 . 8 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ UP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . perform Click () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale X Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale Y Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . alpha Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ CANCEL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale X Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale Y Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . alpha Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġcreate ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Model : ĠPlayer ViewModel , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Item Click : Ġ( data : ĠAlbum ) Ġ-> ĠUnit ĊĠĠĠĠĠĠĠ Ġ): ĠAlbum Linear ViewHolder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAlbum Linear ViewHolder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠItem Album Linear Binding . inflate ( context . in flater ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Model , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Item Click ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠClick ed Album Tracks ViewHolder Ġprivate Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġbinding : ĠItem Album Track Binding , ĊĠĠĠ Ġprivate Ġval Ġplayer Model : ĠPlayer ViewModel , Ċ ) Ġ: ĠBase Holder < Track >( binding ) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ( data : ĠTrack ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . track Ġ= Ġdata ĊĊĠĠĠĠĠĠĠ Ġplayer Model . track . observe ( item View . context Ġas ĠLifecycle Owner , Ġ{ Ġtrack Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( track ?. id Ġ== Ġdata . id ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . track Title . setTextColor ( Context Compat . getColor ( item View . context , ĠR . color . accent )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . track Title . setTextColor ( Context Compat . getColor ( item View . context , ĠR . color . white )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġbinding . root . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Model . play Track ( data , ĠQueue Constructor . IN _ AL BU M . toInt ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . track Title . request Layout () ĊĠĠĠĠĠĠĠ Ġbinding . track Artist . request Layout () ĊĊĠĠĠĠĠĠĠ Ġbinding . root . setOn Touch Listener Ġ{ Ġview , Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( event . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale X Ġ= Ġ 0 . 9 8 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale Y Ġ= Ġ 0 . 9 8 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ UP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . perform Click () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale X Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale Y Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ CANCEL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale X Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale Y Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġcreate ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Model : ĠPlayer ViewModel ĊĠĠĠĠĠĠĠ Ġ): ĠClick ed Album Tracks ViewHolder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠClick ed Album Tracks ViewHolder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠItem Album Track Binding . inflate ( context . in flater ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Model ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠArt ists ViewHolder Ġprivate Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġbinding : ĠItem Artist Binding , ĊĠĠĠ Ġon Item Click : Ġ( data : ĠArtist ) Ġ-> ĠUnit Ċ ) Ġ: ĠBase Holder < Artist >( binding , Ġon Item Click ) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ( data : ĠArtist ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . artist Ġ= Ġdata ĊĊĠĠĠĠĠĠĠ Ġif ( data . tracks Count Ġ!= Ġ 1 ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . artists Tracks Count . text Ġ= Ġbinding . artists Tracks Count . context . resources . getString ( R . string . tracks _ count , Ġdata . tracks Count ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . artists Tracks Count . text Ġ= Ġbinding . artists Tracks Count . context . resources . getString ( R . string . one _ track , Ġdata . tracks Count ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . artist Name . request Layout () ĊĠĠĠĠĠĠĠ Ġbinding . artists Tracks Count . request Layout () ĊĊĠĠĠĠĠĠĠ Ġbinding . root . setOn Touch Listener Ġ{ Ġview , Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( event . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale X Ġ= Ġ 0 . 9 8 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale Y Ġ= Ġ 0 . 9 8 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . alpha Ġ= Ġ 0 . 8 5 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ UP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . perform Click () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale X Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale Y Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . alpha Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ CANCEL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale X Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale Y Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . alpha Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġcreate ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Item Click : Ġ( data : ĠArtist ) Ġ-> ĠUnit ĊĠĠĠĠĠĠĠ Ġ): ĠArt ists ViewHolder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠArt ists ViewHolder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠItem Artist Binding . inflate ( context . in flater ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Item Click ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠF avorite Tracks ViewHolder Ġprivate Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġbinding : ĠItem Favorite Track Binding , ĊĠĠĠ Ġprivate Ġval Ġplayer Model : ĠPlayer ViewModel , ĊĠĠĠ Ġprivate Ġval Ġfavor ites Model : ĠF avorites ViewModel , ĊĠĠĠ Ġon Item Click : Ġ( data : ĠTrack ) Ġ-> ĠUnit Ċ ) Ġ: ĠBase Holder < Track >( binding , Ġon Item Click ) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ( data : ĠTrack ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . track Ġ= Ġdata ĊĊĠĠĠĠĠĠĠ Ġbinding . track Title . request Layout () ĊĠĠĠĠĠĠĠ Ġbinding . track Artist . request Layout () ĊĊĠĠĠĠĠĠĠ Ġplayer Model . track . observe ( item View . context Ġas ĠLifecycle Owner , Ġ{ Ġtrack Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( track ?. id Ġ== Ġdata . id ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . track Title . setTextColor ( Context Compat . getColor ( item View . context , ĠR . color . accent )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . track Title . setTextColor ( Context Compat . getColor ( item View . context , ĠR . color . white )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġbinding . favorite Icon . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset OnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbinding Dialog Ġ= ĠDialog Remove Favorite Track Binding . inflate ( LayoutInflater . from ( it . context )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠAlertDialog . Builder ( it . context , ĠR . style . Custom AlertDialog ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . setView ( binding Dialog . root ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm AlertDialog Ġ= Ġbuilder . show () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding Dialog . track Name . text Ġ= Ġdata . name ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding Dialog . delete . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( data . id Ġ== Ġplayer Model . track . value ?. id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfavor ites Model . set Favorite ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfavor ites Model . delete Track ( data . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm AlertDialog . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding Dialog . cancel . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm AlertDialog . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġset On Touch Listener Ġ{ Ġview , Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( event . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale X Ġ= Ġ 0 . 9 8 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale Y Ġ= Ġ 0 . 9 8 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . alpha Ġ= Ġ 0 . 6 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ UP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . perform Click () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale X Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale Y Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . alpha Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ CANCEL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale X Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale Y Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . alpha Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . root . setOn Touch Listener Ġ{ Ġview , Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( event . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale X Ġ= Ġ 0 . 9 8 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale Y Ġ= Ġ 0 . 9 8 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ UP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . perform Click () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale X Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale Y Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ CANCEL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale X Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale Y Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġcreate ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Model : ĠPlayer ViewModel , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfavor ites Model : ĠF avorites ViewModel , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Item Click : Ġ( data : ĠTrack ) Ġ-> ĠUnit ĊĠĠĠĠĠĠĠ Ġ): ĠF avorite Tracks ViewHolder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠF avorite Tracks ViewHolder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠItem Favorite Track Binding . inflate ( context . in flater ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Model , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfavor ites Model , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Item Click ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }