package Ġme . sh ou h eng . samples . store Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . provider . Documents Contract Ċ import Ġandroid . text . TextUtils Ċ import Ġandroid . view . View Ċ import Ġandroidx . activity . result . Activity Result Launcher Ċ import Ġandroidx . activity . result . contract . Activity Result Contract Ċ import Ġandroidx . annotation . Requires Api Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . document file . provider . Document File Ċ import Ġme . sh ou h eng . samples . R Ċ import Ġme . sh ou h eng . utils . data . Encode Utils Ċ import Ġme . sh ou h eng . utils . k tx . on De bounc ed Click Ċ import Ġme . sh ou h eng . utils . k tx . toast Ċ import Ġme . sh ou h eng . utils . store . IO Utils Ċ import Ġme . sh ou h eng . utils . store . Path Utils Ċ import Ġme . sh ou h eng . utils . store . SP Utils Ċ import Ġjava . io . File Ċ import Ġjava . util .* Ċ Ċ /** ĠTo Ġmake Ġa Ġsample Ġfor Ġstorage Ġusage Ġon ĠAndroid Ġ 1 1 . Ġ*/ Ċ class ĠStorage Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġrequest : ĠActivity Result Launcher < Unit >? Ġ= Ġnull ĊĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . LO L LI POP ) ĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ storage ) ĊĠĠĠĠĠĠĠ Ġbuild Permission Request () ĊĠĠĠĠĠĠĠ ĠfindViewById < View >( R . id . btn _ request ). on De bounc ed Click Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest ?. launch ( Unit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠfindViewById < View >( R . id . btn _ permission ). on De bounc ed Click Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoast (" Per mitted : Ġ[ ${ is External Storage Permission Granted ()} ]") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠfindViewById < View >( R . id . btn _ write ). on De bounc ed Click Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is External Storage Permission Granted ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠwriteTo Path () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠfindViewById < View >( R . id . btn _ read ). on De bounc ed Click Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is External Storage Permission Granted ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Path () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠfindViewById < View >( R . id . btn _ delete ). on De bounc ed Click Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is External Storage Permission Granted ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠfindViewById < View >( R . id . btn _ rename _ dir ). on De bounc ed Click Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is External Storage Permission Granted ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrename Dir () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠfindViewById < View >( R . id . btn _ rename _ file ). on De bounc ed Click Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is External Storage Permission Granted ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrename File () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠfindViewById < View >( R . id . btn _ write _ old ). on De bounc ed Click Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is External Storage Permission Granted ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite By File () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠfindViewById < View >( R . id . btn _ list _ all ). on De bounc ed Click Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is External Storage Permission Granted ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist All () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . LO L LI POP ) ĊĠĠĠ Ġprivate Ġfun Ġbuild Permission Request () Ġ{ ĊĠĠĠĠĠĠĠ Ġrequest Ġ= Ġregister For Activity Result ( object Ġ: ĠActivity Result Contract < Unit , ĠUnit >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcreate Intent ( context : ĠContext , Ġinput : ĠUnit ?): ĠIntent Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġuri Ġ= ĠUri . parse (" content :// com . android . external storage . documents / tree / primary % 3 A Android % 2 F data ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġuri Ġ= ĠUri . parse (" content :// com . android . external storage . documents / tree / primary % 3 A Android ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġuri Ġ= ĠUri . parse (" content :// com . android . external storage . documents / tree / primary ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuri Ġ= ĠDocument File . from Tree Uri ( this @ Storage Activity , Ġuri )?. uri ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi Ġ= ĠIntent ( Intent . ACTION _ OPEN _ DOCUMENT _ TREE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi . flags Ġ= Ġ( Intent . FLAG _ GRANT _ READ _ URI _ PERMISSION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġor ĠIntent . FLAG _ GRANT _ WRITE _ URI _ PERMISSION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġor ĠIntent . FLAG _ GRANT _ PER SIST ABLE _ URI _ PERMISSION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġor ĠIntent . FLAG _ GRANT _ PREFIX _ URI _ PERMISSION ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi . putExtra ( Documents Contract . EXTRA _ INITIAL _ URI , Ġuri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġi ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġparse Result ( result Code : ĠInt , Ġintent : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Code Ġ!= ĠActivity . RESULT _ OK ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri : ĠUri Ġ= Ġintent ?. data Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSP Utils . get (). put ("__ external _ storage _ path ", Ġuri . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Resolver . take Persist able Uri Permission ( uri , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent . FLAG _ GRANT _ READ _ URI _ PERMISSION Ġor ĠIntent . FLAG _ GRANT _ WRITE _ URI _ PERMISSION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) Ġ{} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠwriteTo Path () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuri String Ġ= ĠSP Utils . get (). getString ("__ external _ storage _ path ") ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠUri . parse ( uri String ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroot Ġ= ĠDocument File . from Tree Uri ( this , Ġuri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdoc Ġ= Ġcreate Or Exists File ( root , Ġ" test _ a ", Ġ" application / txt ", Ġ"${ System . currentTimeMillis ()}. txt ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġo us Ġ= Ġthis . content Resolver . open OutputStream ( doc !!. uri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġret Ġ= ĠIO Utils . write 2 Stream ( ous , Ġ" sample Ġa ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoast (" Result : Ġ$ ret ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdoc Ġ= Ġcreate Or Exists File ( root , Ġ" test _ a / test _ a _ b ", Ġ" application / txt ", Ġ"${ System . currentTimeMillis ()}. txt ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġo us Ġ= Ġthis . content Resolver . open OutputStream ( doc !!. uri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġret Ġ= ĠIO Utils . write 2 Stream ( ous , Ġ" sample Ġa Ġb ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoast (" Result : Ġ$ ret ") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoast (" failed !") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġread Path () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuri String Ġ= ĠSP Utils . get (). getString ("__ external _ storage _ path ") ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠUri . parse ( uri String ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroot Ġ= ĠDocument File . from Tree Uri ( this , Ġuri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġ" sample . txt " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdoc Ġ= Ġcreate Or Exists File ( root , Ġ" test _ a ", Ġ" application / txt ", Ġname ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġo us Ġ= Ġthis . content Resolver . open OutputStream ( doc !!. uri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġret Ġ= ĠIO Utils . write 2 Stream ( ous , Ġ" sample Ġa ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoast (" Write Ġsucceed : Ġ$ ret ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠgetFile ( root , Ġ" test _ a ", Ġname ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġins Ġ= Ġcontent Resolver . open InputStream ( file !!. uri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Ġ= ĠIO Utils . is 2 String ( ins ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoast (" Read : Ġ$ text ") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoast (" failed !") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdelete () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuri String Ġ= ĠSP Utils . get (). getString ("__ external _ storage _ path ") ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠUri . parse ( uri String ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroot Ġ= ĠDocument File . from Tree Uri ( this , Ġuri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġ" sample . txt " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdoc Ġ= ĠgetFile ( root , Ġ" test _ a ", Ġname ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( doc Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoast (" File Ġnot Ġfound !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġret Ġ= Ġdoc . delete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoast (" Deleted : Ġ$ ret ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoast (" failed !") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrename Dir () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuri String Ġ= ĠSP Utils . get (). getString ("__ external _ storage _ path ") ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠUri . parse ( uri String ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroot Ġ= ĠDocument File . from Tree Uri ( this , Ġuri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdoc Ġ= Ġget Directory ( root , Ġ" test _ a ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( doc Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoast (" Directory Ġnot Ġfound !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġret Ġ= Ġdoc . rename To (" test _ a _ re named ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoast (" Rename : Ġ$ ret ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoast (" failed !") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrename File () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuri String Ġ= ĠSP Utils . get (). getString ("__ external _ storage _ path ") ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠUri . parse ( uri String ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroot Ġ= ĠDocument File . from Tree Uri ( this , Ġuri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġ" sample . txt " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdoc Ġ= ĠgetFile ( root , Ġ" test _ a ", Ġname ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( doc Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoast (" File Ġnot Ġfound !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġret Ġ= Ġdoc . rename To (" sample _ re named . txt ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoast (" Rename : Ġ$ ret ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoast (" failed !") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite By File () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuri String Ġ= ĠSP Utils . get (). getString ("__ external _ storage _ path ") ĊĠĠĠĠĠĠĠ Ġval Ġleft Ġ= Ġuri String . remove Prefix (" content :// com . android . external storage . documents / tree / primary % 3 A ") ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= ĠEncode Utils . url Decode ( left ) ĊĠĠĠĠĠĠĠ Ġval Ġroot Ġ= ĠPath Utils . get External Storage Path () ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ("$ root ${ File . separator }$ path ", Ġ" write _ old . text ") ĊĠĠĠĠĠĠĠ ĠIO Utils . writeFile FromString ( file , Ġ" test Ġtest ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlist All () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuri String Ġ= ĠSP Utils . get (). getString ("__ external _ storage _ path ") ĊĠĠĠĠĠĠĠ Ġval Ġleft Ġ= Ġuri String . remove Prefix (" content :// com . android . external storage . documents / tree / primary % 3 A ") ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= ĠEncode Utils . url Decode ( left ) ĊĠĠĠĠĠĠĠ Ġval Ġroot Ġ= ĠPath Utils . get External Storage Path () ĊĠĠĠĠĠĠĠ Ġval Ġfiles Ġ= ĠFile ("$ root ${ File . separator }$ path "). list () ĊĠĠĠĠĠĠĠ Ġtoast ( Arrays . toString ( files )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Or Exists File ( ĊĠĠĠĠĠĠĠ Ġroot : ĠDocument File ?, ĊĠĠĠĠĠĠĠ Ġdirectory Path : ĠString , ĊĠĠĠĠĠĠĠ ĠmimeType : ĠString , ĊĠĠĠĠĠĠĠ ĠfileName : ĠString ĊĠĠĠ Ġ): ĠDocument File ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( root Ġ== Ġnull ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġdir Ġ= Ġcreate Or Exists Directory ( root , Ġdirectory Path ) ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġdir ?. find File ( fileName ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( file Ġ!= Ġnull Ġ&& Ġfile . isFile ) Ġfile Ġelse Ġdir ?. create File ( mime Type , ĠfileName ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Or Exists Directory ( root : ĠDocument File ?, Ġdirectory Path : ĠString ): ĠDocument File ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( root Ġ== Ġnull ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġparts Ġ= Ġdirectory Path . split ( File . separator ). to Typed Array () ĊĠĠĠĠĠĠĠ Ġvar Ġdir Ġ= Ġroot ĊĠĠĠĠĠĠĠ Ġparts . filter Ġ{ Ġit . isNotEmpty () Ġ}. forEach Ġ{ Ġpart Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdir Ġ= Ġdir ?. list Files ()?. find Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpart Ġ== Ġit . name Ġ&& Ġit . isDirectory ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġdir ?. create Directory ( part ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġdir ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠGet Ġdocument Ġfile Ġunder Ġroot Ġwith Ġgiven Ġname . Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠgetFile ( root : ĠDocument File ?, Ġdirectory Path : ĠString , ĠfileName : ĠString ): ĠDocument File ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdir Ġ= Ġget Directory ( root , Ġdirectory Path ) ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġdir ?. find File ( fileName ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( file Ġ!= Ġnull Ġ&& Ġfile . isFile Ġ) Ġfile Ġelse Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠGet Ġdocument Ġfile Ġdirectory Ġunder Ġroot Ġwith Ġgiven Ġpath . Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Directory ( root : ĠDocument File ?, Ġdirectory Path : ĠString ): ĠDocument File ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( root Ġ== Ġnull ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġparts Ġ= Ġdirectory Path . split ( File . separator ). to Typed Array () ĊĠĠĠĠĠĠĠ Ġvar Ġdir Ġ= Ġroot ĊĠĠĠĠĠĠĠ Ġparts . filter Ġ{ Ġit . isNotEmpty () Ġ}. forEach Ġ{ Ġpart Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdir Ġ= Ġdir ?. list Files ()?. find Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpart Ġ== Ġit . name Ġ&& Ġit . isDirectory ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġreturn @ forEach ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġdir ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠIs Ġexternal Ġstorage Ġwrite Ġpermission Ġgranted . Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġis External Storage Permission Granted (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= ĠSP Utils . get (). getString ("__ external _ storage _ path ") ĊĠĠĠĠĠĠĠ Ġif Ġ( TextUtils . isEmpty ( path )) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġuri 1 Ġ= ĠUri . parse ( path ) ĊĠĠĠĠĠĠĠ Ġval Ġdocument File Ġ= ĠDocument File . from Tree Uri ( this , Ġuri 1 ) Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġdocument File . can Write () ĊĠĠĠ Ġ} Ċ } Ċ