package Ġcom . wm w . movie viewer . ui Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . Menu Ċ import Ġandroid . view . Menu Inflater Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . view . View Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . core . app . Activity Options Compat Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġcom . wm w . movie viewer . R Ċ import Ġcom . wm w . movie viewer . model . Movie Ċ import Ġkotlinx . android . synt hetic . main . activity _ main .* Ċ import Ġkotlinx . android . synt hetic . main . movie _ list _ view _ holder .* Ċ import Ġkotlinx . coroutines . launch Ċ import Ġorg . k oin . android . ext . android . inject Ċ import Ġandroidx . core . util . Pair Ċ Ċ fun Ġstart MainActivity ( from : ĠContext ) Ġ= Ġfrom . startActivity ( Intent ( from , ĠMovie Activity :: class . java )) Ċ Ċ class ĠMovie Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĠĠĠ Ġprivate Ġval ĠviewModel Ġby Ġinject < Movie ViewModel >() ĊĠĠĠ Ġprivate Ġval Ġmovie Adapter Ġby Ġlazy Ġ{ ĠMovie Adapter (:: movie Item Clicked , Ġ:: movie Item Long Clicked ) Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĊĠĠĠĠĠĠĠ Ġinit Movies () ĊĠĠĠĠĠĠĠ ĠviewModel . fetch Movies () ĊĠĠĠĠĠĠĠ ĠviewModel . setup Sync () ĊĠĠĠĠĠĠĠ Ġobserve Changes () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġobserve Changes () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . get Movies (). observe ( this , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmovie Adapter . set Movies ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinflater : ĠMenu Inflater Ġ= Ġmenu Inflater ĊĠĠĠĠĠĠĠ Ġinflater . inflate ( R . menu . menu , Ġmenu ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( item . itemId Ġ== ĠR . id . logout MenuItem ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . log Out () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnavigate To Login () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Movies () Ġ{ ĊĠĠĠĠĠĠĠ Ġmovies RecyclerView . layout Manager Ġ= ĠLinearLayoutManager ( this ) ĊĠĠĠĠĠĠĠ Ġmovies RecyclerView . adapter Ġ= Ġmovie Adapter ĊĠĠĠĠĠĠĠ Ġmovies RecyclerView . add On Scroll Listener ( Lazy Loading Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . fetch Movies () ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ ĠviewModel . get Movies () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmovie Item Clicked ( movie : ĠMovie ) Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġstart Detail Activity ( this , Ġmovie . id ) ĊĠĠĠĠĠĠĠ Ġval Ġdetails Intent Ġ= ĠIntent ( this , ĠMovie Detail Activity :: class . java ) ĊĠĠĠĠĠĠĠ Ġdetails Intent . putExtra ( getString ( R . string . bundle _ extra _ item ), Ġmovie . id ) ĊĠĠĠĠĠĠĠ Ġval Ġactivity Options Ġ= ĠActivity Options Compat . make Scene Transition Animation ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair . create < View , ĠString >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠimageView , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . transition _ image )), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair . create < View , ĠString >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmovie TextView , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . transition _ title ))) ĊĠĠĠĠĠĠĠ ĠstartActivity ( details Intent , Ġactivity Options . to Bundle ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmovie Item Long Clicked ( movie : ĠMovie ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġlifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . delete Movie ( movie ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnavigate To Login () Ġ{ ĊĠĠĠĠĠĠĠ Ġstart Login Activity ( this ) ĊĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠ Ġ} Ċ }