/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġcom . ator res ve iga . blue cloud . data Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroidx . room . Dao Ċ import Ġandroidx . room . Database Ċ import Ġandroidx . room . Entity Ċ import Ġandroidx . room . Insert Ċ import Ġandroidx . room . On Conflict Strategy Ċ import Ġandroidx . room . Query Ċ import Ġandroidx . room . Room Ċ import Ġandroidx . room . Room Database Ċ import Ġandroidx . room . Transaction Ċ import Ġcom . ator res ve iga . blue cloud . model . Day Forecast Ċ import Ġcom . ator res ve iga . blue cloud . model . Hour Forecast Ċ import Ġcom . ator res ve iga . blue cloud . model . Location Ċ import Ġcom . ator res ve iga . blue cloud . model . SECONDS _ IN _ AN _ HOUR Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . datetime . Clock Ċ Ċ @ Entity ( ĊĠĠĠ ĠtableName Ġ= Ġ" hour _ forecast _ table ", ĊĠĠĠ Ġprimary Keys Ġ= Ġ[" datetime ", Ġ" latitude ", Ġ" longitude ", Ġ" dataSource "] Ċ ) Ċ data Ġclass ĠHour Forecast Entity ( ĊĠĠĠ Ġval Ġdatetime : ĠLong , ĊĠĠĠ Ġval Ġtemperature : ĠFloat , ĊĠĠĠ Ġval Ġfeels Like : ĠFloat , ĊĠĠĠ Ġval Ġpressure : ĠFloat , ĊĠĠĠ Ġval Ġhum idity : ĠFloat , ĊĠĠĠ Ġval Ġu vi : ĠFloat , ĊĠĠĠ Ġval Ġclouds : ĠFloat , ĊĠĠĠ Ġval Ġvisibility : ĠLong , ĊĠĠĠ Ġval Ġwind Speed : ĠFloat , ĊĠĠĠ Ġval Ġwind Degrees : ĠFloat , ĊĠĠĠ Ġval Ġweather Id : ĠInt , ĊĠĠĠ Ġval Ġpop : ĠFloat , ĊĠĠĠ Ġval Ġpre cip itation : ĠFloat , ĊĠĠĠ Ġval Ġlatitude : ĠDouble , ĊĠĠĠ Ġval Ġlongitude : ĠDouble , ĊĠĠĠ Ġval ĠdataSource : ĠInt Ċ ) Ċ Ċ @ Entity ( ĊĠĠĠ ĠtableName Ġ= Ġ" day _ forecast _ table ", ĊĠĠĠ Ġprimary Keys Ġ= Ġ[" datetime ", Ġ" latitude ", Ġ" longitude ", Ġ" dataSource "] Ċ ) Ċ data Ġclass ĠDay Forecast Entity ( ĊĠĠĠ Ġval Ġdatetime : ĠLong , ĊĠĠĠ Ġval Ġpressure : ĠFloat , ĊĠĠĠ Ġval Ġhum idity : ĠFloat , ĊĠĠĠ Ġval Ġu vi : ĠFloat , ĊĠĠĠ Ġval Ġsun rise : ĠLong , ĊĠĠĠ Ġval Ġsun set : ĠLong , ĊĠĠĠ Ġval Ġclouds : ĠFloat , ĊĠĠĠ Ġval Ġwind Speed : ĠFloat , ĊĠĠĠ Ġval Ġwind Degrees : ĠFloat , ĊĠĠĠ Ġval Ġmin Temperature : ĠFloat , ĊĠĠĠ Ġval Ġmax Temperature : ĠFloat , ĊĠĠĠ Ġval Ġpre cip itation : ĠFloat Ġ= Ġ 0 f , ĊĠĠĠ Ġval Ġweather Id : ĠInt , ĊĠĠĠ Ġval Ġmoon Phase Id : ĠInt , ĊĠĠĠ Ġval Ġlatitude : ĠDouble , ĊĠĠĠ Ġval Ġlongitude : ĠDouble , ĊĠĠĠ Ġval ĠdataSource : ĠInt Ċ ) Ċ Ċ @ Entity ( ĊĠĠĠ ĠtableName Ġ= Ġ" location _ table ", ĊĠĠĠ Ġprimary Keys Ġ= Ġ[" name "] Ċ ) Ċ data Ġclass ĠLocation Entity ( ĊĠĠĠ Ġval Ġname : ĠString , ĊĠĠĠ Ġval Ġlatitude : ĠDouble , ĊĠĠĠ Ġval Ġlongitude : ĠDouble , ĊĠĠĠ Ġval Ġtimezone Id : ĠString , ĊĠĠĠ Ġval Ġlast Updated : ĠLong , ĊĠĠĠ Ġval Ġdatetime : ĠLong Ċ ) Ċ Ċ @ Dao Ċ interface ĠFore cast DAO Ġ{ ĊĠĠĠ Ġ@ Query (" SELECT Ġ* Ġfrom Ġhour _ forecast _ table ĠWHERE ĠdataSource = Ġ: dataSource ĠAND Ġlatitude Ġ= Ġ: latitude ĠAND Ġlongitude =: longitude ĠAND Ġdatetime Ġ>= Ġ: startTime ĠORDER ĠBY Ġdatetime ĠASC ") ĊĠĠĠ Ġfun Ġget Hour ly Forecast From ( ĊĠĠĠĠĠĠĠ Ġlatitude : ĠDouble , ĊĠĠĠĠĠĠĠ Ġlongitude : ĠDouble , ĊĠĠĠĠĠĠĠ ĠstartTime : ĠLong , ĊĠĠĠĠĠĠĠ ĠdataSource : ĠInt ĊĠĠĠ Ġ): ĠFlow < List < Hour Forecast Entity >> ĊĊĠĠĠ Ġ@ Query (" SELECT Ġ* Ġfrom Ġday _ forecast _ table ĠWHERE ĠdataSource = Ġ: dataSource ĠAND Ġlatitude Ġ= Ġ: latitude ĠAND Ġlongitude =: longitude ĠAND Ġdatetime >= Ġ: startTime ĠORDER ĠBY Ġdatetime ĠASC ") ĊĠĠĠ Ġfun Ġget Daily Forecast From ( ĊĠĠĠĠĠĠĠ Ġlatitude : ĠDouble , ĊĠĠĠĠĠĠĠ Ġlongitude : ĠDouble , ĊĠĠĠĠĠĠĠ ĠstartTime : ĠLong , ĊĠĠĠĠĠĠĠ ĠdataSource : ĠInt ĊĠĠĠ Ġ): ĠFlow < List < Day Forecast Entity >> ĊĊĠĠĠ Ġ@ Query (" SELECT Ġ* Ġfrom Ġlocation _ table ĠORDER ĠBY Ġdatetime ĠDESC ĠLIMIT Ġ 5 ") ĊĠĠĠ Ġfun Ġget Locations (): ĠFlow < List < Location Entity >> ĊĊĠĠĠ Ġ@ Insert ( on Conflict Ġ= ĠOn Conflict Strategy . REPLACE ) ĊĠĠĠ Ġsuspend Ġfun Ġsave Hour ly Forecast ( hourly : ĠList < Hour Forecast Entity >) ĊĊĠĠĠ Ġ@ Insert ( on Conflict Ġ= ĠOn Conflict Strategy . REPLACE ) ĊĠĠĠ Ġsuspend Ġfun Ġsave Daily Forecast ( daily : ĠList < Day Forecast Entity >) ĊĊĠĠĠ Ġ@ Insert ( on Conflict Ġ= ĠOn Conflict Strategy . REPLACE ) ĊĠĠĠ Ġsuspend Ġfun Ġsave Location ( location : ĠLocation Entity ) ĊĊĠĠĠ Ġ@ Query (" DELETE ĠFROM Ġhour _ forecast _ table ĠWHERE Ġdatetime Ġ< Ġ: datetime ") ĊĠĠĠ Ġsuspend Ġfun Ġclear Hour ly Forecast Ol der Than ( datetime : ĠLong ) ĊĊĠĠĠ Ġ@ Query (" DELETE ĠFROM Ġday _ forecast _ table ĠWHERE Ġdatetime Ġ< Ġ: datetime ") ĊĠĠĠ Ġsuspend Ġfun Ġclear Daily Forecast Ol der Than ( datetime : ĠLong ) ĊĊĠĠĠ Ġ@ Query (" DELETE ĠFROM Ġlocation _ table ĠWHERE Ġname ĠNOT ĠIN Ġ( SELECT Ġname Ġfrom Ġlocation _ table ĠORDER ĠBY Ġdatetime ĠDESC ĠLIMIT Ġ 5 )") ĊĠĠĠ Ġsuspend Ġfun Ġclear Selected Locations () ĊĊĠĠĠ Ġ@ Transaction ĊĠĠĠ Ġsuspend Ġfun Ġclear Ol der Than ( datetime : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġclear Daily Forecast Ol der Than ( datetime Ġ- ĠSE CON DS _ IN _ AN _ HOUR Ġ* Ġ 2 4 ) ĊĠĠĠĠĠĠĠ Ġclear Hour ly Forecast Ol der Than ( datetime Ġ- ĠSE CON DS _ IN _ AN _ HOUR ) ĊĠĠĠĠĠĠĠ Ġclear Selected Locations () ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠThe Ġ[ Room ] Ġdatabase Ġfor Ġthis Ġapp . Ċ Ġ*/ Ċ @ Database ( ĊĠĠĠ Ġentities Ġ= Ġ[ Hour Forecast Entity :: class , ĠDay Forecast Entity :: class , ĠLocation Entity :: class ], ĊĠĠĠ Ġversion Ġ= Ġ 1 , ĊĠĠĠ Ġexport Schema Ġ= Ġfalse Ċ ) Ċ abstract Ġclass ĠApp Database Ġ: ĠRoom Database () Ġ{ ĊĠĠĠ Ġabstract Ġfun Ġforecast DAO (): ĠFore cast DAO ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval Ġdatabase Name Ġ= Ġ" bes afe - db " ĊĊĠĠĠĠĠĠĠ Ġfun Ġbuild Database ( context : ĠContext ): ĠApp Database Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRoom . database Builder ( context , ĠApp Database :: class . java , Ġdatabase Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fallback To Dest ruct ive Migration () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠDay Forecast Entity . to Day Forecast () Ġ= ĠDay Forecast ( ĊĠĠĠ Ġdatetime Ġ= Ġthis . datetime , ĊĠĠĠ Ġpressure Ġ= Ġthis . pressure , ĊĠĠĠ Ġhum idity Ġ= Ġthis . humidity , ĊĠĠĠ Ġu vi Ġ= Ġthis . u vi , ĊĠĠĠ Ġsun rise Ġ= Ġthis . sun rise , ĊĠĠĠ Ġsun set Ġ= Ġthis . sun set , ĊĠĠĠ Ġclouds Ġ= Ġclouds , ĊĠĠĠ Ġwind Speed Ġ= Ġwind Speed , ĊĠĠĠ Ġwind Degrees Ġ= Ġwind Degrees , ĊĠĠĠ Ġmin Temperature Ġ= Ġthis . min Temperature , ĊĠĠĠ Ġmax Temperature Ġ= Ġthis . max Temperature , ĊĠĠĠ Ġpre cip itation Ġ= Ġthis . prec ip itation , ĊĠĠĠ Ġweather Id Ġ= Ġthis . weather Id , ĊĠĠĠ Ġmoon Phase Ġ= Ġthis . moon Phase Id Ċ ) Ċ Ċ fun ĠDay Forecast . to Day Forecast Entity ( latitude : ĠDouble , Ġlongitude : ĠDouble , ĠdataSource : ĠInt ) Ġ= ĠDay Forecast Entity ( ĊĠĠĠ Ġdatetime Ġ= Ġthis . datetime , ĊĠĠĠ Ġpressure Ġ= Ġthis . pressure , ĊĠĠĠ Ġhum idity Ġ= Ġthis . humidity , ĊĠĠĠ Ġu vi Ġ= Ġthis . u vi , ĊĠĠĠ Ġsun rise Ġ= Ġthis . sun rise , ĊĠĠĠ Ġsun set Ġ= Ġthis . sun set , ĊĠĠĠ Ġclouds Ġ= Ġclouds , ĊĠĠĠ Ġwind Speed Ġ= Ġwind Speed , ĊĠĠĠ Ġwind Degrees Ġ= Ġwind Degrees , ĊĠĠĠ Ġmin Temperature Ġ= Ġthis . min Temperature , ĊĠĠĠ Ġmax Temperature Ġ= Ġthis . max Temperature , ĊĠĠĠ Ġpre cip itation Ġ= Ġthis . prec ip itation , ĊĠĠĠ Ġweather Id Ġ= Ġthis . weather Id , ĊĠĠĠ Ġmoon Phase Id Ġ= Ġthis . moon Phase , ĊĠĠĠ Ġlatitude Ġ= Ġlatitude , ĊĠĠĠ Ġlongitude Ġ= Ġlongitude , ĊĠĠĠ ĠdataSource Ġ= ĠdataSource Ċ ) Ċ Ċ fun ĠHour Forecast Entity . to Hour Forecast () Ġ= ĠHour Forecast ( ĊĠĠĠ Ġdatetime Ġ= Ġthis . datetime , ĊĠĠĠ Ġtemperature Ġ= Ġthis . temperature , ĊĠĠĠ Ġfeels Like Ġ= Ġthis . fe els Like , ĊĠĠĠ Ġpressure Ġ= Ġthis . pressure , ĊĠĠĠ Ġhum idity Ġ= Ġthis . humidity , ĊĠĠĠ Ġu vi Ġ= Ġthis . u vi , ĊĠĠĠ Ġclouds Ġ= Ġthis . clouds , ĊĠĠĠ Ġvisibility Ġ= Ġthis . visibility , ĊĠĠĠ Ġwind Speed Ġ= Ġthis . wind Speed , ĊĠĠĠ Ġwind Degrees Ġ= Ġthis . wind Degrees , ĊĠĠĠ Ġweather Id Ġ= Ġthis . weather Id , ĊĠĠĠ Ġpop Ġ= Ġthis . pop , ĊĠĠĠ Ġpre cip itation Ġ= Ġthis . prec ip itation Ċ ) Ċ Ċ fun ĠHour Forecast . to Hour Forecast Entity ( latitude : ĠDouble , Ġlongitude : ĠDouble , ĠdataSource : ĠInt ) Ġ= ĠHour Forecast Entity ( ĊĠĠĠ Ġdatetime Ġ= Ġthis . datetime , ĊĠĠĠ Ġtemperature Ġ= Ġthis . temperature , ĊĠĠĠ Ġfeels Like Ġ= Ġthis . fe els Like , ĊĠĠĠ Ġpressure Ġ= Ġthis . pressure , ĊĠĠĠ Ġhum idity Ġ= Ġthis . humidity , ĊĠĠĠ Ġu vi Ġ= Ġthis . u vi , ĊĠĠĠ Ġclouds Ġ= Ġthis . clouds , ĊĠĠĠ Ġvisibility Ġ= Ġthis . visibility , ĊĠĠĠ Ġwind Speed Ġ= Ġthis . wind Speed , ĊĠĠĠ Ġwind Degrees Ġ= Ġthis . wind Degrees , ĊĠĠĠ Ġweather Id Ġ= Ġthis . weather Id , ĊĠĠĠ Ġpop Ġ= Ġthis . pop , ĊĠĠĠ Ġpre cip itation Ġ= Ġthis . prec ip itation , ĊĠĠĠ Ġlatitude Ġ= Ġlatitude , ĊĠĠĠ Ġlongitude Ġ= Ġlongitude , ĊĠĠĠ ĠdataSource Ġ= ĠdataSource Ċ ) Ċ Ċ fun ĠLocation . to Location Entity () Ġ= ĊĠĠĠ ĠLocation Entity ( ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġname , ĊĠĠĠĠĠĠĠ Ġlatitude Ġ= Ġlatitude , ĊĠĠĠĠĠĠĠ Ġlongitude Ġ= Ġlongitude , ĊĠĠĠĠĠĠĠ Ġtimezone Id Ġ= Ġtimezone Id , ĊĠĠĠĠĠĠĠ Ġlast Updated Ġ= Ġlast Updated , ĊĠĠĠĠĠĠĠ Ġdatetime Ġ= ĠClock . System . now (). epoch Seconds ĊĠĠĠ Ġ) Ċ Ċ fun ĠLocation Entity . to Location () Ġ= ĊĠĠĠ ĠLocation ( ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġname , ĊĠĠĠĠĠĠĠ Ġlatitude Ġ= Ġlatitude , ĊĠĠĠĠĠĠĠ Ġlongitude Ġ= Ġlongitude , ĊĠĠĠĠĠĠĠ Ġtimezone Id Ġ= Ġtimezone Id , ĊĠĠĠĠĠĠĠ Ġlast Updated Ġ= Ġlast Updated ĊĠĠĠ Ġ) Ċ