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

Commit 7c925042 authored by Jeff Sharkey's avatar Jeff Sharkey Committed by Android (Google) Code Review
Browse files

Merge "New recents behavior to match spec." into klp-dev

parents c22acf6f 251097b3
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -20865,6 +20865,7 @@ package android.provider {
    field public static final int FLAG_PROVIDES_IMAGES = 32; // 0x20
    field public static final int FLAG_PROVIDES_VIDEO = 16; // 0x10
    field public static final int FLAG_SUPPORTS_CREATE = 1; // 0x1
    field public static final int FLAG_SUPPORTS_RECENTS = 64; // 0x40
    field public static final int ROOT_TYPE_DEVICE = 3; // 0x3
    field public static final int ROOT_TYPE_SERVICE = 1; // 0x1
    field public static final int ROOT_TYPE_SHORTCUT = 2; // 0x2
+9 −0
Original line number Diff line number Diff line
@@ -411,6 +411,15 @@ public final class DocumentsContract {
         * @see Intent#EXTRA_MIME_TYPES
         */
        public static final int FLAG_PROVIDES_IMAGES = 1 << 5;

        /**
         * Flag indicating that this root can report recently modified
         * documents.
         *
         * @see #COLUMN_FLAGS
         * @see DocumentsContract#buildRecentDocumentsUri(String, String)
         */
        public static final int FLAG_SUPPORTS_RECENTS = 1 << 6;
    }

    /**
+1 −1
Original line number Diff line number Diff line
@@ -5,7 +5,7 @@ LOCAL_MODULE_TAGS := optional

LOCAL_SRC_FILES := $(call all-subdir-java-files)

LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4
LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4 guava

LOCAL_PACKAGE_NAME := DocumentsUI
LOCAL_CERTIFICATE := platform
+53 −34
Original line number Diff line number Diff line
@@ -64,6 +64,7 @@ import android.widget.Toast;

import com.android.documentsui.DocumentsActivity.State;
import com.android.documentsui.model.DocumentInfo;
import com.android.documentsui.model.RootInfo;
import com.android.internal.util.Predicate;
import com.google.android.collect.Lists;

@@ -86,6 +87,7 @@ public class DirectoryFragment extends Fragment {

    public static final int TYPE_NORMAL = 1;
    public static final int TYPE_SEARCH = 2;
    public static final int TYPE_RECENT_OPEN = 3;

    private int mType = TYPE_NORMAL;

@@ -95,7 +97,10 @@ public class DirectoryFragment extends Fragment {
    private LoaderCallbacks<DirectoryResult> mCallbacks;

    private static final String EXTRA_TYPE = "type";
    private static final String EXTRA_URI = "uri";
    private static final String EXTRA_AUTHORITY = "authority";
    private static final String EXTRA_ROOT_ID = "rootId";
    private static final String EXTRA_DOC_ID = "docId";
    private static final String EXTRA_QUERY = "query";

    private static AtomicInteger sLoaderId = new AtomicInteger(4000);

@@ -104,24 +109,26 @@ public class DirectoryFragment extends Fragment {
    private final int mLoaderId = sLoaderId.incrementAndGet();

    public static void showNormal(FragmentManager fm, Uri uri) {
        show(fm, TYPE_NORMAL, uri);
        show(fm, TYPE_NORMAL, uri.getAuthority(), null, DocumentsContract.getDocumentId(uri), null);
    }

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

    @Deprecated
    public static void showRecentsOpen(FragmentManager fm) {
        // TODO: new recents behavior
        show(fm, TYPE_RECENT_OPEN, null, null, null, null);
    }

    private static void show(FragmentManager fm, int type, Uri uri) {
    private static void show(FragmentManager fm, int type, String authority, String rootId,
            String docId, String query) {
        final Bundle args = new Bundle();
        args.putInt(EXTRA_TYPE, type);
        args.putParcelable(EXTRA_URI, uri);
        args.putString(EXTRA_AUTHORITY, authority);
        args.putString(EXTRA_ROOT_ID, rootId);
        args.putString(EXTRA_DOC_ID, docId);
        args.putString(EXTRA_QUERY, query);

        final DirectoryFragment fragment = new DirectoryFragment();
        fragment.setArguments(args);
@@ -160,9 +167,8 @@ public class DirectoryFragment extends Fragment {
        super.onActivityCreated(savedInstanceState);

        final Context context = getActivity();
        final Uri uri = getArguments().getParcelable(EXTRA_URI);

        mAdapter = new DocumentsAdapter(uri.getAuthority());
        mAdapter = new DocumentsAdapter();
        mType = getArguments().getInt(EXTRA_TYPE);

        mCallbacks = new LoaderCallbacks<DirectoryResult>() {
@@ -170,15 +176,26 @@ public class DirectoryFragment extends Fragment {
            public Loader<DirectoryResult> onCreateLoader(int id, Bundle args) {
                final State state = getDisplayState(DirectoryFragment.this);

                final String authority = getArguments().getString(EXTRA_AUTHORITY);
                final String rootId = getArguments().getString(EXTRA_ROOT_ID);
                final String docId = getArguments().getString(EXTRA_DOC_ID);
                final String query = getArguments().getString(EXTRA_QUERY);

                Uri contentsUri;
                if (mType == TYPE_NORMAL) {
                    contentsUri = DocumentsContract.buildChildDocumentsUri(
                            uri.getAuthority(), DocumentsContract.getDocumentId(uri));
                } else {
                    contentsUri = uri;
                }
                switch (mType) {
                    case TYPE_NORMAL:
                        contentsUri = DocumentsContract.buildChildDocumentsUri(authority, docId);
                        return new DirectoryLoader(context, rootId, contentsUri, state.sortOrder);
                    case TYPE_SEARCH:
                        contentsUri = DocumentsContract.buildSearchDocumentsUri(
                                authority, docId, query);
                        return new DirectoryLoader(context, rootId, contentsUri, state.sortOrder);
                    case TYPE_RECENT_OPEN:
                        return new RecentLoader(context);
                    default:
                        throw new IllegalStateException("Unknown type " + mType);

                return new DirectoryLoader(context, contentsUri, state.sortOrder);
                }
            }

            @Override
@@ -246,8 +263,7 @@ public class DirectoryFragment extends Fragment {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            final Cursor cursor = mAdapter.getItem(position);
            final Uri uri = getArguments().getParcelable(EXTRA_URI);
            final DocumentInfo doc = DocumentInfo.fromDirectoryCursor(uri, cursor);
            final DocumentInfo doc = DocumentInfo.fromDirectoryCursor(cursor);
            if (mFilter.apply(doc)) {
                ((DocumentsActivity) getActivity()).onDocumentPicked(doc);
            }
@@ -285,8 +301,7 @@ public class DirectoryFragment extends Fragment {
            for (int i = 0; i < size; i++) {
                if (checked.valueAt(i)) {
                    final Cursor cursor = mAdapter.getItem(checked.keyAt(i));
                    final Uri uri = getArguments().getParcelable(EXTRA_URI);
                    final DocumentInfo doc = DocumentInfo.fromDirectoryCursor(uri, cursor);
                    final DocumentInfo doc = DocumentInfo.fromDirectoryCursor(cursor);
                    docs.add(doc);
                }
            }
@@ -401,14 +416,8 @@ public class DirectoryFragment extends Fragment {
    }

    private class DocumentsAdapter extends BaseAdapter {
        private final String mAuthority;

        private Cursor mCursor;

        public DocumentsAdapter(String authority) {
            mAuthority = authority;
        }

        public void swapCursor(Cursor cursor) {
            mCursor = cursor;

@@ -443,6 +452,8 @@ public class DirectoryFragment extends Fragment {

            final Cursor cursor = getItem(position);

            final String docAuthority = getCursorString(cursor, RootCursorWrapper.COLUMN_AUTHORITY);
            final String docRootId = getCursorString(cursor, RootCursorWrapper.COLUMN_ROOT_ID);
            final String docId = getCursorString(cursor, Document.COLUMN_DOCUMENT_ID);
            final String docMimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE);
            final String docDisplayName = getCursorString(cursor, Document.COLUMN_DISPLAY_NAME);
@@ -466,7 +477,7 @@ public class DirectoryFragment extends Fragment {
            }

            if ((docFlags & Document.FLAG_SUPPORTS_THUMBNAIL) != 0) {
                final Uri uri = DocumentsContract.buildDocumentUri(mAuthority, docId);
                final Uri uri = DocumentsContract.buildDocumentUri(docAuthority, docId);
                final Bitmap cachedResult = thumbs.get(uri);
                if (cachedResult != null) {
                    icon.setImageBitmap(cachedResult);
@@ -477,13 +488,20 @@ public class DirectoryFragment extends Fragment {
                    task.execute(uri);
                }
            } else if (docIcon != 0) {
                icon.setImageDrawable(DocumentInfo.loadIcon(context, mAuthority, docIcon));
                icon.setImageDrawable(DocumentInfo.loadIcon(context, docAuthority, docIcon));
            } else {
                icon.setImageDrawable(RootsCache.resolveDocumentIcon(context, docMimeType));
            }

            title.setText(docDisplayName);

            if (mType == TYPE_RECENT_OPEN) {
                final RootInfo root = roots.getRoot(docAuthority, docRootId);
                icon1.setVisibility(View.VISIBLE);
                icon1.setImageDrawable(root.loadIcon(context));
                summary.setText(root.getDirectoryString());
                summary.setVisibility(View.VISIBLE);
            } else {
                icon1.setVisibility(View.GONE);
                if (docSummary != null) {
                    summary.setText(docSummary);
@@ -491,6 +509,7 @@ public class DirectoryFragment extends Fragment {
                } else {
                    summary.setVisibility(View.INVISIBLE);
                }
            }

            if (summaryGrid != null) {
                summaryGrid.setVisibility(
+12 −6
Original line number Diff line number Diff line
@@ -48,14 +48,16 @@ class DirectoryResult implements AutoCloseable {
public class DirectoryLoader extends AsyncTaskLoader<DirectoryResult> {
    private final ForceLoadContentObserver mObserver = new ForceLoadContentObserver();

    private final String mRootId;
    private final Uri mUri;
    private final int mSortOrder;

    private CancellationSignal mSignal;
    private DirectoryResult mResult;

    public DirectoryLoader(Context context, Uri uri, int sortOrder) {
    public DirectoryLoader(Context context, String rootId, Uri uri, int sortOrder) {
        super(context);
        mRootId = rootId;
        mUri = uri;
        mSortOrder = sortOrder;
    }
@@ -69,12 +71,16 @@ public class DirectoryLoader extends AsyncTaskLoader<DirectoryResult> {
            mSignal = new CancellationSignal();
        }
        final DirectoryResult result = new DirectoryResult();
        final String authority = mUri.getAuthority();
        try {
            result.client = getContext()
                    .getContentResolver().acquireUnstableContentProviderClient(mUri.getAuthority());
                    .getContentResolver().acquireUnstableContentProviderClient(authority);
            final Cursor cursor = result.client.query(
                    mUri, null, null, null, getQuerySortOrder(), mSignal);
            result.cursor = new SortingCursorWrapper(cursor, mSortOrder);
                    mUri, null, null, null, getQuerySortOrder(mSortOrder), mSignal);
            final Cursor withRoot = new RootCursorWrapper(mUri.getAuthority(), mRootId, cursor, -1);
            final Cursor sorted = new SortingCursorWrapper(withRoot, mSortOrder);

            result.cursor = sorted;
            result.cursor.registerContentObserver(mObserver);
        } catch (Exception e) {
            result.exception = e;
@@ -149,8 +155,8 @@ public class DirectoryLoader extends AsyncTaskLoader<DirectoryResult> {
        getContext().getContentResolver().unregisterContentObserver(mObserver);
    }

    private String getQuerySortOrder() {
        switch (mSortOrder) {
    public static String getQuerySortOrder(int sortOrder) {
        switch (sortOrder) {
            case SORT_ORDER_DISPLAY_NAME:
                return Document.COLUMN_DISPLAY_NAME + " ASC";
            case SORT_ORDER_LAST_MODIFIED:
Loading