package Ġde . r ki . cor on aw arn app . submission . data . tek history Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Intent Ċ import Ġandroidx . annotation . Visible ForTesting Ċ import Ġcom . google . android . gms . near by . ex posure notification . Temporary Exposure Key Ċ import Ġdagger . ass isted . Ass isted Ċ import Ġdagger . ass isted . Ass isted Factory Ċ import Ġdagger . ass isted . Ass isted Inject Ċ import Ġde . r ki . cor on aw arn app . exception . Exception Category Ċ import Ġde . r ki . cor on aw arn app . exception . reporting . report Ċ import Ġde . r ki . cor on aw arn app . near by . EN F Client Ċ import Ġde . r ki . cor on aw arn app . near by . Tracing Permission Helper Ċ import Ġde . r ki . cor on aw arn app . util . TimeStamp er Ċ import Ġde . r ki . cor on aw arn app . util . coroutine . App Scope Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . async Ċ import Ġkotlinx . coroutines . flow . first Ċ import Ġkotlinx . coroutines . launch Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . util . UUID Ċ Ċ class ĠT EK History Updater Ġ@ Ass isted Inject Ġconstructor ( ĊĠĠĠ Ġ@ Ass isted Ġval Ġcallback : ĠCallback , ĊĠĠĠ Ġprivate Ġval Ġtek History Storage : ĠT EK History Storage , ĊĠĠĠ Ġprivate Ġval Ġtime Stamp er : ĠTime Stamp er , ĊĠĠĠ Ġprivate Ġval Ġen f Client : ĠEN F Client , ĊĠĠĠ Ġprivate Ġval Ġtracing Permission Helper Factory : ĠTr acing Permission Helper . Factory , ĊĠĠĠ Ġ@ App Scope Ġprivate Ġval Ġscope : ĠCor outine Scope Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġtracing Permission Helper Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġtracing Permission Helper Factory . create ( object Ġ: ĠTr acing Permission Helper . Callback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonUpdate Tracing Status ( is Tracing Enabled : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Tracing Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate TE K History Or Request Permission () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . tag ( TAG ). w (" Can 't Ġstart ĠT EK Ġupdate , Ġtracing Ġpermission Ġwas Ġdecl ined .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Tracing Consent Required ( on Consent Result : Ġ( given : ĠBoolean ) Ġ-> ĠUnit ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Tracing Consent Required ( on Consent Result ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Permission Required ( permission Request : Ġ( Activity ) Ġ-> ĠUnit ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Permission Required ( permission Request ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( error : ĠThrowable ) Ġ= Ġcallback . onError ( error ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate TE K History Or Request Permission () Ġ{ ĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! en f Client . is Tracing Enabled . first ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . tag ( TAG ). w (" Tracing Ġis Ġdisabled , Ġenabling ...") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtracing Permission Helper . start Tracing () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate TE K History Internal () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġupdate TE K History Internal () Ġ{ ĊĠĠĠĠĠĠĠ Ġen f Client . get TE K History Or Request Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon TE K History Available Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . tag ( TAG ). d (" TE KS Ġwere Ġdirectly Ġavailable .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate History And Trigger Callback ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Permission Required Ġ= Ġ{ Ġstatus Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . tag ( TAG ). d (" TE K Ġrequest Ġrequires Ġuser Ġresolution .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpermission Request Trigger : Ġ( Activity ) Ġ-> ĠUnit Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus . start Resolution For Result ( it , ĠT EK _ PERMISSION _ REQUEST ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Permission Required ( permission Request Trigger ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate History And Trigger Callback ( available TE Ks : ĠList < Temporary Exposure Key >? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġupdate TE K History ( available TE Ks ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on TE K Available ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . onError ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġupdate TE K History ( ĊĠĠĠĠĠĠĠ Ġavailable TE Ks : ĠList < Temporary Exposure Key >? Ġ= Ġnull ĊĠĠĠ Ġ): ĠList < Temporary Exposure Key > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdeferred Ġ= Ġscope . async Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġte ks Ġ= Ġavailable TE Ks Ġ?: Ġen f Client . get TE K History () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" Permission Ġare Ġavailable , Ġstoring ĠT EK Ġhistory .") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġte ks . also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtek History Storage . store TE K Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠT EK History Storage . TE K Batch ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbatch Id Ġ= ĠUUID . randomUUID (). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobtained At Ġ= Ġtime Stamp er . now UTC , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeys Ġ= Ġte ks ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeferred . await () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . tag ( TAG ). e ( e , Ġ" Positive Ġpermission Ġresult Ġbut Ġfailed Ġto Ġupdate Ġhistory ?") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . report ( Exception Category . EX POS URE NOTIFICATION , ĠTAG , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhandle Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġis Tracing Permission Request Ġ= Ġtracing Permission Helper . handle Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĠĠĠĠĠĠĠ Ġif Ġ( is Tracing Permission Request ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . tag ( TAG ). d (" Was Ġtracing Ġpermission Ġrequest , Ġwill Ġtry ĠT EK Ġupdate Ġif Ġtracing Ġis Ġnow Ġenabled .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ!= ĠT EK _ PERMISSION _ REQUEST ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . tag ( TAG ). w (" Not Ġour Ġrequest Ġcode Ġ($ request Code ): Ġ% s ", Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( result Code Ġ== ĠActivity . RESULT _ OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . tag ( TAG ). d (" We Ġgot ĠT EK Ġpermission , Ġnow Ġupdating Ġhistory .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate History And Trigger Callback () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . tag ( TAG ). i (" Permission Ġdecl ined Ġ(! = ĠRESULT _ OK ): Ġ% s ", Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on TE K Permission Decl ined () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠCallback Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġon TE K Available ( te ks : ĠList < Temporary Exposure Key >) ĊĠĠĠĠĠĠĠ Ġfun Ġon TE K Permission Decl ined () ĊĠĠĠĠĠĠĠ Ġfun Ġon Tracing Consent Required ( on Consent Result : Ġ( given : ĠBoolean ) Ġ-> ĠUnit ) ĊĠĠĠĠĠĠĠ Ġfun Ġon Permission Required ( permission Request : Ġ( Activity ) Ġ-> ĠUnit ) ĊĠĠĠĠĠĠĠ Ġfun ĠonError ( error : ĠThrowable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Ass isted Factory ĊĠĠĠ Ġinterface ĠFactory Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġcreate ( callback : ĠCallback ): ĠT EK History Updater ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" TE K History Updater " ĊĊĠĠĠĠĠĠĠ Ġ@ Visible ForTesting ( otherwise Ġ= ĠVis ible ForTesting . PRIVATE ) ĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠT EK _ PERMISSION _ REQUEST Ġ= Ġ 3 0 1 1 ĊĠĠĠ Ġ} Ċ } Ċ