package Ġit . w az abit . dev . extensions Ċ Ċ import Ġandroid . content . Content Resolver Ċ import Ġandroid . content . Context Ċ import Ġandroid . net . Uri Ċ import Ġandroid . provider . Open able Columns Ċ import Ġandroid . webkit . MimeType Map Ċ import Ġjava . io . File Ċ Ċ data Ġclass ĠFileInfo ( ĊĠĠĠ Ġval Ġname : String , ĊĠĠĠ Ġval Ġsize : Long , ĊĠĠĠ Ġval ĠmimeType : String ? Ċ ){ ĊĠĠĠ Ġval Ġextension : String ĊĠĠĠ Ġget () Ġ{ Ġreturn Ġ Ġname . substring ( name . lastIndexOf (".") Ġ+ Ġ 1 )} Ċ } Ċ Ċ object ĠFileUtils Ġ{ ĊĊĊĠĠĠ Ġfun Ġsave To Files Dir ( context : ĠContext , Ġuri : Uri ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Info Ġ= Ġcontext . content Resolver . get FileInfo ( uri ) ĊĊĠĠĠĠĠĠĠ Ġcontext . open File Output ( fileInfo . name , ĠContext . MODE _ PRIVATE ). use Ġ{ Ġout Put Stream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . content Resolver . open InputStream ( uri ). use Ġ{ ĠinputStream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠinputStream ?. copy To ( out Put Stream ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠFile ( context . files Dir , fileInfo . name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsave To Cache Dir ( context : ĠContext , Ġuri : Uri ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Info Ġ= Ġcontext . content Resolver . get FileInfo ( uri ) ĊĊĠĠĠĠĠĠĠ Ġcontext . open File Output ( fileInfo . name , ĠContext . MODE _ PRIVATE ). use Ġ{ Ġout Put Stream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . content Resolver . open InputStream ( uri ). use Ġ{ ĠinputStream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠinputStream ?. copy To ( out Put Stream ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠFile ( context . cacheDir , fileInfo . name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget FileInfo ( context : ĠContext , uri : ĠUri ): ĠFileInfo Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontent Resolver Ġ= Ġcontext . content Resolver ĊĠĠĠĠĠĠĠ Ġreturn Ġcontent Resolver . get FileInfo ( uri ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Temporary File ( context : ĠContext , uri : ĠUri ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Info Ġ= Ġget FileInfo ( context , Ġuri ) ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile . create TempFile ( fileInfo . name , Ġfile Info . extension , Ġcontext . cacheDir ) ĊĠĠĠĠĠĠĠ Ġcontext . open File Output ( fileInfo . name , ĠContext . MODE _ PRIVATE ). use Ġ{ Ġout Put Stream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . inputStream (). use Ġ{ ĠinputStream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠinputStream . copy To ( out Put Stream ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfile ĊĠĠĠ Ġ} ĊĊ Ċ } Ċ Ċ fun ĠContent Resolver . get FileInfo ( uri : Uri ) Ġ: ĠFileInfo { ĊĠĠĠ Ġif Ġ( uri . scheme Ġ== Ġ" file ") Ġerror (" Invalid Ġscheme Ġfile :// ") ĊĠĠĠ Ġvar Ġfile Info : FileInfo ? Ġ= Ġnull ĊĠĠĠ Ġval ĠmimeType = ĠgetType ( uri ) Ġ?: Ġerror (" Unknown Ġmime Ġtype ") ĊĠĠĠ Ġquery ( uri , Ġnull , Ġnull , Ġnull , Ġnull )?. use Ġ{ ĊĠĠĠĠĠĠĠ Ġfile Info Ġ= Ġit . let Ġ{ cursor -> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Index Ġ= Ġcursor . getColumnIndex ( Open able Columns . DISPLAY _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Index Ġ= Ġcursor . getColumnIndex ( Open able Columns . SIZE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . moveTo First () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠFileInfo ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . getString ( name Index ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . getLong ( size Index ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmimeType ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġfile Info !! Ċ } ĊĊĊ Ċ fun ĠFile . get FileInfo () Ġ: ĠFileInfo { ĊĠĠĠ Ġreturn ĠFileInfo ( ĊĠĠĠĠĠĠĠ Ġname , ĊĠĠĠĠĠĠĠ Ġlength (), ĊĠĠĠĠĠĠĠ Ġget MimeType () ĊĠĠĠ Ġ) Ċ } ĊĊ Ċ fun ĠFile . copy To ( uri : Uri , Ġcontent Resolver : ĠContent Resolver ) Ġ{ ĊĠĠĠ Ġcontent Resolver . open OutputStream ( uri )?. use Ġ{ ĠoutputStream Ġ-> ĊĠĠĠĠĠĠĠ ĠinputStream (). use Ġ{ ĠinputStream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠinputStream . copy To ( output Stream ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠFile . get MimeType ( fallback : ĠString Ġ= Ġ"* /* "): ĠString Ġ{ ĊĠĠĠ Ġreturn ĠMime TypeMap . getFile Extension From Url ( toString ()) ĊĠĠĠĠĠĠĠ Ġ? . run Ġ{ ĠMime TypeMap . get Singleton (). get MimeType From Extension ( toLowerCase ()) Ġ} ĊĠĠĠĠĠĠĠ Ġ?: Ġfallback Ċ } ĊĊĊĊĊ