DocumentsProviderHelper.java revision 99bcc6aa4dbcfaf6206d9bee496f7388fa9ab17c
199bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay/*
299bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay * Copyright (C) 2015 The Android Open Source Project
399bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay *
499bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay * Licensed under the Apache License, Version 2.0 (the "License");
599bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay * you may not use this file except in compliance with the License.
699bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay * You may obtain a copy of the License at
799bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay *
899bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay *      http://www.apache.org/licenses/LICENSE-2.0
999bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay *
1099bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay * Unless required by applicable law or agreed to in writing, software
1199bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay * distributed under the License is distributed on an "AS IS" BASIS,
1299bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1399bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay * See the License for the specific language governing permissions and
1499bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay * limitations under the License.
1599bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay */
1699bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay
1799bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKaypackage com.android.documentsui;
1899bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay
1999bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKayimport static com.android.documentsui.model.DocumentInfo.getCursorString;
2099bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay
2199bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKayimport android.content.ContentProviderClient;
2299bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKayimport android.database.Cursor;
2399bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKayimport android.net.Uri;
2499bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKayimport android.os.RemoteException;
2599bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKayimport android.provider.DocumentsContract;
2699bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKayimport android.provider.DocumentsContract.Document;
2799bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKayimport android.provider.DocumentsContract.Root;
2899bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay
2999bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKayimport com.android.documentsui.model.RootInfo;
3099bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay
3199bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKayimport libcore.io.IoUtils;
3299bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay
3399bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay/**
3499bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay * Provides support for creation of documents in a test settings.
3599bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay */
3699bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKaypublic class DocumentsProviderHelper {
3799bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay
3899bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay    private final ContentProviderClient mClient;
3999bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay    private final String mAuthority;
4099bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay
4199bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay    public DocumentsProviderHelper(String authority, ContentProviderClient client) {
4299bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay        mClient = client;
4399bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay        mAuthority = authority;
4499bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay    }
4599bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay
4699bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay    public RootInfo getRoot(String id) throws RemoteException {
4799bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay        final Uri rootsUri = DocumentsContract.buildRootsUri(mAuthority);
4899bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay
4999bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay        Cursor cursor = null;
5099bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay        try {
5199bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay            cursor = mClient.query(rootsUri, null, null, null, null);
5299bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay            while (cursor.moveToNext()) {
5399bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay                if (id.equals(getCursorString(cursor, Root.COLUMN_ROOT_ID))) {
5499bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay                    return RootInfo.fromRootsCursor(mAuthority, cursor);
5599bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay                }
5699bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay            }
5799bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay            throw new IllegalArgumentException("Can't find matching root for id=" + id);
5899bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay        } catch (Exception e) {
5999bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay            throw new RuntimeException("Can't load root for id=" + id , e);
6099bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay        } finally {
6199bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay            IoUtils.closeQuietly(cursor);
6299bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay        }
6399bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay    }
6499bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay
6599bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay    public Uri createDocument(Uri parentUri, String mimeType, String name) {
6699bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay        if (name.contains("/")) {
6799bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay            throw new IllegalArgumentException("Name and mimetype probably interposed.");
6899bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay        }
6999bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay        try {
7099bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay            return DocumentsContract.createDocument(mClient, parentUri, mimeType, name);
7199bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay        } catch (RemoteException e) {
7299bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay            throw new RuntimeException("Couldn't create document: " + name + " with mimetype " + mimeType, e);
7399bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay        }
7499bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay    }
7599bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay
7699bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay    public Uri createFolder(Uri parentUri, String name) {
7799bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay        return createDocument(parentUri, Document.MIME_TYPE_DIR, name);
7899bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay    }
7999bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay
8099bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay    public Uri createDocument(RootInfo root, String mimeType, String name) {
8199bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay        Uri rootUri = DocumentsContract.buildDocumentUri(mAuthority, root.documentId);
8299bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay        return createDocument(rootUri, mimeType, name);
8399bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay    }
8499bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay
8599bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay    public Uri createFolder(RootInfo root, String name) {
8699bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay        return createDocument(root, Document.MIME_TYPE_DIR, name);
8799bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay    }
8899bcc6aa4dbcfaf6206d9bee496f7388fa9ab17cSteve McKay}
89