package Ġcom . int act . movies box . ui . activity Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . MenuItem Ċ import Ġandroidx . lifecycle . ViewModel Providers Ċ import Ġcom . int act . movies box . R Ċ import Ġcom . int act . movies box . databinding . Activity Movie Detail Binding Ċ import Ġcom . int act . movies box . extension . observe LiveData Ċ import Ġcom . int act . movies box . presentation . model . Error DTO Ċ import Ġcom . int act . movies box . presentation . model . Movie DTO Ċ import Ġcom . int act . movies box . presentation . view models . Movie Detail ViewModel Ċ import Ġcom . int act . movies box . ui . base . Base Activity Ċ import Ġcom . int act . movies box . ui . base . Custom ViewModel Factory Ċ import Ġcom . int act . movies box . util . IMAGE _ BASE _ URL _ 5 0 0 Ċ import Ġcom . int act . movies box . util . INT ENT _ KEY _ MOV IE _ ID Ċ import Ġcom . squareup . pic asso . Pic asso Ċ import Ġdagger . android . Dispatch ing Android Injector Ċ import Ġtim ber . log . Tim ber Ċ import Ġjavax . inject . Inject ĊĊ Ċ /** Ċ Ġ* ĠActivity Ġto Ġshow Ġthe Ġmovie Ġdetails Ċ Ġ* Ċ Ġ* ĠCreated Ġby ĠAn ur ag ĠG arg Ġon Ġ 2 0 1 9 - 0 4 - 2 4 . Ċ Ġ* Ċ Ġ* ĠUsing Ġkotlinx . android . synt hetic Ġis Ġno Ġlonger Ġa Ġrecommended Ġpractice . Ċ Ġ* Ċ Ġ* ĠData Ġbinding : ĠA Ġbinding Ġclass Ġis Ġgenerated Ġfor Ġeach Ġlayout Ġfile . ĠBy Ġdefault , Ċ Ġ* Ġthe Ġname Ġof Ġthe Ġclass Ġis Ġbased Ġon Ġthe Ġname Ġof Ġthe Ġlayout Ġfile , Ġconverting Ġit Ġto ĠPas cal Ġcase Ċ Ġ* Ġand Ġadding Ġthe ĠBinding Ġsuffix Ġto Ġit . ĠThe Ġabove Ġlayout Ġfilename Ġis Ġactivity _ main . xml Ġso Ġthe Ċ Ġ* Ġcorresponding Ġgenerated Ġclass Ġis ĠActivity Main Binding . Ċ Ġ* Ċ Ġ* ĠBinding Ġadapters : ĠFor Ġevery Ġlayout Ġexpression , Ġthere Ġis Ġa Ġbinding Ġadapter Ġthat Ġmakes Ġthe Ċ Ġ* Ġframework Ġcalls Ġrequired Ġto Ġset Ġthe Ġcorresponding Ġproperties Ġor Ġlisteners . ĠFor Ġexample , Ċ Ġ* Ġthe Ġbinding Ġadapter Ġcan Ġtake Ġcare Ġof Ġcalling Ġthe Ġset Text () Ġmethod Ġto Ġset Ġthe Ġtext Ġproperty Ċ Ġ* Ġor Ġcall Ġthe Ġset OnClickListener () Ġmethod Ġto Ġadd Ġa Ġlistener Ġto Ġthe Ġclick Ġevent . Ċ Ġ* Ċ Ġ* Ġ@ Binding Adapter (" imageUrl ", Ġ" error ") Ċ Ġ* Ġfun Ġload Image ( view : ĠImageView , Ġurl : ĠString , Ġerror : ĠDrawable ) Ġ{ Ċ Ġ* ĠĠĠĠĠ ĠPic asso . get (). load ( url ). error ( error ). into ( view ) Ċ Ġ* Ġ} Ċ Ġ* Ċ Ġ* Ġ< ImageView Ġapp : imageUrl =" @{ venue . imageUrl }" Ġapp : error =" @{ @ drawable / venue Error }" Ġ/> Ċ Ġ* Ċ Ġ* ĠWe Ġare Ġnot Ġusing Ġbinding Ġadapter Ġas Ġin Ġabove Ġexample Ġthe Ġcode Ġhas Ġto Ġbe Ġwritten Ġin Ġthe Ġuser Ġclass Ċ Ġ* Ġwhich Ġis Ġa Ġpo jo Ġand Ġwe Ġare Ġnot Ġinject ing Ġpic asso Ġover Ġthere Ċ Ġ* Ċ Ġ* Ġhttps :// developer . android . com / topic / libraries / data - binding / expressions # kotlin Ċ Ġ*/ Ċ class ĠMovie Detail Activity Ġ: ĠBase Activity () Ġ{ ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġinternal Ġlateinit Ġvar Ġandroid Injector : ĠDispatch ing Android Injector < Any > ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar ĠviewModel Factory : ĠCustom ViewModel Factory ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġpic asso : ĠPic asso ĊĊĠĠĠ Ġprivate Ġvar Ġmovie Id : ĠLong Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmovie DTO : ĠMovie DTO ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠActivity Movie Detail Binding ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmovie Detail ViewModel : ĠMovie Detail ViewModel ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠActivity Movie Detail Binding . inflate ( layout Inflater ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( binding . root ) ĊĠĠĠĠĠĠĠ Ġinitialize Variables () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinitialize Variables () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġset Ġup Ġaction Ġbar ĊĠĠĠĠĠĠĠ Ġset Support ActionBar ( binding . toolbar ) ĊĠĠĠĠĠĠĠ Ġsupport ActionBar ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . set Display Home As Up Enabled ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . set Display Show Home Enabled ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġget Ġthe Ġview Ġmodel ĊĠĠĠĠĠĠĠ Ġmovie Detail ViewModel Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠViewModel Providers . of ( this @ Movie Detail Activity , ĠviewModel Factory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get ( Movie Detail ViewModel :: class . java ) ĊĠĠĠĠĠĠĠ Ġset Observer s ( movie Detail ViewModel ) ĊĠĠĠĠĠĠĠ Ġget Movie Id () ĊĊĠĠĠĠĠĠĠ Ġ// Ġget Ġthe Ġmovie Ġdetails ĊĠĠĠĠĠĠĠ Ġmovie Detail ViewModel . get Movie Detail ( movie Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Movie Id () Ġ{ ĊĠĠĠĠĠĠĠ Ġmovie Id Ġ= Ġintent . extras !!. getLong ( INT ENT _ KEY _ MOV IE _ ID ); ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġsetting Ġthe Ġob servers ĊĠĠĠ Ġprivate Ġfun Ġset Observer s ( viewModel : ĠMovie Detail ViewModel ) Ġ{ ĊĠĠĠĠĠĠĠ Ġobserve LiveData ( viewModel . get Movie Detail LiveData ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Received Ġthe Ġmovie Ġdetail Ġdata , Ġ$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmovie DTO Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate UI () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġobserve LiveData ( viewModel . getError LiveData ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Error Ġfor Ġthe Ġmovie Ġdetail Ġdata Ġ${ it . message }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġon Ġerror Ġreceived ĊĠĠĠ Ġprivate Ġfun ĠonError ( dto : ĠError DTO ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" onError : Ġ$ dto ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġupdate ĠUI ĊĠĠĠ Ġprivate Ġfun Ġupdate UI () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġdata Ġbinding ĊĠĠĠĠĠĠĠ Ġbinding . movie Detail DTO Ġ= Ġmovie DTO ĊĠĠĠĠĠĠĠ Ġ// Ġit Ġspeed s Ġup Ġthe Ġbinding Ġwhich Ġare Ġpending ĊĠĠĠĠĠĠĠ Ġ// binding . execute Pending Bindings () ĊĊĠĠĠĠĠĠĠ Ġ// Ġview Ġbinding ĊĠĠĠĠĠĠĠ Ġwith ( movie DTO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . coll ap sing Toolbar . title Ġ= Ġtitle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpic asso . load ( IMAGE _ BASE _ URL _ 5 0 0 Ġ+ Ġback drop Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. placeholder ( R . drawable . ic _ video _ camera ). into ( binding . poster IV ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( item . itemId Ġ== Ġandroid . R . id . home ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Back Pressed () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠ Ġ} Ċ }