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

Commit 590d75d7 authored by Kelvin Kwan's avatar Kelvin Kwan Committed by Android (Google) Code Review
Browse files

Merge "Make sure GlobalSearch and Recents can load correct data"

parents 28fb87ee dbf8a3f3
Loading
Loading
Loading
Loading
+8 −46
Original line number Diff line number Diff line
package com.android.documentsui;

import static com.android.documentsui.base.DocumentInfo.getCursorInt;
import static com.android.documentsui.base.DocumentInfo.getCursorString;

import android.database.Cursor;
import android.net.Uri;
import android.provider.DocumentsContract;
import android.util.Log;

import com.android.documentsui.base.DocumentInfo;
import com.android.documentsui.base.UserId;
import com.android.documentsui.roots.RootCursorWrapper;

import java.util.ArrayList;
import java.util.List;

public class ModelId {
    private final static String TAG = "ModelId";

    public static final String build(Uri uri) {
        String documentId;
        try {
            documentId = DocumentsContract.getDocumentId(uri);
        } catch (IllegalArgumentException e) {
            Log.e(TAG, "Failed to get document id.", e);
            return null;
        }
        String authority;
        authority = uri.getAuthority();
        return ModelId.build(authority, documentId);
    }

    public static final String build(DocumentInfo docInfo) {
        if (docInfo == null) {
            return null;
        }
        return ModelId.build(docInfo.authority, docInfo.documentId);
    }

    public static final String build(Cursor cursor) {
        if (cursor == null) {
            return null;
        }
        return ModelId.build(getCursorString(cursor, RootCursorWrapper.COLUMN_AUTHORITY),
        return ModelId.build(UserId.of(getCursorInt(cursor, RootCursorWrapper.COLUMN_USER_ID)),
                getCursorString(cursor, RootCursorWrapper.COLUMN_AUTHORITY),
                getCursorString(cursor, DocumentsContract.Document.COLUMN_DOCUMENT_ID));
    }

    public static final ArrayList<String> build(ArrayList<Uri> uris) {
        if (uris == null || uris.isEmpty()) {
            return null;
        }
        ArrayList<String> ids = new ArrayList<>();
        String id;
        for (Uri uri : uris) {
            id = ModelId.build(uri);
            if (id != null) {
                ids.add(id);
            }
        }
        return ids;
    }

    public static final String build(String authority, String docId) {
        if (authority == null || authority.isEmpty() || docId == null || docId.isEmpty()) {
    public static final String build(UserId userId, String authority, String docId) {
        if (userId == null || authority == null || authority.isEmpty() || docId == null
                || docId.isEmpty()) {
            return null;
        }
        return authority + "|" + docId;
        return userId + "|" + authority + "|" + docId;
    }
}
+19 −23
Original line number Diff line number Diff line
@@ -330,10 +330,6 @@ public abstract class MultiRootDocumentsLoader extends AsyncTaskLoader<Directory
        }
        FileUtils.closeQuietly(mResult);
        mResult = null;

        if (mObserver != null) {
            getContext().getContentResolver().unregisterContentObserver(mObserver);
        }
    }

    // TODO: create better transfer of ownership around cursor to ensure its
@@ -402,17 +398,17 @@ public abstract class MultiRootDocumentsLoader extends AsyncTaskLoader<Directory
                return;
            }

            ContentProviderClient client = null;
            try {
                client = DocumentsApplication.acquireUnstableProviderOrThrow(
                        getContext().getContentResolver(), authority);

            final int rootInfoCount = rootInfos.size();
            final Cursor[] res = new Cursor[rootInfoCount];
            mCursors = new Cursor[rootInfoCount];

            for (int i = 0; i < rootInfoCount; i++) {
                    final Uri uri = getQueryUri(rootInfos.get(i));
                final RootInfo rootInfo = rootInfos.get(i);
                try (ContentProviderClient client =
                             DocumentsApplication.acquireUnstableProviderOrThrow(
                                     rootInfo.userId.getContentResolver(getContext()),
                                     authority)) {
                    final Uri uri = getQueryUri(rootInfo);
                    try {
                        final Bundle queryArgs = new Bundle();
                        mState.sortModel.addQuerySortArgs(queryArgs);
@@ -421,17 +417,14 @@ public abstract class MultiRootDocumentsLoader extends AsyncTaskLoader<Directory
                        if (mObserver != null) {
                            res[i].registerContentObserver(mObserver);
                        }
                        mCursors[i] = generateResultCursor(rootInfos.get(i), res[i]);
                        mCursors[i] = generateResultCursor(rootInfo, res[i]);
                    } catch (Exception e) {
                        Log.w(TAG, "Failed to load " + authority + ", " + rootInfos.get(i).rootId,
                                e);
                    }
                        Log.w(TAG, "Failed to load " + authority + ", " + rootInfo.rootId, e);
                    }

                } catch (Exception e) {
                    Log.w(TAG, "Failed to acquire content resolver for authority: " + authority);
            } finally {
                FileUtils.closeQuietly(client);
                }
            }

            set(mCursors);
@@ -449,6 +442,9 @@ public abstract class MultiRootDocumentsLoader extends AsyncTaskLoader<Directory
            }

            for (Cursor cursor : mCursors) {
                if (mObserver != null && cursor != null) {
                    cursor.unregisterContentObserver(mObserver);
                }
                FileUtils.closeQuietly(cursor);
            }

+11 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.documentsui.roots;

import android.database.AbstractCursor;
import android.database.ContentObserver;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
@@ -161,4 +162,14 @@ public class RootCursorWrapper extends AbstractCursor {
    public boolean isNull(int column) {
        return mCursor.isNull(column);
    }

    @Override
    public void registerContentObserver(ContentObserver observer) {
        mCursor.registerContentObserver(observer);
    }

    @Override
    public void unregisterContentObserver(ContentObserver observer) {
        mCursor.unregisterContentObserver(observer);
    }
}
+3 −3
Original line number Diff line number Diff line
@@ -176,7 +176,7 @@ public class TestEnv {

    public void populateStack() {
        DocumentInfo rootDoc = model.getDocument(
                ModelId.build(TestProvidersAccess.HOME.authority, "1"));
                ModelId.build(model.mUserId, TestProvidersAccess.HOME.authority, "1"));

        // These are test setup sanity checks, not test assertions.
        assert rootDoc != null;
@@ -197,7 +197,7 @@ public class TestEnv {

    public void selectDocument(DocumentInfo info) {
        List<String> ids = new ArrayList<>(1);
        ids.add(ModelId.build(info.authority, info.documentId));
        ids.add(ModelId.build(info.userId, info.authority, info.documentId));
        selectionMgr.setItemsSelected(ids, true);
    }

@@ -205,7 +205,7 @@ public class TestEnv {
        List<String> ids = new ArrayList<>(count);
        for (int i = 0; i < count; i++) {
            DocumentInfo info = model.createFile(String.valueOf(i));
            ids.add(ModelId.build(info.authority, info.documentId));
            ids.add(ModelId.build(info.userId, info.authority, info.documentId));
        }
        selectionMgr.setItemsSelected(ids, true);
    }
+1 −1
Original line number Diff line number Diff line
@@ -43,7 +43,7 @@ public class TestModel extends Model {
        Document.COLUMN_MIME_TYPE
    };

    private final UserId mUserId;
    public final UserId mUserId;
    private final String mAuthority;
    private int mLastId = 0;
    private Random mRand = new Random();
Loading