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 Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . work .* Ċ import Ġcom . wm w . movie viewer . App Ċ import Ġcom . wm w . movie viewer . R Ċ import Ġcom . wm w . movie viewer . model . Movie Ċ import Ġcom . wm w . movie viewer . worker . Synchronize Movie Database Worker Ċ import Ġkotlinx . android . synt hetic . main . activity _ main .* Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . serialization . Un stable Default Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ @ Un stable Default Ċ fun Ġstart MainActivity ( from : ĠContext ) Ġ= Ġfrom . startActivity ( Intent ( from , ĠMainActivity :: class . java )) Ċ Ċ @ Un stable Default Ċ class ĠMainActivity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĊĠĠĠ Ġprivate Ġval ĠviewModel Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠViewModel Provider ( this , ĠApp . movie ViewModel Factory ). get ( Movie ViewModel :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ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 () ĊĠĠĠĠĠĠĠ Ġstart Periodic Job () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Periodic Job () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconstraints Ġ= Ġset Constraints () ĊĠĠĠĠĠĠĠ Ġval Ġworker Ġ= Ġbuild Worker ( constraints ) ĊĊĠĠĠĠĠĠĠ Ġval Ġwork Manager Ġ= ĠWork Manager . getInstance ( this ) ĊĠĠĠĠĠĠĠ Ġwork Manager . enqueue ( worker ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Worker ( constraints : ĠConstraints ): ĠPeriod ic Work Request Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠPeriod ic Work RequestBuilder < Synchronize Movie Database Worker >( 1 , ĠTimeUnit . HOUR S ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Constraints ( constraints ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Constraints (): ĠConstraints Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠConstraints . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Required Network Type ( Network Type . NOT _ RO AM ING ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Requires Battery Not Low ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Requires Storage Not Low ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinflater : ĠMenu Inflater Ġ= Ġmenu Inflater ĊĠĠĠĠĠĠĠ Ġinflater . inflate ( R . menu . menu , Ġmenu ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Un stable Default ĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( item . itemId Ġ== ĠR . id . logout MenuItem ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . log Out () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnavigate To Login () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Un stable Default ĊĠĠĠ Ġ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 (). observe ( this , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmovie Adapter . set Movies ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmovie Item Clicked ( movie : ĠMovie ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstart Detail Activity ( this , Ġmovie ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Un stable Default ĊĠĠĠ Ġ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 () ĊĠĠĠ Ġ} Ċ }