package Ġcom . example . my movie . activity Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . Menu Ċ import Ġandroid . view . MenuItem Ċ import Ġandroidx . activity . view Models Ċ import Ġandroidx . appcompat . app . ActionBar Drawer Toggle Ċ import Ġandroidx . appcompat . app . AlertDialog Ċ import Ġandroidx . core . view . Gravity Compat Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġcom . bump tech . glide . G lide Ċ import Ġcom . example . my movie . R Ċ import Ġcom . example . my movie . adapters . Now Playing Adapter Ċ import Ġcom . example . my movie . adapters . Pop ular Movie Adapter Ċ import Ġcom . example . my movie . api . vo . Now Playing VO Ċ import Ġcom . example . my movie . api . vo . Pop ular Movie VO Ċ import Ġcom . example . my movie . databinding . Activity Main Binding Ċ import Ġcom . example . my movie . databinding . Nav Header Binding Ċ import Ġcom . example . my movie . deleg ates . Movie Item Delegate Ċ import Ġcom . example . my movie . local . Database Provider Ċ import Ġcom . example . my movie . viewModel . Movie ViewModel Ċ import Ġcom . google . android . gms . auth . api . signin . Google SignIn Ċ import Ġcom . google . android . material . navigation . Navigation View Ċ import Ġcom . google . firebase . auth . Firebase Auth Ċ import Ġcom . google . firebase . auth . k tx . auth Ċ import Ġcom . google . firebase . k tx . Firebase Ċ import Ġorg . imag in ativ ew orld . wh yn ot image carousel . Carousel Item Ċ import Ġjava . net . URI . create Ċ Ċ class ĠMainActivity Ġ: ĠBase Activity (), ĠMovie Item Delegate Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠActivity Main Binding ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġpopular Adapter : ĠPop ular Movie Adapter ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġnow Playing Adapter : ĠNow Playing Adapter ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġauth : ĠFirebase Auth ĊĊĠĠĠ Ġprivate Ġval Ġm ViewModel : ĠMovie ViewModel Ġby Ġview Models () ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġintent ( context : ĠContext ): ĠIntent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIntent ( context , ĠMainActivity :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠActivity Main Binding . inflate ( layout Inflater ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( binding . root ) ĊĊĠĠĠĠĠĠĠ Ġsupport ActionBar ?. set Display Show Title Enabled ( true ); ĊĠĠĠĠĠĠĠ Ġsupport ActionBar ?. set Display Home As Up Enabled ( true ) ĊĠĠĠĠĠĠĠ Ġauth Ġ= ĠFirebase . auth Ċ Ċ // if Ġnot ĠCurrent User Ġchange Ġto ĠLogin ĊĠĠĠĠĠĠĠ Ġif Ġ( auth . currentUser Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Login Activity () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . apply Ġ{ Ċ Ċ // navigation Ġbar Ġset Ġup ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoggle Ġ= ĠAction Bar Drawer Toggle ( this @ MainActivity , Ġdrawer Layout , Ġtoolbar , Ġ 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdrawer Layout . add Drawer Listener ( toggle ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle . sync State () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnav Ġ= ĠNavigation View . On Navigation ItemSelected Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . nav _ bookmark Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnav Bookmark () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ On Navigation ItemSelected Listener Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . nav _ logout Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccount Logout () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav View . set Navigation ItemSelected Listener ( nav ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheader View Ġ= Ġnav View . getHeader View ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheader View Binding Ġ= ĠNav Header Binding . bind ( header View ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaccount Ġ= ĠGoogle SignIn . getLast Signed In Account ( this @ MainActivity ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( account != null ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheader View Binding . tv UserName . text Ġ= Ġaccount . displayName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheader View Binding . tv User Mail . text Ġ= Ġaccount . email ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG lide . with ( this @ MainActivity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. load ( account . photoUrl ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. into ( header View Binding . iv User ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheader View Binding . tv UserName . text Ġ= Ġauth . currentUser ?. displayName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheader View Binding . tv User Mail . text Ġ= Ġauth . currentUser ?. email ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm ViewModel . get Movie () Ċ // Pop ular ĠViewModel Ġobserve ĊĠĠĠĠĠĠĠ Ġm ViewModel . popular VM . observe ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpopular Adapter ( it . popular Movie VO Ġas ĠMutable List < Pop ular Movie VO >) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . apply Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġmutable ListOf < Carousel Item >() Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCar ousel Item ( Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠimageUrl Ġ=" https :// image . t mdb . org / t / p / original "+ it . popular Movie VO [ 0 ]. backdrop _ path , Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcaption Ġ= Ġ"" Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtop 5 Movie Ġ= Ġit . popular Movie VO . slice ( 0 .. 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġitem : ĠMutable List < Carousel Item > Ġ= Ġmutable ListOf () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġtop 5 Movie . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCar ousel Item ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠimageUrl Ġ= Ġ" https :// image . t mdb . org / t / p / original " Ġ+ Ġit . popular Movie VO [ i ]. backdrop _ path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcaption Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Carousel . addData ( item ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} Ċ // Now Playing ĠViewModel Ġobserve ĊĠĠĠĠĠĠĠ Ġm ViewModel . now Playing VM . observe ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnow Playing Adapter ( it . now Playing VO Ġas ĠMutable List < Now Playing VO >) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ // Account ĠLog Ġout ĊĠĠĠ Ġprivate Ġfun Ġaccount Logout (){ ĊĠĠĠ Ġval Ġdialog Ġ= ĠAlertDialog . Builder ( this @ MainActivity ) ĊĠĠĠĠĠĠĠ Ġ. setTitle (" Logout ") ĊĠĠĠĠĠĠĠ Ġ. setMessage (" Are Ġyou Ġsure Ġto ĠLog Ġout ") ĊĠĠĠĠĠĠĠ Ġ. set Negative Button (" No ") Ġ{ Ġdialog , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . cancel () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. set Positive Button (" Yes ") Ġ{ Ġdialog , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogout () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish Affinity () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . dismiss () ĊĠĠĠĠĠĠĠ Ġ}. create () ĊĠĠĠ Ġdialog . show () ĊĠĠĠ Ġ} Ċ Ċ // Now Playing ĠAdapter ĊĠĠĠ Ġprivate Ġfun Ġnow Playing Adapter ( it : ĠMutable List < Now Playing VO >) Ġ{ ĊĠĠĠĠĠĠĠ Ġnow Playing Adapter Ġ= ĠNow Playing Adapter ( this , Ġit ) ĊĊĠĠĠĠĠĠĠ Ġbinding . rv Now Playing . layout Manager Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinearLayoutManager ( this @ MainActivity , ĠLinearLayoutManager . HORIZONTAL , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġbinding . rv Now Playing . adapter Ġ= Ġnow Playing Adapter ĊĠĠĠ Ġ} Ċ Ċ // Pop ular ĠAdapter ĊĠĠĠ Ġprivate Ġfun Ġpopular Adapter ( it : ĠMutable List < Pop ular Movie VO >) Ġ{ ĊĠĠĠĠĠĠĠ Ġpopular Adapter Ġ= ĠPop ular Movie Adapter ( this , Ġit ) ĊĊĠĠĠĠĠĠĠ Ġbinding . rv Pop ular Movie . layout Manager Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinearLayoutManager ( this @ MainActivity , ĠLinearLayoutManager . HORIZONTAL , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġbinding . rv Pop ular Movie . adapter Ġ= Ġpopular Adapter ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠInf late Ġthe Ġmenu ; Ġthis Ġadds Ġitems Ġto Ġthe Ġaction Ġbar Ġif Ġit Ġis Ġpresent . ĊĠĠĠĠĠĠĠ Ġmenu Inflater . inflate ( R . menu . menu _ main , Ġmenu ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonTap Pop ular Item ( popular Movie VO : ĠPop ular Movie VO ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠMovie Detail Activity 2 . intent ( application Context ) ĊĠĠĠĠĠĠĠ Ġintent . putExtra (" popular Movie ", Ġpopular Movie VO ) ĊĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonTap Now Playing Item ( now Playing VO : ĠNow Playing VO ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠMovie Detail Activity 2 . intent ( application Context ) ĊĠĠĠĠĠĠĠ Ġintent . putExtra (" now Playing ", Ġnow Playing VO ) ĊĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Back Pressed () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( binding . drawer Layout . is Drawer Open ( Gravity Compat . START )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . drawer Layout . close Drawer ( Gravity Compat . START ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Back Pressed () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊ Ċ } ĊĊ