Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 724deeb5 authored by Jeff Sharkey's avatar Jeff Sharkey
Browse files

Refactoring of DocumentsContract.

Combines related columns and constants onto the same class so they
are easier to discover.  Move back to surfacing roots with columns
so they are consistent with documents.

Advanced roots are represented with a flag instead of distinct
types.  Flags to indicate supporting of well-known media types,
instead of arbitrary an MIME filter.  Reintroduce well-formed rootId
to support recents.

Always use the expanded version of "documents" in constants, methods,
and argument names.

Refactor DocumentProvider method names to clearly distinguish if
a single item or multiple could be returned, and of which type.  Add
documentation to clearly define which methods have already been
overridden.

Bug: 10567506, 10567557
Change-Id: I981f26ab82f2b520a19aa1ce66f659de50d7fac0
parent b6a7f2cd
Loading
Loading
Loading
Loading
+6 −14
Original line number Diff line number Diff line
@@ -20,7 +20,6 @@ import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.app.FragmentManager;
import android.content.ContentProviderClient;
import android.content.ContentResolver;
import android.content.Context;
import android.content.DialogInterface;
@@ -28,13 +27,13 @@ import android.content.DialogInterface.OnClickListener;
import android.net.Uri;
import android.os.Bundle;
import android.provider.DocumentsContract;
import android.provider.DocumentsContract.Documents;
import android.provider.DocumentsContract.Document;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import com.android.documentsui.model.Document;
import com.android.documentsui.model.DocumentInfo;

/**
 * Dialog to create a new directory.
@@ -67,24 +66,17 @@ public class CreateDirectoryFragment extends DialogFragment {
                final String displayName = text1.getText().toString();

                final DocumentsActivity activity = (DocumentsActivity) getActivity();
                final Document cwd = activity.getCurrentDirectory();
                final DocumentInfo cwd = activity.getCurrentDirectory();

                final ContentProviderClient client = resolver.acquireUnstableContentProviderClient(
                        cwd.uri.getAuthority());
                try {
                    final String docId = DocumentsContract.createDocument(client,
                            DocumentsContract.getDocId(cwd.uri), Documents.MIME_TYPE_DIR,
                            displayName);
                    final Uri childUri = DocumentsContract.createDocument(
                            resolver, cwd.uri, Document.MIME_TYPE_DIR, displayName);

                    // Navigate into newly created child
                    final Uri childUri = DocumentsContract.buildDocumentUri(
                            cwd.uri.getAuthority(), docId);
                    final Document childDoc = Document.fromUri(resolver, childUri);
                    final DocumentInfo childDoc = DocumentInfo.fromUri(resolver, childUri);
                    activity.onDocumentPicked(childDoc);
                } catch (Exception e) {
                    Toast.makeText(context, R.string.save_error, Toast.LENGTH_SHORT).show();
                } finally {
                    ContentProviderClient.closeQuietly(client);
                }
            }
        });
+24 −24
Original line number Diff line number Diff line
@@ -61,7 +61,7 @@ import android.widget.TextView;
import android.widget.Toast;

import com.android.documentsui.DocumentsActivity.DisplayState;
import com.android.documentsui.model.Document;
import com.android.documentsui.model.DocumentInfo;
import com.android.internal.util.Predicate;
import com.google.android.collect.Lists;

@@ -81,7 +81,7 @@ public class DirectoryFragment extends Fragment {

    private AbsListView mCurrentView;

    private Predicate<Document> mFilter;
    private Predicate<DocumentInfo> mFilter;

    public static final int TYPE_NORMAL = 1;
    public static final int TYPE_SEARCH = 2;
@@ -106,8 +106,8 @@ public class DirectoryFragment extends Fragment {
    }

    public static void showSearch(FragmentManager fm, Uri uri, String query) {
        final Uri searchUri = DocumentsContract.buildSearchUri(
                uri.getAuthority(), DocumentsContract.getDocId(uri), query);
        final Uri searchUri = DocumentsContract.buildSearchDocumentsUri(
                uri.getAuthority(), DocumentsContract.getDocumentId(uri), query);
        show(fm, TYPE_SEARCH, searchUri);
    }

@@ -163,21 +163,21 @@ public class DirectoryFragment extends Fragment {

                Uri contentsUri;
                if (mType == TYPE_NORMAL) {
                    contentsUri = DocumentsContract.buildChildrenUri(
                            uri.getAuthority(), DocumentsContract.getDocId(uri));
                    contentsUri = DocumentsContract.buildChildDocumentsUri(
                            uri.getAuthority(), DocumentsContract.getDocumentId(uri));
                } else if (mType == TYPE_RECENT_OPEN) {
                    contentsUri = RecentsProvider.buildRecentOpen();
                } else {
                    contentsUri = uri;
                }

                final Comparator<Document> sortOrder;
                final Comparator<DocumentInfo> sortOrder;
                if (state.sortOrder == SORT_ORDER_LAST_MODIFIED || mType == TYPE_RECENT_OPEN) {
                    sortOrder = new Document.LastModifiedComparator();
                    sortOrder = new DocumentInfo.LastModifiedComparator();
                } else if (state.sortOrder == SORT_ORDER_DISPLAY_NAME) {
                    sortOrder = new Document.DisplayNameComparator();
                    sortOrder = new DocumentInfo.DisplayNameComparator();
                } else if (state.sortOrder == SORT_ORDER_SIZE) {
                    sortOrder = new Document.SizeComparator();
                    sortOrder = new DocumentInfo.SizeComparator();
                } else {
                    throw new IllegalArgumentException("Unknown sort order " + state.sortOrder);
                }
@@ -258,7 +258,7 @@ public class DirectoryFragment extends Fragment {
    private OnItemClickListener mItemListener = new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            final Document doc = mAdapter.getItem(position);
            final DocumentInfo doc = mAdapter.getItem(position);
            if (mFilter.apply(doc)) {
                ((DocumentsActivity) getActivity()).onDocumentPicked(doc);
            }
@@ -291,11 +291,11 @@ public class DirectoryFragment extends Fragment {
        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            final SparseBooleanArray checked = mCurrentView.getCheckedItemPositions();
            final ArrayList<Document> docs = Lists.newArrayList();
            final ArrayList<DocumentInfo> docs = Lists.newArrayList();
            final int size = checked.size();
            for (int i = 0; i < size; i++) {
                if (checked.valueAt(i)) {
                    final Document doc = mAdapter.getItem(checked.keyAt(i));
                    final DocumentInfo doc = mAdapter.getItem(checked.keyAt(i));
                    docs.add(doc);
                }
            }
@@ -328,7 +328,7 @@ public class DirectoryFragment extends Fragment {
                ActionMode mode, int position, long id, boolean checked) {
            if (checked) {
                // Directories cannot be checked
                final Document doc = mAdapter.getItem(position);
                final DocumentInfo doc = mAdapter.getItem(position);
                if (doc.isDirectory()) {
                    mCurrentView.setItemChecked(position, false);
                }
@@ -339,9 +339,9 @@ public class DirectoryFragment extends Fragment {
        }
    };

    private void onShareDocuments(List<Document> docs) {
    private void onShareDocuments(List<DocumentInfo> docs) {
        final ArrayList<Uri> uris = Lists.newArrayList();
        for (Document doc : docs) {
        for (DocumentInfo doc : docs) {
            uris.add(doc.uri);
        }

@@ -363,12 +363,12 @@ public class DirectoryFragment extends Fragment {
        startActivity(intent);
    }

    private void onDeleteDocuments(List<Document> docs) {
    private void onDeleteDocuments(List<DocumentInfo> docs) {
        final Context context = getActivity();
        final ContentResolver resolver = context.getContentResolver();

        boolean hadTrouble = false;
        for (Document doc : docs) {
        for (DocumentInfo doc : docs) {
            if (!doc.isDeleteSupported()) {
                Log.w(TAG, "Skipping " + doc);
                hadTrouble = true;
@@ -396,12 +396,12 @@ public class DirectoryFragment extends Fragment {
    }

    private class DocumentsAdapter extends BaseAdapter {
        private List<Document> mDocuments;
        private List<DocumentInfo> mDocuments;

        public DocumentsAdapter() {
        }

        public void swapDocuments(List<Document> documents) {
        public void swapDocuments(List<DocumentInfo> documents) {
            mDocuments = documents;

            if (mDocuments != null && mDocuments.isEmpty()) {
@@ -433,7 +433,7 @@ public class DirectoryFragment extends Fragment {
                }
            }

            final Document doc = getItem(position);
            final DocumentInfo doc = getItem(position);

            final ImageView icon = (ImageView) convertView.findViewById(android.R.id.icon);
            final TextView title = (TextView) convertView.findViewById(android.R.id.title);
@@ -507,7 +507,7 @@ public class DirectoryFragment extends Fragment {
        }

        @Override
        public Document getItem(int position) {
        public DocumentInfo getItem(int position) {
            return mDocuments.get(position);
        }

@@ -538,8 +538,8 @@ public class DirectoryFragment extends Fragment {

            Bitmap result = null;
            try {
                result = DocumentsContract.getThumbnail(
                        context.getContentResolver(), uri, mThumbSize);
                result = DocumentsContract.getDocumentThumbnail(
                        context.getContentResolver(), uri, mThumbSize, null);
                if (result != null) {
                    final ThumbnailCache thumbs = DocumentsApplication.getThumbnailsCache(
                            context, mThumbSize);
+9 −9
Original line number Diff line number Diff line
@@ -28,7 +28,7 @@ import android.net.Uri;
import android.os.CancellationSignal;
import android.util.Log;

import com.android.documentsui.model.Document;
import com.android.documentsui.model.DocumentInfo;
import com.android.internal.util.Predicate;
import com.google.android.collect.Lists;

@@ -41,7 +41,7 @@ import java.util.List;

class DirectoryResult implements AutoCloseable {
    Cursor cursor;
    List<Document> contents = Lists.newArrayList();
    List<DocumentInfo> contents = Lists.newArrayList();
    Exception e;

    @Override
@@ -53,11 +53,11 @@ class DirectoryResult implements AutoCloseable {
public class DirectoryLoader extends UriDerivativeLoader<Uri, DirectoryResult> {

    private final int mType;
    private Predicate<Document> mFilter;
    private Comparator<Document> mSortOrder;
    private Predicate<DocumentInfo> mFilter;
    private Comparator<DocumentInfo> mSortOrder;

    public DirectoryLoader(Context context, Uri uri, int type, Predicate<Document> filter,
            Comparator<Document> sortOrder) {
    public DirectoryLoader(Context context, Uri uri, int type, Predicate<DocumentInfo> filter,
            Comparator<DocumentInfo> sortOrder) {
        super(context, uri);
        mType = type;
        mFilter = filter;
@@ -84,15 +84,15 @@ public class DirectoryLoader extends UriDerivativeLoader<Uri, DirectoryResult> {
        result.cursor.registerContentObserver(mObserver);

        while (cursor.moveToNext()) {
            Document doc = null;
            DocumentInfo doc = null;
            switch (mType) {
                case TYPE_NORMAL:
                case TYPE_SEARCH:
                    doc = Document.fromDirectoryCursor(uri, cursor);
                    doc = DocumentInfo.fromDirectoryCursor(uri, cursor);
                    break;
                case TYPE_RECENT_OPEN:
                    try {
                        doc = Document.fromRecentOpenCursor(resolver, cursor);
                        doc = DocumentInfo.fromRecentOpenCursor(resolver, cursor);
                    } catch (FileNotFoundException e) {
                        Log.w(TAG, "Failed to find recent: " + e);
                    }
+1 −2
Original line number Diff line number Diff line
@@ -21,11 +21,10 @@ import static com.android.documentsui.DocumentsActivity.TAG;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.provider.DocumentsContract.DocumentRoot;
import android.util.Log;

/**
 * Handles {@link DocumentRoot} changes which invalidate cached data.
 * Handles changes which invalidate cached data.
 */
public class DocumentChangedReceiver extends BroadcastReceiver {
    @Override
+18 −20
Original line number Diff line number Diff line
@@ -42,7 +42,6 @@ import android.graphics.drawable.ColorDrawable;
import android.net.Uri;
import android.os.Bundle;
import android.provider.DocumentsContract;
import android.provider.DocumentsContract.DocumentRoot;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
@@ -60,8 +59,9 @@ import android.widget.SearchView.OnQueryTextListener;
import android.widget.TextView;
import android.widget.Toast;

import com.android.documentsui.model.Document;
import com.android.documentsui.model.DocumentInfo;
import com.android.documentsui.model.DocumentStack;
import com.android.documentsui.model.RootInfo;

import java.io.FileNotFoundException;
import java.util.Arrays;
@@ -160,7 +160,7 @@ public class DocumentsActivity extends Activity {
            mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);

            final Uri rootUri = intent.getData();
            final DocumentRoot root = mRoots.findRoot(rootUri);
            final RootInfo root = mRoots.findRoot(rootUri);
            if (root != null) {
                onRootPicked(root, true);
            } else {
@@ -252,7 +252,7 @@ public class DocumentsActivity extends Activity {
            mDrawerToggle.setDrawerIndicatorEnabled(true);

        } else {
            final DocumentRoot root = getCurrentRoot();
            final RootInfo root = getCurrentRoot();
            actionBar.setIcon(root != null ? root.loadIcon(this) : null);

            if (mRoots.isRecentsRoot(root)) {
@@ -317,7 +317,7 @@ public class DocumentsActivity extends Activity {
        super.onPrepareOptionsMenu(menu);

        final FragmentManager fm = getFragmentManager();
        final Document cwd = getCurrentDirectory();
        final DocumentInfo cwd = getCurrentDirectory();

        final MenuItem createDir = menu.findItem(R.id.menu_create_dir);
        final MenuItem search = menu.findItem(R.id.menu_search);
@@ -473,7 +473,7 @@ public class DocumentsActivity extends Activity {
        }
    };

    public DocumentRoot getCurrentRoot() {
    public RootInfo getCurrentRoot() {
        if (mStack.size() > 0) {
            return mStack.getRoot(mRoots);
        } else {
@@ -481,7 +481,7 @@ public class DocumentsActivity extends Activity {
        }
    }

    public Document getCurrentDirectory() {
    public DocumentInfo getCurrentDirectory() {
        return mStack.peek();
    }

@@ -491,7 +491,7 @@ public class DocumentsActivity extends Activity {

    private void onCurrentDirectoryChanged() {
        final FragmentManager fm = getFragmentManager();
        final Document cwd = getCurrentDirectory();
        final DocumentInfo cwd = getCurrentDirectory();

        if (cwd == null) {
            // No directory means recents
@@ -533,14 +533,14 @@ public class DocumentsActivity extends Activity {
        onCurrentDirectoryChanged();
    }

    public void onRootPicked(DocumentRoot root, boolean closeDrawer) {
    public void onRootPicked(RootInfo root, boolean closeDrawer) {
        // Clear entire backstack and start in new root
        mStack.clear();

        if (!mRoots.isRecentsRoot(root)) {
            try {
                final Uri uri = DocumentsContract.buildDocumentUri(root.authority, root.docId);
                onDocumentPicked(Document.fromUri(getContentResolver(), uri));
                final Uri uri = DocumentsContract.buildDocumentUri(root.authority, root.documentId);
                onDocumentPicked(DocumentInfo.fromUri(getContentResolver(), uri));
            } catch (FileNotFoundException e) {
            }
        } else {
@@ -561,7 +561,7 @@ public class DocumentsActivity extends Activity {
        finish();
    }

    public void onDocumentPicked(Document doc) {
    public void onDocumentPicked(DocumentInfo doc) {
        final FragmentManager fm = getFragmentManager();
        if (doc.isDirectory()) {
            // TODO: query display mode user preference for this dir
@@ -591,7 +591,7 @@ public class DocumentsActivity extends Activity {
        }
    }

    public void onDocumentsPicked(List<Document> docs) {
    public void onDocumentsPicked(List<DocumentInfo> docs) {
        if (mAction == ACTION_OPEN || mAction == ACTION_GET_CONTENT) {
            final int size = docs.size();
            final Uri[] uris = new Uri[size];
@@ -602,21 +602,19 @@ public class DocumentsActivity extends Activity {
        }
    }

    public void onSaveRequested(Document replaceTarget) {
    public void onSaveRequested(DocumentInfo replaceTarget) {
        onFinished(replaceTarget.uri);
    }

    public void onSaveRequested(String mimeType, String displayName) {
        final Document cwd = getCurrentDirectory();
        final DocumentInfo cwd = getCurrentDirectory();
        final String authority = cwd.uri.getAuthority();

        final ContentProviderClient client = getContentResolver()
                .acquireUnstableContentProviderClient(authority);
        try {
            final String docId = DocumentsContract.createDocument(client,
                    DocumentsContract.getDocId(cwd.uri), mimeType, displayName);

            final Uri childUri = DocumentsContract.buildDocumentUri(authority, docId);
            final Uri childUri = DocumentsContract.createDocument(
                    getContentResolver(), cwd.uri, mimeType, displayName);
            onFinished(childUri);
        } catch (Exception e) {
            Toast.makeText(this, R.string.save_error, Toast.LENGTH_SHORT).show();
@@ -701,7 +699,7 @@ public class DocumentsActivity extends Activity {

    private void dumpStack() {
        Log.d(TAG, "Current stack:");
        for (Document doc : mStack) {
        for (DocumentInfo doc : mStack) {
            Log.d(TAG, "--> " + doc);
        }
    }
Loading