package Ġcom . example . android . architecture . blueprint s . be et v . util . download Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . AsyncTask Ċ import Ġandroid . os . Build Ċ import Ġandroid . util . Log Ċ import Ġandroid . widget . ProgressBar Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . annotation . Requires Api Ċ import Ġjava . io .* Ċ import Ġjava . net . URL Ċ import Ġjava . net . URLConnection Ċ Ċ class ĠDownload Task ( var Ġcontext : ĠContext , Ġvar ĠprogressBar : ĠProgress Bar Ġ?= Ġnull ) Ġ: ĠAsync Task < String , ĠString , ĠString >() Ġ{ ĊĊĠĠĠ Ġvar ĠonSuccess Listener Ġ: Ġ(() Ġ-> ĠUnit )? Ġ= Ġnull ĊĠĠĠ Ġvar Ġon Failed Lister : Ġ(() Ġ-> ĠUnit )? Ġ= Ġnull ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠBUFFER _ SIZE : ĠInt Ġ= Ġ 8 1 9 2 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠFILE _ BASE _ PATH Ġ= Ġ" file ://" ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMIME _ TYPE Ġ= Ġ" application / vnd . android . package - archive " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠPRO VIDER _ PATH Ġ= Ġ". provider " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠAPP _ INSTALL _ PATH Ġ= Ġ"\" application / vnd . android . package - archive \"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Cancelled ( result : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Cancelled ( result ) ĊĠĠĠĠĠĠĠ Ġon Failed Lister ?. invoke () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Progress Update ( var arg Ġvalues : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpercent Ġ= Ġvalues [ 0 ] !!. toInt () ĊĠĠĠĠĠĠĠ ĠprogressBar ?. progress Ġ= Ġpercent ĊĠĠĠĠĠĠĠ Ġsuper . on Progress Update (* values ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pre Execute () Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġon Pre Execute (), Ġinvoked Ġon Ġthe ĠUI Ġthread Ġbefore Ġthe Ġtask Ġis Ġexecuted . ĠThis Ġstep Ġis Ġnormally Ġused Ġto Ġsetup Ġthe Ġtask , Ġfor Ġinstance Ġby Ġshowing Ġa Ġprogress Ġbar Ġin Ġthe Ġuser Ġinterface . ĊĠĠĠĠĠĠĠ ĠprogressBar ?. progress Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ ĠprogressBar ?. secondary Progress Ġ= Ġ 1 0 0 ĊĠĠĠĠĠĠĠ ĠprogressBar ?. isIn determinate Ġ= Ġfalse ĊĠĠĠĠĠĠĠ ĠprogressBar ?. max Ġ= Ġ 1 0 0 ĊĠĠĠĠĠĠĠ Ġsuper . on Pre Execute () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Post Execute ( result : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Post Execute ( result ) ĊĠĠĠĠĠĠĠ Ġ// Ġ... ĊĠĠĠĠĠĠĠ ĠprogressBar ?. progress Ġ= Ġ 1 0 0 ĊĠĠĠĠĠĠĠ ĠLog . d (" DOWNLOAD _ TASK ", Ġ" download Ġx ong Ġr Ġne ") ĊĠĠĠĠĠĠĠ ĠonSuccess Listener ?. invoke () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDownloading Ġfile Ġin Ġbackground Ġthread ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . N ) ĊĠĠĠ Ġoverride Ġfun Ġdo In Background ( var arg Ġparams : ĠString ?): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcount Ġ: ĠInt ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurl Ġ= ĠURL ( params [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstr s Ġ= Ġparams [ 0 ]?. split ("/") ?. to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠfileName : ĠString Ġ= Ġstr s ! ![ strs . size - 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconnection : ĠURL Connection Ġ= Ġurl . open Connection () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . connect Timeout Ġ= Ġ 3 0 0 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . read Timeout Ġ= Ġ 3 0 0 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . connect () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthis Ġwill Ġbe Ġuseful Ġso Ġthat Ġyou Ġcan Ġshow Ġa Ġtip ical Ġ 0 - 1 0 0 % ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġprogress Ġbar ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlength : ĠLong Ġ= Ġconnection . content Length Long ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdownload Ġthe Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput : ĠInputStream Ġ= ĠBuffered InputStream ( url . open Stream (), ĠBUFFER _ SIZE ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġoutput Ġstream ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdestination Ġ= ĠDownload Controller . getInstance (). get A pk Path ByName ( context , ĠfileName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠoutputFile Ġ= ĠFile ( destination ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( outputFile . exists ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" DOWNLOAD TASK ", Ġ" t Ġd ang Ġexisted Ġr Ġne Ġn ha Ġ 1 ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoutputFile . delete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( outputFile . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" DOWNLOAD TASK ", Ġ" t Ġd ang Ġexisted Ġr Ġne Ġn ha Ġ 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" DOWNLOAD TASK ", Ġ" t Ġd ang Ġexisted Ġr Ġne Ġn ha Ġ 3 ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Ġ: ĠOutputStream Ġ= ĠFileOutputStream ( destination ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠByteArray ( 1 0 2 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtotal Ġ: ĠLong Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( input . read ( data ). let Ġ{ Ġcount Ġ= Ġit ; Ġit Ġ!= Ġ- 1 Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Ġ+= Ġcount ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġpublishing Ġthe Ġprogress .... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAfter Ġthis Ġon Progress Update Ġwill Ġbe Ġcalled ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpercent : ĠLong Ġ= Ġ(( total Ġ* Ġ 1 0 0 ) Ġ/ Ġlength ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublish Progress ("" Ġ+ Ġpercent . toInt ()); ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwriting Ġdata Ġto Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . write ( data , Ġ 0 , Ġcount ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġflush ing Ġoutput ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . flush () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġclosing Ġstreams ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput . close () Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠoutputFile Ġ= ĠFile ( destination ); Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif ( outputFile . exists ()){ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoutputFile . set Readable ( true , Ġfalse ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstorage : ĠFile Ġ= ĠFile ( Environment . get External Storage Directory () Ġ+ ĠFile . separator Ġ+ Ġ"/ Image /" ĊĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" Error : Ġ", Ġexception . message ); ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} Ċ } Ċ