/* Ċ Ġ* ĠCopyright ĠÂ© Ġ 2 0 1 9 ĠWire Guard ĠLLC . ĠAll ĠRights ĠReserved . Ċ Ġ* ĠSPDX - License - Identifier : ĠApache - 2 . 0 Ċ Ġ*/ Ċ package Ġcom . wire guard . android . util Ċ Ċ import Ġandroid . content . Content Values Ċ import Ġandroid . content . Context Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Environment Ċ import Ġandroid . provider . Media Store Ċ import Ġandroid . provider . Media Store . Media Columns Ċ import Ġcom . wire guard . android . R Ċ import Ġjava . io . File Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . io . IOException Ċ import Ġjava . io . OutputStream Ċ Ċ object ĠDown loads File Saver Ġ{ ĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġfun Ġsave ( context : ĠContext , Ġname : ĠString , ĠmimeType : ĠString ?, Ġoverwrite Existing : ĠBoolean ) Ġ= Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . Q ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontent Resolver Ġ= Ġcontext . content Resolver ĊĠĠĠĠĠĠĠ Ġif Ġ( overwrite Existing ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Resolver . delete ( Media Store . Downloads . EXTERNAL _ CONTENT _ URI , ĠString . format ("% s Ġ= Ġ?", ĠMedia Columns . DISPLAY _ NAME ), ĠarrayOf ( name )) ĊĠĠĠĠĠĠĠ Ġval Ġcontent Values Ġ= ĠContent Values () ĊĠĠĠĠĠĠĠ Ġcontent Values . put ( Media Columns . DISPLAY _ NAME , Ġname ) ĊĠĠĠĠĠĠĠ Ġcontent Values . put ( Media Columns . MIME _ TYPE , ĠmimeType ) ĊĠĠĠĠĠĠĠ Ġval Ġcontent Uri Ġ= Ġcontent Resolver . insert ( Media Store . Downloads . EXTERNAL _ CONTENT _ URI , Ġcontent Values ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIOException ( context . getString ( R . string . create _ downloads _ file _ error )) ĊĠĠĠĠĠĠĠ Ġval Ġcontent Stream Ġ= Ġcontent Resolver . open OutputStream ( content Uri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIOException ( context . getString ( R . string . create _ downloads _ file _ error )) ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" DE PREC ATION ") Ġvar Ġcursor Ġ= Ġcontent Resolver . query ( content Uri , ĠarrayOf ( Media Columns . DATA ), Ġnull , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠ Ġvar Ġpath : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( cursor Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cursor . moveTo First ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Ġ= Ġcursor . getString ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( path Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath Ġ= Ġ" Download /" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Ġ= Ġcontent Resolver . query ( content Uri , ĠarrayOf ( Media Columns . DISPLAY _ NAME ), Ġnull , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cursor Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cursor . moveTo First ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Ġ+= Ġcursor . getString ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠDown loads File ( context , Ġcontent Stream , Ġpath , Ġcontent Uri ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" DE PREC ATION ") Ġval Ġpath Ġ= ĠEnvironment . get External Storage Public Directory ( Environment . DIRECTORY _ DOWNLOAD S ) ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( path , Ġname ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! path . isDirectory Ġ&& Ġ! path . mkdir s ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException ( context . getString ( R . string . create _ output _ dir _ error )) ĊĠĠĠĠĠĠĠ ĠDown loads File ( context , ĠFileOutputStream ( file ), Ġfile . absolute Path , Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠDown loads File ( private Ġval Ġcontext : ĠContext , Ġval ĠoutputStream : ĠOutputStream , Ġval ĠfileName : ĠString , Ġprivate Ġval Ġuri : ĠUri ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġdelete () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . Q ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . content Resolver . delete ( uri !! , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( fileName ). delete () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ