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

Commit dbf8a3f3 authored by Kelvin Kwan's avatar Kelvin Kwan
Browse files

Make sure GlobalSearch and Recents can load correct data

Bug: 148270755
Test: manual
Test: atest DocumentsUIGoogleTests

Change-Id: I66450aed4a80dbdbc8abc04b5c913f6bad192b2c
parent a94d0652
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