/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 7 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* Ġ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 . example . android . watch next code lab Ċ Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroid . os . Bundle Ċ import Ġandroidx . lean back . app . Details Fragment Ċ import Ġandroidx . lean back . app . Details Fragment Background Controller Ċ import Ġandroidx . lean back . widget . Action Ċ import Ġandroidx . lean back . widget . Array Object Adapter Ċ import Ġandroidx . lean back . widget . Class Presenter Selector Ċ import Ġandroidx . lean back . widget . Details Overview Row Ċ import Ġandroidx . lean back . widget . Full Width Details Overview Row Presenter Ċ import Ġandroidx . lean back . widget . Full Width Details Overview Shared Element Helper Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroid . util . Log Ċ import Ġandroid . widget . Toast Ċ Ċ import Ġcom . bump tech . glide . G lide Ċ import Ġcom . bump tech . glide . request . RequestOptions Ċ import Ġcom . bump tech . glide . request . target . Simple Target Ċ import Ġcom . bump tech . glide . request . transition . Transition Ċ import Ġcom . example . android . watch next code lab . channels . schedule Adding To Watch list Ċ import Ġcom . example . android . watch next code lab . channels . schedule Remove From Watch list Ċ import Ġcom . example . android . watch next code lab . model . Category Ċ import Ġcom . example . android . watch next code lab . model . Movie Ċ import Ġcom . example . android . watch next code lab . presenter . Details Description Presenter Ċ import Ġcom . example . android . watch next code lab . watch list . Watch list Manager Ċ Ċ private Ġconst Ġval ĠTAG Ġ= Ġ" Video Details Fragment " Ċ Ċ private Ġconst Ġval ĠACTION _ WATCH _ TR AIL ER _ ID Ġ= Ġ 1 L Ċ private Ġconst Ġval ĠACTION _ ADD _ TO _ LIST _ ID Ġ= Ġ 2 L Ċ private Ġconst Ġval ĠACTION _ BU Y _ ID Ġ= Ġ 3 L Ċ private Ġconst Ġval ĠACTION _ ADD _ TO _ LIST _ INDEX Ġ= Ġ 1 Ċ Ċ private Ġconst Ġval ĠDET AIL _ TH UMB _ WIDTH Ġ= Ġ 2 7 4 Ċ private Ġconst Ġval ĠDET AIL _ TH UMB _ HEIGHT Ġ= Ġ 2 7 4 Ċ Ċ /* Ċ Ġ* ĠLe an back Details Fragment Ġextends ĠDetails Fragment , Ġa ĠWrapper Ġfragment Ġfor Ġlean back Ġdetails Ġscreens . Ċ Ġ* ĠIt Ġshows Ġa Ġdetailed Ġview Ġof Ġvideo Ġand Ġits Ġmeta Ġplus Ġrelated Ġvideos . Ċ Ġ*/ Ċ class ĠVideo Details Fragment Ġ: ĠDetails Fragment () Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġselected Movie : ĠMovie ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġrow Adapter : ĠArray Object Adapter ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġpresenter Selector : ĠClass Presenter Selector ĊĊĠĠĠ Ġprivate Ġval Ġwatch list Manager Ġ= ĠWatch list Manager . get () ĊĠĠĠ Ġprivate Ġvar Ġis Movie In Watch List : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdetails Background : ĠDetails Fragment Background Controller ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġaction Adapter : ĠArray Object Adapter ĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠaddTo Watch list Action : ĠAction ĊĠĠĠ Ġprivate Ġval Ġwatch list Observer Ġ= ĠObserver < Category > Ġ{ ĊĠĠĠĠĠĠĠ Ġis Movie In Watch List Ġ= Ġwatch list Manager . isIn Watch list ( context , Ġselected Movie ) ĊĠĠĠĠĠĠĠ ĠaddTo Watch list Action . label 1 Ġ= Ġwatch list Action Label ĊĠĠĠĠĠĠĠ Ġaction Adapter . notify Array Item Range Changed ( ACTION _ ADD _ TO _ LIST _ INDEX , Ġ 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġwatch list Action Label : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġif Ġ( is Movie In Watch List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresources . getString ( R . string . remove _ from _ list ) ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresources . getString ( R . string . add _ to _ list ) ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" onCreate ĠDetails Fragment ") ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġval Ġparam : ĠMovie ? Ġ= Ġactivity . intent . get Parcelable Extra ( MOV IE ) ĊĠĠĠĠĠĠĠ Ġif ( Ġparam Ġ== Ġnull Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Cannot Ġshow Ġdetails Ġfor Ġan Ġinvalid Ġmovie , Ġreturning Ġto Ġthe ĠMainActivity ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( activity , ĠMainActivity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . finish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġselected Movie Ġ= Ġparam ĊĊĠĠĠĠĠĠĠ Ġdetails Background Ġ= ĠDetails Fragment Background Controller ( this ) ĊĊĠĠĠĠĠĠĠ Ġpresenter Selector Ġ= ĠClass Presenter Selector () ĊĠĠĠĠĠĠĠ Ġrow Adapter Ġ= ĠArray Object Adapter ( presenter Selector ) ĊĠĠĠĠĠĠĠ Ġis Movie In Watch List Ġ= Ġwatch list Manager . isIn Watch list ( context , Ġselected Movie ) ĊĊĠĠĠĠĠĠĠ Ġsetup Details Overview Row () ĊĠĠĠĠĠĠĠ Ġsetup Details Overview Row Presenter () ĊĠĠĠĠĠĠĠ Ġadapter Ġ= Ġrow Adapter ĊĠĠĠĠĠĠĠ Ġinitialize Background ( selected Movie ) ĊĊĠĠĠĠĠĠĠ Ġwatch list Manager . get Live Watch list (). observe Fore ver ( watch list Observer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġwatch list Manager . get Live Watch list (). remove Observer ( watch list Observer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinitialize Background ( data : ĠMovie ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdetails Background . enable Par allax () ĊĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= ĠRequest Options () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. center Crop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. error ( R . drawable . default _ background ) ĊĠĠĠĠĠĠĠ ĠG lide . with ( activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Bitmap () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. load ( data . card ImageUrl ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply ( options ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. into ( object Ġ: ĠSimple Target < Bitmap >() Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Resource Ready ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresource : ĠBitmap , Ġtransition : ĠTransition < in ĠBitmap >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetails Background . cover Bitmap Ġ= Ġresource ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow Adapter . notify Array Item Range Changed ( 0 , Ġrow Adapter . size ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Details Overview Row () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" do In Background : Ġ" Ġ+ Ġselected Movie . toString ()) ĊĠĠĠĠĠĠĠ Ġval Ġrow Ġ= ĠDetails Overview Row ( selected Movie ) ĊĠĠĠĠĠĠĠ Ġrow . image Drawable Ġ= ĠContext Compat . get Drawable ( context , ĠR . drawable . default _ background ) ĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġconvert Dp To Pixel ( activity . application Context , ĠDET AIL _ TH UMB _ WIDTH ) ĊĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġconvert Dp To Pixel ( activity . application Context , ĠDET AIL _ TH UMB _ HEIGHT ) ĊĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= ĠRequest Options () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. center Crop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. error ( R . drawable . default _ background ) ĊĠĠĠĠĠĠĠ ĠG lide . with ( activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Drawable () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. load ( selected Movie . thumbnail Url ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply ( options ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. into ( object Ġ: ĠSimple Target < Drawable >( width , Ġheight ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Resource Ready ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresource : ĠDrawable , Ġtransition : ĠTransition < in ĠDrawable >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" details Ġoverview Ġcard Ġimage Ġurl Ġready : Ġ" Ġ+ Ġresource ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow . image Drawable Ġ= Ġresource ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow Adapter . notify Array Item Range Changed ( 0 , Ġrow Adapter . size ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠaddTo Watch list Action Ġ= ĠAction ( ACTION _ ADD _ TO _ LIST _ ID , Ġwatch list Action Label ) ĊĠĠĠĠĠĠĠ Ġval Ġwatch Action Ġ= ĠAction ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ WATCH _ TR AIL ER _ ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources . getString ( R . string . watch _ tr ailer _ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources . getString ( R . string . watch _ tr ailer _ 2 )) ĊĠĠĠĠĠĠĠ Ġval Ġbuy Action Ġ= ĠAction ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ BU Y _ ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources . getString ( R . string . buy _ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Movie . offer Price ) ĊĊĠĠĠĠĠĠĠ Ġaction Adapter Ġ= ĠlistOf ( watch Action , ĠaddTo Watch list Action , Ġbuy Action ). toArray Object Adapter () ĊĊĠĠĠĠĠĠĠ Ġrow . actions Adapter Ġ= Ġaction Adapter ĊĊĠĠĠĠĠĠĠ Ġrow Adapter Ġ+= Ġrow ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Details Overview Row Presenter () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠSet Ġdetail Ġbackground . ĊĠĠĠĠĠĠĠ Ġval Ġdetails Presenter Ġ= ĠFull Width Details Overview Row Presenter ( Details Description Presenter ()) ĊĠĠĠĠĠĠĠ Ġdetails Presenter . backgroundColor Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContext Compat . getColor ( context , ĠR . color . selected _ background ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠHook Ġup Ġtransition Ġelement . ĊĠĠĠĠĠĠĠ Ġval Ġshared Element Helper Ġ= ĠFull Width Details Overview Shared Element Helper () ĊĠĠĠĠĠĠĠ Ġshared Element Helper . set Shared Element Enter Transition ( activity , ĠSHARE D _ ELEMENT _ NAME ) ĊĠĠĠĠĠĠĠ Ġdetails Presenter . set Listener ( shared Element Helper ) ĊĠĠĠĠĠĠĠ Ġdetails Presenter . is Part icip ating Entr ance Transition Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġdetails Presenter . setOn Action Clicked Listener Ġ{ Ġaction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( action . id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ WATCH _ TR AIL ER _ ID Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( activity , ĠPlay back Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra ( MOV IE , Ġselected Movie ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ ADD _ TO _ LIST _ ID Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Movie In Watch List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġschedule Remove From Watch list ( context , Ġselected Movie ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġschedule Adding To Watch list ( context , Ġselected Movie ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠToast . makeText ( activity , Ġaction . toString (), ĠToast . LENGTH _ SHORT ). show () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpresenter Selector . addClass Presenter ( Details Overview Row :: class . java , Ġdetails Presenter ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconvert Dp To Pixel ( context : ĠContext , Ġdp : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdensity Ġ= Ġcontext . resources . display Metrics . density ĊĠĠĠĠĠĠĠ Ġreturn ĠMath . round ( dp . toFloat () Ġ* Ġdensity ) ĊĠĠĠ Ġ} Ċ } Ċ