/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠGoogle ĠInc . ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . android . u amp . ch ill in . fragments Ċ Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . Seek Bar Ċ import Ġandroid . widget . Seek Bar . On Seek Bar ChangeListener Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . annotation . Requires Api Ċ import Ġandroidx . appcompat . widget . Toolbar Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . activity ViewModels Ċ import Ġandroidx . fragment . app . view Models Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġcom . android . u amp . ch ill in . R Ċ import Ġcom . android . u amp . ch ill in . databinding . Fragment Now playing Binding Ċ import Ġcom . android . u amp . ch ill in . utils . Injector Utils Ċ import Ġcom . android . u amp . ch ill in . view models . MainActivity ViewModel Ċ import Ġcom . android . u amp . ch ill in . view models . Now Playing Fragment ViewModel Ċ import Ġcom . android . u amp . ch ill in . view models . Now Playing Fragment ViewModel . Now Playing Metadata Ċ import Ġcom . bump tech . glide . G lide ĊĊ Ċ /** Ċ Ġ* ĠA Ġfragment Ġrepresenting Ġthe Ġcurrent Ġmedia Ġitem Ġbeing Ġplayed . Ċ Ġ*/ Ċ class ĠNow Playing Fragment Ġ: ĠFragment () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġmain Activity ViewModel Ġby Ġactivity ViewModels < MainActivity ViewModel > Ġ{ ĊĠĠĠĠĠĠĠ ĠInject or Utils . provide MainActivity ViewModel ( require Context ()) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġnow Playing ViewModel Ġby Ġview Models < Now Playing Fragment ViewModel > Ġ{ ĊĠĠĠĠĠĠĠ ĠInject or Utils . provide Now Playing Fragment ViewModel ( require Context ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġlateinit Ġvar Ġbinding : ĠFragment Now playing Binding ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġnew Instance () Ġ= ĠNow Playing Fragment () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠFragment Now playing Binding . inflate ( in flater , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġreturn Ġbinding . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . LO L LI POP ) ĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAlways Ġtrue , Ġbut Ġlets Ġlint Ġknow Ġthat Ġas Ġwell . ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġactivity Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġ// ĠAttach Ġob servers Ġto Ġthe ĠLive Data Ġcoming Ġfrom Ġthis ĠViewModel ĊĠĠĠĠĠĠĠ Ġnow Playing ViewModel . media Metadata . observe ( view Lifecycle Owner , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObserver Ġ{ Ġmedia Item Ġ-> Ġupdate UI ( view , Ġmedia Item ) Ġ}) ĊĠĠĠĠĠĠĠ Ġnow Playing ViewModel . media Button Res . observe ( view Lifecycle Owner , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObserver Ġ{ Ġres Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . media Button . setImage Resource ( res ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġnow Playing ViewModel . media Position . observe ( view Lifecycle Owner , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObserver Ġ{ Ġpos Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . position . text Ġ= ĠNow Playing Metadata . timestamp To MSS ( context , Ġpos ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . seek Bar . progress Ġ= Ġpos . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSetup ĠUI Ġhandlers Ġfor Ġbuttons ĊĠĠĠĠĠĠĠ Ġbinding . media Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnow Playing ViewModel . media Metadata . value ?. let Ġ{ Ġmain Activity ViewModel . play Media Id ( it . id ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . skip Next . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmain Activity ViewModel . skip To Next () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . skip Previous . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmain Activity ViewModel . skip To Previous () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . favorite Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( main Activity ViewModel . favorite Music ( context )){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . favorite Button . setImage Resource ( R . drawable . ic _ fav _ fill ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( view . context , ĠR . string . fav _ add , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . favorite Button . setImage Resource ( R . drawable . ic _ fav _ empty ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( view . context , ĠR . string . fav _ remove , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . seek Bar . setOn Seek Bar ChangeListener ( object Ġ: ĠOn Seek Bar ChangeListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Progress Changed ( seek Bar : ĠSeek Bar , Ġprogress : ĠInt , Ġfrom User : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( from User ) Ġmain Activity ViewModel . seek To ( progress . to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonStart Tracking Touch ( seek Bar : ĠSeek Bar ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Stop Tracking Touch ( seek Bar : ĠSeek Bar ) Ġ{} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġbinding . back Button . setOnClickListener Ġ{ Ġactivity ?. on Back Pressed () Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠInitialize Ġplayback Ġduration Ġand Ġposition Ġto Ġzero ĊĠĠĠĠĠĠĠ Ġbinding . duration . text Ġ= ĠNow Playing Metadata . timestamp To MSS ( context , Ġ 0 L ) ĊĠĠĠĠĠĠĠ Ġbinding . position . text Ġ= ĠNow Playing Metadata . timestamp To MSS ( context , Ġ 0 L ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInternal Ġfunction Ġused Ġto Ġupdate Ġall ĠUI Ġelements Ġexcept Ġfor Ġthe Ġcurrent Ġitem Ġplayback ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġupdate UI ( view : ĠView , Ġmetadata : ĠNow Playing Metadata ) Ġ= Ġwith ( binding ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( metadata . album Art Uri Ġ== ĠUri . EMPTY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalbum Art . setImage Resource ( R . drawable . ic _ album _ black _ 2 4 dp ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠG lide . with ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. load ( metadata . album Art Uri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. into ( album Art ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtitle . text Ġ= Ġmetadata . title ĊĠĠĠĠĠĠĠ Ġsubtitle . text Ġ= Ġmetadata . subtitle ĊĠĠĠĠĠĠĠ Ġduration . text Ġ= Ġmetadata . duration ĊĠĠĠĠĠĠĠ Ġseek Bar . max Ġ= ĠNow Playing Metadata . timestamp To M ILL ( metadata . duration , Ġ 0 L ). toInt () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( main Activity ViewModel . verify Music ( view . context )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfavorite Button . setImage Resource ( R . drawable . ic _ fav _ fill ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfavorite Button . setImage Resource ( R . drawable . ic _ fav _ empty ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ } Ċ