package Ġcom . example . movie app . ui Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . databinding . Data Binding Component Ċ import Ġandroidx . databinding . Data Binding Util Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġandroidx . lifecycle . ViewModel Providers Ċ import Ġcom . example . movie app . R Ċ import Ġcom . example . movie app . binding . Fragment Data Binding Component Ċ import Ġcom . example . movie app . databinding . Movie Detail Fragment Binding Ċ import Ġcom . example . movie app . di . Injectable Ċ import Ġcom . example . movie app . observer . Movie Detail ViewModel Ċ import Ġcom . example . movie app . util . App Executors Ċ import Ġcom . example . movie app . util . Converter Util Ċ import Ġcom . example . movie app . util . Resource Ċ import Ġcom . example . movie app . util . Status Ċ import Ġjavax . inject . Inject Ċ Ċ class ĠMovie Detail Fragment Ġ: ĠFragment (), ĠInjectable Ġ{ ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar ĠviewModel Factory : ĠViewModel Provider . Factory ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠviewModel : ĠMovie Detail ViewModel ĊĊĠĠĠ Ġprivate Ġvar Ġdata Binding Component : ĠData Binding Component Ġ= ĠFragment Data Binding Component ( this ) ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠMovie Detail Fragment Binding ĊĊĠĠĠ Ġoverride Ġfun Ġon Save InstanceState ( out State : ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Save InstanceState ( out State ) ĊĠĠĠĠĠĠĠ Ġout State . put Int ( MOV IE _ ID , Ġmovie Id ) ĊĠĠĠĠĠĠĠ Ġout State . putString ( MOV IE _ TITLE , Ġmovie Title ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġset Has Options Menu ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ ĠData Binding Util . inflate < Movie Detail Fragment Binding >( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinflater , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . layout . movie _ detail _ fragment , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Binding Component ĊĠĠĠĠĠĠĠ Ġ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . converter Ġ= ĠConverter Util () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . lifecycle Owner Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġ}. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . root ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Created ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Created ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġmovie Id Ġ= ĠsavedInstanceState ?. getInt ( MOV IE _ ID ) Ġ?: ĠMovie Detail Fragment Args . from Bundle ( arguments ). id ĊĠĠĠĠĠĠĠ Ġmovie Title Ġ= ĠsavedInstanceState ?. getString ( MOV IE _ TITLE ) Ġ?: ĠMovie Detail Fragment Args . from Bundle ( arguments ). title ĊĊĠĠĠĠĠĠĠ ĠviewModel Ġ= ĠViewModel Providers . of ( this , ĠviewModel Factory ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get ( Movie Detail ViewModel :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . init ( ref ID Ġ= Ġmovie Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . result . observe ( this , ĠObserver Ġ{ Ġres Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . status Ġ= Ġres . status ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . item Ġ= Ġres ?. data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ActionBar () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( res . status Ġ== ĠStatus . SUCCESS Ġ&& Ġres ?. data Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . status Ġ= ĠStatus . ERROR ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( res ?. status Ġ== ĠStatus . ERROR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( require Context (), ĠgetString ( R . string . general Error ), ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset ActionBar () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaction Bar Ġ= Ġ( activity Ġas ĠMainActivity ). support ActionBar ĊĠĠĠĠĠĠĠ Ġaction Bar ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . title Ġ= Ġmovie Title Ġ?: ĠgetString ( R . string . details ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . set Display Home As Up Enabled ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . set Display Show Home Enabled ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( item . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid . R . id . home Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Activity (). on Back Pressed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġmovie Id : ĠInt Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġvar Ġmovie Title : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMOV IE _ ID Ġ= Ġ" movie _ id " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMOV IE _ TITLE Ġ= Ġ" movie _ title " ĊĠĠĠ Ġ} Ċ } Ċ