package Ġapp . en velop . domain Ċ Ċ import Ġandroid . content . Content Resolver Ċ import Ġandroid . net . Uri Ċ import Ġandroid . provider . Open able Columns Ċ import Ġandroid . webkit . MimeType Map Ċ import Ġapp . en velop . common . En velop Spec Ċ import Ġapp . en velop . common . Operation Ċ import Ġapp . en velop . data . models . Doc Ċ import Ġapp . en velop . data . security . Hash Generator Ċ import Ġapp . en velop . data . security . IV Generator Ċ import Ġapp . en velop . data . security . P bk df 2 Aes Encryption Spec Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ import Ġjava . util .* Ċ import Ġjavax . inject . Inject Ċ Ċ class ĠDoc Builder Ċ @ Inject Ġconstructor ( ĊĠ Ġprivate Ġval ĠuserService : ĠUserService , ĊĠ Ġprivate Ġval Ġhash Generator : ĠHash Generator , ĊĠ Ġprivate Ġval Ġdoc Id Generator : ĠDoc Id Generator , ĊĠ Ġprivate Ġval Ġiv Generator : ĠIV Generator , ĊĠ Ġprivate Ġval Ġcontent Resolver : ĠContent Resolver Ċ ) Ġ{ ĊĊĠ Ġfun Ġbuild ( file Uri : ĠUri ) Ġ= ĊĠĠĠ ĠuserService ĊĠĠĠĠĠ Ġ. user Single () ĊĠĠĠĠĠ Ġ. map Ġ{ Ġuser Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġfile Info Ġ= Ġget FileInfo ( file Uri ) ĊĠĠĠĠĠĠĠ Ġval Ġnum Parts Ġ= ĠDoc . calculate Num Parts ( fileInfo . size , ĠEn velop Spec . FILE _ PART _ SIZE ) ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġgenerate Doc Id () ĊĠĠĠĠĠĠĠ ĠOperation . success ( ĊĠĠĠĠĠĠĠĠĠ ĠDoc ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġid , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġfile Info . name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġgenerate File Url (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ= Ġfile Info . size , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcontentType Ġ= Ġfile Info . extension , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcreatedAt Ġ= ĠDate (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuploaded Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġusername Ġ= Ġuser . username , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnum Parts Ġ= ĠDoc . calculate Num Parts ( fileInfo . size , ĠEn velop Spec . FILE _ PART _ SIZE ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpass code Ġ= Ġgenerate Pass code (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġversion Ġ= ĠDoc . CURRENT _ VERSION , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpart IV s Ġ= Ġiv Generator . generate List In Base 6 4 ( num Parts , ĠP bk df 2 Aes Encryption Spec . IV _ SIZE ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġencryption Spec Ġ= ĠP bk df 2 Aes Encryption Spec ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsalt Ġ= Ġid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiv Ġ= Ġiv Generator . generate In Base 6 4 ( P bk df 2 Aes Encryption Spec . IV _ SIZE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ. onError Return Ġ{ ĠOperation . error ( Error (" Could Ġnot Ġaccess Ġfile Ġand Ġbuild Ġdoc ", Ġit )) Ġ} ĊĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĊĠ Ġprivate Ġfun Ġget FileInfo ( file Uri : ĠUri ) Ġ= ĊĠĠĠ Ġcontent Resolver ĊĠĠĠĠĠ Ġ. query ( file Uri , Ġnull , Ġnull , Ġnull , Ġnull ) ĊĠĠĠĠĠ Ġ. use Ġ{ Ġcursor Ġ-> ĊĠĠĠĠĠĠĠ Ġcursor !!. moveTo First () ĊĠĠĠĠĠĠĠ Ġvar Ġname Ġ= ĊĠĠĠĠĠĠĠĠĠ Ġcursor . getString ( cursor . getColumnIndex ( Open able Columns . DISPLAY _ NAME )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . if Blank Ġ{ Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġgenerate Generic FileName () ĊĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġcursor . getLong ( cursor . getColumnIndex ( Open able Columns . SIZE )) ĊĠĠĠĠĠĠĠ Ġval Ġextension Ġ= Ġname . getExtension () Ġ?: Ġfile Uri . getExtension () ĊĊĠĠĠĠĠĠĠ Ġ// ĠAvoid Ġfile Ġnames Ġwithout Ġextension ĊĠĠĠĠĠĠĠ Ġif Ġ( name . getExtension () Ġ== Ġnull Ġ&& Ġ! extension . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ"$ name .$ extension " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( size Ġ== Ġ 0 L ) Ġthrow ĠError (" Empty Ġfile ") ĊĊĠĠĠĠĠĠĠ ĠFileInfo ( ĊĠĠĠĠĠĠĠĠĠ Ġname , ĊĠĠĠĠĠĠĠĠĠ Ġsize , ĊĠĠĠĠĠĠĠĠĠ Ġextension ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġgenerate Generic FileName () Ġ= Ġ" file -${ Random (). nextInt ( 1 0 0 0 )}" ĊĠ Ġprivate Ġfun Ġgenerate File Url () Ġ= ĠUUID . randomUUID (). toString () ĊĠ Ġprivate Ġfun Ġgenerate Doc Id () Ġ= Ġdoc Id Generator . generate () ĊĠ Ġprivate Ġfun Ġgenerate Pass code () Ġ= Ġhash Generator . generate ( En velop Spec . PASS CODE _ LENGTH ) ĊĊĠ Ġprivate Ġfun ĠString . getExtension () Ġ= ĊĠĠĠ Ġif Ġ( contains (". ")) Ġsplit (". "). last () Ġelse Ġnull ĊĊĠ Ġprivate Ġfun ĠUri . getExtension () Ġ= ĊĠĠĠ ĠMime TypeMap . get Singleton (). getExtension From MimeType ( content Resolver . getType ( this )) ĊĊĠ Ġprivate Ġclass ĠFileInfo ( ĊĠĠĠ Ġval Ġname : ĠString , ĊĠĠĠ Ġval Ġsize : ĠLong , ĊĠĠĠ Ġval Ġextension : ĠString ? ĊĠ Ġ) ĊĊĠ Ġclass ĠError ( message : ĠString , Ġcause : ĠThrowable ? Ġ= Ġnull ) Ġ: ĠException ( message , Ġcause ) Ċ Ċ }