package Ġcom . w ak az ta hir . d rives ync . drive Ċ Ċ import Ġcom . google . api . client . http . ByteArray Content Ċ import Ġcom . google . api . client . http . InputStream Content Ċ import Ġcom . google . api . client . json . gson . Gson Factory Ċ import Ġcom . google . api . services . drive . Drive Ċ import Ġcom . google . auth . http . Http Credentials Adapter Ċ import Ġcom . google . auth . oauth 2 . AccessToken Ċ import Ġcom . google . auth . oauth 2 . User Credentials Ċ import Ġcom . w ak az ta hir . d rives ync . core . Sync ServiceProvider Ċ import Ġcom . w ak az ta hir . d rives ync . model . Sync File Ċ import Ġcom . w ak az ta hir . k mp storage . Storage InputStream Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġjava . util .* Ċ Ċ actual Ġopen Ġclass ĠDrive ServiceProvider ( ĊĠĠĠ ĠappName : ĠString , Ċ // ĠĠĠ Ġauth Provider : ĠGoogle Auth Provider , ĊĠĠĠ ĠaccessToken Value : ĠString , ĊĠĠĠ ĠaccessToken Expiry : ĠDate Ċ ) Ġ: ĠSync ServiceProvider Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġdrive Service : ĠDrive ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠaccessToken Ġ= ĠAccess Token ( accessToken Value , ĠaccessToken Expiry ) ĊĠĠĠĠĠĠĠ Ġval Ġcredentials Ġ= ĠUser Credentials . create ( accessToken ) ĊĠĠĠĠĠĠĠ Ġval Ġcredentials Adapter Ġ= ĠHttp Credentials Adapter ( credentials ) ĊĠĠĠĠĠĠĠ Ġdrive Service Ġ= ĠDrive . Builder ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcom . google . api . client . http . jav an et . Net Http Transport (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGson Factory (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcredentials Adapter ĊĠĠĠĠĠĠĠ Ġ). set Application Name ( appName ). build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġoverride Ġsuspend Ġfun Ġget Sync File ( file Id : ĠString ): ĠSync File ? Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn @ with Context ĠSync File ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdrive Service . files (). get ( file Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Fields (" id , name , description , mime Type , created Time , modified Time , properties ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. execute () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġoverride Ġsuspend Ġfun Ġget Files List (): ĠList < Sync File > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfiles List Ġ= Ġdrive Service . files (). list (). set Spaces (" app Data Folder ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Fields (" files ( id , name , description , mime Type , created Time , modified Time , properties )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. execute () ĊĠĠĠĠĠĠĠ Ġreturn Ġfiles List . files . map Ġ{ ĠSync File ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġoverride Ġsuspend Ġfun Ġget Files Map (): ĠHashMap < String , ĠSync File >? Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfiles List Ġ= Ġdrive Service . files (). list (). set Spaces (" app Data Folder ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Fields (" files ( id , name , description , mime Type , created Time , modified Time , properties )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. execute () ĊĠĠĠĠĠĠĠ Ġval Ġfiles Map Ġ= Ġhash Map Of < String , ĠSync File >() ĊĠĠĠĠĠĠĠ Ġfiles List . files . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin . run Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuuid Ġ= Ġit . properties [" uuid "] Ġ?: Ġit . id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! uuid . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiles Map [ uuid ] Ġ= ĠSync File ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn @ with Context Ġfiles Map ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġoverride Ġsuspend Ġfun Ġupload File ( file : ĠSync File , Ġcontent : ĠString ): ĠSync File ? Ġ= ĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . mime Type Ġ== Ġnull ) Ġerror ( Throwable (" File Ġmime type Ġcannot Ġbe Ġnull ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuploaded File Ġ= Ġkotlin . run Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . file . parents Ġ= ĠlistOf (" app Data Folder ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Stream Ġ= ĠByteArray Content . fromString ( file . mime Type , Ġcontent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . cloud Id Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSync File ( drive Service . files (). create ( file . file , Ġcontent Stream ). execute ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSync File ( drive Service . files (). update ( file . cloud Id , Ġfile . file , Ġcontent Stream ). execute ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. get OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( uploaded File Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context Ġuploaded File ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġoverride Ġsuspend Ġfun Ġupload File ( file : ĠSync File , Ġcontent : ĠStorage InputStream ): ĠSync File ? Ġ= ĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . mime Type Ġ== Ġnull ) Ġerror (" file Ġmime type Ġcannot Ġbe Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . file . parents Ġ= ĠlistOf (" app Data Folder ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Stream Ġ= ĠInputStream Content ( file . mime Type , Ġcontent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . cloud Id Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context ĠSync File ( drive Service . files (). create ( file . file , Ġcontent Stream ). execute ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context ĠSync File ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrive Service . files (). update ( file . cloud Id , Ġfile . file , Ġcontent Stream ). execute () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġoverride Ġsuspend Ġfun Ġdownload File AsString ( file Id : ĠString ): ĠString ? Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdrive Service . files (). get ( file Id ). execute Media As InputStream (). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs : ĠScanner Ġ= ĠScanner ( it ). use Delimiter ("\\ A ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġif Ġ( s . hasNext ()) Ġs . next () Ġelse Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġoverride Ġsuspend Ġfun Ġdownload File ( file Id : ĠString ): ĠStorage InputStream ? Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdrive Service . files (). get ( file Id ). execute Media As InputStream () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġactual Ġoverride Ġsuspend Ġfun Ġdelete File ( file Id : ĠString ): ĠBoolean Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoperation Ġ= Ġkotlin . run Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdrive Service . files (). delete ( file Id ). execute () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn @ with Context Ġoperation . is Success ĊĠĠĠ Ġ} Ċ }