/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠThe ĠL ittle ĠD rops Ġof ĠR ain ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠMIT ĠLicense Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// opensource . org / licenses / MIT Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . presentation Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . app . job . Job Info Ċ import Ġandroid . app . job . Job Scheduler Ċ import Ġandroid . content .* Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . KeyEvent Ċ import Ġandroid . view . Menu Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . activity . result . Activity Result Callback Ċ import Ġandroidx . appcompat . app . ActionBar Drawer Toggle Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . appcompat . widget . Toolbar Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . drawer layout . widget . Drawer Layout Ċ import Ġandroidx . drawer layout . widget . Drawer Layout . Drawer Listener Ċ import Ġandroidx . navigation . Nav Controller Ċ import Ġandroidx . navigation . find Nav Controller Ċ import Ġandroidx . navigation . fragment . Nav Host Fragment Ċ import Ġandroidx . navigation . ui . AppBar Configuration Ċ import Ġandroidx . navigation . ui . navigate Up Ċ import Ġandroidx . navigation . ui . setup ActionBar With Nav Controller Ċ import Ġandroidx . navigation . ui . setup With Nav Controller Ċ import Ġandroidx . preference . Preference Manager Ċ import Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . Nav Main Directions Ċ import Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . R Ċ import Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . data . dao . User Dao Ċ import Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . data . entities . User Ċ import Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . data . interfaces . On User Found Listener Ċ import Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . databinding . Activity Main Binding Ċ import Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . databinding . Nav Header Main Binding Ċ import Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . domain . helpers . Helper Ċ import Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . domain . helpers . Logged User Ċ import Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . domain . helpers . MainActivity Holder Ċ import Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . domain . preferences . My On Shared Preference ChangeListener Ċ import Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . domain . services . New Messages Service Ċ import Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . domain . services . Setup Products Update Worker Service Ċ import Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . presentation . contracts . Email Link Auth Activity Result Contract Ċ import Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . presentation . helper . Intent Helper Ċ import Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . presentation . interfaces . On Key Long Press Listener Ċ import Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . presentation . ui . MainActivity ViewModel Ċ import Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . presentation . ui . MainActivity ViewState Ċ import Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . presentation . ui . Settings Fragment Ċ import Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . presentation . ui . send _ message . SendMessage Fragment Ċ import Ġco il . load Ċ import Ġcom . firebase . ui . auth . Auth UI Ċ import Ġcom . google . android . gms . oss . licenses . O ss License s Menu Activity Ċ import Ġcom . google . android . material . bottomnavigation . Bottom Navigation View Ċ import Ġcom . google . android . material . floating action button . Floating ActionButton Ċ import Ġcom . google . android . material . navigation . Navigation View Ċ import Ġcom . google . firebase . Timestamp Ċ import Ġcom . google . firebase . auth . Firebase Auth Ċ import Ġcom . google . firebase . messaging . Firebase Messaging Ċ import Ġcom . jo anz ap ata . icon ify . Icon Drawable Ċ import Ġcom . jo anz ap ata . icon ify . fonts . Simple Line Icons Icons Ċ import Ġcom . jo anz ap ata . icon ify . fonts . Typ icons Icons Ċ import Ġorg . k oin . android x . view model . ext . android . state ViewModel Ċ Ċ // Ġ@ Android EntryPoint Ċ class ĠMainActivity Ġ: ĊĠĠĠ ĠAppCompatActivity (), ĊĠĠĠ ĠOn User Found Listener , ĊĠĠĠ ĠComponent Callbacks 2 , ĊĠĠĠ ĠActivity Result Callback < Int > Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġapp Bar Configuration : ĠApp Bar Configuration ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠMainActivity :: class . simple Name ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠMainActivity Holder . main Activity Class Ġ= ĠMainActivity :: class ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠviewModel : ĠMainActivity ViewModel Ġby Ġstate ViewModel () ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġfab : ĠFloating ActionButton ĊĠĠĠ Ġprivate Ġvar Ġbinding : ĠActivity Main Binding ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġbinding Nav Header : ĠNav Header Main Binding ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtoggle : ĠAction Bar Drawer Toggle ĊĠĠĠ Ġprivate Ġvar Ġauthenticate On Resume Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġis SetUp User In Drawer Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġlast Intent : ĠIntent ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġm On Key Long Press Listener : ĠOn Key Long Press Listener ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠActivity Main Binding . inflate ( layout Inflater ) ĊĠĠĠĠĠĠĠ Ġval Ġheader View Ġ= Ġbinding ?. nav View ?. getHeader View ( 0 ) ĊĠĠĠĠĠĠĠ Ġbinding Nav Header Ġ= ĠNav Header Main Binding . bind ( header View !! ) ĊĠĠĠĠĠĠĠ ĠviewModel . view State LiveData . observe ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate UI ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠInitialize Ġthe Ġsingleton Ġclass ĊĠĠĠĠĠĠĠ ĠLog ged User . user LiveData . value Ġ= Ġnull ĊĠĠĠĠĠĠĠ ĠsetContentView ( binding ?. root ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtoolbar : ĠToolbar Ġ= ĠfindViewById ( R . id . toolbar ) ĊĠĠĠĠĠĠĠ Ġset Support ActionBar ( toolbar ) ĊĠĠĠĠĠĠĠ Ġsupport ActionBar ?. set Display Home As Up Enabled ( true ) ĊĊĠĠĠĠĠĠĠ Ġfab Ġ= ĠfindViewById ( R . id . fab ) ĊĠĠĠĠĠĠĠ Ġfab . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġfab . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbundle Ġ= ĠBundle () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbundle . putString ( SendMessage Fragment . ACTION _ SEND _ KEY , ĠSend Message Fragment . ACTION _ SEND ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfind Nav Controller ( R . id . nav _ host _ fragment ). navigate ( R . id . send _ message _ fragment , Ġbundle ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġdrawer Layout : ĠDraw er Layout Ġ= ĠfindViewById ( R . id . drawer _ layout ) ĊĠĠĠĠĠĠĠ Ġtoggle Ġ= ĠAction Bar Drawer Toggle ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdrawer Layout , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoolbar , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . navigation _ drawer _ open , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . navigation _ drawer _ close ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġdrawer Layout . add Drawer Listener ( toggle ) ĊĊĠĠĠĠĠĠĠ Ġtoggle . sync State () ĊĠĠĠĠĠĠĠ Ġdrawer Layout . add Drawer Listener ( object Ġ: ĠDraw er Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Drawer StateChanged ( newState : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLog . i ( TAG , Ġ" on Drawer StateChanged : Ġ$ newState ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Drawer Slide ( drawer View : ĠView , Ġslide Offset : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" on Drawer Slide ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Drawer Closed ( drawer View : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" on Drawer Closed ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Drawer Opened ( drawer View : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! isSet Up User In Drawer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Setting Ġup Ġuser Ġin Ġdrawer ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetUp User In Drawer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis SetUp User In Drawer Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" on Drawer Opened ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġval Ġnav Host Fragment Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsupport FragmentManager . find Fragment ById ( R . id . nav _ host _ fragment ) Ġas ĠNav Host Fragment ĊĠĠĠĠĠĠĠ Ġval Ġnav Controller : ĠNav Controller Ġ= Ġnav Host Fragment . nav Controller ĊĊĠĠĠĠĠĠĠ Ġ// ĠPass ing Ġeach Ġmenu ĠID Ġas Ġa Ġset Ġof ĠI ds Ġbecause Ġeach ĊĠĠĠĠĠĠĠ Ġ// Ġmenu Ġshould Ġbe Ġconsidered Ġas Ġtop Ġlevel Ġdest inations . ĊĠĠĠĠĠĠĠ Ġapp Bar Configuration Ġ= ĠApp Bar Configuration ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . nav _ home , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . nav _ facebook , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . nav _ instagram , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . nav _ messages , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . nav _ all _ messages ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdrawer Layout ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġsetup ActionBar With Nav Controller ( nav Controller , Ġapp Bar Configuration ) ĊĠĠĠĠĠĠĠ Ġbinding ?. nav View ?. setup With Nav Controller ( nav Controller ) ĊĠĠĠĠĠĠĠ Ġval Ġb nv Ġ= ĠfindViewById < Bottom Navigation View >( R . id . nav _ bottom ) ĊĠĠĠĠĠĠĠ Ġval Ġmenu Ġ= Ġb nv . menu ĊĠĠĠĠĠĠĠ Ġmenu . find Item ( R . id . nav _ all _ messages ). icon Ġ= ĠIcon Drawable ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSimple Line Icons Icons . icon _ envelope _ letter ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġmenu . find Item ( R . id . nav _ reload _ products ). icon Ġ= ĠIcon Drawable ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSimple Line Icons Icons . icon _ loop ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġmenu . find Item ( R . id . nav _ send _ topic _ message ). icon Ġ= ĠIcon Drawable ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSimple Line Icons Icons . icon _ envelope ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġmenu . find Item ( R . id . nav _ users ). icon Ġ= ĠIcon Drawable ( this , ĠSimple Line Icons Icons . icon _ users ) ĊĠĠĠĠĠĠĠ Ġmenu . find Item ( R . id . nav _ off _ air ). icon Ġ= ĠIcon Drawable ( this , ĠSimple Line Icons Icons . icon _ w rench ) ĊĊĠĠĠĠĠĠĠ Ġb nv . setup With Nav Controller ( nav Controller ) ĊĠĠĠĠĠĠĠ Ġb nv . visibility Ġ= ĠView . GONE ĊĊĠĠĠĠĠĠĠ ĠLog ged User . user LiveData . observe ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPreference Manager . getDefault SharedPreferences ( this ). edit (). putString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSettings Fragment . LOG GED _ USER _ EMAIL _ KEY , Ġit . email ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). apply () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfab . isEnabled Ġ= Ġ( it Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis SetUp User In Drawer Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Drawer Menu Items () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠFirebase Auth . getInstance (). add Auth State Listener Ġ{ Ġauth Data Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirebase User Ġ= Ġauth Data . currentUser ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( firebase User Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġemail User Ġ= Ġfirebase User . email !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" email User : Ġ$ email User ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif (! email User . isNull OrEmpty () Ġ&& Ġemail User . contains ("@ ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUser Dao . findBy EM ail ( email User , Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġhandle Intent () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠsetUp User In Drawer () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( binding Nav Header Ġ== Ġnull Ġ&& Ġbinding Nav Header ?. nav Vw Name Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" binding Nav Header Ġis Ġnull ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" binding Nav Header Ġis ĠNOT Ġnull Ġ${ binding Nav Header ?. nav Vw Name ?. text }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( Logged User . user LiveData . value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Logged User . user LiveData . value !!. imageUrl Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Setting Ġup Ġuser Ġimage ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding Nav Header ?. nav Vw Image ?. load ( Logged User . user LiveData . value !!. imageUrl ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholder ( R . drawable . image _ placeholder ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContext Compat . get Drawable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . mip map . ic _ launcher _ round ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding Nav Header ?. nav Vw Image ?. setImage Drawable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContext Compat . get Drawable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . mip map . ic _ launcher _ round ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Setting Ġuser Ġname Ġand Ġemail ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdrawer Layout : ĠDraw er Layout Ġ= ĠfindViewById ( R . id . drawer _ layout ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding Nav Header ?. nav Vw Image ?. setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrawer Layout . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfind Nav Controller ( R . id . nav _ host _ fragment ). navigate ( MainActivity Directions . action Global UserProfile Fragment ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding Nav Header ?. nav Vw Name ?. text Ġ= ĠLog ged User . user LiveData . value !!. name ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Name : Ġ${ Logged User . user LiveData . value !!. name }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding Nav Header ?. nav Vw Email ?. text Ġ= ĠLog ged User . user LiveData . value !!. email ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" EM ail : Ġ${ Logged User . user LiveData . value !!. email }") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" No Ġuser Ġfound !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding Nav Header ?. nav Vw Image ?. setImage Drawable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContext Compat . get Drawable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . mip map . ic _ launcher _ round ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding Nav Header ?. nav Vw Name ?. text Ġ= ĠgetString ( R . string . not _ logged _ in ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding Nav Header ?. nav Vw Email ?. text Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRelease Ġmemory Ġwhen Ġthe ĠUI Ġbecomes Ġhidden Ġor Ġwhen Ġsystem Ġresources Ġbecome Ġlow . ĊĠĠĠĠ Ġ* Ġ@ param Ġlevel Ġthe Ġmemory - related Ġevent Ġthat Ġwas Ġraised . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Trim Memory ( level : ĠInt ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠDetermine Ġwhich Ġlifecycle Ġor Ġsystem Ġevent Ġwas Ġraised . ĊĠĠĠĠĠĠĠ Ġwhen Ġ( level ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠComponent Callbacks 2 . TRIM _ MEMORY _ UI _ HIDDEN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRelease Ġany ĠUI Ġobjects Ġthat Ġcurrently Ġhold Ġmemory . Ċ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThe Ġuser Ġinterface Ġhas Ġmoved Ġto Ġthe Ġbackground . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠComponent Callbacks 2 . TRIM _ MEMORY _ RUNNING _ MO DER ATE , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠComponent Callbacks 2 . TRIM _ MEMORY _ RUNNING _ LOW , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠComponent Callbacks 2 . TRIM _ MEMORY _ RUNNING _ CRITICAL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRelease Ġany Ġmemory Ġthat Ġyour Ġapp Ġdoesn 't Ġneed Ġto Ġrun . Ċ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThe Ġdevice Ġis Ġrunning Ġlow Ġon Ġmemory Ġwhile Ġthe Ġapp Ġis Ġrunning . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThe Ġevent Ġraised Ġindicates Ġthe Ġseverity Ġof Ġthe Ġmemory - related Ġevent . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIf Ġthe Ġevent Ġis ĠTR IM _ MEMORY _ RUNNING _ CRITICAL , Ġthen Ġthe Ġsystem Ġwill ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbegin Ġk illing Ġbackground Ġprocesses . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠComponent Callbacks 2 . TRIM _ MEMORY _ BACKGROUND , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠComponent Callbacks 2 . TRIM _ MEMORY _ MO DER ATE , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠComponent Callbacks 2 . TRIM _ MEMORY _ COMPLETE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRelease Ġas Ġmuch Ġmemory Ġas Ġthe Ġprocess Ġcan . Ċ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThe Ġapp Ġis Ġon Ġthe ĠL RU Ġlist Ġand Ġthe Ġsystem Ġis Ġrunning Ġlow Ġon Ġmemory . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThe Ġevent Ġraised Ġindicates Ġwhere Ġthe Ġapp Ġs its Ġwithin Ġthe ĠL RU Ġlist . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIf Ġthe Ġevent Ġis ĠTR IM _ MEMORY _ COMPLETE , Ġthe Ġprocess Ġwill Ġbe Ġone Ġof ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthe Ġfirst Ġto Ġbe Ġterminated . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRelease Ġany Ġnon - critical Ġdata Ġstructures . ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThe Ġapp Ġreceived Ġan Ġun recognized Ġmemory Ġlevel Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Ġthe Ġsystem . ĠT reat Ġthis Ġas Ġa Ġgeneric Ġlow - memory Ġmessage . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon New Intent ( intent : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on New Intent ( intent ) ĊĠĠĠĠĠĠĠ Ġhandle Intent ( intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Key Long Press ( keyCode : ĠInt , Ġevent : ĠKeyEvent ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġm On Key Long Press Listener ?. key Long Press ( keyCode , Ġevent ) ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Key Long Press ( keyCode , Ġevent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġif Ġ( authenticate On Resume ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauthenticate On Resume Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNavigate Ġto Ġthe Ġsign - in / authentication Ġfragment ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfind Nav Controller ( R . id . nav _ host _ fragment ). navigate ( MainActivity Directions . action Global Authentication Fragment ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġupdate UI ( viewModel . view State ) ĊĠĠĠĠĠĠĠ Ġhandle Intent () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this :: toggle . isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdrawer Layout : ĠDraw er Layout Ġ= ĠfindViewById ( R . id . drawer _ layout ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdrawer Layout . remove Drawer Listener ( toggle ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Main Ġactivity Ġdestroyed ") ĊĠĠĠĠĠĠĠ Ġbinding Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġbinding Nav Header Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Intent () Ġ{ ĊĠĠĠĠĠĠĠ Ġhandle Intent ( intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Intent ( intent : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( last Intent Ġ!= Ġintent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( intent Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( intent . extras Ġ!= Ġnull Ġ&& Ġintent . extras !!. containsKey ( Intent Helper . EXTRA _ START _ WH AT )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( intent . extras !!. get ( Intent Helper . EXTRA _ START _ WH AT )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" privacy " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfind Nav Controller ( R . id . nav _ host _ fragment ). navigate ( Nav Main Directions . action Global Privacy Fragment ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . remove Extra ( Intent Helper . EXTRA _ START _ WH AT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" tos " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfind Nav Controller ( R . id . nav _ host _ fragment ). navigate ( Nav Main Directions . action Global T os Fragment ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . remove Extra ( Intent Helper . EXTRA _ START _ WH AT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" licenses " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow License s () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Email Link Auth ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Intent Ġ= Ġintent ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrun Email Link Auth ( intent : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( intent Ġ!= Ġnull Ġ&& ĠAuth UI . can Handle Intent ( intent )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauthenticate On Resume Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( intent . extras Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregister For Activity Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEmail Link Auth Activity Result Contract (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). launch ( intent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate UI ( view State : ĠMainActivity ViewState ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġhe ĠUI ĊĠĠĠĠĠĠĠ Ġview State . text Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġis SetUp User In Drawer Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġsetup Drawer Menu Items () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ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 . main , Ġmenu ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Support Navigate Up (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Support Navigate Up () ĊĠĠĠĠĠĠĠ Ġval Ġnav Controller Ġ= Ġfind Nav Controller ( R . id . nav _ host _ fragment ) ĊĠĠĠĠĠĠĠ Ġreturn Ġnav Controller . navigate Up ( app Bar Configuration ) Ġ|| Ġsuper . on Support Navigate Up () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġret Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġwhen Ġ( item . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid . R . id . home Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Back Pressed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġret Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . action _ settings Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfind Nav Controller ( R . id . nav _ host _ fragment ). navigate ( Nav Main Directions . action Global Settings Fragment ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġret Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . action _ licenses Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow License s () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġret Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . action _ privacy Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfind Nav Controller ( R . id . nav _ host _ fragment ). navigate ( Nav Main Directions . action Global Privacy Fragment ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġret Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . action _ tos Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfind Nav Controller ( R . id . nav _ host _ fragment ). navigate ( Nav Main Directions . action Global T os Fragment ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġret Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġret ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Drawer Menu Items () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnav View Ġ= ĠfindViewById < Navigation View >( R . id . nav _ view ) ĊĠĠĠĠĠĠĠ Ġval Ġnav Home Ġ= Ġnav View . menu . find Item ( R . id . nav _ home ) ĊĠĠĠĠĠĠĠ Ġnav Home . icon Ġ= ĠIcon Drawable ( this , ĠSimple Line Icons Icons . icon _ home ) ĊĠĠĠĠĠĠĠ Ġval Ġnav Facebook Ġ= Ġnav View . menu . find Item ( R . id . nav _ facebook ) ĊĠĠĠĠĠĠĠ Ġnav Facebook . icon Ġ= ĠIcon Drawable ( this , ĠSimple Line Icons Icons . icon _ social _ facebook ) ĊĠĠĠĠĠĠĠ Ġval Ġnav Inst agram Ġ= Ġnav View . menu . find Item ( R . id . nav _ instagram ) ĊĠĠĠĠĠĠĠ Ġnav Inst agram . icon Ġ= ĠIcon Drawable ( this , ĠTyp icons Icons . ty pc n _ social _ instagram ) ĊĠĠĠĠĠĠĠ Ġval Ġnav Messages Ġ= Ġnav View . menu . find Item ( R . id . nav _ messages ) ĊĠĠĠĠĠĠĠ Ġnav Messages . icon Ġ= ĠIcon Drawable ( this , ĠSimple Line Icons Icons . icon _ envelope ) ĊĠĠĠĠĠĠĠ Ġval Ġnav Admin Ġ= Ġnav View . menu . find Item ( R . id . nav _ all _ messages ) ĊĠĠĠĠĠĠĠ Ġnav Admin . icon Ġ= ĠIcon Drawable ( this , ĠSimple Line Icons Icons . icon _ w rench ) ĊĠĠĠĠĠĠĠ Ġval Ġnav Authentication Ġ= Ġnav View . menu . find Item ( R . id . nav _ authentication ) ĊĠĠĠĠĠĠĠ Ġval Ġnav My Lik ed Products Ġ= Ġnav View . menu . find Item ( R . id . nav _ my _ lik ed _ products ) ĊĠĠĠĠĠĠĠ Ġnav My Lik ed Products . icon Ġ= ĠIcon Drawable ( this , ĠSimple Line Icons Icons . icon _ heart ) ĊĠĠĠĠĠĠĠ Ġval Ġnav All Products Products Ġ= Ġnav View . menu . find Item ( R . id . nav _ all _ products ) ĊĠĠĠĠĠĠĠ Ġnav All Products Products . icon Ġ= ĠIcon Drawable ( this , ĠSimple Line Icons Icons . icon _ present ) ĊĠĠĠĠĠĠĠ Ġif Ġ( Logged User . user LiveData . value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav Authentication . icon Ġ= ĠIcon Drawable ( this , ĠSimple Line Icons Icons . icon _ logout ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav Authentication . title Ġ= ĠgetString ( R . string . logout ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav Authentication . icon Ġ= ĠIcon Drawable ( this , ĠSimple Line Icons Icons . icon _ login ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav Authentication . title Ġ= ĠgetString ( R . string . login ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( false Ġ&& ĠLog ged User . user LiveData . value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav Messages . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav Messages . isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav My Lik ed Products . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav My Lik ed Products . isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav Messages . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav Messages . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( false Ġ&& ĠLog ged User . user LiveData . value Ġ!= Ġnull Ġ&& ĠLog ged User . user LiveData . value !!. isAdmin ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubscribe To Admin Messages () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav Admin . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav Admin . isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav All Products Products . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav All Products Products . isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav Admin . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav Admin . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav All Products Products . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav All Products Products . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠTODO ĠRemove Ġafter Ġreturning Ġmenu Ġoptions ĊĠĠĠĠĠĠĠ Ġif Ġ( Logged User . user LiveData . value Ġ!= Ġnull Ġ&& ĠLog ged User . user LiveData . value !!. isAdmin ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubscribe To Admin Messages () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav Admin . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav Admin . isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav My Lik ed Products . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav My Lik ed Products . isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav All Products Products . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav All Products Products . isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav Admin . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav Admin . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav My Lik ed Products . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav My Lik ed Products . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav All Products Products . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav All Products Products . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġnav My Lik ed Products . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġnav My Lik ed Products . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġnav All Products Products . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġnav All Products Products . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġnav Home . isChecked Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsubscribe To Admin Messages () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsp : ĠSharedPreferences Ġ= ĠPreference Manager . getDefault SharedPreferences ( this ) ĊĠĠĠĠĠĠĠ Ġif Ġ( sp . getBoolean ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMy On Shared Preference ChangeListener . SP _ KEY _ SUB SCR IBE _ ADMIN _ MESSAGES , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtopic Ġ= ĠHelper . get Topic Admin Messages ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFirebase Messaging . getInstance (). subscribe To Topic ( topic ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Complete Listener Ġ{ Ġtask Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmsg Ġ= ĠgetString ( R . string . msg _ subscribed _ to _ admins ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! task . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmsg Ġ= ĠgetString ( R . string . msg _ subscribe _ admins _ failed ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġmsg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( base Context , Ġmsg , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Not Ġregistered Ġto Ġreceive Ġprom os ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon User Found ( user : ĠUser ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" User Ġfound : Ġ$ user ") ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Firebase Auth . getInstance (). currentUser !!. provider Data . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser . provider Id Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFirebase Auth . getInstance (). currentUser !!. provider Data [ 1 ]. provider Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser . last Seen Ġ= ĠTimestamp . now () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUser Dao . insert OrUpdate ( user ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( user . isAdmin ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHelper . request Read External Storage Permission ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjob Scheduler Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget System Service ( Context . JOB _ SCHEDUL ER _ SERVICE ) Ġas ĠJob Scheduler ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjob Info Products Worker Ġ= ĠJob Info . Builder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSetup Products Update Worker Service . JOB _ ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠComponent Name ( this , ĠSetup Products Update Worker Service :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjob Info New Messages Ġ= ĠJob Info . Builder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNew Messages Service . JOB _ ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠComponent Name ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNew Messages Service :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġjob Ġ= Ġjob Info Products Worker . set Requires Ch arging ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMinimum Latency ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Required Network Type ( Job Info . NETWORK _ TYPE _ UN METER ED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ. set Periodic ( 8 6 4 0 0 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Override Deadline (( 3 Ġ* Ġ 6 0 Ġ* Ġ 1 0 0 0 ). to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjob Scheduler . schedule ( job ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjob Ġ= Ġjob Info New Messages . set Requires Ch arging ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ. setMinimum Latency ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Required Network Type ( Job Info . NETWORK _ TYPE _ ANY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Periodic ( 3 0 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ. set Override Deadline ( 3 Ġ* Ġ 6 0 Ġ* Ġ 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjob Scheduler . schedule ( job ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHelper . request Get Co arse Location Permission ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog ged User . user LiveData . value Ġ= Ġuser ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . user _ logged _ as , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog ged User . user LiveData . value !!. name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ LONG ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFirebase Auth . getInstance (). currentUser Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser From Fb Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHelper . firebase User To User ( Firebase Auth . getInstance (). currentUser !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUser Dao . insert OrUpdate ( user From Fb ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog ged User . user LiveData . value Ġ= Ġuser From Fb ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfind Nav Controller ( R . id . nav _ host _ fragment ). navigate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMainActivity Directions . action Global UserProfile Fragment () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . user _ logged _ as , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog ged User . user LiveData . value !!. name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ LONG ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthenticate On Resume Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis SetUp User In Drawer Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġsetup Drawer Menu Items () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( result : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( result Ġ== ĠActivity . RESULT _ OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSuccessfully Ġsigned Ġin ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġval Ġuser Ġ= ĠFirebase Auth . getInstance (). currentUser ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ... ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Error Ġsigning Ġin ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSign Ġin Ġfailed . ĠIf Ġresponse Ġis Ġnull Ġthe Ġuser Ġcanceled Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsign - in Ġflow Ġusing Ġthe Ġback Ġbutton . ĠOtherwise Ġcheck ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġresponse . getError (). get ErrorCode () Ġand Ġhandle Ġthe Ġerror . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ... ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow License s () Ġ{ ĊĠĠĠĠĠĠĠ ĠO ss License s Menu Activity . set Activity Title ( getString ( R . string . licenses )) ĊĠĠĠĠĠĠĠ ĠstartActivity ( Intent ( this , ĠO ss License s Menu Activity :: class . java )) ĊĠĠĠ Ġ} Ċ } Ċ