package Ġnl . tc ile gn ar . we er 9 2 9 2 . ui Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . Menu Ċ import Ġandroid . view . MenuItem Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . appcompat . widget . Search View Ċ import Ġandroidx . appcompat . widget . Search View . On Query Text Listener Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . navigation . find Nav Controller Ċ import Ġandroidx . navigation . ui . AppBar Configuration Ċ import Ġandroidx . navigation . ui . setup ActionBar With Nav Controller Ċ import Ġandroidx . navigation . ui . setup With Nav Controller Ċ import Ġcom . google . android . material . bottomnavigation . Bottom Navigation View Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ import Ġdagger . android . Android Injection Ċ import Ġnl . tc ile gn ar . we er 9 2 9 2 . R Ċ import Ġnl . tc ile gn ar . we er 9 2 9 2 . d agger . factories . Initializer Fragment Factory Ċ import Ġnl . tc ile gn ar . we er 9 2 9 2 . d agger . factories . ViewModel Factory Ċ import Ġnl . tc ile gn ar . we er 9 2 9 2 . d agger . factories . add Initializer Ċ import Ġnl . tc ile gn ar . we er 9 2 9 2 . model . Temperature Unit Ċ import Ġnl . tc ile gn ar . we er 9 2 9 2 . network . model . response . Coordinates Ċ import Ġnl . tc ile gn ar . we er 9 2 9 2 . storage . Temperature Prefs Ċ import Ġnl . tc ile gn ar . we er 9 2 9 2 . ui . forecast . Forecast Fragment Ċ import Ġnl . tc ile gn ar . we er 9 2 9 2 . ui . forecast . Forecast ViewModel Ċ import Ġnl . tc ile gn ar . we er 9 2 9 2 . ui . home . Home Fragment Ċ import Ġnl . tc ile gn ar . we er 9 2 9 2 . ui . home . Home ViewModel Ċ import Ġnl . tc ile gn ar . we er 9 2 9 2 . util . extensions . get ViewModel Ċ import Ġjavax . inject . Inject Ċ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity (), ĠOn Query Text Listener Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdefault Coordinates Ġ= ĠCoordinates . get 9 2 9 2 HQ () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġhome VM F : ĠViewModel Factory < Home ViewModel > ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġforecast VM F : ĠViewModel Factory < Forecast ViewModel > ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġhome ViewModel : ĠHome ViewModel ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtemperature Prefs : ĠTemperature Prefs ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsearch View : ĠMenuItem ĊĊĠĠĠ Ġprivate Ġvar Ġcurrent Title : ĠString Ġ= Ġ"" ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠAndroid Injection . inject ( this ) ĊĊĠĠĠĠĠĠĠ Ġsupport FragmentManager . fragment Factory Ġ= ĠInitial izer Fragment Factory (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Initializer Ġ{ ĠHome Fragment ( home VM F ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Initializer Ġ{ ĠFore cast Fragment ( forecast VM F ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĠĠĠĠĠĠĠ Ġhome ViewModel Ġ= Ġget ViewModel ( home VM F , ĠHome ViewModel :: class . java ) ĊĠĠĠĠĠĠĠ Ġtemperature Prefs Ġ= ĠTemperature Prefs ( this ) ĊĊĠĠĠĠĠĠĠ Ġval Ġnav View : ĠBottom Navigation View Ġ= ĠfindViewById ( R . id . nav _ view ) ĊĊĠĠĠĠĠĠĠ Ġval Ġnav Controller Ġ= Ġfind Nav Controller ( R . id . nav _ host _ fragment ) ĊĠĠĠĠĠĠĠ Ġ// ĠPass ing Ġeach Ġmenu ĠID Ġas Ġa Ġset Ġof ĠI ds Ġbecause Ġeach ĊĠĠĠĠĠĠĠ Ġ// Ġmenu Ġshould Ġbe Ġconsidered Ġas Ġtop Ġlevel Ġdest inations . ĊĠĠĠĠĠĠĠ Ġval Ġapp Bar Configuration Ġ= ĠApp Bar Configuration ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . navigation _ home , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . navigation _ forecast , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . navigation _ radar ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġsetup ActionBar With Nav Controller ( nav Controller , Ġapp Bar Configuration ) ĊĠĠĠĠĠĠĠ Ġnav View . setup With Nav Controller ( nav Controller ) ĊĊĠĠĠĠĠĠĠ Ġhome ViewModel . current Weather . observe ( this , ĠObserver Ġ{ Ġcurrent Weather Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Weather ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Title Ġ= Ġcurrent Weather . location . get City With CountryCode (). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ActionBar Title ( current Title ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġhome ViewModel . isLoading . observe ( this , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Loading () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ActionBar Title ( current Title ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġhome ViewModel . errorMessage . observe ( this , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . isNotBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( findViewById ( android . R . id . content ), Ġit , ĠSn ackbar . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ// ĠStart Ġapp Ġwith Ġcurrent Ġweather Ġfrom Ġdefault Ġlocation ĊĠĠĠĠĠĠĠ Ġif Ġ( savedInstanceState Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhome ViewModel . getCurrent Weather ( default Coordinates ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġmenu Inflater . inflate ( R . menu . settings , Ġmenu ) ĊĊĠĠĠĠĠĠĠ Ġtemperature Prefs . get Temperature Unit LiveData String (). observe ( this , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Icon Ġ= ĠTemperature Unit . valueOf ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmenu . find Item ( R . id . action _ settings ). icon Ġ= Ġnew Icon . get Menu Icon ( this ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġsearch View Ġ= Ġmenu . find Item ( R . id . action _ search ) ĊĠĠĠĠĠĠĠ Ġ( search View . action View Ġas ĠSearch View ). setOn Query Text Listener ( this ) ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . onCreate Options Menu ( menu ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ) Ġ= Ġwhen Ġ( item . itemId ) Ġ{ ĊĠĠĠĠĠĠĠ Ġandroid . R . id . home Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Back Pressed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠR . id . action _ settings Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemperature Prefs . toggle Temperature Unit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset ActionBar Title ( title : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsupport ActionBar !!. title Ġ= Ġtitle ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Loading () Ġ{ ĊĠĠĠĠĠĠĠ Ġset ActionBar Title (" Loading ...") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Query Text Submit ( query : ĠString ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( query ?. isNotBlank () Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch View . collapse Action View () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Loading () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhome ViewModel . getCurrent Weather ( query ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Query Text Change ( new Text : ĠString ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} Ċ } Ċ