15fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey/* 25fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey * Copyright (C) 2014 The Android Open Source Project 35fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey * 45fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License"); 55fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey * you may not use this file except in compliance with the License. 65fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey * You may obtain a copy of the License at 75fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey * 85fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey * http://www.apache.org/licenses/LICENSE-2.0 95fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey * 105fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey * Unless required by applicable law or agreed to in writing, software 115fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS, 125fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey * See the License for the specific language governing permissions and 145fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey * limitations under the License. 155fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey */ 165fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey 175fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkeypackage android.support.v4.provider; 185fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey 195fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkeyimport android.content.ContentResolver; 205fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkeyimport android.content.Context; 215fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkeyimport android.database.Cursor; 225fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkeyimport android.net.Uri; 235fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkeyimport android.provider.DocumentsContract; 245fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkeyimport android.util.Log; 255fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey 265fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkeyimport java.util.ArrayList; 275fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey 285fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkeyclass DocumentsContractApi21 { 295fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey private static final String TAG = "DocumentFile"; 305fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey 315fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey public static Uri createFile(Context context, Uri self, String mimeType, 325fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey String displayName) { 335fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey return DocumentsContract.createDocument(context.getContentResolver(), self, mimeType, 345fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey displayName); 355fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey } 365fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey 375fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey public static Uri createDirectory(Context context, Uri self, String displayName) { 385fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey return createFile(context, self, DocumentsContract.Document.MIME_TYPE_DIR, displayName); 395fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey } 405fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey 415fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey public static Uri prepareTreeUri(Uri treeUri) { 425fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey return DocumentsContract.buildDocumentUriUsingTree(treeUri, 435fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey DocumentsContract.getTreeDocumentId(treeUri)); 445fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey } 455fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey 465fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey public static Uri[] listFiles(Context context, Uri self) { 475fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey final ContentResolver resolver = context.getContentResolver(); 485fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey final Uri childrenUri = DocumentsContract.buildChildDocumentsUriUsingTree(self, 495fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey DocumentsContract.getDocumentId(self)); 505fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey final ArrayList<Uri> results = new ArrayList<Uri>(); 515fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey 525fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey Cursor c = null; 535fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey try { 545fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey c = resolver.query(childrenUri, new String[] { 555fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey DocumentsContract.Document.COLUMN_DOCUMENT_ID }, null, null, null); 565fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey while (c.moveToNext()) { 575fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey final String documentId = c.getString(0); 585fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey final Uri documentUri = DocumentsContract.buildDocumentUriUsingTree(self, 595fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey documentId); 605fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey results.add(documentUri); 615fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey } 625fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey } catch (Exception e) { 635fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey Log.w(TAG, "Failed query: " + e); 645fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey } finally { 655fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey closeQuietly(c); 665fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey } 675fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey 685fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey return results.toArray(new Uri[results.size()]); 695fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey } 705fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey 715fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey public static Uri renameTo(Context context, Uri self, String displayName) { 725fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey return DocumentsContract.renameDocument(context.getContentResolver(), self, displayName); 735fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey } 745fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey 755fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey private static void closeQuietly(AutoCloseable closeable) { 765fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey if (closeable != null) { 775fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey try { 785fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey closeable.close(); 795fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey } catch (RuntimeException rethrown) { 805fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey throw rethrown; 815fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey } catch (Exception ignored) { 825fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey } 835fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey } 845fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey } 855fdfbc2e02f46509474057e4366585f6a6062cb9Jeff Sharkey} 86