package Ġcom . ja ime gc . covid 1 9 tracker . worker Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . util . Log Ċ import Ġandroidx . work . Coroutine Worker Ċ import Ġandroidx . work . Worker Parameters Ċ import Ġcom . ja ime gc . covid 1 9 tracker . data . api . client . Cov id Tracker ApiClient Ċ import Ġcom . ja ime gc . covid 1 9 tracker . data . api . model . Cov id Tracker Dto Ċ import Ġcom . ja ime gc . covid 1 9 tracker . domain . model . Cov id Tracker Ċ import Ġcom . ja ime gc . covid 1 9 tracker . domain . model . to Domain Ċ import Ġcom . ja ime gc . covid 1 9 tracker . domain . use case . Add Cov id Tracker Ċ import Ġcom . ja ime gc . covid 1 9 tracker . util . FileUtils Ċ import Ġcom . squareup . mos hi . M oshi Ċ import Ġkotlinx . coroutines . Deferred Ċ import Ġkotlinx . coroutines . async Ċ import Ġkotlinx . coroutines . await All Ċ import Ġkotlinx . coroutines . coroutine Scope Ċ import Ġorg . k oin . core . component . K oin Component Ċ import Ġorg . k oin . core . component . inject Ċ import Ġretrofit 2 . Response Ċ Ċ // ĠThis Ġis Ġa Ġutil Ġclass Ġthat Ġhelps Ġto Ġcreate Ġand Ġdownload Ġall Ġjson s . ĠAlso , Ġpopulate Ġthe Ġdata Ċ // Ġin Ġthe Ġdatabase . ĠBy Ġdefault , Ġit 's Ġnot Ġused Ċ class ĠPopulate Database Worker ( ĊĠĠĠ Ġval Ġcontext : ĠContext , ĊĠĠĠ Ġworker Params : ĠWorker Parameters Ċ ) Ġ: ĠCor outine Worker ( context , Ġworker Params ), ĠK oin Component Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠPopulate Database Worker :: class . java . simple Name ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠF OLDER Ġ= Ġ" data /" ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠF OLDER _ DOWNLOAD Ġ= Ġ"/ data " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠJSON _ FILE _ EXTENSION Ġ= Ġ". json " ĊĠĠĠĠĠĠĠ Ġ// ĠFirst Ġday Ġin Ġthe ĠAPI ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠSTART _ DATE Ġ= ĠTrip le ( 2 0 2 0 , Ġ 1 , Ġ 2 3 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠEND _ DATE Ġ= ĠTrip le ( 2 0 2 0 , Ġ 6 , Ġ 1 3 ) ĊĠĠĠĠĠĠĠ Ġ// ĠP LEASE , ĠUSE ĠRESP ON SI BL Y ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠSTART _ DATE _ SERVER Ġ= ĠTrip le ( 2 0 2 0 , Ġ 6 , Ġ 5 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠEND _ DATE _ SERVER Ġ= ĠTrip le ( 2 0 2 0 , Ġ 6 , Ġ 6 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDOWN LOAD _ JSON S _ FROM _ SERVER Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġfile Utils : ĠFileUtils Ġby Ġinject () ĊĠĠĠ Ġprivate Ġval Ġm oshi Ġ= ĊĠĠĠĠĠĠĠ ĠM oshi . Builder (). build (). adapter ( Cov id Tracker Dto :: class . java ) ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġdo Work (): ĠResult Ġ= ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Dates Ġ= Ġfile Utils . generate Dates ( START _ DATE , ĠEND _ DATE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcov id Track ers Ġ= Ġmutable ListOf < Cov id Tracker >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist Dates . map Ġ{ Ġdate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate Src Ġ= Ġ"$ FOLDER $ date $ JSON _ FILE _ EXTENSION " ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Json Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context . assets . open ( date Src ). buffered Reader (). use Ġ{ Ġit . read Text () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm oshi . fromJson ( data Json ). also Ġ{ Ġcov id Tracker Dto Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcov id Tracker Dto ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcov id Track ers . add ( covid Tracker Dto . to Domain ( getDate From FileName ( date Src ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( covid Track ers . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠT ips : ĠUse Ġan Ġemulator Ġto Ġgenerate Ġthe Ġdatabase ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuse Case : ĠAdd Cov id Tracker Ġby Ġinject () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuse Case . add Cov id Track ers ( covid Track ers ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( DOWNLOAD _ JSON S _ FROM _ SERVER ) Ġdownload All Json s () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠResult . success () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Error Ġpop ulating Ġdatabase ", Ġexception ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResult . failure () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Date From FileName ( date : ĠString ): ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġdate . replace ( FOLDER , Ġ""). replace ( JSON _ FILE _ EXTENSION , Ġ"") ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġdownload All Json s () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlist Dates Ġ= Ġfile Utils . generate Dates ( START _ DATE _ SERVER , ĠEND _ DATE _ SERVER ) ĊĠĠĠĠĠĠĠ Ġval Ġcov id Tracker ApiClient : ĠC ov id Tracker ApiClient Ġby Ġinject () ĊĠĠĠĠĠĠĠ Ġval Ġall Requests Ġ= Ġmutable ListOf < Deferred < Response < Cov id Tracker Dto >> >() ĊĊĠĠĠĠĠĠĠ Ġcoroutine Scope Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist Dates . map Ġ{ Ġdate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġall Requests . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasync Ġ{ Ġcov id Tracker ApiClient . getC ov id Tracker By Date As Response ( date ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠYou Ġcan Ġsee Ġanother Ġway Ġof Ġconcurrent Ġrequests Ġusing ĠArrow Ġin ĠUpdate base Worker Ġclass ĊĠĠĠĠĠĠĠ Ġall Requests . await All (). map Indexed Ġ{ Ġindex , Ġresponse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . is Successful Ġ&& Ġresponse . body () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Utils . writeFile To Internal Storage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm oshi . toJson ( response . body ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ list Dates [ index ]} $ JSON _ FILE _ EXTENSION ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF OLDER _ DOWNLOAD ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }