package Ġcom . c ra iov adata . android . sun sh ine . ui . ad pt er Models Ċ Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . preference . Preference Manager . getDefault SharedPreferences Ċ import Ġcom . c ra iov adata . android . sun sh ine . R Ċ import Ġcom . c ra iov adata . android . sun sh ine . ui . main . Cards Adapter Ċ import Ġcom . c ra iov adata . android . sun sh ine . utilities . Sun sh ine Weather Utils Ċ import Ġcom . c ra iov adata . android . sun sh ine . City Data Ċ import Ġcom . c ra iov adata . android . sun sh ine . City Data . IS _ IMP ERIAL _ UNITS _ DEFAULT Ċ import Ġcom . c ra iov adata . android . sun sh ine . City Data . is Test Mode Ċ import Ġcom . c ra iov adata . android . sun sh ine . ui . models . List Weather Entry Ċ import Ġcom . j jo e 6 4 . graph view . Grid Label Renderer Ċ import Ġcom . j jo e 6 4 . graph view . helper . Date As X Axis Label Formatter Ċ import Ġcom . j jo e 6 4 . graph view . series . DataPoint Ċ import Ġcom . j jo e 6 4 . graph view . series . Line Graph Series Ċ import Ġkotlinx . android . synt hetic . main . card _ graph . view .* Ċ import Ġjava . util .* Ċ Ċ // ( val Ġweather Id : ĠInt , Ġval Ġdate : ĠDate , Ġval Ġtemperature : ĠDouble , Ġval Ġicon Code O WM : ĠString ) Ċ data Ġclass ĠGraph ( val Ġlist : ĠList < List Weather Entry > ?) Ġ: ĊĠĠĠ ĠBase ( Ċ // ĠĠĠĠĠĠĠ Ġlist ?. get ( 0 )?. date ?. time , ĊĠĠĠĠĠĠĠ ĠTYPE . GRAPH ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġbind Forecast To UI ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġweather Entries : ĠList < List Weather Entry > ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview : ĠView , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener : ĠC ards Adapter . Listener ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( weather Entries Ġ== Ġnull Ġ|| Ġweather Entries . isEmpty ()) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Graph ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweather Entries , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Text C els ius Far States ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġdraw Graph ( entries : ĠList < List Weather Entry >, Ġview : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . graph View . removeAll Series () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġseries Ġ= ĠLine Graph Series < DataPoint >() Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmin Temp Ġ= Ġ 1 2 5 . 0 Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmax Temp Ġ= Ġ- Ġ 5 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentries . forEach Ġ{ Ġentry Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemperature Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSun sh ine Weather Utils . adapt Temperature ( view . context , Ġentry . temperature ) Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Ġtemperature Ġ< Ġmin Temp ) Ġmin Temp Ġ= Ġtemperature Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( temperature Ġ> Ġmax Temp ) Ġmax Temp Ġ= Ġ Ġtemperature ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Point Ġ= ĠData Point ( entry . date , Ġtemperature ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseries . append Data ( data Point , Ġfalse , Ġentries . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseries . append Data ( data Point , Ġtrue , Ġentries . size Ġ+ Ġ 2 , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġseries . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= Ġview . context . getColor ( R . color . se mit r ansparent Gray ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠbackgroundColor Ġ= ĠColor . TRANSP ARENT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Draw Background Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Animated ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthickness Ġ= Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Draw Data Points Ġ= Ġtrue Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Points Radius Ġ= Ġ 3 . 0 f ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . graph View . apply Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove All Series () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Data Changed ( false , Ġfalse ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġcontext . getString ( R . string . title _ graph _ temperature ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Data Changed ( false , Ġfalse ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġset Ġmanual Ġx Ġbounds Ġto Ġhave Ġnice Ġsteps Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġviewport . is Y Axis Bounds Manual Ġ= Ġtrue Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġviewport . set Min Y ( min Temp Ġ- Ġ 3 ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġviewport . setMax Y ( max Temp Ġ+ Ġ 3 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Series ( series ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgrid Label Renderer . apply Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum Horizontal Labels Ġ= Ġentries . size Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum Vertical Labels Ġ= Ġ(( max Temp Ġ- Ġmin Temp )/ 6 ). toInt () Ġ+ Ġ 3 Ċ // num Vertical Labels Ġ= Ġ 4 Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhorizontal Axis Title Ġ= Ġ" hour " Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvertical Axis Title Ġ= Ġ" Temperature " Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhorizontal Axis Title Ġ= Ġ Ġ"\ u 2 3 F 0 " Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhorizontal Axis Title Ġ= Ġ Ġ"\ uE 1 2 b " ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgrid Style Ġ= ĠGrid Label Renderer . Grid Style . NONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Human Round ing ( false , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlabel Formatter Ġ= Ġobject Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDate As X Axis Label Formatter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCity Data . get Formatter City TZ (" HH : mm ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġformat Label ( value : ĠDouble , Ġis Value X : ĠBoolean ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( is Value X ) Ġsuper . format Label ( value , Ġis Value X ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġsuper . format Label ( value , Ġis Value X ) Ġ+ Ġ"\ u 0 0 B 0 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcity TimeZone Ġ= ĠTime Zone . getTime Zone ( City Data . TIME _ ZONE _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . textView Clock Symbol . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( it . context , Ġcity TimeZone . displayName , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Test Mode Ġ&& Ġcity TimeZone . id Ġ== Ġ" GMT ") Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtext Ġ= Ġcity TimeZone . displayName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġ" GMT Ġtime Ġ-> ĠTIME _ ZONE _ ID Ġerror : Ġ$ city TimeZone " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . textView Clock Symbol . setTextColor ( Color . RED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . textView Clock Symbol . text Ġ= Ġtext ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġset Text C els ius Far States ( view : ĠView , Ġlistener : ĠC ards Adapter . Listener ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġview . context ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsp Ġ= ĠgetDefault SharedPreferences ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġcontext . getString ( R . string . pref _ units _ key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Imp erial Ġ= Ġsp . getBoolean ( key , ĠIS _ IMP ERIAL _ UNITS _ DEFAULT ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġblue View Ġ= Ġview . textView F aren heit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġwhite View Ġ= Ġview . textView C els ius ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Imp erial ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblue View Ġ= Ġview . textView C els ius ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhite View Ġ= Ġview . textView F aren heit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġblue View . setTextColor ( Context Compat . getColor ( context , Ġandroid . R . color . holo _ blue _ dark )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblue View . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsp . edit (). put Boolean ( key , Ġ! is Imp erial ). apply () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on C els ius Far Clicked ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblue View . is Clickable Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblue View . background Ġ= Ġcontext . get Drawable ( R . drawable . selector _ transp ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhite View . is Clickable Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhite View . setTextColor ( Context Compat . getColor ( context , Ġandroid . R . color . white )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhite View . setOnClickListener ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhite View . background Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ Ċ } ĊĊ