package Ġcom . sample . music x . view models Ċ Ċ import Ġandroid . os . System Clock Ċ import Ġandroid . support . v 4 . media . Media Metadata Compat Ċ import Ġandroid . support . v 4 . media . session . Playback State Compat Ċ import Ġandroidx . fragment . app . FragmentManager Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġcom . sample . music x . fragments . Playlist Picker Dialog Fragment Ċ import Ġcom . sample . music x . utilities .* Ċ import Ġjava . util .* Ċ import Ġkotlin . concurrent . fixed Rate Timer Ċ Ċ class ĠPlayer ViewModel Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġval Ġmedia Metadata Ġ= ĠMutable LiveData < Now Playing Metadata >() ĊĊĠĠĠ Ġvar Ġplayback State Ġ= ĠMutable LiveData < Playback State Compat >() ĊĊĠĠĠ Ġval Ġis Playing Ġ= ĠMutable LiveData < Boolean >( false ) ĊĊĠĠĠ Ġval Ġis Loop ing Ġ= ĠMutable LiveData < Boolean >( false ) ĊĊĠĠĠ Ġval Ġelapsed Time Ġ= ĠMutable LiveData ( 0 L ) ĊĊĠĠĠ Ġprivate Ġvar Ġtimer : ĠTimer ? Ġ= Ġnull ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġplayback State . observe Fore ver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it . state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlay back State Compat . STATE _ PA USED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Playing . value Ġ!= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Playing . value Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimer ?. cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimer ?. purge () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimer Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlay back State Compat . STATE _ PLAY ING Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Playing . value Ġ== Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Playing . value Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimer Ġ= Ġfixed Rate Timer (" timer ", Ġinitial Delay Ġ= Ġ 0 , Ġperiod Ġ= Ġ 1 0 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Elapsed Time () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlay back State Compat . STATE _ SKIP PING _ TO _ NEXT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlay back State Compat . STATE _ SKIP PING _ TO _ PREVIOUS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelapsed Time . value Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimer ?. cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimer ?. purge () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Playing . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimer Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshow Playlist Picker ( fm : ĠFragment Manager ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtrack Id Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Metadata . value ?. id Ġ?: Ġthrow ĠIllegalArgumentException (" Track Ġid 's Ġcannot Ġbe Ġnull ") ĊĠĠĠĠĠĠĠ Ġval Ġdialog Ġ= ĠPlaylist Picker Dialog Fragment . newInstance ( track Id ) ĊĠĠĠĠĠĠĠ Ġdialog . show ( fm , Ġ" Notice Dialog Fragment ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Playback State ( playback State : ĠPlay back State Compat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . playback State . value Ġ= Ġplayback State ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Loop ing ( repeat Mode : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( repeat Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPlay back State Compat . REPEAT _ MODE _ ONE Ġ-> Ġis Loop ing . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPlay back State Compat . REPEAT _ MODE _ ALL Ġ-> Ġis Loop ing . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Media Metadata ( media Metadata : ĠMedia Metadata Compat ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġnow Playing Metadata Ġ= ĠNow Playing Metadata ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Metadata . id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Metadata . album Art Uri . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Metadata . title Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Metadata . display Subtitle Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Metadata . duration Ġ/ Ġ 1 0 0 0 ĊĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġthis . media Metadata . post Value ( now Playing Metadata ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Elapsed Time () Ġ{ ĊĠĠĠĠĠĠĠ Ġplayback State . value ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . state Ġ== ĠPlay back State Compat . STATE _ PLAY ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Delta Ġ= ĠSystem Clock . elapsed Realtime () Ġ- Ġit . last Position UpdateTime ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠcurrentTime Ġ= Ġ( it . position Ġ+ Ġtime Delta . toInt ()) Ġ/ Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelapsed Time . post Value ( currentTime ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠNow Playing Metadata ( ĊĠĠĠ Ġval Ġid : ĠString , ĊĠĠĠ Ġval Ġalbum Art Uri : ĠString , ĊĠĠĠ Ġval Ġtitle : ĠString , ĊĠĠĠ Ġval Ġsubtitle : ĠString , ĊĠĠĠ Ġval Ġduration : ĠLong Ċ )