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