package Ġio . temp o . internal . domain . use Cases Ċ Ċ import Ġio . temp o . Storage Ċ import Ġio . temp o . Temp o Event Ċ import Ġio . temp o . Time Source Ċ import Ġio . temp o . Time Source Cache Ċ import Ġio . temp o . internal . data . Temp o Event Logger Ċ import Ġio . temp o . internal . domain . Device Clock s Ċ import Ġio . temp o . internal . log Ċ import Ġio . temp o . internal . retry IO Ċ import Ġkotlinx . coroutines .* Ċ Ċ internal Ġclass ĠSync Time Sources UC ( ĊĠĠĠ Ġprivate Ġval Ġtime Sources : ĠList < Time Source >, ĊĠĠĠ Ġprivate Ġval Ġstorage : ĠStorage , ĊĠĠĠ Ġprivate Ġval Ġdevice Clock s : ĠDevice Clock s , ĊĠĠĠ Ġprivate Ġval Ġevent Logger : ĠTemp o Event Logger Ċ ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTIME OUT _ MS Ġ= Ġ 3 0 L Ġ* Ġ 1 0 0 0 L ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġany Ġ[ Time Source ] Ġsynced Ġsuccessfully . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġoperator Ġfun Ġinvoke (): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Default ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠTemp o Event . Sync Start (). log () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcompleted Successfully Ġ= Ġtime Sources . map Ġ{ Ġtime Source Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasync Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTemp o Event . T SS ync Request ( time Source ). log () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Timeout ( TIMEOUT _ MS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġretry IO ( times Ġ= Ġ 2 0 ) Ġ{ Ġsync Single Time Source ( time Source ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTemp o Event . T SS ync Success ( time Source . config . id ). log () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTemp o Event . T SS ync Failure ( time Source , Ġt ). log () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. await All () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompleted Successfully . any (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( if Ġ( it ) ĠTemp o Event . Sync Success () Ġelse ĠTemp o Event . Sync Fail ()). log () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġsync Single Time Source ( time Source : ĠTime Source ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrequest Time Ġ= Ġtime Source . request Time () ĊĊĠĠĠĠĠĠĠ Ġval Ġcache Ġ= ĠTime Source Cache ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime Source Id Ġ= Ġtime Source . config . id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime Source Priority Ġ= Ġtime Source . config . priority , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġestimated Boot Time Ġ= Ġdevice Clock s . estimated Boot Time (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Device U ptime Ġ= Ġdevice Clock s . uptime (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Time Ġ= Ġrequest Time , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġboot Count Ġ= Ġdevice Clock s . boot Count () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġstorage . put Cache ( cache ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtime Source . config . id ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠTemp o Event . log () Ġ= Ġlog ( event Logger ) Ċ }