package Ġie . gov . tracing . network Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroidx . annotation . Keep Ċ import Ġcom . google . common . util . concurrent . F utures Ċ import Ġcom . google . common . util . concurrent . List enable Future Ċ import Ġcom . google . gson . Gson Ċ import Ġie . gov . tracing . common . Events Ċ import Ġie . gov . tracing . near by . Provide Di agnosis Keys Worker Ċ import Ġie . gov . tracing . storage . Shared Prefs Ċ import Ġjava . io . File Ċ import Ġkotlin . math . max Ċ import Ġkotlin . math . min Ċ Ċ @ Keep Ċ data Ġclass ĠServer File ( val Ġid : ĠLong , Ġval Ġpath : ĠString ) Ċ Ċ internal Ġclass ĠDi agnosis KeyDown loader ( private Ġval Ġcontext : ĠContext ) Ġ{ ĊĠĠĠ Ġprivate Ġfun Ġprocess Google List ( file List : ĠList < String >): ĠArray < Server File > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġsince Ġ= ĠShared Prefs . getLong (" since ", Ġcontext ) ĊĠĠĠĠĠĠĠ Ġvar Ġfile Limit Ġ= ĠShared Prefs . getLong (" file Limit ", Ġcontext ) ĊĠĠĠĠĠĠĠ Ġval Ġfiles Ġ= Ġmutable ListOf < Server File >() ĊĊĠĠĠĠĠĠĠ Ġfile List . forEach Ġ{ Ġserver File Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf Ġ= ĠFile ( server File ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġf . name Without Extension ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Parts Ġ= Ġname . split ("- ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEvents . raise Event ( Events . INFO , Ġ" checking Ġgoogle Ġfile Ġ- Ġ${ server File } Ġ- Ġ${ name }, Ġ${ name Parts [ 0 ]}, Ġ${ name Parts [ 1 ]}, Ġ${ since }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( name Parts [ 0 ]. to Long () Ġ>= Ġsince ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsf Ġ= ĠServer File ( name Parts [ 1 ]. to Long (), Ġserver File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiles . add ( sf ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( files . size Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfiles . to Typed Array () ĊĠĠĠĠĠĠĠ Ġ} ĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġif Ġ( since Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠstartIndex Ġ= Ġmax ( 0 , Ġfiles . size Ġ- Ġfile Limit . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Index Ġ= Ġmin ( files . size , ĠstartIndex Ġ+ Ġfile Limit . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfiles . sub List ( startIndex , Ġend Index ). to Typed Array () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Index Ġ= Ġmin ( files . size , Ġfile Limit . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfiles . sub List ( 0 , Ġend Index ). to Typed Array () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdownload (): ĠList enable Future < List < File >> Ġ{ ĊĠĠĠĠĠĠĠ ĠProvide Di agnosis Keys Worker . next Since Ġ= Ġ 0 Ġ// Ġthis Ġwill Ġbe Ġgreater Ġthan Ġ 0 Ġon Ġsuccess ĊĊĠĠĠĠĠĠĠ Ġvar Ġsince Ġ= ĠShared Prefs . getLong (" since ", Ġcontext ) ĊĠĠĠĠĠĠĠ Ġvar Ġfile Limit Ġ= ĠShared Prefs . getLong (" file Limit ", Ġcontext ) ĊĠĠĠĠĠĠĠ Ġval Ġkey Server Type Ġ= ĠShared Prefs . getString (" key Server Type ", Ġcontext ) ĊĊĠĠĠĠĠĠĠ ĠEvents . raise Event ( Events . INFO , Ġ" download Ġ- Ġget Ġexports Ġto Ġprocess Ġsince : Ġ$ since ") ĊĊĠĠĠĠĠĠĠ Ġ// Ġprocess : ĊĠĠĠĠĠĠĠ Ġ// Ġ 1 . Ġlist Ġbatches Ġfrom Ġserver Ġfrom Ġsince Ġindex ĊĠĠĠĠĠĠĠ Ġ// Ġ 2 . Ġdownload Ġthe Ġfiles Ġto Ġprocess ĊĠĠĠĠĠĠĠ Ġ// Ġ 3 . Ġincrement Ġsync Ġto Ġlargest Ġprocessed Ġindex ĊĠĠĠĠĠĠĠ Ġ// Ġ 4 . Ġreturn Ġthe Ġlist Ġof Ġfiles Ġto Ġpass Ġto Ġthe Ġsubmit ter ĊĠĠĠĠĠĠĠ Ġvar Ġendpoint Ġ= Ġ"/ ex pos ures /? since =$ since & limit =$ file Limit " ĊĠĠĠĠĠĠĠ Ġif Ġ( key Server Type Ġ== Ġ" google ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġendpoint Ġ= Ġ"/ v 1 / index . txt " ĊĠĠĠĠĠĠĠ Ġ} ĠĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠFetch er . fetch Key File ( endpoint , Ġcontext ) ĊĊĠĠĠĠĠĠĠ Ġval Ġfiles Ġ= Ġmutable ListOf < File >() ĊĠĠĠĠĠĠĠ Ġif ( data Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġserver Files : ĠArray < Server File > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key Server Type Ġ== Ġ" google ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile List Ġ= Ġdata . split ("\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver Files Ġ= Ġprocess Google List ( file List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver Files Ġ= ĠGson (). fromJson ( data , ĠArray < Server File >:: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEvents . raise Event ( Events . INFO , Ġ" download Ġ- Ġsuccess , Ġprocessing Ġfiles : Ġ${ server Files . size }") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver Files . forEach Ġ{ Ġserver File Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEvents . raise Event ( Events . INFO , Ġ" download Ġ- Ġdownloading Ġfile : Ġ${ server File }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFetch er . download File ( server File . path , Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiles . add ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġupdate Ġmax Ġsince ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsince Ġ= Ġsince . coerce At Least ( server File . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEvents . raise Error (" download Ġ- ĠError Ġdownloading Ġfile : Ġ${ server File . path }", Ġex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( files . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEvents . raise Event ( Events . INFO , Ġ" success Ġdownloading Ġincrement ing Ġsince Ġto : Ġ$ since ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProvide Di agnosis Keys Worker . next Since Ġ= Ġsince ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠF utures . immediate Future ( files ) ĊĠĠĠ Ġ} Ċ }