package Ġmy . com . code play . training . weather app _ v 2 Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . SharedPreferences Ċ import Ġandroid . graphics . Paint Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . MenuItem Ċ import Ġandroidx . activity . result . contract . Activity Result Contracts Ċ import Ġandroidx . appcompat . app . AlertDialog Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . appcompat . widget . PopupMenu Ċ import Ġandroidx . core . view . Gravity Compat Ċ import Ġandroidx . core . view . isVisible Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ import Ġmy . com . code play . training . weather app _ v 2 . databinding . Activity Weather Binding Ċ import Ġmy . com . code play . training . weather app _ v 2 . db . Database Manager Ċ import Ġmy . com . code play . training . weather app _ v 2 . db . entity . Weather Ċ import Ġmy . com . code play . training . weather app _ v 2 . remote . Ret rofit Service Manager Ċ import Ġmy . com . code play . training . weather app _ v 2 . remote . model . Data Ċ import Ġretrofit 2 . Call Ċ import Ġretrofit 2 . Callback Ċ import Ġretrofit 2 . Response ĊĊ Ċ class ĠWeather Activity Ġ: ĠAppCompatActivity (), ĠPopup Menu . On MenuItem ClickListener Ġ{ ĊĠĠĠ Ġprivate Ġval ĠstartActivity For Result Ġ= Ġregister For Activity Result ( ĊĠĠĠĠĠĠĠ ĠActivity Result Contracts . Start Activity For Result ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( it . result Code Ġ== ĠActivity . RESULT _ OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew City Id Ġ= Ġit . data ?. getInt Extra ( EXTRA _ C ITY _ ID , Ġ 0 ) Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new City Id Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( city Id Ġ!= Ġnew City Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcity Id Ġ= Ġnew City Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcity Name Ġ= Ġit . data !!. getString Extra ( EXTRA _ C ITY _ NAME ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcity Lon Ġ= Ġit . data !!. get Float Extra ( EXTRA _ C ITY _ LON , Ġ 0 . 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcity Lat Ġ= Ġit . data !!. get Float Extra ( EXTRA _ C ITY _ LAT , Ġ 0 . 0 f ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . edit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put Int ( KEY _ C ITY _ ID , Ġcity Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putString ( KEY _ LOCATION , Ġcity Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put Float ( KEY _ LONG IT UDE , Ġcity Lon ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put Float ( KEY _ LAT IT UDE , Ġcity Lat ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Weather ( city Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( is Out dated ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Weather ( city Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġcity List Intent Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠIntent ( this , ĠCity List Activity :: class . java ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠActivity Weather Binding ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġprefs : ĠSharedPreferences ĊĠĠĠ Ġprivate Ġvar Ġcity Id Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġcity Name Ġ= Ġ"-" ĊĠĠĠ Ġprivate Ġvar Ġcity Lon Ġ= Ġ 0 . 0 f ĊĠĠĠ Ġprivate Ġvar Ġcity Lat Ġ= Ġ 0 . 0 f ĊĠĠĠ Ġprivate Ġvar Ġlast Record Timestamp Ġ= Ġ 0 L ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠActivity Weather Binding . inflate ( layout Inflater ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( binding . root ) ĊĊĠĠĠĠĠĠĠ Ġbinding . location Button . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpaint Flags Ġ= Ġpaint Flags Ġor ĠPaint . UNDER LINE _ TEXT _ FLAG ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset OnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġreplace Ġwith Ġsingle Ġchoice Ġdialog ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity For Result . launch ( city List Intent . also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . putExtra ( EXTRA _ C ITY _ ID , Ġcity Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ*/ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprompt Select City Dialog ( if Ġ( city Id Ġ> Ġ 0 ) Ġcities . indexOf First Ġ{ Ġit . id Ġ== Ġcity Id Ġ} Ġelse Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . menu Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPopup Menu ( this , Ġit ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgravity Ġ= ĠGr avity Compat . END ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Force Show Icon ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset On MenuItem ClickListener ( this @ Weather Activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinf late ( R . menu . weather _ popup ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprefs Ġ= Ġget Preferences ( Context . MODE _ PRIVATE ) ĊĠĠĠĠĠĠĠ Ġcity Id Ġ= Ġprefs . getInt ( KEY _ C ITY _ ID , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( city Id Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcity Name Ġ= Ġprefs . getString ( KEY _ LOCATION , Ġ"- ") !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Record Timestamp Ġ= Ġprefs . getLong ( KEY _ TIMESTAMP , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Out dated ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Weather ( city Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Weather () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . location Button . text Ġ= ĠgetString ( R . string . select _ a _ city ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprompt Select City () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon MenuItem Click ( item : ĠMenuItem ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( item ?. itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . action _ refresh Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( city Id Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprompt Select City () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( binding . progress . isVisible . not ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Out dated ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Weather ( city Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( binding . root , ĠR . string . info _ updated , ĠSn ackbar . LENGTH _ SHORT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . action _ open _ history Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( Intent ( this , ĠHistory Activity :: class . java )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . action _ forecast Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( city Id Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprompt Select City () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( Intent ( this , ĠFore cast Activity :: class . java ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( EXTRA _ C ITY _ NAME , Ġcity Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( EXTRA _ C ITY _ LON , Ġcity Lon ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( EXTRA _ C ITY _ LAT , Ġcity Lat ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprompt Select City () Ġ= ĠSn ackbar . make ( binding . root , ĠR . string . select _ a _ city , ĠSn ackbar . LENGTH _ IN DEFIN ITE ) ĊĠĠĠĠĠĠĠ Ġ. setAction ( R . string . set ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// startActivity For Result . launch ( city List Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprompt Select City Dialog () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. show () ĊĊĠĠĠ Ġprivate Ġfun Ġprompt Select City Dialog ( checked Item : ĠInt Ġ= Ġ 0 ) Ġ= ĠAlertDialog . Builder ( this , ĠR . style . Weather AlertDialog ) ĊĠĠĠĠĠĠĠ Ġ. setTitle ( R . string . select _ a _ city ) ĊĠĠĠĠĠĠĠ Ġ. set Single Choice Items ( cities . map Ġ{ Ġit . name Ġ}. to Typed Array (), Ġchecked Item ) Ġ{ Ġdialog , Ġposition Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( cities [ position ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( city Id Ġ!= Ġid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcity Id Ġ= Ġid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcity Name Ġ= Ġname ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcity Lon Ġ= Ġlon ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcity Lat Ġ= Ġlat ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . edit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put Int ( KEY _ C ITY _ ID , Ġcity Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putString ( KEY _ LOCATION , Ġcity Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put Float ( KEY _ LONG IT UDE , Ġcity Lon ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put Float ( KEY _ LAT IT UDE , Ġcity Lat ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Weather ( city Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( is Out dated ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Weather ( city Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . dismiss () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. set Positive Button ( android . R . string . cancel , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ. create () ĊĠĠĠĠĠĠĠ Ġ. show () ĊĊĠĠĠ Ġprivate Ġfun Ġis Out dated () Ġ= Ġlast Record Timestamp == 0 L ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|| ĠSystem . currentTimeMillis ()- last Record Timestamp Ġ> ĠINTER VAL _ IN _ M ILL IS ĊĊĠĠĠ Ġprivate Ġfun Ġrequest Weather ( city Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . progress . isVisible Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ ĠRet rofit Service Manager . weather Service . get Weather Data ( city Id ). enqueue ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject : ĠCallback < Data > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( call : ĠCall < Data >, Ġresponse : ĠResponse < Data >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . progress . isVisible Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . body ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement Ġ= Ġit . weather . first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġicon Res Id Ġ= Ġget Weather Icon ( element . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemperature Ġ= Ġit . main . temp . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwind speed Ġ= Ġit . wind . speed . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġupdate Ġlast Ġweather Ġrecord Ġin ĠSharedPreferences ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . edit (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Record Timestamp Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Long ( KEY _ TIMESTAMP , Ġlast Record Timestamp ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Int ( KEY _ WE ATHER _ ICON , Ġicon Res Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput String ( KEY _ WE ATHER _ DESC , Ġelement . description ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput String ( KEY _ LOCATION , Ġit . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput String ( KEY _ TEMP ER ATURE , Ġtemperature ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Float ( KEY _ W IND _ SPEED , Ġwind speed ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Int ( KEY _ HUM ID ITY , Ġit . main . humidity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Int ( KEY _ CLOUD INESS , Ġit . clouds . all ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapply () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġadd Ġthe Ġsame Ġrecord Ġto Ġlocal Ġdatabase ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDatabase Manager . getInstance ( this @ Weather Activity ). weather Data Dao () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. insert ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWeather ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemperature , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwind speed . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . main . humidity . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . clouds . all . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġicon Res Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. start () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Weather ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġicon Res Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . description , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemperature , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwind speed , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . main . humidity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . clouds . all ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . root , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . err _ request _ failed , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . message () Ġ?: Ġ" Unknown ĠError " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . LENGTH _ LONG ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( call : ĠCall < Data >, Ġt : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . progress . isVisible Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . root , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . err _ request _ failed , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt . message Ġ?: Ġ" Unknown ĠError " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . LENGTH _ LONG ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Weather ( ĊĠĠĠĠĠĠĠ Ġicon Res Id : ĠInt Ġ= Ġprefs . getInt ( KEY _ WE ATHER _ ICON , ĠR . drawable . ic _ unknown _ large ), ĊĠĠĠĠĠĠĠ Ġdescription : ĠString Ġ= Ġprefs . getString ( KEY _ WE ATHER _ DESC , Ġ" Unknown ") !! , ĊĠĠĠĠĠĠĠ Ġlocation : ĠString Ġ= Ġprefs . getString ( KEY _ LOCATION , Ġ"- ") !! , ĊĠĠĠĠĠĠĠ Ġtemperature : ĠString Ġ= Ġprefs . getString ( KEY _ TEMP ER ATURE , Ġ"- ") !! , ĊĠĠĠĠĠĠĠ Ġwind speed : ĠFloat Ġ= Ġprefs . get Float ( KEY _ W IND _ SPEED , Ġ 0 . 0 f ), ĊĠĠĠĠĠĠĠ Ġhum idity : ĠInt Ġ= Ġprefs . getInt ( KEY _ HUM ID ITY , Ġ 0 ), ĊĠĠĠĠĠĠĠ Ġcloud iness : ĠInt Ġ= Ġprefs . getInt ( KEY _ CLOUD INESS , Ġ 0 ) ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . icon . setImage Resource ( icon Res Id ) ĊĠĠĠĠĠĠĠ Ġbinding . description Text . text Ġ= Ġdescription . to Title Case () ĊĠĠĠĠĠĠĠ Ġbinding . location Button . text Ġ= ĠgetString ( R . string . location , Ġlocation ) ĊĠĠĠĠĠĠĠ Ġbinding . temperature Text . text Ġ= Ġtemperature ĊĠĠĠĠĠĠĠ Ġbinding . wind Speed Text . text Ġ= ĠgetString ( R . string . wind _ speed , Ġwind speed ) ĊĠĠĠĠĠĠĠ Ġbinding . humidity Text . text Ġ= ĠgetString ( R . string . percent , Ġhum idity ) ĊĠĠĠĠĠĠĠ Ġbinding . cloud iness Text . text Ġ= ĠgetString ( R . string . percent , Ġcloud iness ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ // Ġreference : Ġhttps :// open weather map . org / weather - conditions # How - to - get - icon - URL Ċ fun Ġget Weather Icon ( condition Id : ĠInt ) Ġ= Ġwhen ( condition Id ) Ġ{ ĊĠĠĠ Ġ// 2 0 0 , Ġ 2 0 1 , Ġ 2 0 2 , Ġ 2 1 0 , Ġ 2 1 1 , Ġ 2 1 2 , Ġ 2 2 1 , Ġ 2 3 0 , Ġ 2 3 1 , Ġ 2 3 2 Ġ-> ĠR . drawable . ic _ th under storm _ large ĊĠĠĠ Ġ// 3 0 0 , Ġ 3 0 1 , Ġ 3 0 2 , Ġ 3 1 0 , Ġ 3 1 1 , Ġ 3 1 2 , Ġ 3 1 3 , Ġ 3 1 4 , Ġ 3 2 1 Ġ-> ĠR . drawable . ic _ d ri zzle _ large ĊĠĠĠ Ġ// 5 0 0 , Ġ 5 0 1 , Ġ 5 0 2 , Ġ 5 0 3 , Ġ 5 0 4 , Ġ 5 1 1 , Ġ 5 2 0 , Ġ 5 2 1 , Ġ 5 2 2 , Ġ 5 3 1 Ġ-> ĠR . drawable . ic _ rain _ large ĊĠĠĠ Ġ// 6 0 0 , Ġ 6 0 1 , Ġ 6 0 2 , Ġ 6 1 1 , Ġ 6 1 2 , Ġ 6 1 5 , Ġ 6 1 6 , Ġ 6 2 0 , Ġ 6 2 1 , Ġ 6 2 2 Ġ-> ĠR . drawable . ic _ snow _ large ĊĠĠĠ Ġin Ġ 2 0 0 .. 2 3 2 Ġ-> ĠR . drawable . ic _ th under storm _ large ĊĠĠĠ Ġin Ġ 3 0 0 .. 3 2 1 Ġ-> ĠR . drawable . ic _ d ri zzle _ large ĊĠĠĠ Ġin Ġ 5 0 0 .. 5 3 1 Ġ-> ĠR . drawable . ic _ rain _ large ĊĠĠĠ Ġin Ġ 6 0 0 .. 6 2 2 Ġ-> ĠR . drawable . ic _ snow _ large ĊĠĠĠĠ 8 0 0 Ġ-> ĠR . drawable . ic _ day _ clear _ large ĊĠĠĠĠ 8 0 1 Ġ-> ĠR . drawable . ic _ day _ f ew _ clouds _ large ĊĠĠĠĠ 8 0 2 Ġ-> ĠR . drawable . ic _ scatter ed _ clouds _ large ĊĠĠĠĠ 8 0 3 , Ġ 8 0 4 Ġ-> ĠR . drawable . ic _ broken _ clouds _ large ĊĠĠĠ Ġ// 7 0 1 , Ġ 7 1 1 , Ġ 7 2 1 , Ġ 7 3 1 , Ġ 7 4 1 , Ġ 7 5 1 , Ġ 7 6 1 , Ġ 7 6 2 Ġ-> ĠR . drawable . ic _ fog _ large ĊĠĠĠ Ġin Ġ 7 0 1 .. 7 6 2 Ġ-> ĠR . drawable . ic _ fog _ large ĊĠĠĠĠ 7 8 1 , Ġ 9 0 0 Ġ-> ĠR . drawable . ic _ t ornado _ large ĊĠĠĠĠ 9 0 5 Ġ-> ĠR . drawable . ic _ wind y _ large ĊĠĠĠĠ 9 0 6 Ġ-> ĠR . drawable . ic _ h ail _ large ĊĠĠĠ Ġelse Ġ-> ĠR . drawable . ic _ unknown _ large Ċ } Ċ Ċ fun ĠString . to Title Case (): ĠString Ġ{ ĊĠĠĠ Ġvar Ġoutput Ġ= Ġ"" ĊĠĠĠ Ġfor Ġ( word Ġin Ġsplit (" Ġ")) Ġ{ ĊĠĠĠĠĠĠĠ Ġoutput Ġ+= Ġword . replace First Char Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . uppercase Char () ĊĠĠĠĠĠĠĠ Ġ} Ġ+ Ġ" Ġ" ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġoutput . trim () Ċ }