/* Ċ Ġ* ĠMIT ĠLicense Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 ĠShe T ie Jun Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ package Ġme . s het j . base . network . subscriber Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Environment . DIRECTORY _ DOWNLOAD S Ċ import Ġandroid . text . TextUtils Ċ import Ġio . reactivex . rx java 3 . android . schedul ers . Android Schedulers Ċ import Ġio . reactivex . rx java 3 . core . Observable Ċ import Ġjava . io . File Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . io . IOException Ċ import Ġjava . io . InputStream Ċ import Ġme . s het j . base . network . call Back . Download Progress CallBack Ċ import Ġme . s het j . base . network . call Back . Net CallBack Ċ import Ġme . s het j . base . network . exception . ApiException Ċ import Ġokhttp 3 . ResponseBody Ċ import Ġtim ber . log . Tim ber Ċ Ċ class ĠDownload Subscriber ( ĊĠĠĠ Ġprivate Ġval Ġpath : ĠString ?, ĊĠĠĠ Ġprivate Ġval Ġname : ĠString ?, ĊĠĠĠ Ġval Ġcall Back : ĠNet CallBack < *> Ċ ) Ġ: ĠBase Subscriber < ResponseBody >( call Back . context ) Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġlast Refresh Ui Time : ĠLong ĊĠĠĠ Ġpublic Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĠĠĠĠĠĠĠ Ġcall Back . onStart () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonComplete () Ġ{ ĊĠĠĠĠĠĠĠ Ġ/* Ġif Ġ( m CallBack Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm CallBack . on Completed (); ĊĠĠĠĠĠĠĠ Ġ}*/ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonError ( e : ĠApiException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfinally Error ( e ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Next ( t : ĠResponse Body ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwrite ResponseBody To Disk ( path , Ġname , Ġcall Back . context , Ġt ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite ResponseBody To Disk ( ĊĠĠĠĠĠĠĠ Ġpath : ĠString ?, ĊĠĠĠĠĠĠĠ Ġname : ĠString ?, ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext ?, ĊĠĠĠĠĠĠĠ Ġbody : ĠResponse Body ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠHttp Log . d (" contentType : >>>> " Ġ+ Ġbody . contentType (). toString ()); ĊĠĠĠĠĠĠĠ Ġvar Ġsave Path : ĠString ? Ġ= Ġpath ĊĠĠĠĠĠĠĠ Ġvar Ġsave Name Ġ= Ġname ĊĠĠĠĠĠĠĠ Ġif Ġ(! TextUtils . isEmpty ( save Name )) Ġ{ Ġ// Ġtext / html ; Ġcharset = utf - 8 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! save Name !!. contains (". ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġbody . contentType (). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Suffix Ġ= Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠA PK _ CONTENT TYPE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ". apk " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPNG _ CONTENT TYPE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ". png " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJ PG _ CONTENT TYPE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ". jpg " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"." Ġ+ Ġbody . contentType () !!. subtype () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsave Name Ġ+= Ġfile Suffix ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Name Ġ= ĠSystem . currentTimeMillis (). toString () Ġ+ Ġfile Suffix ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( save Path Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Path Ġ= Ġcontext !!. get External Files Dir ( DIRECTORY _ DOWNLOAD S ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toString () Ġ+ ĠFile . separator Ġ+ Ġsave Name ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( save Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Path Ġ= Ġsave Path Ġ+ ĠFile . separator Ġ+ Ġsave Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Path Ġ= Ġsave Path . replace ("// ". to Regex (), Ġ"/") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfuture Studio Icon File Ġ= ĠFile ( save Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġif Ġ(! future Studio Icon File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfuture Studio Icon File . createNew File (); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠinputStream : ĠInputStream ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠoutputStream : ĠFileOutputStream ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbyte [] Ġfile Reader Ġ= Ġnew Ġbyte [ 2 0 4 8 ]; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Reader Ġ= ĠByteArray ( 1 0 2 4 Ġ* Ġ 1 2 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠfileSize : ĠLong Ġ= Ġbody . content Length () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠfileSize Downloaded : ĠLong Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠinputStream Ġ= Ġbody . byte Stream () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoutputStream Ġ= ĠFileOutputStream ( future Studio Icon File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcall Back Ġ= Ġcall Back ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġread Ġ= ĠinputStream . read ( file Reader ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( read Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoutputStream . write ( file Reader , Ġ 0 , Ġread ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfileSize Downloaded Ġ+= Ġread . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ ä¸ĭè½½ è¿Ľ åº¦ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprogress Ġ= ĠfileSize Downloaded Ġ* Ġ 1 . 0 f Ġ/ ĠfileSize ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcur Time Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġæ¯ı 2 0 0 æ¯ « ç§Ĵ åĪ·æĸ° ä¸Ģæ¬¡ æķ°æį® , éĺ² æŃ¢ é¢ĳ ç¹ ģ æĽ´æĸ° è¿Ľ åº¦ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cur Time Ġ- Ġlast Refresh Ui Time Ġ>= Ġ 2 0 0 Ġ|| Ġprogress Ġ== Ġ 1 . 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfinal FileSize Downloaded Ġ= ĠfileSize Downloaded ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . just ( final FileSize Downloaded ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( call Back Ġis ĠDownload Progress CallBack <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Back . update ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinal FileSize Downloaded , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfileSize , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinal FileSize Downloaded Ġ== ĠfileSize ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) Ġ{ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Refresh Ui Time Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoutputStream . flush () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" file Ġdownloaded : Ġ$ file Size Downloaded Ġof Ġ$ file Size ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfinal ĠString Ġfinal Name Ġ= Ġname ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfinal Path : ĠString Ġ= Ġsave Path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . just ( final Path ). observe On ( Android Schedulers . main Thread ()). subscribe ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( call Back Ġis ĠDownload Progress CallBack <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Back . onComplete ( final Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) Ġ{ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinally Error ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoutputStream ?. close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠinputStream ?. close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinally Error ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfinally Error ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ ĠObservable . just ( ApiException ( e , Ġ 1 0 0 )). observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next ( call Back :: onError ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠA PK _ CONTENT TYPE Ġ= Ġ" application / vnd . android . package - archive " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠPNG _ CONTENT TYPE Ġ= Ġ" image / png " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠJ PG _ CONTENT TYPE Ġ= Ġ" image / jpg " ĊĊĠĠĠĠĠĠĠ Ġ// Ġprivate Ġstatic ĠString ĠTEXT _ CONTENT TYPE Ġ= Ġ" text / html ; Ġcharset = utf - 8 "; ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġfile Suffix Ġ= Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġlast Refresh Ui Time Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠ Ġ} Ċ } Ċ