package Ġcom . y uch en . how yo Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . content .* Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . location . Location Ċ import Ġandroid . location . Location Manager Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . IB inder Ċ import Ġandroid . provider . Settings Ċ import Ġandroid . util . Display Metrics Ċ import Ġandroid . view . Gravity Ċ import Ġandroidx . activity . view Models Ċ import Ġandroidx . appcompat . app . ActionBar Drawer Toggle Ċ import Ġandroidx . appcompat . app . AlertDialog Ċ import Ġandroidx . appcompat . widget . Toolbar Ċ import Ġandroidx . core . app . Activity Compat Ċ import Ġandroidx . databinding . Data Binding Util Ċ import Ġandroidx . local broadcast manager . content . Local Broadcast Manager Ċ import Ġandroidx . navigation . Nav Controller Ċ import Ġandroidx . navigation . Nav Destination Ċ import Ġandroidx . navigation . find Nav Controller Ċ import Ġandroidx . navigation . ui . AppBar Configuration Ċ import Ġcom . google . android . material . bottomnavigation . Bottom Navigation View Ċ import Ġcom . y uch en . how yo . databinding . Activity Main Binding Ċ import Ġcom . y uch en . how yo . ext . get Vm Factory Ċ import Ġcom . y uch en . how yo . service . User Loc ate Service Ċ import Ġcom . y uch en . how yo . signin . User Manager Ċ import Ġcom . y uch en . how yo . signin . User Manager . is LoggedIn Ċ import Ġcom . y uch en . how yo . util .* Ċ import Ġkotlinx . coroutines . launch Ċ Ċ class ĠMainActivity Ġ: ĠBase Activity () Ġ{ ĊĊĠĠĠ Ġval ĠviewModel Ġby Ġview Models < Main ViewModel > Ġ{ Ġget Vm Factory () Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠActivity Main Binding ĊĠĠĠ Ġprivate Ġvar Ġaction Bar Drawer Toggle : ĠAction Bar Drawer Toggle ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġapp Bar Configuration : ĠApp Bar Configuration ĊĠĠĠ Ġprivate Ġvar Ġlocation Permission Granted Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠmContext : ĠContext ĊĠĠĠ Ġprivate Ġvar Ġuser Loc ate Service Bound Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġuser Loc ate Service : ĠUser Loc ate Service ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġhow Yo Broadcast Receiver : ĠHow Yo Broadcast Receiver ĊĊĠĠĠ Ġprivate Ġval Ġuser Loc ate Service Connection Ġ= Ġobject Ġ: ĠService Connection Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Service Connected ( name : ĠComponent Name , Ġservice : ĠI Binder ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbinder Ġ= Ġservice Ġas ĠUser Loc ate Service . Local Binder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Loc ate Service Ġ= Ġbinder . service ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Loc ate Service Bound Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . setUser Loc ate Service Status ( user Loc ate Service Bound ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Service Disconnected ( name : ĠComponent Name ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Loc ate Service Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Loc ate Service Bound Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . setUser Loc ate Service Status ( user Loc ate Service Bound ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġon Navigation ItemSelected Listener Ġ= ĊĠĠĠĠĠĠĠ ĠBottom Navigation View . On Navigation ItemSelected Listener Ġ{ Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( item . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . navigation _ home Ġ-> Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfind Nav Controller ( R . id . my Nav Host Fragment ). navigate ( Navigation Directions . nav To Home Fragment ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ On Navigation ItemSelected Listener Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . navigation _ discover Ġ-> Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfind Nav Controller ( R . id . my Nav Host Fragment ). navigate ( Navigation Directions . nav To Discover Fragment ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ On Navigation ItemSelected Listener Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . navigation _ plan _ cover Ġ-> Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfind Nav Controller ( R . id . my Nav Host Fragment ). navigate ( Navigation Directions . nav To Plan Cover Dialog ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ On Navigation ItemSelected Listener Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . navigation _ star Ġ-> Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfind Nav Controller ( R . id . my Nav Host Fragment ). navigate ( Navigation Directions . nav To Favorite Fragment ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ On Navigation ItemSelected Listener Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . navigation _ profile Ġ-> Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfind Nav Controller ( R . id . my Nav Host Fragment ). navigate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNavigation Directions . nav To Profile Fragment ( User Manager . userId Ġ?: Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ On Navigation ItemSelected Listener Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġget Ġthe Ġheight Ġof Ġstatus Ġbar Ġfrom Ġsystem ĊĠĠĠ Ġprivate Ġval Ġstatus Bar Height : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresource Id Ġ= Ġresources . getIdentifier (" status _ bar _ height ", Ġ" dim en ", Ġ" android ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresource Id Ġ> Ġ 0 Ġ-> Ġresources . get Dimension Pixel Size ( resourceId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġset Theme ( R . style . Theme _ How Yo ) ĊĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ ĠmContext Ġ= Ġthis ĊĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠData Binding Util . set ContentView ( this , ĠR . layout . activity _ main ) ĊĠĠĠĠĠĠĠ Ġbinding . lifecycle Owner Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġbinding . viewModel Ġ= ĠviewModel ĊĊĠĠĠĠĠĠĠ Ġhow Yo Broadcast Receiver Ġ= ĠHow Yo Broadcast Receiver () ĊĊĠĠĠĠĠĠĠ ĠviewModel . navigate To Home By Bottom Nav . observe ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . bottom Nav View . selected ItemId Ġ= ĠR . id . navigation _ home ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . on Home Navig ated () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . current Fragment Type . observe ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ!= ĠCurrent Fragment Type . SIGN _ IN Ġ&& Ġ! is LoggedIn Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfind Nav Controller ( R . id . my Nav Host Fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. navigate ( Navigation Directions . nav To SignIn Fragment ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . is Reset Toolbar . observe ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Toolbar () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Drawer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Nav Controller () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . on Reset Toolbar () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . is User Loc ate Service Ready . observe ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Loc ate Service ?. subscribe To Location Updates () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . reset User Loc ate Service Status () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . is Access App First Time . observe ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ&& Ġis LoggedIn ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Location Permission () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . reset Is Access App First Time () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsetup Toolbar () ĊĠĠĠĠĠĠĠ Ġsetup Bottom Nav () ĊĠĠĠĠĠĠĠ Ġsetup Drawer () ĊĠĠĠĠĠĠĠ Ġsetup Nav Controller () ĊĠĠĠĠĠĠĠ Ġif Ġ( is LoggedIn ) Ġget Location Permission () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Bottom Nav () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . bottom Nav View . setOn Navigation ItemSelected Listener ( on Navigation ItemSelected Listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Nav Controller () Ġ{ ĊĠĠĠĠĠĠĠ Ġfind Nav Controller ( R . id . my Nav Host Fragment ). add On Destination Changed Listener Ġ{ Ġnav Controller : ĠNav Controller , Ġ_: ĠNav Destination , Ġ_: ĠBundle ? Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . current Fragment Type . value Ġ= Ġwhen Ġ( nav Controller . current Destination ?. id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . home Fragment Ġ-> ĠCurrent Fragment Type . HOME ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . discover Fragment Ġ-> ĠCurrent Fragment Type . DIS COVER ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . favorite Fragment Ġ-> ĠCurrent Fragment Type . FA V OR ITE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . profile Fragment Ġ-> ĠCurrent Fragment Type . PROFILE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . author Profile Fragment Ġ-> ĠCurrent Fragment Type . AUTHOR _ PROFILE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . notification Fragment Ġ-> ĠCurrent Fragment Type . NOTIFICATION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . plan Fragment Ġ-> ĠCurrent Fragment Type . PLAN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . group Message Fragment Ġ-> ĠCurrent Fragment Type . GROUP _ MESSAGE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . check Or Shopping List Fragment Ġ-> ĠCurrent Fragment Type . CHECK _ OR _ SH OP PING _ LIST ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . locate Fragment Ġ-> ĠCurrent Fragment Type . COMP AN ION _ LOC ATE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . payment Fragment Ġ-> ĠCurrent Fragment Type . PAYMENT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . payment Detail Fragment Ġ-> ĠCurrent Fragment Type . PAYMENT _ DETAIL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . friends Fragment Ġ-> ĠCurrent Fragment Type . FR I END S ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . setting Fragment Ġ-> ĠCurrent Fragment Type . SETTING ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . signIn Fragment Ġ-> ĠCurrent Fragment Type . SIGN _ IN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . comment Fragment Ġ-> ĠCurrent Fragment Type . COMMENT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠviewModel . current Fragment Type . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Toolbar () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . toolbar . set Padding ( 0 , Ġstatus Bar Height , Ġ 0 , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdpi Ġ= Ġresources . display Metrics . density D pi . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdpi Multiple Ġ= Ġdpi Ġ/ ĠDisplay Metrics . D ENS ITY _ DEFAULT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcut out Height Ġ= Ġget Cut out Height () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . i (" ====== Ġ${ Build . MODEL } Ġ===== =") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . i ("$ dpi Ġdpi Ġ(${ dpi Multiple } x )") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . i (" status Bar Height : Ġ${ status Bar Height } px /${ status Bar Height Ġ/ Ġdpi Multiple } dp ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcut out Height Ġ> Ġ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . i (" cut out Height : Ġ${ cut out Height } px /${ cut out Height Ġ/ Ġdpi Multiple } dp ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġori StatusBar Height Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources . get Dimension Pixel Size ( R . dim en . height _ status _ bar _ origin ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . toolbar . set Padding ( 0 , Ġori StatusBar Height , Ġ 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayout Params Ġ= ĠToolbar . LayoutParams ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToolbar . LayoutParams . WRAP _ CONTENT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToolbar . LayoutParams . WRAP _ CONTENT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Params . gravity Ġ= ĠGr avity . CENTER ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( Build . MODEL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Pixel Ġ 5 " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . i (" Build . MODEL Ġis Ġ${ Build . MODEL }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Params . top Margin Ġ= Ġstatus Bar Height Ġ- Ġori StatusBar Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . text Toolbar Title . layout Params Ġ= Ġlayout Params ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . i (" ====== Ġ${ Build . MODEL } Ġ===== =") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Drawer () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġset Ġup Ġtoolbar ĊĠĠĠĠĠĠĠ Ġval Ġnav Controller Ġ= Ġthis . find Nav Controller ( R . id . my Nav Host Fragment ) ĊĠĠĠĠĠĠĠ Ġset Support ActionBar ( binding . toolbar ) ĊĠĠĠĠĠĠĠ Ġsupport ActionBar ?. title Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġapp Bar Configuration Ġ= ĠApp Bar Configuration ( nav Controller . graph , Ġbinding . drawer Layout ) ĊĊĠĠĠĠĠĠĠ Ġbinding . drawer Layout . fits System Windows Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġbinding . drawer Layout . clip To Padding Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġaction Bar Drawer Toggle Ġ= Ġobject Ġ: ĠAction Bar Drawer Toggle ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . drawer Layout , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . toolbar , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . navigation _ drawer _ open , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . navigation _ drawer _ close ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠOb serve Ġcurrent Ġdrawer Ġtoggle Ġto Ġset Ġthe Ġnavigation Ġicon Ġand Ġbehavior ĊĠĠĠĠĠĠĠ ĠviewModel . current Drawer Toggle Type . observe ( this ) Ġ{ Ġtype Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Bar Drawer Toggle ?. is Drawer Indicator Enabled Ġ= Ġtype . indicator Enabled ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsupport ActionBar ?. set Display Home As Up Enabled (! type . indicator Enabled ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDraw er Toggle Type . BACK Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . toolbar . set Navigation Icon ( R . drawable . toolbar _ back ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Bar Drawer Toggle ?. set Toolbar Navigation ClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDraw er Toggle Type . BACK Ġ-> Ġon Back Pressed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . user Location . observe ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . update User Location ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . on Update User Location () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĠĠĠĠĠĠĠ Ġbind Service () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbind Service () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġservice Intent Ġ= ĠIntent ( this , ĠUser Loc ate Service :: class . java ) ĊĠĠĠĠĠĠĠ Ġif Ġ( is LoggedIn ) Ġbind Service ( service Intent , Ġuser Loc ate Service Connection , ĠB IND _ AUTO _ CREATE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġif Ġ( viewModel . is Access App First Time . value Ġ!= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregister Location Receiver () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . reset Broadcast Status () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġregister Location Receiver () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is LoggedIn Ġ&& ĠviewModel . is Broadcast Registered . value Ġ!= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocal Broadcast Manager . getInstance ( this ). register Receiver ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhow Yo Broadcast Receiver , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent Filter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUser Loc ate Service . ACTION _ HOW _ YO _ LOCATION _ BRO ADCAST ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . set Broadcast Registered () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is LoggedIn ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocal Broadcast Manager . getInstance ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. unregister Receiver ( how Yo Broadcast Receiver ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . reset Broadcast Status () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( user Loc ate Service Bound Ġ&& Ġis LoggedIn ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġun bind Service ( user Loc ate Service Connection ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Loc ate Service Bound Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Back Pressed () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . reset Shared Toolbar Title () ĊĠĠĠĠĠĠĠ ĠviewModel . reset Toolbar () ĊĊĠĠĠĠĠĠĠ Ġsuper . on Back Pressed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠThese Ġfunction Ġabout Ġgetting Ġlocation Ġshould Ġbe Ġin Ġa Ġdependent Ġclass ĊĠĠĠ Ġprivate Ġfun Ġget Location Permission () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Activity Compat . check Self Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . ACCESS _ F INE _ LOCATION ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Permission Granted Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck GPS State () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Location Permission () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrequest Location Permission () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Activity Compat . should Show Request Permission R ationale ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . ACCESS _ F INE _ LOCATION ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAlertDialog . Builder ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage ( getString ( R . string . request _ location _ permission _ message )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button ( getString ( R . string . confirm )) Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Compat . request Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĠarrayOf ( Manifest . permission . ACCESS _ F INE _ LOCATION ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠREQUEST _ LOCATION _ PERMISSION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Negative Button ( getString ( R . string . cancel )) Ġ{ Ġ_, Ġ_ Ġ-> Ġrequest Location Permission () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Compat . request Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĠarrayOf ( Manifest . permission . ACCESS _ F INE _ LOCATION ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠREQUEST _ LOCATION _ PERMISSION ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( ĊĠĠĠĠĠĠĠ Ġrequest Code : ĠInt , ĊĠĠĠĠĠĠĠ Ġpermissions : ĠArray < out ĠString >, ĊĠĠĠĠĠĠĠ Ġgrant Results : ĠInt Array ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Request Permissions Result ( request Code , Ġpermissions , Ġgrant Results ) ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( request Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠREQUEST _ LOCATION _ PERMISSION Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( grant Results . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( grant Results [ 0 ] Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Permission Granted Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck GPS State () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( request Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠREQUEST _ LOCATION _ PERMISSION Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Location Permission () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠREQUEST _ ENABLE _ GPS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck GPS State () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck GPS State () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlocation Manager Ġ= ĠmContext . getSystem Service ( Context . LOCATION _ SERVICE ) Ġas ĠLocation Manager ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! location Manager . is Provider Enabled ( Location Manager . GPS _ PROVIDER )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAlertDialog . Builder ( mContext ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( getString ( R . string . check _ gps _ title )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage ( getString ( R . string . check _ gps _ message )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . navigate _ to _ open _ setting ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity For Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent ( Settings . ACTION _ LOCATION _ SOURCE _ SETTINGS ), ĠREQUEST _ ENABLE _ GPS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Negative Button ( getString ( R . string . cancel ), Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbind Service () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregister Location Receiver () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠHow Yo Broadcast Receiver Ġ: ĠBroadcast Receiver () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext , Ġintent : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocation Ġ= Ġintent . get Parcelable Extra < Location >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUser Loc ate Service . EXTRA _ LOCATION ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( location Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . setUser Location ( location ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ