/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 Ġ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 Ġk g . del let en eb re . y am us . view models Ċ Ċ import Ġandroid . support . v 4 . media . Media Browser Compat Ċ import Ġandroid . support . v 4 . media . Media Browser Compat . Media Item Ċ import Ġandroid . support . v 4 . media . Media Browser Compat . Subscription Callback Ċ import Ġandroid . support . v 4 . media . Media Metadata Compat Ċ import Ġandroid . support . v 4 . media . session . Playback State Compat Ċ import Ġandroidx . lifecycle .* Ċ import Ġk g . del let en eb re . y am us . Media Item Data Ċ import Ġk g . del let en eb re . y am us . R Ċ import Ġk g . del let en eb re . y am us . common . EMPTY _ PLAY BACK _ STATE Ċ import Ġk g . del let en eb re . y am us . common . Media Session Connection Ċ import Ġk g . del let en eb re . y am us . common . NOTH ING _ PLAY ING Ċ import Ġk g . del let en eb re . y am us . fragments . Media Item Fragment Ċ import Ġk g . del let en eb re . y am us . media . extensions . id Ċ import Ġk g . del let en eb re . y am us . media . extensions . is Playing Ċ Ċ /** Ċ Ġ* Ġ[ ViewModel ] Ġfor Ġ[ Media Item Fragment ]. Ċ Ġ*/ Ċ class ĠMedia Item Fragment ViewModel ( ĊĠĠĠ Ġprivate Ġval Ġmedia Id : ĠString , ĊĠĠĠ Ġmedia Session Connection : ĠMedia Session Connection Ċ ) Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUse Ġa Ġbacking Ġproperty Ġso Ġconsumers Ġof Ġmedia Items Ġonly Ġget Ġa Ġ[ LiveData ] Ġinstance Ġso ĊĠĠĠĠ Ġ* Ġthey Ġdon 't Ġin advert ently Ġmodify Ġit . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġ_ media Items Ġ= ĠMutable LiveData < List < Media Item Data >>() ĊĠĠĠ Ġval Ġmedia Items : ĠLive Data < List < Media Item Data >> Ġ= Ġ_ media Items ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPass Ġthe Ġstatus Ġof Ġthe Ġ[ Media Session Connection . network Failure ] Ġthrough . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġnetwork Error Ġ= ĠTransform ations . map ( media Session Connection . network Failure ) Ġ{ Ġit Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġsubscription Callback Ġ= Ġobject Ġ: ĠSubscription Callback () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Children Loaded ( parentId : ĠString , Ġchildren : ĠList < Media Item >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitems List Ġ= Ġchildren . map Ġ{ Ġchild Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsubtitle Ġ= Ġchild . description . subtitle Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Item Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild . media Id !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild . description . title . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubtitle . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild . description . icon Uri !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild . is Browsable , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetResource For Media Id ( child . media Id !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ media Items . post Value ( items List ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWhen Ġthe Ġsession 's Ġ[ Playback State Compat ] Ġchanges , Ġthe Ġ[ media Items ] Ġneed Ġto Ġbe Ġupdated ĊĠĠĠĠ Ġ* Ġso Ġthe Ġcorrect Ġ[ Media Item Data . playback Res ] Ġis Ġdisplayed Ġon Ġthe Ġactive Ġitem . ĊĠĠĠĠ Ġ* Ġ( i . e .: Ġplay / pause Ġbutton Ġor Ġblank ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġplayback State Observer Ġ= ĠObserver < Playback State Compat > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġplayback State Ġ= Ġit Ġ?: ĠEMPTY _ PLAY BACK _ STATE ĊĠĠĠĠĠĠĠ Ġval Ġmetadata Ġ= Ġmedia Session Connection . now Playing . value Ġ?: ĠNOT H ING _ PLAY ING ĊĠĠĠĠĠĠĠ Ġif Ġ( metadata . getString ( Media Metadata Compat . METADATA _ KEY _ MEDIA _ ID ) Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ media Items . post Value ( update State ( playback State , Ġmetadata )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWhen Ġthe Ġsession 's Ġ[ Media Metadata Compat ] Ġchanges , Ġthe Ġ[ media Items ] Ġneed Ġto Ġbe Ġupdated ĊĠĠĠĠ Ġ* Ġas Ġit Ġmeans Ġthe Ġcurrently Ġactive Ġitem Ġhas Ġchanged . ĠAs Ġa Ġresult , Ġthe Ġnew , Ġand Ġpotentially ĊĠĠĠĠ Ġ* Ġold Ġitem Ġ( if Ġthere Ġwas Ġone ), Ġboth Ġneed Ġto Ġhave Ġtheir Ġ[ Media Item Data . playback Res ] ĊĠĠĠĠ Ġ* Ġchanged . Ġ( i . e .: Ġplay / pause Ġbutton Ġor Ġblank ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġmedia Metadata Observer Ġ= ĠObserver < Media Metadata Compat > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġplayback State Ġ= Ġmedia Session Connection . playback State . value Ġ?: ĠEMPTY _ PLAY BACK _ STATE ĊĠĠĠĠĠĠĠ Ġval Ġmetadata Ġ= Ġit Ġ?: ĠNOT H ING _ PLAY ING ĊĠĠĠĠĠĠĠ Ġif Ġ( metadata . getString ( Media Metadata Compat . METADATA _ KEY _ MEDIA _ ID ) Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ media Items . post Value ( update State ( playback State , Ġmetadata )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBecause Ġthere 's Ġa Ġcomplex Ġd ance Ġbetween Ġthis Ġ[ ViewModel ] Ġand Ġthe Ġ[ Media Session Connection ] ĊĠĠĠĠ Ġ* Ġ( which Ġis Ġwrapping Ġa Ġ[ Media Browser Compat ] Ġobject ), Ġthe Ġusual Ġguidance Ġof Ġusing ĊĠĠĠĠ Ġ* Ġ[ Transform ations ] Ġdoesn 't Ġquite Ġwork . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠSpecific ally Ġthere 's Ġthree Ġthings Ġthat Ġare Ġw atched Ġthat Ġwill Ġcause Ġthe Ġsingle Ġpiece Ġof ĊĠĠĠĠ Ġ* Ġ[ LiveData ] Ġexposed Ġfrom Ġthis Ġclass Ġto Ġbe Ġupdated . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ[ subscription Callback ] Ġ( defined Ġabove ) Ġis Ġcalled Ġif / when Ġthe Ġchildren Ġof Ġthis ĊĠĠĠĠ Ġ* ĠViewModel 's Ġ[ media Id ] Ġchanges . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ[ Media Session Connection . playback State ] Ġchanges Ġstate Ġbased Ġon Ġthe Ġplayback Ġstate Ġof ĊĠĠĠĠ Ġ* Ġthe Ġplayer , Ġwhich Ġcan Ġchange Ġthe Ġ[ Media Item Data . playback Res ] s Ġin Ġthe Ġlist . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ[ Media Session Connection . now Playing ] Ġchanges Ġbased Ġon Ġthe Ġitem Ġthat 's Ġbeing Ġplayed , ĊĠĠĠĠ Ġ* Ġwhich Ġcan Ġalso Ġchange Ġthe Ġ[ Media Item Data . playback Res ] s Ġin Ġthe Ġlist . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġmedia Session Connection Ġ= Ġmedia Session Connection . also Ġ{ ĊĠĠĠĠĠĠĠ Ġit . subscribe ( media Id , Ġsubscription Callback ) ĊĊĠĠĠĠĠĠĠ Ġit . playback State . observe Fore ver ( playback State Observer ) ĊĠĠĠĠĠĠĠ Ġit . now Playing . observe Fore ver ( media Metadata Observer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSince Ġwe Ġuse Ġ[ LiveData . observe Fore ver ] Ġabove Ġ( in Ġ[ media Session Connection ]), Ġwe Ġwant ĊĠĠĠĠ Ġ* Ġto Ġcall Ġ[ LiveData . remove Observer ] Ġhere Ġto Ġprevent Ġle aking Ġresources Ġwhen Ġthe Ġ[ ViewModel ] ĊĠĠĠĠ Ġ* Ġis Ġnot Ġlonger Ġin Ġuse . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠFor Ġmore Ġdetails , Ġsee Ġthe Ġk doc Ġon Ġ[ media Session Connection ] Ġabove . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Cle ared () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Cle ared () ĊĊĠĠĠĠĠĠĠ Ġ// ĠRemove Ġthe Ġpermanent Ġob servers Ġfrom Ġthe ĠMedia Session Connection . ĊĠĠĠĠĠĠĠ Ġmedia Session Connection . playback State . remove Observer ( playback State Observer ) ĊĠĠĠĠĠĠĠ Ġmedia Session Connection . now Playing . remove Observer ( media Metadata Observer ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAnd Ġthen , Ġfinally , Ġunsubscribe Ġthe Ġmedia ĠID Ġthat Ġwas Ġbeing Ġw atched . ĊĠĠĠĠĠĠĠ Ġmedia Session Connection . unsubscribe ( media Id , Ġsubscription Callback ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetResource For Media Id ( media Id : ĠString ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠisActive Ġ= Ġmedia Id Ġ== Ġmedia Session Connection . now Playing . value ?. id ĊĠĠĠĠĠĠĠ Ġval Ġis Playing Ġ= Ġmedia Session Connection . playback State . value ?. is Playing Ġ?: Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! isActive Ġ-> ĠNO _ RES ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Playing Ġ-> ĠR . drawable . ic _ pause ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠR . drawable . ic _ play ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate State ( ĊĠĠĠĠĠĠĠ Ġplayback State : ĠPlay back State Compat , ĊĠĠĠĠĠĠĠ Ġmedia Metadata : ĠMedia Metadata Compat ĊĠĠĠ Ġ): ĠList < Media Item Data > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġnew Res Id Ġ= Ġwhen Ġ( playback State . is Playing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> ĠR . drawable . ic _ pause ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠR . drawable . ic _ play ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmedia Items . value ?. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuse Res Id Ġ= Ġif Ġ( it . media Id Ġ== Ġmedia Metadata . id ) Ġnew Res Id Ġelse ĠNO _ RES ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . copy ( playback Res Ġ= Ġuse Res Id ) ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġempty List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠFactory ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmedia Id : ĠString , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmedia Session Connection : ĠMedia Session Connection ĊĠĠĠ Ġ) Ġ: ĠViewModel Provider . New Instance Factory () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" unchecked _ cast ") ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< T Ġ: ĠViewModel ?> Ġcreate ( model Class : ĠClass < T >): ĠT Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMedia Item Fragment ViewModel ( media Id , Ġmedia Session Connection ) Ġas ĠT ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġconst Ġval ĠTAG Ġ= Ġ" Media Item Fragment VM " Ċ private Ġconst Ġval ĠNO _ RES Ġ= Ġ 0 Ċ