package Ġuk . n hs . n hs x . covid 1 9 . android . app . analytics Ċ Ċ import Ġkotlinx . coroutines . Non C ancellable Ċ import Ġkotlinx . coroutines . sync . Mutex Ċ import Ġkotlinx . coroutines . sync . with Lock Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġuk . n hs . n hs x . covid 1 9 . android . app . analytics . Calculate Missing Submission Days . Companion . SUB MISSION _ LOG _ CHECK _ RANGE _ MAX Ċ import Ġuk . n hs . n hs x . covid 1 9 . android . app . analytics . Consume Ol dest Analytics Result . Cons umed Ċ import Ġuk . n hs . n hs x . covid 1 9 . android . app . common . Result Ċ import Ġuk . n hs . n hs x . covid 1 9 . android . app . common . run S af ely Ċ import Ġuk . n hs . n hs x . covid 1 9 . android . app . remote . Analytics Api Ċ import Ġjava . time . LocalDate Ċ import Ġjavax . inject . Inject Ċ import Ġjavax . inject . Singleton Ċ Ċ @ Singleton Ċ class ĠSubmit Analytics Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġanalytics Api : ĠAnalytics Api , ĊĠĠĠ Ġprivate Ġval Ġmigrate Metrics Log Storage To Log Storage : ĠMigrate Metrics Log Storage To Log Storage , ĊĠĠĠ Ġprivate Ġval Ġanalytics Submission Log Storage : ĠAnalytics Submission Log Storage , ĊĠĠĠ Ġprivate Ġval Ġconsume Ol dest Analytics : ĠCons ume Ol dest Analytics , ĊĠĠĠ Ġprivate Ġval Ġcreate Analytics Payload : ĠCreate Analytics Payload Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġmutex Ġ= ĠMutex () ĊĊĠĠĠ Ġsuspend Ġoperator Ġfun Ġinvoke ( ĊĠĠĠĠĠĠĠ Ġon After Submission : Ġsuspend Ġ() Ġ-> ĠUnit Ġ= Ġ{} ĊĠĠĠ Ġ): ĠResult < Unit > Ġ= ĊĠĠĠĠĠĠĠ Ġrun S af ely Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Non C ancellable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmigrate Metrics Log Storage To Log Storage () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCons ume Ġanalytics Ġchrono logic ally Ġup Ġto Ġyesterday ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAbort Ġon Ġfailure , Ġnot Ġsuccessfully Ġsubmitted Ġanalytics Ġare Ġlost ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġoldest Analytics Result Ġ= Ġconsume Ol dest Analytics . invoke () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( ol dest Analytics Result Ġis ĠCon su med ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanalytics Payload Ġ= Ġcreate Analytics Payload ( ol dest Analytics Result . analytics Events Group ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanalytics Api . submit Analytics ( analytics Payload ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanalytics Submission Log Storage . add Date ( analytics Payload . analytics Window . startDate To LocalDate ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcleanup Analytics Submission Logs ( analytics Payload . analytics Window . startDate To LocalDate ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon After Submission () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoldest Analytics Result Ġ= Ġconsume Ol dest Analytics . invoke () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcleanup Analytics Submission Logs ( current Package Date : ĠLocalDate ) Ġ{ ĊĠĠĠĠĠĠĠ Ġanalytics Submission Log Storage . remove Before OrEqual ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Package Date . minus Days ( SUB MISSION _ LOG _ CHECK _ RANGE _ MAX . to Long ()) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ