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

Commit 54ca29a5 authored by Jeff Sharkey's avatar Jeff Sharkey
Browse files

DocumentsUI handles GET_CONTENT; hinting, errors.

Document browser now takes over all GET_CONTENT requests that request
openable Uris. It shows both storage backends and includes other apps
that respond to GET_CONTENT. Only grants transient read permissions.

Better guarding against throwing storage backends. Send sort order
and local-only hinting to backends.

Require that OPEN/CREATE_DOC users include openable category.

Bug: 10330112, 10329976, 10340741, 10331689, 10329971
Change-Id: Ieb8768a6d71201816046f4a4c48832061a313c28
parent 2241d45c
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -65,7 +65,7 @@ public final class DocumentsContract {
    public static final String META_DATA_DOCUMENT_PROVIDER = "android.content.DOCUMENT_PROVIDER";

    /** {@hide} */
    public static final String ACTION_ROOTS_CHANGED = "android.provider.action.ROOTS_CHANGED";
    public static final String ACTION_DOCUMENT_CHANGED = "android.provider.action.DOCUMENT_CHANGED";

    /**
     * {@link DocumentColumns#DOC_ID} value representing the root directory of a
@@ -496,7 +496,7 @@ public final class DocumentsContract {
     * This signal is used to invalidate internal caches.
     */
    public static void notifyRootsChanged(Context context, String authority) {
        final Intent intent = new Intent(ACTION_ROOTS_CHANGED);
        final Intent intent = new Intent(ACTION_DOCUMENT_CHANGED);
        intent.setData(buildRootsUri(authority));
        context.sendBroadcast(intent);
    }
+8 −0
Original line number Diff line number Diff line
@@ -17,11 +17,19 @@
            <intent-filter android:priority="100">
                <action android:name="android.intent.action.OPEN_DOCUMENT" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.OPENABLE" />
                <data android:mimeType="*/*" />
            </intent-filter>
            <intent-filter android:priority="100">
                <action android:name="android.intent.action.CREATE_DOCUMENT" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.OPENABLE" />
                <data android:mimeType="*/*" />
            </intent-filter>
            <intent-filter android:priority="100">
                <action android:name="android.intent.action.GET_CONTENT" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.OPENABLE" />
                <data android:mimeType="*/*" />
            </intent-filter>
        </activity>
+1 −0
Original line number Diff line number Diff line
@@ -47,6 +47,7 @@
    <string name="root_type_service">Services</string>
    <string name="root_type_shortcut">Shortcuts</string>
    <string name="root_type_device">Devices</string>
    <string name="root_type_apps">More apps</string>

    <string name="pref_advanced_devices">Display advanced devices</string>
    <string name="pref_file_size">Display file size</string>
+5 −1
Original line number Diff line number Diff line
@@ -144,7 +144,7 @@ public class DirectoryFragment extends Fragment {
                final DisplayState state = getDisplayState(DirectoryFragment.this);
                mFilter = new MimePredicate(state.acceptMimes);

                final Uri contentsUri;
                Uri contentsUri;
                if (mType == TYPE_NORMAL) {
                    contentsUri = DocumentsContract.buildContentsUri(uri);
                } else if (mType == TYPE_RECENT_OPEN) {
@@ -153,6 +153,10 @@ public class DirectoryFragment extends Fragment {
                    contentsUri = uri;
                }

                if (state.localOnly) {
                    contentsUri = DocumentsContract.setLocalOnly(contentsUri);
                }

                final Comparator<Document> sortOrder;
                if (state.sortOrder == DisplayState.SORT_ORDER_DATE || mType == TYPE_RECENT_OPEN) {
                    sortOrder = new Document.DateComparator();
+34 −2
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.CancellationSignal;
import android.provider.DocumentsContract.DocumentColumns;
import android.util.Log;

import com.android.documentsui.model.Document;
@@ -38,6 +39,7 @@ import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;

public class DirectoryLoader extends UriDerivativeLoader<List<Document>> {
@@ -46,6 +48,17 @@ public class DirectoryLoader extends UriDerivativeLoader<List<Document>> {
    private Predicate<Document> mFilter;
    private Comparator<Document> mSortOrder;

    /**
     * Stub result that represents an internal error.
     */
    public static class ExceptionResult extends LinkedList<Document> {
        public final Exception e;

        public ExceptionResult(Exception e) {
            this.e = e;
        }
    }

    public DirectoryLoader(Context context, Uri uri, int type, Predicate<Document> filter,
            Comparator<Document> sortOrder) {
        super(context, uri);
@@ -56,11 +69,18 @@ public class DirectoryLoader extends UriDerivativeLoader<List<Document>> {

    @Override
    public List<Document> loadInBackground(Uri uri, CancellationSignal signal) {
        try {
            return loadInBackgroundInternal(uri, signal);
        } catch (Exception e) {
            return new ExceptionResult(e);
        }
    }

    private List<Document> loadInBackgroundInternal(Uri uri, CancellationSignal signal) {
        final ArrayList<Document> result = Lists.newArrayList();

        // TODO: send selection and sorting hints to backend
        final ContentResolver resolver = getContext().getContentResolver();
        final Cursor cursor = resolver.query(uri, null, null, null, null, signal);
        final Cursor cursor = resolver.query(uri, null, null, null, getQuerySortOrder(), signal);
        try {
            while (cursor != null && cursor.moveToNext()) {
                Document doc = null;
@@ -94,4 +114,16 @@ public class DirectoryLoader extends UriDerivativeLoader<List<Document>> {

        return result;
    }

    private String getQuerySortOrder() {
        if (mSortOrder instanceof Document.DateComparator) {
            return DocumentColumns.LAST_MODIFIED + " DESC";
        } else if (mSortOrder instanceof Document.NameComparator) {
            return DocumentColumns.DISPLAY_NAME + " ASC";
        } else if (mSortOrder instanceof Document.SizeComparator) {
            return DocumentColumns.SIZE + " DESC";
        } else {
            return null;
        }
    }
}
Loading