package Ġcom . popular movies . vp aliy . popular movies app . ui . detail Ċ Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . widget . ImageView Ċ import Ġcom . popular movies . vp aliy . popular movies app . R Ċ import Ġcom . popular movies . vp aliy . popular movies app . ui . base . Base Activity Ċ import Ġcom . popular movies . vp aliy . popular movies app . ui . model . Media Model Ċ import Ġcom . rd . animation . type . Animation Type Ċ import Ġkotlinx . android . synt hetic . main . activity _ media _ details .* Ċ import Ġkotlinx . android . synt hetic . main . layout _ media _ description .* Ċ import Ġandroid . support . v 7 . widget . RecyclerView Ċ import Ġcom . popular movies . vp aliy . popular movies app . ui . model . List Wrapper Ċ import Ġcom . bump tech . glide . G lide Ċ import Ġcom . bump tech . glide . Priority Ċ import Ġcom . bump tech . glide . load . engine . Disk Cache Strategy Ċ import Ġcom . popular movies . vp aliy . popular movies app . App Ċ import Ġcom . popular movies . vp aliy . popular movies app . ui . detail . Detail Contract . Presenter Ċ import Ġjavax . inject . Inject Ċ import Ġandroid . content . res . Color State List Ċ import Ġandroid . support . constraint . Constraint Layout Ċ import Ġandroid . support . v 7 . graphics . Palette Ċ import Ġandroid . view . View Ċ import Ġcom . popular movies . vp aliy . domain . entity .* Ċ import Ġcom . popular movies . vp aliy . popular movies app . di . component . Base Component Ċ import Ġcom . popular movies . vp aliy . popular movies app . di . component . D agger Details Component Ċ import Ġcom . popular movies . vp aliy . popular movies app . di . injector . Injector Ċ import Ġcom . popular movies . vp aliy . popular movies app . di . module . Details Module Ċ import Ġcom . popular movies . vp aliy . popular movies app . ui .* Ċ import Ġcom . popular movies . vp aliy . popular movies app . ui . base . Base Adapter Ċ import Ġcom . popular movies . vp aliy . popular movies app . ui . utils . set Drawable Color Ċ import Ġcom . vp aliy . kotlin _ extensions .* Ċ Ċ class ĠDetail Activity Ġ: ĠBase Activity (), ĠDetail Contract . View Ġ{ ĊĠ Ġvar Ġpresenter : ĠPres enter ? Ġ= Ġnull ĊĠĠĠ Ġ@ Inject Ġset ( value ) Ġ{ ĊĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠ Ġfield ?. attach View ( this ) ĊĠĠĠ Ġ} ĊĊĠ Ġprivate Ġval Ġhidden Ġby Ġlazy ( Lazy Thread Safety Mode . NONE ) Ġ{ ĊĠĠĠ ĠlistOf ( share Button , Ġposter , Ġpage Indicator , Ġdescription Root , Ġposter , Ġdetails ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġval Ġadapter Ġby Ġlazy ( Lazy Thread Safety Mode . NONE ) Ġ{ ĊĠĠĠ ĠDetail Adapter ( this ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġval Ġback drop Adapter Ġby Ġlazy ( Lazy Thread Safety Mode . NONE ) Ġ{ ĊĠĠĠ ĠBack drop Adapter ( this , Ġthis :: on Loaded ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġval Ġsuggestion Map Ġ= Ġmutable Map Of < Similarity Type , ĠBase Adapter < Media Model >>() ĊĊĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠ ĠsetContentView ( R . layout . activity _ media _ details ) ĊĠĠĠ Ġdetails . adapter Ġ= Ġadapter ĊĠĠĠ Ġback drop Pager . adapter Ġ= Ġback drop Adapter ĊĠĠĠ Ġdetails . on Fl ing Listener Ġ= Ġfl ing Listener ĊĠĠĠ Ġdetails . add On Scroll Listener ( listener ) ĊĠĠĠ Ġinfo (" Calling Ġpresenter ") ĊĠĠĠ Ġpresenter ?. start () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġon Loaded ( image : ĠImageView , Ġbitmap : ĠBitmap ) Ġ{ ĊĠĠĠ Ġpage Indicator . set Animation Type ( Animation Type . TH IN _ W ORM ) ĊĠĠĠ Ġpage Indicator . translation Y Ġ= Ġimage . height Ġ- Ġpage Indicator . height Ġ* Ġ 2 . 5 f ĊĠĠĠ Ġdescription Root . static Offset Ġ= Ġimage . height . toFloat () ĊĠĠĠ Ġdescription Root . offset Ġ= Ġimage . height . toFloat () ĊĠĠĠ Ġval Ġposter Offset Ġ= Ġimage . height Ġ- Ġposter . height Ġ* Ġ 0 . 3 3 f ĊĠĠĠ Ġposter . min Offset Ġ= Ġposter Offset ĊĠĠĠ Ġposter . static Offset Ġ= Ġposter Offset ĊĠĠĠ Ġposter . set Offset ( poster Offset ) ĊĠĠĠ Ġposter . is Pin ned Ġ= Ġtrue ĊĠĠĠ Ġshare Button . set Min Offset ( backdrop Pager . getMin Height () Ġ- Ġshare Button . height Ġ/ Ġ 2 f ) ĊĠĠĠ Ġapply Palette ( Palette . from ( bitmap ). generate ()) ĊĠĠĠ Ġhidden . forEach ( View :: show ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġshow Back dro ps ( data : ĠList < String >) Ġ{ ĊĠĠĠ Ġback drop Adapter . data Ġ= Ġdata . to Mutable List () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġshow Cast ( data : ĠList < Role >) Ġ{ ĊĠĠĠ Ġval Ġcast Adapter Ġ= ĠCast Adapter ( this ). apply Ġ{ ĊĠĠĠĠĠ Ġthis . data Ġ= Ġdata . to Mutable List () ĊĠĠĠ Ġ} ĊĠĠĠ Ġadapter . add First ( List Wrapper ( cast Adapter , ĠgetString ( R . string . cast _ title ))) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġapply Palette ( palette : ĠPalette ) Ġ{ ĊĠĠĠ Ġvar Ġsw atch : ĠPalette . Sw atch ? Ġ= Ġpalette . dark V ibr ant Sw atch ĊĠĠĠ Ġif Ġ( sw atch Ġ== Ġnull ) Ġsw atch Ġ= Ġpalette . dom inant Sw atch ĊĠĠĠ Ġ// apply Ġif Ġnot Ġnull ĊĠĠĠ Ġif Ġ( sw atch Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġshare Button . background Tint List Ġ= ĠColor State List . valueOf ( sw atch . rgb ) ĊĠĠĠĠĠ Ġdescription Root . set BackgroundColor ( sw atch . rgb ) ĊĠĠĠĠĠ Ġch ips . set Chips Colors ( sw atch . body TextColor , Ġsw atch . title TextColor ) ĊĠĠĠĠĠ Ġmovie Title . setTextColor ( sw atch . body TextColor ) ĊĠĠĠĠĠ Ġrelease . setTextColor ( sw atch . body TextColor ) ĊĠĠĠĠĠ Ġratings . setTextColor ( sw atch . body TextColor ) ĊĠĠĠĠĠ Ġdescription . setTextColor ( sw atch . body TextColor ) ĊĠĠĠĠĠ Ġduration . setTextColor ( sw atch . body TextColor ) ĊĠĠĠĠĠ Ġ// money . setTextColor ( sw atch . body TextColor ) ĊĠĠĠĠĠ Ġ// set Drawable Color ( money , Ġsw atch . body TextColor ) ĊĠĠĠĠĠ Ġset Drawable Color ( duration , Ġsw atch . body TextColor ) ĊĠĠĠĠĠ Ġset Drawable Color ( release , Ġsw atch . body TextColor ) ĊĠĠĠĠĠ Ġset Drawable Color ( ratings , Ġsw atch . body TextColor ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġshow Media ( movie : ĠMovie ) Ġ{ ĊĠĠĠ Ġshow Back dro ps ( movie . back dro ps !! ) ĊĠĠĠ Ġmovie Title . text Ġ= Ġmovie . title ĊĠĠĠ Ġrelease . text Ġ= Ġmovie . release Year ĊĠĠĠ Ġratings . text Ġ= Ġmovie . average Vote . toString () ĊĠĠĠ Ġdescription . text Ġ= Ġmovie . description ĊĠĠĠ Ġch ips . set Tags ( movie . genres ) ĊĠĠĠ ĠG lide . with ( this ) ĊĠĠĠĠĠĠĠ Ġ. load ( movie . poster ) ĊĠĠĠĠĠĠĠ Ġ. as Bitmap () ĊĠĠĠĠĠĠĠ Ġ. priority ( Priority . IM MEDI ATE ) ĊĠĠĠĠĠĠĠ Ġ. disk Cache Strategy ( Disk Cache Strategy . RESULT ) ĊĠĠĠĠĠĠĠ Ġ. placeholder ( R . drawable . placeholder ) ĊĠĠĠĠĠĠĠ Ġ. into ( poster ) ĊĠĠĠ Ġdescription . after Post Ġ{ ĊĠĠĠĠĠ Ġadjust Description () ĊĠĠĠĠĠ Ġpost ( this @ Detail Activity :: adjust Placeholder ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġadjust Placeholder () Ġ{ ĊĠĠĠ Ġval Ġlayout Params Ġ= Ġadapter . placeholder . layout Params ĊĠĠĠ Ġlayout Params . height Ġ= Ġback drop Pager . height Ġ+ Ġdescription Root . height ĊĠĠĠ Ġadapter . placeholder . layout Params Ġ= Ġlayout Params ĊĠĠĠ Ġval Ġoffset Ġ= Ġback drop Pager . height Ġ+ Ġdescription Root . height Ġ- Ġshare Button . height Ġ/ Ġ 2 ĊĠĠĠ Ġshare Button . static Offset Ġ= Ġoffset ĊĠĠĠ Ġshare Button . set Offset ( offset . toFloat ()) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġadjust Description () Ġ{ ĊĠĠĠ Ġif Ġ(( description . end Y () Ġ> Ġdummy . end Y ())) Ġ{ ĊĠĠĠĠĠ Ġ// if Ġthe Ġposter Ġis Ġhigher Ġthan Ġthe Ġduration , Ġthen Ġshift Ġthe Ġrelease Ġlabel ĊĠĠĠĠĠ Ġif Ġ(( dummy . end Y () Ġ- Ġduration . end Y ()) Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġshift To Start ( release , Ġtop To Bottom Ġ= Ġdummy . id ) ĊĠĠĠĠĠĠĠ Ġshift To Start ( duration , Ġstart To Start Ġ= Ġmovie Title . id , Ġtop To Bottom Ġ= Ġmovie Title . id ) ĊĠĠĠĠĠĠĠ Ġshift To Start ( ch ips , Ġtop To Bottom Ġ= Ġrelease . id ) ĊĠĠĠĠĠĠĠ Ġshift To Start ( description , Ġtop To Bottom Ġ= Ġch ips . id ) ĊĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(( dummy . end Y () Ġ- Ġduration . end Y ()) Ġ<= Ġ( 2 Ġ* Ġduration . height )) Ġ{ ĊĠĠĠĠĠĠĠ Ġshift To Start ( ch ips , Ġtop To Bottom Ġ= Ġdummy . id ) ĊĠĠĠĠĠĠĠ Ġshift To Start ( description , Ġtop To Bottom Ġ= Ġch ips . id ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġshift To Start ( target : ĠView , Ġtop To Bottom : ĠInt , Ġstart To Start : ĠInt Ġ= ĠConstraint Layout . LayoutParams . PARENT _ ID ) Ġ{ ĊĠĠĠ Ġval Ġparams Ġ= Ġtarget . layout Params Ġas ĠConstraint Layout . LayoutParams ĊĠĠĠ Ġparams . start To Start Ġ= Ġstart To Start ĊĠĠĠ Ġparams . left To Right Ġ= ĠConstraint Layout . LayoutParams . UN SET ĊĠĠĠ Ġparams . top To Bottom Ġ= Ġtop To Bottom ĊĠĠĠ Ġtarget . layout Params Ġ= Ġparams ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġshow Message ( resource : ĠInt ) Ġ{ ĊĠĠĠ ĠTODO (" not Ġimplemented ") Ġ// To Ġchange Ġbody Ġof Ġcreated Ġfunctions Ġuse ĠFile Ġ| ĠSettings Ġ| ĠFile ĠTemplates . ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġshow Reviews ( data : ĠList < Review >) Ġ{ ĊĠĠĠ Ġval Ġreview Adapter Ġ= ĠReview Adapter ( this ). apply Ġ{ ĊĠĠĠĠĠ Ġthis . data Ġ= Ġdata . to Mutable List () ĊĠĠĠ Ġ} ĊĠĠĠ Ġadapter . add ( List Wrapper ( review Adapter , ĠgetString ( R . string . review _ title ))) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġappend Suggest ed ( type : ĠSimilar ity Type , Ġdata : ĠList < Media Model >) Ġ{ ĊĠĠĠ Ġsuggestion Map [ type ]?. append ( data . to Mutable List ()) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġshow Suggest ed ( type : ĠSimilar ity Type , Ġdata : ĠList < Media Model >) Ġ{ ĊĠĠĠ Ġval Ġsuggested Adapter Ġ= ĠSuggest ed Adapter ( this ) ĊĠĠĠ Ġsuggested Adapter . data Ġ= Ġdata . to Mutable List () ĊĠĠĠ Ġsuggestion Map . put ( type , Ġsuggested Adapter ) ĊĠĠĠ Ġval Ġtitle Ġ= Ġ( type Ġ== ĠSimilar ) Ġthen ĠgetString ( R . string . media _ similar _ content ) ĊĠĠĠĠĠĠĠ Ġ?: ĠgetString ( R . string . media _ recommend ations ) ĊĠĠĠ Ġval Ġwrapper Ġ= ĠList Wrapper ( suggest ed Adapter , Ġtitle , Ġ{ Ġpresenter ?. more ( type ) Ġ}) ĊĠĠĠ Ġadapter . add ( wrapper ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġshow Trail ers ( data : ĠList < Tr ailer >) Ġ{ ĊĠĠĠ Ġval Ġtr ailer Adapter Ġ= ĠTr ailer Adapter ( this ). apply Ġ{ ĊĠĠĠĠĠ Ġthis . data Ġ= Ġdata . to Mutable List () ĊĠĠĠ Ġ} ĊĠĠĠ Ġadapter . add Last ( List Wrapper ( tr ailer Adapter , ĠgetString ( R . string . tr ailer _ title ))) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġinject () Ġ{ ĊĠĠĠ ĠApp . inject ( this ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġval Ġfl ing Listener Ġ= Ġobject Ġ: ĠRecyclerView . On Fl ing Listener () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġon Fl ing ( velocity X : ĠInt , Ġvelocity Y : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠ Ġposter . is Immediate Pin Ġ= Ġtrue ĊĠĠĠĠĠ Ġback drop Pager . is Immediate Pin Ġ= Ġtrue ĊĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġval Ġlistener Ġ= Ġobject Ġ: ĠRecyclerView . On Scroll Listener () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġposter Height Ġby Ġlazy ( Lazy Thread Safety Mode . NONE ) Ġ{ ĊĠĠĠĠĠ Ġget Dimension ( R . dim en . details _ poster _ height ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġbutton Height Ġby Ġlazy ( Lazy Thread Safety Mode . NONE ) Ġ{ ĊĠĠĠĠĠ Ġget Dimension ( R . dim en . design _ fab _ size _ normal ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Scroll StateChanged ( re cyclerView : ĠRecyclerView , ĠnewState : ĠInt ) Ġ{ ĊĠĠĠĠĠ Ġsuper . on Scroll StateChanged ( re cyclerView , ĠnewState ) ĊĠĠĠĠĠ Ġposter . is Immediate Pin Ġ= Ġ( newState Ġ== ĠRecyclerView . SCROLL _ STATE _ SET TL ING ) ĊĠĠĠĠĠ Ġback drop Pager . is Immediate Pin Ġ= Ġ( newState Ġ== ĠRecyclerView . SCROLL _ STATE _ SET TL ING ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Sc rolled ( re cyclerView : ĠRecyclerView ?, Ġdx : ĠInt , Ġdy : ĠInt ) Ġ{ ĊĠĠĠĠĠ Ġsuper . on Sc rolled ( re cyclerView , Ġdx , Ġdy ) ĊĠĠĠĠĠ Ġval Ġscroll Y Ġ= Ġadapter . placeholder . top ĊĠĠĠĠĠ Ġback drop Pager . offset Ġ= Ġscroll Y ĊĠĠĠĠĠ Ġposter . set Offset ( poster . static Offset Ġ+ Ġscroll Y ) ĊĠĠĠĠĠ Ġdescription Root . offset Ġ= Ġ( description Root . static Offset Ġ+ Ġscroll Y ) ĊĊĠĠĠĠĠ Ġvar Ġmin Ġ= Ġposter . translation Y Ġ+ Ġposter . height ĊĠĠĠĠĠ Ġvar Ġmax Ġ= Ġdescription Root . static Offset Ġ+ Ġdescription Root . height ĊĠĠĠĠĠ Ġ// hide Ġthe Ġposter Ġas Ġit Ġgoes Ġup ĊĠĠĠĠĠ Ġval Ġalpha Ġ= Ġ( description Root . offset Ġ+ Ġdescription Root . height Ġ- Ġmin ) Ġ/ Ġ( max Ġ- Ġmin ) ĊĠĠĠĠĠ Ġvar Ġparams Ġ= Ġposter . layout Params ĊĠĠĠĠĠ Ġ// TODO Ġmake Ġthe Ġimage Ġdis appear Ġon Ġscroll ĊĠĠĠĠĠ Ġparams . height Ġ= Ġ( poster Height Ġ* Ġalpha ). toInt () ĊĠĠĠĠĠ Ġposter . layout Params Ġ= Ġparams ĊĠĠĠĠĠ Ġposter . alpha Ġ= Ġ( alpha ) ĊĠĠĠĠĠ Ġshare Button . alpha Ġ= Ġ( 1 Ġ- Ġalpha ) ĊĠĠĠĠĠ Ġparams Ġ= Ġshare Button . layout Params ĊĠĠĠĠĠ Ġparams . height Ġ= Ġ( button Height Ġ* Ġ( 1 Ġ- Ġalpha )). toInt () ĊĠĠĠĠĠ Ġshare Button . layout Params Ġ= Ġparams ĊĠĠĠĠĠ Ġmax Ġ= Ġback drop Pager . height . toFloat () ĊĠĠĠĠĠ Ġmin Ġ= Ġpage Indicator . translation Y Ġ+ Ġpage Indicator . height ĊĠĠĠĠĠ Ġshare Button . set Offset ( share Button . static Offset Ġ+ Ġscroll Y . toFloat () Ġ- Ġshare Button . height Ġ/ Ġ 2 ) ĊĠĠĠĠĠ Ġ// Ġhide Ġthe Ġpage Ġindicator Ġon Ġscroll ĊĠĠĠĠĠ Ġpage Indicator . alpha Ġ= Ġ(( backdrop Pager . offset Ġ+ Ġback drop Pager . height Ġ- Ġmin ) Ġ/ Ġ( max Ġ- Ġmin )) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġfun Ġbuild Injector ( model : ĠMedia Model ) Ġ= Ġobject Ġ: ĠInject or < Detail Activity > Ġ{ ĊĠĠĠĠĠ Ġoverride Ġval Ġcomponent : ĠBase Component < Detail Activity > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠD agger Details Component . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. application Component ( App . component ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. details Module ( Details Module ( model )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġinject ( target : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( target Ġis ĠDetail Activity ) ĊĠĠĠĠĠĠĠĠĠ Ġcomponent . inject ( target ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ }