/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 1 ĠPat rick ĠGold inger Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġdev . pat rick gold . fl or is board . res Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . net . Uri Ċ import Ġjava . io . Buffered InputStream Ċ import Ġjava . io . Buffered OutputStream Ċ import Ġjava . io . BufferedReader Ċ import Ġjava . io . Buffered Writer Ċ import Ġkotlin . contracts . Invocation Kind Ċ import Ġkotlin . contracts . contract Ċ Ċ class ĠExternal Content Utils Ġprivate Ġconstructor () Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġinline Ġfun Ġ< R > Ġread From Uri ( context : ĠContext , Ġuri : ĠUri , ĠmaxSize : ĠInt , Ġblock : Ġ( it : ĠBuffered InputStream ) Ġ-> ĠR ): ĠResult < R > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontract Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalls In Place ( block , ĠInvocation Kind . AT _ MO ST _ ON CE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Resolver Ġ= Ġcontext . content Resolver ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠNullPointerException (" System Ġcontent Ġresolver Ġnot Ġavailable ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠinputStream Ġ= Ġcontent Resolver . open InputStream ( uri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠNullPointerException (" Cannot Ġopen Ġinput Ġstream Ġfor Ġgiven Ġuri Ġ'$ uri '") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġasset FileDescriptor Ġ= Ġcontent Resolver . open Asset FileDescriptor ( uri , Ġ" r ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠNullPointerException (" Cannot Ġopen Ġasset Ġfile Ġdescriptor Ġfor Ġgiven Ġuri Ġ'$ uri '") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( asset FileDescriptor . length Ġ> ĠmaxSize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Contents Ġof Ġgiven Ġuri Ġ'$ uri ' Ġexceeds Ġmaximum Ġsize Ġof Ġ$ maxSize Ġbytes !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠinputStream . buffered (). use Ġ{ Ġblock ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinline Ġfun Ġ< R > Ġread Text From Uri ( context : ĠContext , Ġuri : ĠUri , ĠmaxSize : ĠInt , Ġblock : Ġ( it : ĠBufferedReader ) Ġ-> ĠR ): ĠResult < R > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontract Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalls In Place ( block , ĠInvocation Kind . AT _ MO ST _ ON CE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Resolver Ġ= Ġcontext . content Resolver ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠNullPointerException (" System Ġcontent Ġresolver Ġnot Ġavailable ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠinputStream Ġ= Ġcontent Resolver . open InputStream ( uri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠNullPointerException (" Cannot Ġopen Ġinput Ġstream Ġfor Ġgiven Ġuri Ġ'$ uri '") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġasset FileDescriptor Ġ= Ġcontent Resolver . open Asset FileDescriptor ( uri , Ġ" r ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠNullPointerException (" Cannot Ġopen Ġasset Ġfile Ġdescriptor Ġfor Ġgiven Ġuri Ġ'$ uri '") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( asset FileDescriptor . length Ġ> ĠmaxSize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Contents Ġof Ġgiven Ġuri Ġ'$ uri ' Ġexceeds Ġmaximum Ġsize Ġof Ġ$ maxSize Ġbytes !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠinputStream . buffered Reader ( Charsets . UTF _ 8 ). use Ġ{ Ġblock ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġread All Text From Uri ( context : ĠContext , Ġuri : ĠUri , ĠmaxSize : ĠInt ): ĠResult < String > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġread Text From Uri ( context , Ġuri , ĠmaxSize ) Ġ{ Ġit . read Text () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinline Ġfun ĠwriteTo Uri ( context : ĠContext , Ġuri : ĠUri , Ġblock : Ġ( it : ĠBuffered OutputStream ) Ġ-> ĠUnit ): ĠResult < Unit > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontract Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalls In Place ( block , ĠInvocation Kind . AT _ MO ST _ ON CE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Resolver Ġ= Ġcontext . content Resolver ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠNullPointerException (" System Ġcontent Ġresolver Ġnot Ġavailable ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMust Ġuse Ġ" r wt " Ġmode Ġto Ġensure Ġdestination Ġfile Ġlength Ġis Ġtruncated Ġafter Ġwriting . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠoutputStream Ġ= Ġcontent Resolver . open OutputStream ( uri , Ġ" r wt ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠNullPointerException (" Cannot Ġopen Ġoutput Ġstream Ġfor Ġgiven Ġuri Ġ'$ uri '") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoutputStream . buffered (). use Ġ{ Ġblock ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinline Ġfun Ġwrite Text To Uri ( context : ĠContext , Ġuri : ĠUri , Ġblock : Ġ( it : ĠBuffered Writer ) Ġ-> ĠUnit ): ĠResult < Unit > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontract Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalls In Place ( block , ĠInvocation Kind . AT _ MO ST _ ON CE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Resolver Ġ= Ġcontext . content Resolver ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠNullPointerException (" System Ġcontent Ġresolver Ġnot Ġavailable ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMust Ġuse Ġ" r wt " Ġmode Ġto Ġensure Ġdestination Ġfile Ġlength Ġis Ġtruncated Ġafter Ġwriting . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠoutputStream Ġ= Ġcontent Resolver . open OutputStream ( uri , Ġ" r wt ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠNullPointerException (" Cannot Ġopen Ġoutput Ġstream Ġfor Ġgiven Ġuri Ġ'$ uri '") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoutputStream . buffered Writer ( Charsets . UTF _ 8 ). use Ġ{ Ġblock ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġwrite All Text To Uri ( context : ĠContext , Ġuri : ĠUri , Ġtext : ĠString ): ĠResult < Unit > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwrite Text To Uri ( context , Ġuri ) Ġ{ Ġit . write ( text ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ