package Ġcom . ang gray udi . material preference . util Ċ Ċ import Ġandroid . annotation . Target Api Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Stat Fs Ċ import Ġandroid . provider . Documents Contract Ċ import Ġandroid . system . Errno Exception Ċ import Ġandroid . system . Os Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . annotation . Ui Thread Ċ import Ġandroidx . annotation . Worker Thread Ċ import Ġandroidx . core . content . File Provider Ċ import Ġandroidx . document file . provider . Document File Ċ import Ġcom . af ol le st ad . material dialogs . Material Dialog Ċ import Ġcom . af ol le st ad . material dialogs . list . list Items Ċ import Ġcom . ang gray udi . material preference . R Ċ import Ġcom . ang gray udi . material preference . callback . Storage Permission Den ial Exception Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjava . io .* Ċ import Ġjava . net . URL Decoder Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* Ġ@ author ĠAng gray udi ĠH Ċ Ġ*/ Ċ object ĠFileUtils Ġ{ ĊĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" FileUtils " ĊĊĠĠĠ Ġconst Ġval ĠSTORAGE _ PERMISSION _ GRAN TED Ġ= Ġ 1 2 0 ĊĠĠĠ Ġconst Ġval ĠSTORAGE _ PERMISSION _ NOT _ GRAN TED Ġ= Ġ 1 2 1 ĊĠĠĠ Ġconst Ġval ĠS DC ARD _ URI _ PERMISSION _ NOT _ GRAN TED Ġ= Ġ 1 2 2 ĊĊĠĠĠ Ġconst Ġval ĠREQUEST _ CODE _ STORAGE _ GET _ FOLDER Ġ= Ġ 1 1 1 ĊĠĠĠ Ġconst Ġval ĠREQUEST _ CODE _ STORAGE _ GET _ SINGLE _ FILE Ġ= Ġ 1 1 2 ĊĠĠĠ Ġconst Ġval ĠREQUEST _ CODE _ STORAGE _ GET _ SINGLE _ MULTI _ FILE Ġ= Ġ 1 1 3 ĊĠĠĠ Ġconst Ġval ĠREQUEST _ CODE _ REQUIRE _ SD CARD _ ROOT _ PATH _ PERMISSION S Ġ= Ġ 1 1 4 ĊĠĠĠ Ġconst Ġval ĠREQUEST _ CODE _ REQUIRE _ SD CARD _ FILE _ ROOT _ PATH _ PERMISSION S Ġ= Ġ 1 1 5 ĊĊĠĠĠ Ġconst Ġval ĠUNKNOWN _ MIME _ TYPE Ġ= Ġ" application / octet - stream " ĊĊĠĠĠ Ġvar Ġs Moving File : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġfun Ġresolve Path From Uri ( data : ĠIntent ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdecoded Path Ġ= Ġdata . data !!. path ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . KIT K AT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( data . data !!. authority ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" com . android . external storage . documents " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwithout Uri Ġ= ĠgetString Between ( decoded Path !! , Ġ'/', Ġ': ') Ġ+ Ġdecoded Path . substring ( decoded Path . indexOf (': '), Ġdecoded Path . length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsd card Id Ġ= Ġwithout Uri . substring ( 0 , Ġwithout Uri . indexOf (': ') Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub Folder Ġ= Ġwithout Uri . substring ( without Uri . indexOf (': ') Ġ+ Ġ 1 , Ġwithout Uri . length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sd card Id Ġ== Ġ" primary :") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsd card Id Ġ= ĠSave Dir . EXTERNAL Ġ+ Ġ"/" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsd card Id Ġ+ Ġsub Folder ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(" file " Ġ== Ġdata . data !!. scheme ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdata . data !!. path ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠSave Dir . EXTERNAL ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġresolve Sd Card Path ( data : ĠIntent ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdecoded Path Ġ= Ġdecode Uri ( data . data !!. path ) ĊĠĠĠĠĠĠĠ Ġval Ġwithout Uri Ġ= ĠgetString Between ( decoded Path !! , Ġ'/', Ġ': ') Ġ+ Ġdecoded Path . substring ( decoded Path . indexOf (': '), Ġdecoded Path . length ) ĊĠĠĠĠĠĠĠ Ġvar Ġsd card Id Ġ= Ġwithout Uri . substring ( 0 , Ġwithout Uri . indexOf (': ') Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġsub Folder Ġ= Ġwithout Uri . substring ( without Uri . indexOf (': ') Ġ+ Ġ 1 , Ġwithout Uri . length ) ĊĠĠĠĠĠĠĠ Ġif Ġ( sd card Id Ġ== Ġ" primary :") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsd card Id Ġ= ĠSave Dir . EXTERNAL Ġ+ Ġ"/" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsd card Id Ġ+ Ġsub Folder ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsave Uri Permission ( context : ĠContext , Ġdata : ĠIntent ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġdata . data !!. path ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . KIT K AT Ġ&& Ġpath !!. startsWith ("/ tree /") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ! path . startsWith ("/ tree / primary ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroot Ġ= ĠUri . parse (" content :// com . android . external storage . documents / tree /" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString Between ( data . data ?. path !! , Ġ'/', Ġ': ') Ġ+ Ġ"% 3 A ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data . data Ġ== Ġroot ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtake Flags Ġ= ĠIntent . FLAG _ GRANT _ READ _ URI _ PERMISSION Ġor ĠIntent . FLAG _ GRANT _ WRITE _ URI _ PERMISSION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . content Resolver . take Persist able Uri Permission ( root , Ġtake Flags ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠSecurity Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( context , ĠR . string . please _ grant _ storage _ permission , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( context , ĠR . string . not _ root _ path , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Target Api ( Build . VERSION _ CODES . KIT K AT ) ĊĠĠĠ Ġfun Ġis Sd Card Uri Permissions Granted ( context : ĠContext , Ġdata : ĠIntent ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġroot Ġ= ĠUri . parse (" content :// com . android . external storage . documents / tree /" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString Between ( data . data ?. path !! , Ġ'/', Ġ': ') Ġ+ Ġ"% 3 A ") ĊĠĠĠĠĠĠĠ Ġcontext . content Resolver . pers isted Uri Permissions . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . is Read Permission Ġ&& Ġit . is Write Permission Ġ&& Ġit . uri Ġ== Ġroot ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( root Ġ== Ġdata . data ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtake Flags Ġ= ĠIntent . FLAG _ GRANT _ READ _ URI _ PERMISSION Ġor ĠIntent . FLAG _ GRANT _ WRITE _ URI _ PERMISSION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . content Resolver . take Persist able Uri Permission ( root , Ġtake Flags ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignore : ĠSecurity Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Target Api ( Build . VERSION _ CODES . KIT K AT ) ĊĠĠĠ Ġfun Ġis Sd Card Uri Permissions Granted ( context : ĠContext , Ġsd card Id : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġroot Ġ= ĠUri . parse (" content :// com . android . external storage . documents / tree /$ sd card Id % 3 A ") ĊĠĠĠĠĠĠĠ Ġcontext . content Resolver . pers isted Uri Permissions . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . is Read Permission Ġ&& Ġit . is Write Permission Ġ&& Ġit . uri Ġ== Ġroot ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġ[ Document File ] Ġobject Ġfrom ĠSD Ġcard . ĊĠĠĠĠ Ġ* Ġ@ param Ġdirectory ĠSD Ġcard ĠID Ġfollowed Ġby Ġdirectory Ġname , Ġfor Ġexample Ġ` 6 8 8 1 - 2 2 4 9 : Download / Archive `, ĊĠĠĠĠ Ġ* Ġwhere ĠID Ġfor ĠSD Ġcard Ġis Ġ` 6 8 8 1 - 2 2 4 9 ` ĊĠĠĠĠ Ġ* Ġ@ param ĠfileName Ġfor Ġexample Ġ` intel _ h ax m . zip ` ĊĠĠĠĠ Ġ* Ġ@ return Ġ` null ` Ġif Ġdoes Ġnot Ġexist ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget External File ( context : ĠContext , Ġdirectory : ĠString , ĠfileName : ĠString ?): ĠDocument File ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fileName Ġ!= Ġnull ) Ġget External File ( context , Ġgenerate File Location ( directory , ĠfileName )) Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠStorage Permission Den ial Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Storage Permission Den ial Exception :: class ) ĊĠĠĠ Ġprivate Ġfun Ġget External File ( context : ĠContext , Ġfile : ĠString ): ĠDocument File ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Ġ= Ġget External Root ( context , Ġfile ) ĊĠĠĠĠĠĠĠ Ġval Ġcleaned Path Ġ= Ġclean Sd Card Path ( file ) ĊĠĠĠĠĠĠĠ Ġif Ġ( cleaned Path . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdirs Ġ= Ġif Ġ( cleaned Path . contains ("/ ")) Ġcleaned Path . split ("/ ". to Regex ()). drop Last While Ġ{ Ġit . isEmpty () Ġ}. to Typed Array () Ġelse ĠarrayOf ( cleaned Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġdirs . size Ġ&& Ġcurrent Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ġ= Ġcurrent . find File ( dirs [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcurrent ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Storage Permission Den ial Exception :: class ) ĊĠĠĠ Ġprivate Ġfun Ġget External Folder ( context : ĠContext , Ġfile : ĠString ): ĠDocument File ? Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠUri . parse (" content :// com . android . external storage . documents / tree /" Ġ+ ĠUri . encode ( file )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDocument File . from Tree Uri ( context , Ġuri ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠSecurity Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠStorage Permission Den ial Exception ( context ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Storage Permission Den ial Exception :: class ) ĊĠĠĠ Ġprivate Ġfun Ġget External Root ( context : ĠContext , Ġfolder : ĠString ): ĠDocument File ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget External Folder ( context , Ġfolder . substring ( 0 , Ġfolder . indexOf (': ') Ġ+ Ġ 1 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( FileNotFoundException :: class ) ĊĠĠĠ Ġfun Ġopen OutputStream ( context : ĠContext , Ġfile : ĠDocument File ): ĠOutputStream ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( file . uri . scheme Ġ== Ġ" file ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhandle Ġfile Ġfrom Ġinternal Ġstorage ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFileOutputStream ( File ( file . uri . path !! ), Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . content Resolver . open OutputStream ( file . uri , Ġ" wa ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( FileNotFoundException :: class ) ĊĠĠĠ Ġfun Ġopen InputStream ( context : ĠContext , Ġfile : ĠDocument File ): ĠInputStream ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( file . uri . scheme Ġ== Ġ" file ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhandle Ġfile Ġfrom Ġinternal Ġstorage ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFileInputStream ( File ( file . uri . path !! )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . content Resolver . open InputStream ( file . uri ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( FileNotFoundException :: class , ĠStorage Permission Den ial Exception :: class ) ĊĠĠĠ Ġfun Ġopen InputStream ( context : ĠContext , Ġfile : ĠString ): ĠInputStream ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( file . startsWith ("/ ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFileInputStream ( File ( file )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdocument File Ġ= Ġget External File ( context , Ġfile ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( document File Ġ!= Ġnull Ġ&& Ġdocument File . isFile ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . content Resolver . open InputStream ( document File . uri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠFileNotFoundException (" File Ġnot Ġfound : Ġ$ file ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdecode Uri ( uri : ĠString ?): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠURL Decoder . decode ( uri , Ġ" ISO - 8 8 5 9 - 1 ") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignore : ĠUnsupported EncodingException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuri ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclean Sd Card Path ( file : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresolved Path Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġval Ġtree Ġ= Ġfile . substring ( file . indexOf (': ') Ġ+ Ġ 1 , Ġfile . length ) ĊĠĠĠĠĠĠĠ Ġtree . split ("/ ". to Regex ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. drop Last While Ġ{ Ġit . isEmpty () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . trim Ġ{ Ġc Ġ-> Ġc Ġ<= Ġ' Ġ' Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . isNotEmpty () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġdirectory Ġ-> Ġresolved Path . append ( directory ). append ("/") Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( resolved Path . toString (). endsWith ("/ ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolved Path Ġ= ĠStringBuilder ( resolved Path . substring ( 0 , Ġresolved Path . length Ġ- Ġ 1 )) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresolved Path . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Storage Permission Den ial Exception :: class ) ĊĠĠĠ Ġfun Ġmkdir s ( context : ĠContext , Ġfolder : ĠString ): ĠDocument File ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( folder . startsWith ("/ ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( folder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . isDirectory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDocument File . from File ( file ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcurrent Directory Ġ= Ġget External Root ( context , Ġfolder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcleaned Path Ġ= Ġclean Sd Card Path ( folder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cleaned Path . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġif Ġ( cleaned Path . contains ("/ ")) Ġcleaned Path . split ("/ ". to Regex ()). drop Last While Ġ{ Ġit . isEmpty () Ġ}. to Typed Array () Ġelse ĠarrayOf ( cleaned Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Directory Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdocument File Ġ= Ġcurrent Directory ?. find File ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( document File Ġ== Ġnull Ġ|| Ġdocument File . isFile ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Directory Ġ= Ġcurrent Directory ?. create Directory ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( document File . isDirectory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Directory Ġ= Ġdocument File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠRuntimeException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Directory Ġ!= Ġnull Ġ&& Ġcurrent Directory !!. uri . path !!. endsWith ( cleaned Path )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcurrent Directory ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Storage Permission Den ial Exception :: class ) ĊĠĠĠ Ġfun Ġcreate ( context : ĠContext , Ġfolder : ĠString , ĠfileName : ĠString ): ĠDocument File ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( folder . startsWith ("/ ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( folder , ĠfileName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . parent File ?. mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( create ( file )) ĠDocument File . from File ( file ) Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdirectory Ġ= Ġmkdir s ( context , Ġfolder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdirectory ?. create File ( UNKNOWN _ MIME _ TYPE , ĠfileName ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Storage Permission Den ial Exception :: class ) ĊĠĠĠ Ġfun Ġrecreate ( context : ĠContext , Ġfolder : ĠString , ĠfileName : ĠString ): ĠDocument File ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( folder . startsWith ("/ ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( folder , ĠfileName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . parent File ?. mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( create ( file )) ĠDocument File . from File ( file ) Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdirectory Ġ= Ġmkdir s ( context , Ġfolder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( directory Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġdirectory . find File ( fileName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file Ġ!= Ġnull Ġ&& Ġfile . isFile ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdirectory ?. create File ( UNKNOWN _ MIME _ TYPE , ĠfileName ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate ( file : ĠFile ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . createNew File () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Storage Permission Den ial Exception :: class ) ĊĠĠĠ Ġfun Ġdelete ( context : ĠContext , Ġfolder : ĠString , ĠfileName : ĠString ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( folder . startsWith ("/ ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fileName Ġ!= Ġnull ) ĠFile ( folder , ĠfileName ). delete () Ġelse Ġfalse ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdocument File Ġ= Ġget External File ( context , Ġfolder , ĠfileName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdocument File Ġ!= Ġnull Ġ&& Ġdocument File . delete () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Storage Permission Den ial Exception :: class ) ĊĠĠĠ Ġfun Ġdelete ( context : ĠContext , Ġfolder : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( folder . startsWith ("/ ")) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( folder ). delete () ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdocument File Ġ= Ġget External File ( context , Ġfolder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdocument File Ġ!= Ġnull Ġ&& Ġdocument File . delete () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġresolve Parent File ( file : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFile ( file ). parent Ġ?: Ġfile . substring ( 0 , Ġfile . indexOf (': ') Ġ+ Ġ 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Storage Permission Den ial Exception :: class ) ĊĠĠĠ Ġfun Ġfile Exists ( context : ĠContext , Ġfile : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġf Ġ= ĠFile ( file ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( file . startsWith ("/ ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf . isFile ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġfile . substring ( file . lastIndexOf ( if Ġ( file . contains ("/ ")) Ġ'/' Ġelse Ġ': ') Ġ+ Ġ 1 , Ġfile . length ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdocument File Ġ= Ġget External File ( context , Ġresolve Parent File ( file ), Ġname ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdocument File Ġ!= Ġnull Ġ&& Ġdocument File . isFile ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Storage Permission Den ial Exception :: class ) ĊĠĠĠ Ġfun Ġfile Exists ( context : ĠContext , Ġfolder : ĠString , Ġfile : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( folder . startsWith ("/ ")) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( folder , Ġfile ). isFile ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdocument File Ġ= Ġget External File ( context , Ġfolder , Ġfile ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdocument File Ġ!= Ġnull Ġ&& Ġdocument File . isFile ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Storage Permission Den ial Exception :: class ) ĊĠĠĠ Ġfun ĠfileSize ( context : ĠContext , Ġfolder : ĠString , ĠfileName : ĠString ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( folder . startsWith ("/ ")) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( folder , ĠfileName ). length () ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget External File ( context , Ġfolder , ĠfileName )?. length () Ġ?: Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Storage Permission Den ial Exception :: class ) ĊĠĠĠ Ġfun ĠfileSize ( context : ĠContext , Ġfile : ĠString ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( file . startsWith ("/ ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( file ). length () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdocument File Ġ= Ġget External File ( context , Ġfile ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdocument File ?. length () Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġas Document File ( context : ĠContext , Ġfolder : ĠString , Ġfilename : ĠString ?): ĠDocument File ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( folder . startsWith ("/ ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( filename Ġ!= Ġnull ) ĠDocument File . from File ( File ( folder , Ġfilename )) Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget External File ( context , Ġfolder , Ġfilename ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Storage Permission Den ial Exception :: class ) ĊĠĠĠ Ġfun Ġas Document File ( context : ĠContext , Ġfile : ĠString ): ĠDocument File ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( file . startsWith ("/ ")) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDocument File . from File ( File ( file )) ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget External File ( context , Ġfile ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Storage Permission Den ial Exception :: class ) ĊĠĠĠ Ġfun Ġas Document Folder ( context : ĠContext , Ġfolder : ĠString ): ĠDocument File ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( folder . startsWith ("/ ")) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDocument File . from File ( File ( folder )) ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget External Folder ( context , Ġfolder ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Base Name ( filename : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġorg . apache . commons . io . Filename Utils . getBase Name ( if Ġ( filename . contains ("/ ")) Ġfilename Ġelse Ġfilename . replace First (" :" . to Regex (), Ġ"/ ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Extension ( filename : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġorg . apache . commons . io . Filename Utils . getExtension ( if Ġ( filename . contains ("/ ")) Ġfilename Ġelse Ġfilename . replace First (" :" . to Regex (), Ġ"/ ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsame Partition ( path 1 : ĠString , Ġpath 2 : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( path 1 . startsWith ("/") Ġ&& Ġpath 2 . startsWith ("/ ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( path 1 . startsWith ("/") Ġ|| Ġpath 2 . startsWith ("/ ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġsd card 1 Ġ= Ġpath 1 . substring ( 0 , Ġpath 1 . indexOf (': ')) ĊĠĠĠĠĠĠĠ Ġval Ġsd card 2 Ġ= Ġpath 2 . substring ( 0 , Ġpath 2 . indexOf (': ')) ĊĠĠĠĠĠĠĠ Ġreturn Ġsd card 1 Ġ== Ġsd card 2 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclose Stream ( close able : ĠClose able ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose able ?. close () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwrite File From InputStream ( stream : ĠInputStream , Ġfile : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġf Ġ= Ġfile ĊĠĠĠĠĠĠĠ Ġvar Ġoutput : ĠOutputStream ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( f . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf . createNew File () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf Ġ= ĠFile ( f . absolute Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Ġ= ĠFileOutputStream ( f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠByteArray ( 1 0 2 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġread Ġ= Ġstream . read ( buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( read Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . write ( buffer , Ġ 0 , Ġread ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Ġ= Ġstream . read ( buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose Stream ( output ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose Stream ( stream ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġ@ Throws ( Storage Permission Den ial Exception :: class ) ĊĠĠĠ Ġfun Ġmove File ( context : ĠContext , Ġsrc Path : ĠString , Ġdest Path : ĠString , Ġcallback : ĠFile Move Callback ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( src Path Ġ== Ġdest Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠ Ġif Ġ( callback Ġis ĠReal Time File Move Callback ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Moving File Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġ// Ġinternal ĊĠĠĠĠĠĠĠ Ġif Ġ( src Path . startsWith ("/") Ġ&& Ġdest Path . startsWith ("/ ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= ĠFile ( src Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdest Ġ= ĠFile ( dest Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( src . rename To ( dest )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Move Completed ( if Ġ( src . parent Ġ== Ġdest . parent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" File Ġrenamed " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" File Ġmoved Ġsuccessfully ", Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġinput : ĠInputStream ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġoutput : ĠOutputStream ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( callback . on Move Started ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dest . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate ( dest ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdest Ġ= ĠFile ( dest . absolute Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Ġ= ĠFileOutputStream ( dest ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Ġ= ĠFileInputStream ( src ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Move File ( src . length (), Ġinput , Ġoutput , Ġcallback ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠFileNotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Move Completed (" File Ġnot Ġfound ", Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose Stream ( input ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose Stream ( output ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġsplit ter Ġ= Ġif Ġ( dest Path . contains ("/ ")) Ġ'/' Ġelse Ġ':' ĊĠĠĠĠĠĠĠ Ġval Ġtarget Name Ġ= Ġdest Path . substring ( dest Path . lastIndexOf ( splitter ) Ġ+ Ġ 1 , Ġdest Path . length ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġsd Ġcard ĊĠĠĠĠĠĠĠ Ġif Ġ(! src Path . startsWith ("/") Ġ&& Ġ! dest Path . startsWith ("/ ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= Ġas Document File ( context , Ġsrc Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( src Ġ== Ġnull Ġ|| Ġ! src . isFile ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Move Completed (" File Ġnot Ġfound ", Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( resolve Parent File ( src Path ) Ġ== Ġresolve Parent File ( dest Path )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsuccess Ġ= Ġsrc . rename To ( target Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Move Completed ( if Ġ( success ) Ġ" File Ġrenamed " Ġelse Ġ" Cannot Ġrename Ġfile ", Ġsuccess ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( same Partition ( src Path , Ġdest Path )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdest Ġ= Ġmkdir s ( context , Ġresolve Parent File ( dest Path )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dest Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Move Completed (" Cannot Ġmove Ġthe Ġfile Ġto Ġdestination ", Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . N ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmov able Ġ= Ġtarget Name Ġ== Ġsrc . name Ġ|| Ġsrc . rename To ( target Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsuccess Ġ= Ġmov able Ġ&& ĠDocuments Contract . move Document ( context . content Resolver , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsrc . uri , Ġsrc . parent File !!. uri , Ġdest . uri ) Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Move Completed ( if Ġ( success ) Ġ" File Ġmoved Ġsuccessfully " Ġelse Ġ" Failed Ġto Ġmove Ġthe Ġfile ", Ġsuccess ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠFileNotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Move Completed (" File Ġnot Ġfound ", Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalStateException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Move Completed (" File Ġ$ target Name Ġalready Ġexists Ġin Ġtarget Ġdirectory .", Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUnder ĠN ou gat , Ġwe Ġmove Ġthe Ġfile Ġby Ġcopying Ġit , Ġand Ġdelete Ġthe Ġprevious Ġfile . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġdifferent Ġpartition ĊĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= Ġas Document File ( context , Ġsrc Path ) ĊĠĠĠĠĠĠĠ Ġif Ġ( src Ġ== Ġnull Ġ|| Ġ! src . isFile ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Move Completed (" File Ġnot Ġfound ", Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġoutput : ĠOutputStream ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġinput : ĠInputStream ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdest Ġ= Ġmkdir s ( context , Ġresolve Parent File ( dest Path )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dest Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Move Completed (" Cannot Ġmove Ġthe Ġfile Ġto Ġdestination ", Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( callback . on Move Started ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest Ġ= Ġdest . create File ( src . type Ġ?: ĠUNKNOWN _ MIME _ TYPE , Ġtarget Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" Unused Equals ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dest Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Move Completed (" Cannot Ġmove Ġthe Ġfile Ġto Ġdestination ", Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Ġ= Ġcontext . content Resolver . open OutputStream ( dest . uri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput Ġ= Ġcontext . content Resolver . open InputStream ( src . uri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( output Ġ== Ġnull Ġ|| Ġinput Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Move Completed (" Cannot Ġmove Ġthe Ġfile ", Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Move File ( src . length (), Ġinput , Ġoutput , Ġcallback ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠFileNotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Move Completed (" File Ġnot Ġfound ", Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose Stream ( output ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose Stream ( input ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Move File ( src Size : ĠLong , Ġinput : ĠInputStream , Ġoutput : ĠOutputStream , Ġcallback : ĠFile Move Callback ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtimer Ġ= ĠTimer () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠByteArray ( 1 0 2 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbyte Moved : ĠLong Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( callback Ġis ĠReal Time File Move Callback Ġ&& Ġsrc Size Ġ> Ġ 1 0 Ġ* ĠFile Size . MB ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimer . schedule ( object Ġ: ĠTimer Task () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Moving (( byte Moved Ġ* Ġ 1 0 0 Ġ/ Ġsrc Size ). toInt (), Ġbyte Moved ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ 1 , Ġ 7 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġread Ġ= Ġinput . read ( buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( read Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . write ( buffer , Ġ 0 , Ġread ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbyte Moved Ġ+= Ġread ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Ġ= Ġinput . read ( buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimer . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Move Completed (" File Ġmoved Ġsuccessfully ", Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimer . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Move Completed (" Failed Ġto Ġmove Ġthe Ġfile ", Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose Stream ( input ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose Stream ( output ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgenerate File Location ( folder : ĠString , ĠfileName : ĠString ?): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! folder . startsWith ("/ ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsd card Id Ġ= Ġfolder . substring ( 0 , Ġfolder . indexOf (': ') Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sd card Id Ġ== Ġfolder ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfolder Ġ+ ĠfileName !! ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ"$ folder /$ fileName " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshare File ( context : ĠContext , Ġfile : ĠDocument File ?, ĠmimeType : ĠString ?, Ġauthority : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( file Ġ!= Ġnull Ġ&& Ġfile . isFile ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Intent . ACTION _ SEND ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setType ( mime Type Ġ?: Ġ"* /* ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putExtra ( Intent . EXTRA _ SUBJECT , Ġfile . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putExtra ( Intent . EXTRA _ STREAM , Ġif Ġ( file . uri . scheme Ġ== Ġ" file ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile Provider . get Uri For File ( context , Ġauthority , ĠFile ( file . uri . path !! )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . uri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( intent . resolve Activity ( context . package Manager ) Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . startActivity ( Intent . create Chooser ( intent , Ġcontext . getString ( R . string . share _ file ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( context , ĠR . string . no _ app _ share _ file , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( context , ĠR . string . file _ not _ found , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshare File ( context : ĠContext , Ġfiles : ĠMutable List < Document File >, Ġauthority : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfiles . indices . reversed (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! files [ it ]. isFile ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiles . remove At ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( files . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġur is Ġ= ĠArrayList < Uri >( files . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfiles . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġur is . add ( if Ġ( it . uri . scheme Ġ== Ġ" file ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile Provider . get Uri For File ( context , Ġauthority , ĠFile ( it . uri . path !! )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . uri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Intent . ACTION _ SEND _ MULTIPLE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setType ("* /* ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put Parcelable ArrayList Extra ( Intent . EXTRA _ STREAM , Ġur is ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( intent . resolve Activity ( context . package Manager ) Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . startActivity ( Intent . create Chooser ( intent , Ġcontext . getString ( R . string . share _ file ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( context , ĠR . string . no _ app _ share _ file , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( context , ĠR . string . file _ not _ found , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Open Intent ( context : ĠContext , Ġfile : ĠDocument File , Ġauthority : ĠString ): ĠIntent Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠIntent ( Intent . ACTION _ VIEW ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Flags ( Intent . FLAG _ GRANT _ READ _ URI _ PERMISSION ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Flags ( Intent . FLAG _ ACTIVITY _ NEW _ TASK ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setData ( if Ġ( file . uri . scheme Ġ== Ġ" file ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile Provider . get Uri For File ( context , Ġauthority , ĠFile ( file . uri . path !! )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . uri ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġopen Document File ( context : ĠContext , Ġio Scope : ĠCor outine Scope , Ġui Scope : ĠCor outine Scope , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile : ĠString , Ġcallback : ĠFile Document Find Callback ) Ġ{ ĊĠĠĠĠĠĠĠ Ġio Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġas Document File ( context , Ġfile )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui Scope . launch Ġ{ Ġcallback . on Document File Found ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠStorage Permission Den ial Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui Scope . launch Ġ{ ĠToast . makeText ( context , Ġe . message , ĠToast . LENGTH _ SHORT ). show () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġopen File ( context : ĠContext , Ġio Scope : ĠCor outine Scope , Ġui Scope : ĠCor outine Scope , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile : ĠString , ĠmimeType : ĠString , Ġauthority : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġopen Document File ( context , Ġio Scope , Ġui Scope , Ġfile , Ġobject Ġ: ĠFile Document Find Callback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Document File Found ( file : ĠDocument File ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen File ( context , Ġfile , ĠmimeType , Ġauthority ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Ui Thread ĊĠĠĠ Ġfun Ġopen File ( context : ĠContext , Ġfile : ĠDocument File ?, ĠmimeType : ĠString ?, Ġauthority : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( file Ġ== Ġnull Ġ|| Ġ! file . isFile ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( context , ĠR . string . file _ not _ found , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= Ġcreate Open Intent ( context , Ġfile , Ġauthority ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . resolve Activity ( context . package Manager ) Ġ!= Ġnull Ġ-> Ġcontext . startActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . setType ( mime Type Ġ?: Ġfile . type ). resolve Activity ( context . package Manager ) Ġ!= Ġnull Ġ-> Ġcontext . startActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠMaterial Dialog ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. title ( R . string . open _ as ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. list Items ( R . array . open _ file _ options , ĠwaitFor Positive Button Ġ= Ġfalse ) Ġ{ Ġdialog , Ġindex , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmime s Ġ= ĠarrayOf (" image /* ", Ġ" audio /* ", Ġ" video /* ", Ġ" application / zip ", Ġ" text /* ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( intent . setType ( mime s [ index ]). resolve Activity ( context . package Manager ) Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . startActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( context , ĠR . string . no _ app _ to _ open _ file , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠMem erik sa Ġfilesystem Ġsu atu Ġstorage . Ġ*/ ĊĠĠĠ Ġ@ Worker Thread ĊĠĠĠ Ġfun Ġget FileSystem ( path : ĠFile ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmount Ġ= ĠRuntime . get Runtime (). exec (" mount ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreader Ġ= ĠBufferedReader ( InputStream Reader ( mount . inputStream )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmount . waitFor () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġline Ġ= Ġreader . readLine () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( line Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsplit Ġ= Ġline . split ("\\ s +". to Regex ()). drop Last While Ġ{ Ġit . isEmpty () Ġ}. to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġsplit . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( split [ i ] Ġ!= Ġ"/" Ġ&& Ġpath . absolute Path . startsWith ( split [ i ])) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsplit [ i Ġ+ Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline Ġ= Ġreader . readLine () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreader . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmount . destroy () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInterruptedException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠGet Ġavailable Ġspace Ġin Ġbytes . Ġ*/ ĊĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠ Ġfun Ġget Free Space ( context : ĠContext , Ġpath : ĠString ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcreate Folder AndGet Space : Ġ() Ġ-> ĠLong Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mkdir s ( context , Ġpath ) Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Free Space ( context , Ġpath ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . startsWith ("/") Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstat Ġ= ĠStat Fs ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . J EL LY _ BE AN _ MR 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstat . available Bytes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( stat . block Size Ġ* Ġstat . available Blocks ). to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBuild . VERSION . SDK _ INT Ġ>= Ġ 2 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . content Resolver . open FileDescriptor ( get External Folder ( context , Ġpath )?. uri ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġ 0 , Ġ" r ") ?. use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstats Ġ= ĠOs . f stat vfs ( it . file Descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstats . f _ b avail Ġ* Ġstats . f _ fr size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠErr no Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . message ?. contains (" No Ġsuch Ġfile Ġor Ġdirectory ") Ġ== Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcreate Folder AndGet Space () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠStorage Permission Den ial Exception ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠFileNotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcreate Folder AndGet Space () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠSecurity Exception ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . message ?. contains (" Invalid Ġpath : Ġ") Ġ== Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcreate Folder AndGet Space () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠGet Ġavailable Ġspace Ġin Ġbytes . Ġ*/ ĊĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠ Ġfun Ġget Used Space ( context : ĠContext , Ġpath : ĠString ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcreate Folder AndGet Space : Ġ() Ġ-> ĠLong Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mkdir s ( context , Ġpath ) Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Used Space ( context , Ġpath ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . startsWith ("/") Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstat Ġ= ĠStat Fs ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . J EL LY _ BE AN _ MR 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstat . total Bytes Ġ- Ġstat . available Bytes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( stat . block Size Ġ* Ġstat . block Count Ġ- Ġstat . block Size Ġ* Ġstat . available Blocks ). to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBuild . VERSION . SDK _ INT Ġ>= Ġ 2 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . content Resolver . open FileDescriptor ( get External Folder ( context , Ġpath )?. uri ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġ 0 , Ġ" r ") ?. use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstats Ġ= ĠOs . f stat vfs ( it . file Descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstats . f _ blocks Ġ* Ġstats . f _ fr size Ġ- Ġstats . f _ b avail Ġ* Ġstats . f _ fr size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠErr no Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . message ?. contains (" No Ġsuch Ġfile Ġor Ġdirectory ") Ġ== Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcreate Folder AndGet Space () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠStorage Permission Den ial Exception ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠFileNotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcreate Folder AndGet Space () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠSecurity Exception ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . message ?. contains (" Invalid Ġpath : Ġ") Ġ== Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcreate Folder AndGet Space () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠ Ġfun Ġget Storage Capacity ( context : ĠContext , Ġpath : ĠString ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcreate Folder AndGet Space : Ġ() Ġ-> ĠLong Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mkdir s ( context , Ġpath ) Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Storage Capacity ( context , Ġpath ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . startsWith ("/") Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstat Ġ= ĠStat Fs ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . J EL LY _ BE AN _ MR 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstat . total Bytes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( stat . block Size Ġ* Ġstat . block Count ). to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBuild . VERSION . SDK _ INT Ġ>= Ġ 2 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . content Resolver . open FileDescriptor ( get External Folder ( context , Ġpath )?. uri ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġ 0 , Ġ" r ") ?. use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstats Ġ= ĠOs . f stat vfs ( it . file Descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstats . f _ blocks Ġ* Ġstats . f _ fr size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠErr no Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . message ?. contains (" No Ġsuch Ġfile Ġor Ġdirectory ") Ġ== Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcreate Folder AndGet Space () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠStorage Permission Den ial Exception ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠFileNotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcreate Folder AndGet Space () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠSecurity Exception ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . message ?. contains (" Invalid Ġpath : Ġ") Ġ== Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcreate Folder AndGet Space () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget FileName ( url : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġu Ġ= Ġurl ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġu Ġ= ĠURL Decoder . decode ( url , Ġ" UTF - 8 ") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠUnsupported EncodingException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġu . substring ( u . lastIndexOf ('/') Ġ+ Ġ 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetString Between ( str : ĠString , Ġstart : ĠChar , Ġend : ĠChar ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( start Ġ!= Ġend ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġstr . indexOf ( end ) Ġ- Ġ 1 Ġdown To Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( str [ i ] Ġ== Ġstart ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstr . substring ( i Ġ+ Ġ 1 , Ġstr . indexOf ( end )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġstr . indexOf ( end ) Ġ+ Ġ 1 Ġuntil Ġstr . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( str [ i ] Ġ== Ġstart ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstr . substring ( str . indexOf ( start ) Ġ+ Ġ 1 , Ġi ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠFile Move Callback Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġ` true ` Ġif Ġyou Ġwant Ġto Ġmove Ġthe Ġfile Ġfrom Ġdifferent Ġthread ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġon Move Started (): ĠBoolean ĊĊĠĠĠĠĠĠĠ Ġfun Ġon Move Completed ( message : ĠString , Ġsuccess : ĠBoolean ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠReal Time File Move Callback Ġ: ĠFile Move Callback Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġon Moving ( progress : ĠInt , Ġbyte Moved : ĠLong ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠFile Document Find Callback Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġon Document File Found ( file : ĠDocument File ) ĊĠĠĠ Ġ} Ċ } Ċ