package Ġcom . ian h ann ib all ake . local storage Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . content . res . Asset FileDescriptor Ċ import Ġandroid . database . Cursor Ċ import Ġandroid . database . Matrix Cursor Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Bitmap Factory Ċ import Ġandroid . graphics . Point Ċ import Ġandroid . os . Cancellation Signal Ċ import Ġandroid . os . Environment Ċ import Ġandroid . os . Parcel FileDescriptor Ċ import Ġandroid . os . Stat Fs Ċ import Ġandroid . provider . Documents Contract Ċ import Ġandroid . provider . Documents Contract . Document Ċ import Ġandroid . provider . Documents Contract . Root Ċ import Ġandroid . provider . Documents Provider Ċ import Ġandroid . support . v 4 . content . Context Compat Ċ import Ġandroid . support . v 4 . os . Environment Compat Ċ import Ġandroid . util . Log Ċ import Ġandroid . webkit . MimeType Map Ċ import Ġjava . io . File Ċ import Ġjava . io . FileNotFoundException Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . io . IOException Ċ Ċ class ĠLocal Storage Provider Ġ: ĠDocuments Provider () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" LocalStorage Provider " ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠDefault Ġroot Ġprojection : Ġeverything Ġbut ĠRoot . COLUMN _ MIME _ TYPES ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠDEFAULT _ ROOT _ PRO JECTION Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRoot . COLUMN _ ROOT _ ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRoot . COLUMN _ SUM MARY , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRoot . COLUMN _ FLAGS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRoot . COLUMN _ TITLE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRoot . COLUMN _ DOCUMENT _ ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRoot . COLUMN _ ICON , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRoot . COLUMN _ AVAILABLE _ BYTES ) ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠDefault Ġdocument Ġprojection : Ġeverything Ġbut ĠDocument . COLUMN _ ICON Ġand ĠDocument . COLUMN _ SUM MARY ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠDEFAULT _ DOCUMENT _ PRO JECTION Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDocument . COLUMN _ DOCUMENT _ ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDocument . COLUMN _ DISPLAY _ NAME , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDocument . COLUMN _ FLAGS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDocument . COLUMN _ MIME _ TYPE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDocument . COLUMN _ SIZE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDocument . COLUMN _ LAST _ MODI FIED ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCheck Ġto Ġsee Ġif Ġwe Ġare Ġmissing Ġthe ĠStorage Ġpermission Ġgroup . ĠIn Ġthose Ġcases , Ġwe Ġcannot ĊĠĠĠĠĠĠĠĠ Ġ* Ġaccess Ġlocal Ġfiles Ġand Ġmust Ġinvalidate Ġany Ġroot ĠURIs Ġcurrently Ġavailable . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġcontext ĠThe Ġcurrent ĠContext ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġwhether Ġthe Ġpermission Ġhas Ġbeen Ġgranted Ġit Ġis Ġsafe Ġto Ġproceed ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġis Missing Permission ( context : ĠContext ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( context Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Context Compat . check Self Permission ( context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . WRITE _ EXTERNAL _ STORAGE ) Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMake Ġsure Ġthat Ġour Ġroot Ġis Ġinvalid ated Ġas Ġapparently Ġwe Ġlost Ġpermission ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . content Resolver . notify Change ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDocuments Contract . build Roots Uri ( Build Config . DOCUMENT S _ AUTH ORITY ), Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" In lined Api ") ĊĠĠĠ Ġoverride Ġfun Ġquery Roots ( projection : ĠArray < String >? ): ĠCursor ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġcontext Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( Context Compat . check Self Permission ( context , ĠManifest . permission . WRITE _ EXTERNAL _ STORAGE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġa Ġcursor Ġwith Ġeither Ġthe Ġrequested Ġfields , Ġor Ġthe Ġdefault Ġprojection Ġif Ġ" projection " Ġis Ġnull . ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠMatrix Cursor ( projection Ġ?: ĠDEFAULT _ ROOT _ PRO JECTION ) ĊĠĠĠĠĠĠĠ Ġ// ĠAdd ĠHome Ġdirectory ĊĠĠĠĠĠĠĠ Ġval Ġhome Dir Ġ= ĠEnvironment . get External Storage Directory () ĊĠĠĠĠĠĠĠ Ġif Ġ( Environment . get External Storage State () Ġ== ĠEnvironment . MEDIA _ MOUNT ED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrow Ġ= Ġresult . new Row () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThese Ġcolumns Ġare Ġrequired ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow . add ( Root . COLUMN _ ROOT _ ID , Ġhome Dir . absolute Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow . add ( Root . COLUMN _ DOCUMENT _ ID , Ġhome Dir . absolute Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow . add ( Root . COLUMN _ TITLE , Ġcontext . getString ( R . string . home )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow . add ( Root . COLUMN _ FLAGS , ĠRoot . FLAG _ LOCAL _ ONLY Ġor ĠRoot . FLAG _ SUPPORT S _ CREATE Ġor ĠRoot . FLAG _ SUPPORT S _ IS _ CHILD ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow . add ( Root . COLUMN _ ICON , ĠR . mip map . ic _ launcher ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThese Ġcolumns Ġare Ġoptional ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow . add ( Root . COLUMN _ SUM MARY , Ġhome Dir . absolute Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow . add ( Root . COLUMN _ AVAILABLE _ BYTES , ĠStat Fs ( home Dir . absolute Path ). available Bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRoot . COLUMN _ MIME _ TYPE Ġis Ġanother Ġoptional Ġcolumn Ġand Ġuseful Ġif Ġyou Ġhave Ġmultiple Ġroots Ġwith Ġdifferent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtypes Ġof Ġmime Ġtypes Ġ( roots Ġthat Ġdon 't Ġmatch Ġthe Ġrequested Ġmime Ġtype Ġare Ġautomatically Ġhidden ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠAdd ĠSD Ġcard Ġdirectory ĊĠĠĠĠĠĠĠ Ġval Ġsd Card Ġ= ĠFile ("/ storage / ext Sd Card ") ĊĠĠĠĠĠĠĠ Ġval Ġstorage State Ġ= ĠEnvironment Compat . get Storage State ( sd Card ) ĊĠĠĠĠĠĠĠ Ġif Ġ( storage State Ġ== ĠEnvironment . MEDIA _ MOUNT ED Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstorage State Ġ== ĠEnvironment . MEDIA _ MOUNT ED _ READ _ ONLY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrow Ġ= Ġresult . new Row () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThese Ġcolumns Ġare Ġrequired ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow . add ( Root . COLUMN _ ROOT _ ID , Ġsd Card . absolute Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow . add ( Root . COLUMN _ DOCUMENT _ ID , Ġsd Card . absolute Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow . add ( Root . COLUMN _ TITLE , Ġcontext . getString ( R . string . sd _ card )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAlways Ġassume ĠSD ĠCard Ġis Ġread - only ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow . add ( Root . COLUMN _ FLAGS , ĠRoot . FLAG _ LOCAL _ ONLY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow . add ( Root . COLUMN _ ICON , ĠR . drawable . ic _ sd _ card ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow . add ( Root . COLUMN _ SUM MARY , Ġsd Card . absolute Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow . add ( Root . COLUMN _ AVAILABLE _ BYTES , ĠStat Fs ( sd Card . absolute Path ). available Bytes ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Document ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent Document Id : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠmimeType : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠdisplayName : ĠString ĊĠĠĠ Ġ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( LocalStorage Provider . is Missing Permission ( context )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnew File Ġ= ĠFile ( parent Document Id , ĠdisplayName ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new File . createNew File ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnew File . absolute Path ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Error Ġcreating Ġnew Ġfile Ġ$ new File ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Error Ġcreating Ġnew Ġfile Ġ$ new File ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( FileNotFoundException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġopen Document Thumbnail ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdocument Id : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsize Hint : ĠPoint , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignal : ĠC ancellation Signal ? ĊĠĠĠ Ġ): ĠAsset FileDescriptor ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġcontext Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( LocalStorage Provider . is Missing Permission ( context )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠAssume Ġdocument Id Ġpoints Ġto Ġan Ġimage Ġfile . ĠBuild Ġa Ġthumbnail Ġno Ġlarger Ġthan Ġtwice Ġthe Ġsize Hint ĊĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= ĠBitmap Factory . Options () ĊĠĠĠĠĠĠĠ Ġoptions . in Just Decode Bounds Ġ= Ġtrue ĊĠĠĠĠĠĠĠ ĠBitmap Factory . decode File ( document Id , Ġoptions ) ĊĠĠĠĠĠĠĠ Ġval Ġtarget Height Ġ= Ġ 2 Ġ* Ġsize Hint . y ĊĠĠĠĠĠĠĠ Ġval Ġtarget Width Ġ= Ġ 2 Ġ* Ġsize Hint . x ĊĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġoptions . out Height ĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġoptions . out Width ĊĠĠĠĠĠĠĠ Ġoptions . in Sample Size Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġif Ġ( height Ġ> Ġtarget Height Ġ|| Ġwidth Ġ> Ġtarget Width ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhalf Height Ġ= Ġheight Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhalf Width Ġ= Ġwidth Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCalculate Ġthe Ġlargest Ġin Sample Size Ġvalue Ġthat Ġis Ġa Ġpower Ġof Ġ 2 Ġand Ġkeeps Ġboth ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġheight Ġand Ġwidth Ġlarger Ġthan Ġthe Ġrequested Ġheight Ġand Ġwidth . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( half Height Ġ/ Ġoptions . in Sample Size Ġ> Ġtarget Height Ġ|| Ġhalf Width Ġ/ Ġoptions . in Sample Size Ġ> Ġtarget Width ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoptions . in Sample Size Ġ*= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġoptions . in Just Decode Bounds Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġbitmap Ġ= ĠBitmap Factory . decode File ( document Id , Ġoptions ) ĊĠĠĠĠĠĠĠ Ġ// ĠWrite Ġout Ġthe Ġthumbnail Ġto Ġa Ġtemporary Ġfile ĊĠĠĠĠĠĠĠ Ġval Ġtemp File : ĠFile ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemp File Ġ= ĠFile . create TempFile (" thumbnail ", Ġnull , Ġcontext . cacheDir ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFileOutputStream ( temp File ). use Ġ{ Ġout Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap . compress ( Bitmap . Compress Format . PNG , Ġ 9 0 , Ġout ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Error Ġwriting Ġthumbnail ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠIt Ġappears Ġthe ĠStorage ĠFramework ĠUI Ġcaches Ġthese Ġresults Ġquite Ġag gress ively Ġso Ġthere Ġis Ġlittle Ġreason Ġto ĊĠĠĠĠĠĠĠ Ġ// Ġwrite Ġyour Ġown Ġcaching Ġlayer Ġbeyond Ġwhat Ġyou Ġneed Ġto Ġreturn Ġa Ġsingle ĠAsset FileDescriptor ĊĠĠĠĠĠĠĠ Ġreturn ĠAsset FileDescriptor ( Parcel FileDescriptor . open ( temp File , ĠParcel FileDescriptor . MODE _ READ _ ONLY ), Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAsset FileDescriptor . UNKNOWN _ LENGTH ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Child Document ( parent Document Id : ĠString , Ġdocument Id : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdocument Id . startsWith ( parent Document Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġquery Child Documents ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent Document Id : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprojection : ĠArray < String > ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsort Order : ĠString ? ĊĠĠĠ Ġ): ĠCursor ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( LocalStorage Provider . is Missing Permission ( context )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġa Ġcursor Ġwith Ġeither Ġthe Ġrequested Ġfields , Ġor Ġthe Ġdefault Ġprojection Ġif Ġ" projection " Ġis Ġnull . ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠMatrix Cursor ( projection Ġ?: ĠDEFAULT _ DOCUMENT _ PRO JECTION ) ĊĠĠĠĠĠĠĠ Ġval Ġparent Ġ= ĠFile ( parent Document Id ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( file Ġin Ġparent . list Files ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDon 't Ġshow Ġhidden Ġfiles / folders ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! file . name . startsWith (". ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdds Ġthe Ġfile 's Ġdisplay Ġname , ĠMIME Ġtype , Ġsize , Ġand Ġso Ġon . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinclude File ( result , Ġfile ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġquery Document ( document Id : ĠString , Ġprojection : ĠArray < String >? ): ĠCursor ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( LocalStorage Provider . is Missing Permission ( context )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġa Ġcursor Ġwith Ġeither Ġthe Ġrequested Ġfields , Ġor Ġthe Ġdefault Ġprojection Ġif Ġ" projection " Ġis Ġnull . ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠMatrix Cursor ( projection Ġ?: ĠDEFAULT _ DOCUMENT _ PRO JECTION ) ĊĠĠĠĠĠĠĠ Ġinclude File ( result , ĠFile ( document Id )) ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinclude File ( result : ĠMatrix Cursor , Ġfile : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrow Ġ= Ġresult . new Row () ĊĠĠĠĠĠĠĠ Ġ// ĠThese Ġcolumns Ġare Ġrequired ĊĠĠĠĠĠĠĠ Ġrow . add ( Document . COLUMN _ DOCUMENT _ ID , Ġfile . absolute Path ) ĊĠĠĠĠĠĠĠ Ġrow . add ( Document . COLUMN _ DISPLAY _ NAME , Ġfile . name ) ĊĠĠĠĠĠĠĠ Ġval ĠmimeType Ġ= Ġget Document Type ( file . absolute Path ) ĊĠĠĠĠĠĠĠ Ġrow . add ( Document . COLUMN _ MIME _ TYPE , ĠmimeType ) ĊĠĠĠĠĠĠĠ Ġ@ Suppress Lint (" In lined Api ") ĊĠĠĠĠĠĠĠ Ġvar Ġflags Ġ= Ġif Ġ( file . can Write ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDocument . FLAG _ SUPPORT S _ DELETE Ġor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDocument . FLAG _ SUPPORT S _ WRITE Ġor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDocument . FLAG _ SUPPORT S _ RE NAME Ġor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mime Type Ġ== ĠDocument . MIME _ TYPE _ DIR ) ĠDocument . FLAG _ DIR _ SUPPORT S _ CREATE Ġelse Ġ 0 ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġonly Ġshow Ġthumb nails Ġfor Ġimage Ġfiles Ġ- Ġexpect Ġa Ġcall Ġto Ġopen Document Thumbnail Ġfor Ġeach Ġfile Ġthat Ġhas ĊĠĠĠĠĠĠĠ Ġ// Ġthis Ġflag Ġset ĊĠĠĠĠĠĠĠ Ġif Ġ( mime Type ?. startsWith (" image /") Ġ== Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflags Ġ= Ġflags Ġor ĠDocument . FLAG _ SUPPORT S _ TH UMB NA IL ĊĠĠĠĠĠĠĠ Ġrow . add ( Document . COLUMN _ FLAGS , Ġflags ) ĊĠĠĠĠĠĠĠ Ġ// ĠCOLUMN _ SIZE Ġis Ġrequired , Ġbut Ġcan Ġbe Ġnull ĊĠĠĠĠĠĠĠ Ġrow . add ( Document . COLUMN _ SIZE , Ġfile . length ()) ĊĠĠĠĠĠĠĠ Ġ// ĠThese Ġcolumns Ġare Ġoptional ĊĠĠĠĠĠĠĠ Ġrow . add ( Document . COLUMN _ LAST _ MODI FIED , Ġfile . lastModified ()) ĊĠĠĠĠĠĠĠ Ġ// ĠDocument . COLUMN _ ICON Ġcan Ġbe Ġa Ġresource Ġid Ġidentifying Ġa Ġcustom Ġicon . ĠThe Ġsystem Ġprovides Ġdefault Ġicons ĊĠĠĠĠĠĠĠ Ġ// Ġbased Ġon Ġmime Ġtype ĊĠĠĠĠĠĠĠ Ġ// ĠDocument . COLUMN _ SUM MARY Ġis Ġoptional Ġadditional Ġinformation Ġabout Ġthe Ġfile ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Document Type ( document Id : ĠString ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( LocalStorage Provider . is Missing Permission ( context )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( document Id ) ĊĠĠĠĠĠĠĠ Ġif Ġ( file . isDirectory ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDocument . MIME _ TYPE _ DIR ĊĠĠĠĠĠĠĠ Ġ// ĠFrom ĠFile Provider . getType ( Uri ) ĊĠĠĠĠĠĠĠ Ġval Ġlast Dot Ġ= Ġfile . name . lastIndexOf ('.') ĊĠĠĠĠĠĠĠ Ġif Ġ( last Dot Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġextension Ġ= Ġfile . name . substring ( last Dot Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmime Ġ= ĠMime TypeMap . get Singleton (). get MimeType From Extension ( extension ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mime Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmime ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ" application / octet - stream " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdelete Document ( document Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( LocalStorage Provider . is Missing Permission ( context )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( document Id ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! file . delete ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Error Ġdeleting Ġ$ document Id ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( FileNotFoundException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġrename Document ( document Id : ĠString , ĠdisplayName : ĠString ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( LocalStorage Provider . is Missing Permission ( context )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġexisting File Ġ= ĠFile ( document Id ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! existing File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠFileNotFoundException ("$ document Id Ġdoes Ġnot Ġexist ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( existing File . name Ġ== ĠdisplayName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġparent Directory Ġ= Ġexisting File . parent File ĊĠĠĠĠĠĠĠ Ġvar Ġnew File Ġ= ĠFile ( parent Directory , ĠdisplayName ) ĊĠĠĠĠĠĠĠ Ġvar Ġconflict Index Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( new File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew File Ġ= ĠFile ( parent Directory , Ġ"${ displayName }_${ conflict Index ++ }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġsuccess Ġ= Ġexisting File . rename To ( new File ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! success ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠFileNotFoundException (" Unable Ġto Ġrename Ġ$ document Id Ġto Ġ${ existing File . absolute Path }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġexisting File . absolute Path ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( FileNotFoundException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġopen Document ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdocument Id : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmode : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignal : ĠC ancellation Signal ? ĊĠĠĠ Ġ): ĠParcel FileDescriptor ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( LocalStorage Provider . is Missing Permission ( context )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( document Id ) ĊĠĠĠĠĠĠĠ Ġreturn ĠParcel FileDescriptor . open ( file , ĠParcel FileDescriptor . parse Mode ( mode )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} Ċ } Ċ