package Ġcom . fab irt . weather forecast . presentation . weather Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . os . Bundle Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . fragment . app . view Models Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġcom . fab irt . weather forecast . R Ċ import Ġcom . fab irt . weather forecast . core . constants . LOCATION _ PERMISSION _ REQUEST _ CODE Ċ import Ġcom . fab irt . weather forecast . core . utils . Dialog Manager Ċ import Ġcom . fab irt . weather forecast . core . error . Failure Ċ import Ġcom . fab irt . weather forecast . core . utils . Settings Manager Ċ import Ġcom . fab irt . weather forecast . core . utils . Transitions Helper Ċ import Ġcom . fab irt . weather forecast . data . models . Weather Location Ċ import Ġcom . fab irt . weather forecast . databinding . Fragment Weather Binding Ċ import Ġcom . fab irt . weather forecast . domain . entities . Current Weather Ċ import Ġdagger . h ilt . android . Android EntryPoint Ċ Ċ @ Android EntryPoint Ċ class ĠWeather Fragment Ġ: ĠFragment () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlocation Permission Ġ= ĠManifest . permission . ACCESS _ F INE _ LOCATION ĊĠĠĠ Ġprivate Ġval ĠviewModel : ĠWeather ViewModel Ġby Ġview Models () ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠFragment Weather Binding ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠFragment Weather Binding . inflate ( in flater , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġsetup Observer s () ĊĠĠĠĠĠĠĠ Ġreturn Ġbinding . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Created ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Created ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠTrans itions Helper . setup Transitions ( this ) ĊĠĠĠĠĠĠĠ Ġcheck Permissions () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ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 ) ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠLOC ATION _ PERMISSION _ REQUEST _ CODE Ġ&& Ġgrant Results . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġgrant Results . first () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . request C urren Weather () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( result Ġ== ĠPackage Manager . PERMISSION _ DEN IED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDialog Manager . show ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= ĠFailure . Location Permission Not Granted Failure . title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= ĠFailure . Location Permission Not Granted Failure . message , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpositive Text Ġ= Ġresources . getString ( R . string . settings ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Confirm Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSettings Manager . open AppSettings ( require Context ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Permissions () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Context Compat . check Self Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Permission ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . request C urren Weather () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Location Permissions () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrequest Location Permissions () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( should Show Request Permission R ationale ( location Permission )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDialog Manager . show ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= ĠFailure . Location Permission Not Granted Failure . title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= ĠFailure . Location Permission Not Granted Failure . message , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpositive Text Ġ= Ġresources . getString ( R . string . allow ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Confirm Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( location Permission ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOC ATION _ PERMISSION _ REQUEST _ CODE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( location Permission ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOC ATION _ PERMISSION _ REQUEST _ CODE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Observer s () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . current Weather . observe ( view Lifecycle Owner , ĠObserver Ġ{ Ġweather Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġweather ?. let ( this :: update Weather View ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠviewModel . current Location . observe ( view Lifecycle Owner , ĠObserver Ġ{ Ġlocation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocation ?. let (:: update Location View ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠviewModel . failure . observe ( view Lifecycle Owner , ĠObserver Ġ{ Ġfailure Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfailure ?. let (:: handle Failure ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Weather View ( weather : ĠCurrent Weather ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . weather Ġ= Ġweather ĊĠĠĠĠĠĠĠ Ġbinding . humidity Text . text Ġ= Ġresources . getString ( R . string . humidity _ percentage , Ġweather . humidity ) ĊĠĠĠĠĠĠĠ Ġbinding . pressure Text . text Ġ= Ġresources . getString ( R . string . atm _ pressure , Ġweather . pressure ) ĊĠĠĠĠĠĠĠ Ġbinding . wind Speed Text . text Ġ= Ġresources . getString ( R . string . wind _ speed , Ġweather . wind Speed ) ĊĠĠĠĠĠĠĠ Ġbinding . temperature Text . text Ġ= Ġresources . getString ( R . string . temperature , Ġweather . temperature ) ĊĠĠĠĠĠĠĠ Ġbinding . real Feel Text . text Ġ= Ġresources . getString ( R . string . temperature , Ġweather . fe els like ) ĊĠĠĠĠĠĠĠ Ġbinding . wind Direction Text . text Ġ= Ġweather . wind Dir ĊĠĠĠĠĠĠĠ Ġbinding . visibility Text . text Ġ= Ġresources . getString ( R . string . visibility , Ġweather . visibility ) ĊĠĠĠĠĠĠĠ Ġbinding . weather Description Text . text Ġ= Ġweather . weather Description ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Location View ( location : ĠWeather Location ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . location Ġ= Ġlocation ĊĠĠĠĠĠĠĠ Ġbinding . location Text . text Ġ= Ġlocation . name ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Failure ( failure : ĠFailure ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= Ġfailure . title ĊĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġfailure . message ĊĠĠĠĠĠĠĠ Ġvar Ġaction Text Ġ= Ġresources . getString ( R . string . ok ) ĊĠĠĠĠĠĠĠ Ġvar Ġon Confirm Ġ= Ġ{} ĊĠĠĠĠĠĠĠ Ġwhen Ġ( failure ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFailure . Location Permission Not Granted Failure Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Text Ġ= Ġresources . getString ( R . string . settings ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Confirm Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSettings Manager . open AppSettings ( require Context ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFailure . Latest Location NotFound Failure Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Text Ġ= Ġresources . getString ( R . string . settings ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Confirm Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSettings Manager . open Location Settings ( require Context ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFailure . Network Failure Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Text Ġ= Ġresources . getString ( R . string . settings ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Confirm Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSettings Manager . open Wifi Settings ( require Context ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFailure . Unexpected Failure Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Text Ġ= Ġresources . getString ( R . string . retry ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Confirm Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . request C urren Weather () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠDialog Manager . show ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġtitle , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= Ġbody , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpositive Text Ġ= Ġaction Text , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Confirm Ġ= Ġon Confirm ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠviewModel . clear Failure () ĊĠĠĠ Ġ} Ċ }