package Ġpl . si enc zy km . temp l bn . utils Ċ Ċ import Ġandroid . app . Notification Ċ import Ġandroid . app . Notification Channel Ċ import Ġandroid . app . Notification Manager Ċ import Ġandroid . app widget . App Widget Manager Ċ import Ġandroid . content . Component Name Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . graphics . drawable . Icon Ċ import Ġandroid . location . Location Ċ import Ġandroid . os . Build Ċ import Ġandroidx . annotation . Requires Api Ċ import Ġandroidx . annotation . Worker Thread Ċ import Ġandroidx . core . app . Notification Compat Ċ import Ġandroidx . core . app . Notification Manager Compat Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . cancel Ċ import Ġkotlinx . coroutines . launch Ċ import Ġpl . si enc zy km . temp l bn . R Ċ import Ġpl . si enc zy km . temp l bn . db . App Db Ċ import Ġpl . si enc zy km . temp l bn . db . model . Air Station Model Ċ import Ġpl . si enc zy km . temp l bn . db . model . Base Station Model Ċ import Ġpl . si enc zy km . temp l bn . db . model . Weather Station Model Ċ import Ġpl . si enc zy km . temp l bn . ui . main . MainActivity Ċ import Ġpl . si enc zy km . temp l bn . ui . station . Station Activity Ċ import Ġpl . si enc zy km . temp l bn . widget . Old Weather Widget Ċ Ċ // ĠTODO Ġrefactor Ġthis Ġsomehow ? Ċ object ĠExternal Display s Handler Ġ{ ĊĊĠĠĠ Ġfun Ġcancel All Notifications ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ ĠNotification Manager Compat . from ( context ). cancel All () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcancel Notification ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠ Ġnotification Id : ĠInt ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠNotification Manager Compat . from ( context ). cancel ( notification Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsend Notification ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠ Ġnotification Id : ĠInt , ĊĠĠĠĠĠĠĠ Ġnotification : ĠNotification ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠNotification Manager Compat . from ( context ). notify ( notification Id , Ġnotification ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . O ) ĊĠĠĠ Ġprivate Ġfun Ġcreate Notification Channel ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠ Ġchannel : ĠNotification Channel ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ( context . getSystem Service ( Context . NOTIFICATION _ SERVICE ) Ġas ĠNotification Manager ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. create Notification Channel ( channel ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate External Display s ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Weather Notification ( context ) ĊĠĠĠĠĠĠĠ Ġupdate Old Weather Widget ( context ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcheck Air Quality ( context : ĠContext ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġnotification Id Ġ= Ġ 7 0 ĊĊĠĠĠĠĠĠĠ Ġif Ġ( context . show Air Quality Notification ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCor outine Scope ( Dispatch ers . IO ). launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Nearest Air Station Id ( context )?. let Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġair Station Ġ= ĠApp Db . get Database ( context ). air Station Dao (). get Station ById ( it ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( air Station ?. air Quality Index Ġ!= Ġnull Ġ&& Ġair Station . air Quality Index !! Ġ>= Ġcontext . get Air Quality Level ()) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġair Channel Id Ġ= Ġ" air _ quality _ notification " ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchannel Ġ= ĠNotification Channel ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġair Channel Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getString ( R . string . air _ index _ notification _ channel _ name ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Manager . IMPORT ANCE _ LOW ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getString ( R . string . air _ index _ notification _ channel _ description ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Notification Channel ( context , Ġchannel ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠNotification Compat . Builder ( context , Ġair Channel Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Title ( air Station . getFull Station Name ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Text ( context . getString ( R . string . air _ index _ notification _ content )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Intent ( MainActivity . open Air Pending Intent ( context )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAuto Cancel ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Small Icon ( R . drawable . ic _ app _ icon ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Notification ( context , Ġnotification Id , Ġbuilder . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcancel Notification ( context , Ġnotification Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Old Weather Widget ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwidget Update Intent Ġ= ĠIntent ( context , ĠOld Weather Widget :: class . java ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠApp Widget Manager . ACTION _ APP WIDGET _ UPDATE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp Widget Manager . EXTRA _ APP WIDGET _ IDS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp Widget Manager . getInstance ( context ). getApp Widget Ids ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠComponent Name ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOld Weather Widget :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( Old Weather Widget . OLD _ KEY , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcontext . send Broadcast ( widget Update Intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Weather Notification ( context : ĠContext ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġnotification Id Ġ= Ġ 6 9 ĊĊĠĠĠĠĠĠĠ Ġif Ġ( context . show Weather Notification ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCor outine Scope ( Dispatch ers . IO ). launch Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġweather Station Ġ= Ġget Pro per Weather Station ( context ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemperature String Ġ= Ġweather Station ?. get Parsed Temperature ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ it ${ context . getString ( R . string . cel s ius _ degree )}" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhour String Ġ= Ġ"${ weather Station ?. date ?. let Ġ{ ĠdateFormat (" HH : mm "). format ( it ) Ġ}}" ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġweather Channel Id Ġ= Ġ" weather _ notification " ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchannel Ġ= ĠNotification Channel ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweather Channel Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getString ( R . string . weather _ notification _ channel _ name ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Manager . IMPORT ANCE _ LOW ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getString ( R . string . weather _ notification _ channel _ description ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Notification Channel ( context , Ġchannel ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification . Builder ( context , Ġweather Channel Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification . Builder ( context ) Ġ// ĠNotification Compact Ġdo Ġnot Ġallow Ġpass ĠIcon Ġvia Ġset Small Icon () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Title ("$ temperature String Ġ- Ġ$ hour String ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Text ( weather Station ?. getFull Station Name ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Intent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( context . open Weather Station ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStation Activity . open Weather Station Pending Intent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweather Station ?. station Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMainActivity . open Weather Pending Intent ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set O ngo ing ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemperature String ?. let Ġ{ Ġtext Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M Ġ&& Ġcontext . create Icon For Notification ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Small Icon ( get Notification Icon ( text , Ġcontext )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Small Icon ( R . drawable . ic _ temperature ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġset Small Icon ( R . drawable . ic _ temperature ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Notification ( context , Ġnotification Id , Ġbuilder . build ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcancel Notification ( context , Ġnotification Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . M ) ĊĠĠĠ Ġfun Ġget Notification Icon ( text : ĠString , Ġcontext : ĠContext ): ĠIcon Ġ= ĠIcon . create With Bitmap ( ĊĠĠĠĠĠĠĠ Ġdraw Text On Bitmap ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ġ= Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Ġ= Ġ 2 8 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ= Ġ 2 8 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext X Scale Ġ= Ġ 1 . 0 3 f Ġ- Ġ( text . length Ġ* Ġ 0 . 1 f ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Size Ġ= Ġ 2 2 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscal able Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġtext ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ@ Worker Thread ĊĠĠĠ Ġfun Ġget Pro per Weather Station ( context : ĠContext ) Ġ= ĊĠĠĠĠĠĠĠ ĠApp Db . get Database ( context ). weather Station Dao () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Station ById ( get Pro per Weather Station Id ( context )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġstation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( station ?. is Date Obsolete OrNull () Ġ== Ġfalse ) Ġstation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠĠĠĠ Ġ// TODO Ġfind Ġnext Ġclosest Ġstation Ġwith Ġvalid Ġdata ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp Db . get Database ( context ). weather Station Dao () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Station ById ( context . getDefault Weather Station Id ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Pro per Weather Station Id ( context : ĠContext ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdefault Station Id Ġ= Ġcontext . getDefault Weather Station Id () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( context . use Location ToUpdate Weather ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getLast Known Location ()?. let Ġ{ Ġget Nearest Weather Station Id ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġdefault Station Id ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Station Id ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Nearest Air Station Id ( context : ĠContext ): ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnearest Station Ġ= Ġcontext . getLast Known Location ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAir Station Model . getAll St ations () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. min With OrNull ( distance Comparator ( it )) Ġ// Ġsince ĠAir Station Model . get St ations () Ġis Ġlist Ġof Ġstatic Ġobjects , Ġmin With OrNull Ġwill Ġnever Ġreturns Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġ// Ġdistance Ġis Ġnot Ġnull Ġif Ġwe Ġrun Ġdistance Comparator () ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( nearest Station . distance !! Ġ<= Ġ 1 0 ) Ġ{ Ġ// ĠTODO : Ġmove Ġthis Ġ 1 0 Ġkm Ġinto Ġoptions Ġperhaps ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnearest Station . station Id ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Nearest Weather Station Id ( location : ĠLocation ): ĠInt Ġ= ĊĠĠĠĠĠĠĠ ĠWeather Station Model . getAll St ations () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. min With OrNull ( distance Comparator ( location )) !!. station Id Ġ// Ġsince ĠWeather Station Model . get St ations () Ġis Ġlist Ġof Ġstatic Ġobjects , Ġmin With OrNull Ġwill Ġnever Ġreturns Ġnull ĊĊĠĠĠ Ġprivate Ġfun Ġdistance Comparator ( it : ĠLocation ): ĠComparator < Base Station Model > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠComparator Ġ{ Ġstation 1 , Ġstation 2 Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstation 1 . distance Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġha vers ine ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . latitude , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . longitude , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstation 1 . latitude , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstation 1 . longitude ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstation 2 . distance Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġha vers ine ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . latitude , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . longitude , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstation 2 . latitude , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstation 2 . longitude ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( station 1 . distance !! Ġ> Ġstation 2 . distance !! ) Ġ 1 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }