package Ġni . dev otion . mult idat ap ar ser . file čĊč Ċ import Ġandroid . app . Notification . Builder č Ċ import Ġandroid . app . Notification Manager č Ċ import Ġandroid . content . Context č Ċ import Ġandroid . os . Build . VERSION č Ċ import Ġandroid . os . Build . VERSION _ CODES č Ċ import Ġandroid . os . Process č Ċ import Ġandroid . util . Log č Ċ import Ġni . dev otion . mult idat ap ar ser . R č Ċ import Ġni . dev otion . mult idat ap ar ser .` interface `. On Download Result č Ċ import Ġni . dev otion . mult idat ap ar ser . model . Files . File Types č Ċ import Ġni . dev otion . mult idat ap ar ser . model . Files . Files č Ċ import Ġjava . io . Buffered InputStream č Ċ import Ġjava . io . File č Ċ import Ġjava . io . File OutputStream č Ċ import Ġjava . net . Http URLConnection č Ċ import Ġjava . net . URL č Ċ import Ġjava . util . concurrent . Thread Factory čĊč Ċ @ Suppress (" DE PREC ATION ") č Ċ class ĠFile Manager ( private Ġval Ġcontext : ĠContext ) Ġ{ čĊĠĠĠ Ġprivate Ġvar Ġis Note Enabled Ġ= Ġfalse čĊĠĠĠ Ġprivate Ġvar Ġchannel Id Ġ= Ġ"" čĊĠĠĠ Ġlateinit Ġvar Ġon Download Result Listener : ĠOn Download Result čĊĠĠĠ Ġlateinit Ġvar Ġnotification Manager : ĠNotification Manager čĊčĊĠĠĠ Ġfun Ġdownload File From URL ( file Model : ĠFiles , Ġchannel Id : ĠString , Ġon Download Result Listener : ĠOn Download Result ): ĠString ? Ġ{ čĊĠĠĠĠĠĠĠ Ġthis . channelId Ġ= Ġchannel Id čĊĠĠĠĠĠĠĠ Ġis Note Enabled Ġ= Ġtrue čĊĠĠĠĠĠĠĠ Ġnotification Manager Ġ= Ġcontext . getSystem Service ( Context . NOTIFICATION _ SERVICE ) Ġas ĠNotification Manager čĊĠĠĠĠĠĠĠ Ġreturn Ġdownload File From URL ( file Model , Ġon Download Result Listener ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġdownload File From URL ( file Model : ĠFiles , Ġon Download Result Listener : ĠOn Download Result ): ĠString ? Ġ{ čĊĠĠĠĠĠĠĠ Ġthis . on Download Result Listener Ġ= Ġon Download Result Listener čĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= ĠURL ( file Model . file Url ) čĊĠĠĠĠĠĠĠ Ġval Ġurl Connection : ĠHttp URLConnection Ġ= Ġurl . open Connection () Ġas ĠHttp URLConnection čĊĠĠĠĠĠĠĠ Ġval Ġresponse Code Ġ= Ġurl Connection . response Code čĊĠĠĠĠĠĠĠ Ġif ( response Code Ġ< Ġ 2 0 0 Ġ|| Ġresponse Code Ġ>= Ġ 3 0 0 ){ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Download Result Listener . onError ( context . getString ( R . string . network _ error ), Ġresponse Code ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"" čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġval ĠinputStream Ġ= ĠBuffered InputStream ( url Connection . inputStream ) čĊĠĠĠĠĠĠĠ Ġreturn Ġsave File ( inputStream , Ġfile Model ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġsave File ( file : ĠFile , Ġfile Model : ĠFiles , Ġon Download Result Listener : ĠOn Download Result ): ĠString { čĊĠĠĠĠĠĠĠ Ġval Ġfile to save Ġ= ĠFile ( context . get External Files Dir ( null )?. path , Ġfile Model . fileName ) čĊĠĠĠĠĠĠĠ Ġfile to save . parent File ?. createNew File () čĊĠĠĠĠĠĠĠ Ġfile to save . createNew File () čĊĠĠĠĠĠĠĠ Ġval Ġin Stream Ġ= Ġfile . inputStream () čĊĠĠĠĠĠĠĠ Ġin Stream . use Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ ĠFileOutputStream ( file to save ). use Ġ{ Ġoutput Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠByteArray ( 4 Ġ* Ġ 1 0 2 4 ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġread : ĠInt čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Ġ= Ġit . read ( buffer ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( read Ġ== Ġ- 1 ) Ġbreak čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . write ( buffer , Ġ 0 , Ġread ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . flush () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Download Result Listener . on Success ( file to save . path ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġreturn Ġfile . absolute Path čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġsave File ( inputStream : ĠBuffered InputStream , Ġfile Model : ĠFiles ): ĠString { čĊĠĠĠĠĠĠĠ Ġval Ġext : ĠString Ġ= Ġwhen Ġ( file Model . fileType ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile Types . TYPE _ PDF Ġ-> Ġ" pdf " čĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile Types . TYPE _ DOC Ġ-> Ġ" docx " čĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile Types . TYPE _ IMAGE _ PNG Ġ-> Ġ" png " čĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile Types . TYPE _ IMAGE _ JPG Ġ-> Ġ" jpg " čĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile Types . TYPE _ VIDEO Ġ-> Ġ" mp 4 " čĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile Types . TYPE _ AUDIO Ġ-> Ġ" mp 3 " čĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile Types . TYPE _ ZIP Ġ-> Ġ" zip " čĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile Types . TYPE _ R AR Ġ-> Ġ" rar " čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġval Ġfile Location Ġ= ĠFile ( context . get External Files Dir ( null )?. path , Ġ"${ file Model . fileName }. $ ext ") čĊĠĠĠĠĠĠĠ Ġfile Location . parent File ?. createNew File () čĊĠĠĠĠĠĠĠ Ġfile Location . createNew File () čĊĠĠĠĠĠĠĠ Ġif ( is Note Enabled ) Ġnotification Manager . notify ( 0 , Ġbuild Note (). build ()) čĊĠĠĠĠĠĠĠ ĠinputStream . use Ġ{ Ġbuffer InputStream Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠ ĠFileOutputStream ( file Location ). use Ġ{ ĠoutputStream File Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠByteArray ( 4 Ġ* Ġ 1 0 2 4 ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġread : ĠInt čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Ġ= Ġbuffer InputStream . read ( buffer ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( read Ġ== Ġ- 1 ) Ġbreak čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoutputStream File . write ( buffer , Ġ 0 , Ġread ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoutputStream File . flush () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Download Result Listener . on Success ( file Location . path ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( is Note Enabled ) Ġnotification Manager . cancel ( 0 ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġreturn Ġfile Location . absolute Path čĊĠĠĠ Ġ} čĊčĊčĊĠĠĠ Ġfun Ġbuild Note (): ĠBuilder { čĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= Ġif ( VERSION . SDK _ INT Ġ>= ĠVERSION _ CODES . O ) ĠBuilder ( context , Ġchannel Id ) Ġelse ĠBuilder ( context ) čĊĠĠĠĠĠĠĠ Ġbuilder . setContent Title ( context . getString ( R . string . download ing )) čĊĠĠĠĠĠĠĠ Ġbuilder . setAuto Cancel ( false ) čĊĠĠĠĠĠĠĠ Ġbuilder . set Small Icon ( android . R . drawable . stat _ sys _ download ) čĊĠĠĠĠĠĠĠ Ġbuilder . set O ngo ing ( true ) čĊĠĠĠĠĠĠĠ Ġreturn Ġbuilder čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġinternal Ġclass ĠFile Thread Factory Ġ: ĠThread Factory Ġ{ čĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnew Thread ( run nable : ĠRunnable ): ĠThread Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠThread ( run nable ). apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ" FileManager ĠThread " čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpriority Ġ= ĠProcess . THREAD _ PRIORITY _ BACKGROUND čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} č Ċ }