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

Commit 2ee7641a authored by Alexander Dorokhine's avatar Alexander Dorokhine
Browse files

Refactor how AppSearchResult and AppSearchBatchResult are parcelled.

Mainline modules seem to be metalava'd differently, causing the CREATOR,
describeContents(), and other parcelling methods to become part of the
public API.

Additionally, AppSearchResult and AppSearchBatchResult were forked from
Jetpack with parcelling added, and manually maintained.

Additionally, the parcelling wouldn't work properly if the keys and
values are not themselves parcelable, but this was not clearly
documented or called out.

This CL fixes these problems by creating parcelable wrappers around the
upstream Jetpack AppSearchResult and AppSearchBatchResult, usable only
when they contain parcelable keys and values.

Bug: 146218515
Test: Presubmit
Change-Id: I828a22dc6dae3e46f5d167f1a9d12627ba15d9fd
parent 321827b7
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package android.app.appsearch;
import android.annotation.CallbackExecutor;
import android.annotation.NonNull;
import android.annotation.SystemService;
import android.app.appsearch.aidl.IAppSearchManager;
import android.content.Context;

import com.android.internal.util.Preconditions;
+1 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@ package android.app.appsearch;

import android.annotation.SystemApi;
import android.app.SystemServiceRegistry;
import android.app.appsearch.aidl.IAppSearchManager;
import android.content.Context;

/**
+7 −4
Original line number Diff line number Diff line
@@ -23,6 +23,9 @@ import static android.os.ParcelFileDescriptor.MODE_WRITE_ONLY;
import android.annotation.NonNull;
import android.annotation.UserIdInt;
import android.annotation.WorkerThread;
import android.app.appsearch.aidl.AppSearchResultParcel;
import android.app.appsearch.aidl.IAppSearchManager;
import android.app.appsearch.aidl.IAppSearchResultCallback;
import android.app.appsearch.exceptions.AppSearchException;
import android.os.Bundle;
import android.os.Parcel;
@@ -105,8 +108,8 @@ public class AppSearchMigrationHelper implements Closeable {
                    mUserId,
                    new IAppSearchResultCallback.Stub() {
                        @Override
                        public void onResult(AppSearchResult result) {
                            future.complete(result);
                        public void onResult(AppSearchResultParcel resultParcel) {
                            future.complete(resultParcel.getResult());
                        }
                    });
            AppSearchResult<Void> result = future.get();
@@ -145,8 +148,8 @@ public class AppSearchMigrationHelper implements Closeable {
            mService.putDocumentsFromFile(mPackageName, mDatabaseName, fileDescriptor, mUserId,
                    new IAppSearchResultCallback.Stub() {
                        @Override
                        public void onResult(AppSearchResult result) {
                            future.complete(result);
                        public void onResult(AppSearchResultParcel resultParcel) {
                            future.complete(resultParcel.getResult());
                        }
                    });
            AppSearchResult<List<Bundle>> result = future.get();
+57 −38
Original line number Diff line number Diff line
@@ -19,6 +19,11 @@ package android.app.appsearch;
import android.annotation.CallbackExecutor;
import android.annotation.NonNull;
import android.annotation.UserIdInt;
import android.app.appsearch.aidl.AppSearchBatchResultParcel;
import android.app.appsearch.aidl.AppSearchResultParcel;
import android.app.appsearch.aidl.IAppSearchBatchResultCallback;
import android.app.appsearch.aidl.IAppSearchManager;
import android.app.appsearch.aidl.IAppSearchResultCallback;
import android.app.appsearch.exceptions.AppSearchException;
import android.app.appsearch.util.SchemaMigrationUtil;
import android.compat.annotation.UnsupportedAppUsage;
@@ -86,13 +91,15 @@ public final class AppSearchSession implements Closeable {
            @NonNull Consumer<AppSearchResult<AppSearchSession>> callback) {
        try {
            mService.initialize(mUserId, new IAppSearchResultCallback.Stub() {
                public void onResult(AppSearchResult result) {
                @Override
                public void onResult(AppSearchResultParcel resultParcel) {
                    executor.execute(() -> {
                        AppSearchResult<Void> result = resultParcel.getResult();
                        if (result.isSuccess()) {
                            callback.accept(
                                    AppSearchResult.newSuccessfulResult(AppSearchSession.this));
                        } else {
                            callback.accept(result);
                            callback.accept(AppSearchResult.newFailedResult(result));
                        }
                    });
                }
@@ -191,15 +198,16 @@ public final class AppSearchSession implements Closeable {
                    mDatabaseName,
                    mUserId,
                    new IAppSearchResultCallback.Stub() {
                        public void onResult(AppSearchResult result) {
                        @Override
                        public void onResult(AppSearchResultParcel resultParcel) {
                            executor.execute(() -> {
                                AppSearchResult<Bundle> result = resultParcel.getResult();
                                if (result.isSuccess()) {
                                    Bundle responseBundle = (Bundle) result.getResultValue();
                                    GetSchemaResponse response =
                                            new GetSchemaResponse(responseBundle);
                                            new GetSchemaResponse(result.getResultValue());
                                    callback.accept(AppSearchResult.newSuccessfulResult(response));
                                } else {
                                    callback.accept(result);
                                    callback.accept(AppSearchResult.newFailedResult(result));
                                }
                            });
                        }
@@ -227,15 +235,17 @@ public final class AppSearchSession implements Closeable {
                    mDatabaseName,
                    mUserId,
                    new IAppSearchResultCallback.Stub() {
                        public void onResult(AppSearchResult result) {
                        @Override
                        public void onResult(AppSearchResultParcel resultParcel) {
                            executor.execute(() -> {
                                AppSearchResult<List<String>> result = resultParcel.getResult();
                                if (result.isSuccess()) {
                                    Set<String> namespaces =
                                            new ArraySet<>((List<String>) result.getResultValue());
                                            new ArraySet<>(result.getResultValue());
                                    callback.accept(
                                            AppSearchResult.newSuccessfulResult(namespaces));
                                } else {
                                    callback.accept(result);
                                    callback.accept(AppSearchResult.newFailedResult(result));
                                }
                            });
                        }
@@ -280,13 +290,14 @@ public final class AppSearchSession implements Closeable {
                    /*binderCallStartTimeMillis=*/ SystemClock.elapsedRealtime(),
                    new IAppSearchBatchResultCallback.Stub() {
                        @Override
                        public void onResult(AppSearchBatchResult result) {
                            executor.execute(() -> callback.onResult(result));
                        public void onResult(AppSearchBatchResultParcel resultParcel) {
                            executor.execute(() -> callback.onResult(resultParcel.getResult()));
                        }

                        @Override
                        public void onSystemError(AppSearchResult result) {
                            executor.execute(() -> sendSystemErrorToCallback(result, callback));
                        public void onSystemError(AppSearchResultParcel resultParcel) {
                            executor.execute(() -> sendSystemErrorToCallback(
                                    resultParcel.getResult(), callback));
                        }
                    });
            mIsMutated = true;
@@ -341,15 +352,17 @@ public final class AppSearchSession implements Closeable {
                    mUserId,
                    new IAppSearchBatchResultCallback.Stub() {
                        @Override
                        public void onResult(AppSearchBatchResult result) {
                        public void onResult(AppSearchBatchResultParcel resultParcel) {
                            executor.execute(() -> {
                                AppSearchBatchResult<String, Bundle> result =
                                        resultParcel.getResult();
                                AppSearchBatchResult.Builder<String, GenericDocument>
                                        documentResultBuilder =
                                        new AppSearchBatchResult.Builder<>();

                                // Translate successful results
                                for (Map.Entry<String, Bundle> bundleEntry :
                                        ((Map<String, Bundle>) result.getSuccesses()).entrySet()) {
                                        result.getSuccesses().entrySet()) {
                                    GenericDocument document;
                                    try {
                                        document = new GenericDocument(bundleEntry.getValue());
@@ -380,8 +393,9 @@ public final class AppSearchSession implements Closeable {
                        }

                        @Override
                        public void onSystemError(AppSearchResult result) {
                            executor.execute(() -> sendSystemErrorToCallback(result, callback));
                        public void onSystemError(AppSearchResultParcel result) {
                            executor.execute(
                                    () -> sendSystemErrorToCallback(result.getResult(), callback));
                        }
                    });
        } catch (RemoteException e) {
@@ -492,8 +506,9 @@ public final class AppSearchSession implements Closeable {
                    /*systemUsage=*/ false,
                    mUserId,
                    new IAppSearchResultCallback.Stub() {
                        public void onResult(AppSearchResult result) {
                            executor.execute(() -> callback.accept(result));
                        @Override
                        public void onResult(AppSearchResultParcel resultParcel) {
                            executor.execute(() -> callback.accept(resultParcel.getResult()));
                        }
                    });
            mIsMutated = true;
@@ -550,13 +565,14 @@ public final class AppSearchSession implements Closeable {
                    new ArrayList<>(request.getIds()), mUserId,
                    new IAppSearchBatchResultCallback.Stub() {
                        @Override
                        public void onResult(AppSearchBatchResult result) {
                            executor.execute(() -> callback.onResult(result));
                        public void onResult(AppSearchBatchResultParcel resultParcel) {
                            executor.execute(() -> callback.onResult(resultParcel.getResult()));
                        }

                        @Override
                        public void onSystemError(AppSearchResult result) {
                            executor.execute(() -> sendSystemErrorToCallback(result, callback));
                        public void onSystemError(AppSearchResultParcel resultParcel) {
                            executor.execute(() -> sendSystemErrorToCallback(
                                    resultParcel.getResult(), callback));
                        }
                    });
            mIsMutated = true;
@@ -598,8 +614,9 @@ public final class AppSearchSession implements Closeable {
            mService.removeByQuery(mPackageName, mDatabaseName, queryExpression,
                    searchSpec.getBundle(), mUserId,
                    new IAppSearchResultCallback.Stub() {
                        public void onResult(AppSearchResult result) {
                            executor.execute(() -> callback.accept(result));
                        @Override
                        public void onResult(AppSearchResultParcel resultParcel) {
                            executor.execute(() -> callback.accept(resultParcel.getResult()));
                        }
                    });
            mIsMutated = true;
@@ -629,15 +646,15 @@ public final class AppSearchSession implements Closeable {
                    mDatabaseName,
                    mUserId,
                    new IAppSearchResultCallback.Stub() {
                        public void onResult(AppSearchResult result) {
                        @Override
                        public void onResult(AppSearchResultParcel resultParcel) {
                            executor.execute(() -> {
                                AppSearchResult<Bundle> result = resultParcel.getResult();
                                if (result.isSuccess()) {
                                    Bundle responseBundle = (Bundle) result.getResultValue();
                                    StorageInfo response =
                                            new StorageInfo(responseBundle);
                                    StorageInfo response = new StorageInfo(result.getResultValue());
                                    callback.accept(AppSearchResult.newSuccessfulResult(response));
                                } else {
                                    callback.accept(result);
                                    callback.accept(AppSearchResult.newFailedResult(result));
                                }
                            });
                        }
@@ -686,13 +703,14 @@ public final class AppSearchSession implements Closeable {
                    request.getVersion(),
                    mUserId,
                    new IAppSearchResultCallback.Stub() {
                        public void onResult(AppSearchResult result) {
                        @Override
                        public void onResult(AppSearchResultParcel resultParcel) {
                            executor.execute(() -> {
                                AppSearchResult<Bundle> result = resultParcel.getResult();
                                if (result.isSuccess()) {
                                    try {
                                        SetSchemaResponse setSchemaResponse =
                                                new SetSchemaResponse(
                                                        (Bundle) result.getResultValue());
                                                new SetSchemaResponse(result.getResultValue());
                                        if (!request.isForceOverride()) {
                                            // Throw exception if there is any deleted types or
                                            // incompatible types. That's the only case we swallowed
@@ -707,7 +725,7 @@ public final class AppSearchSession implements Closeable {
                                        callback.accept(AppSearchResult.throwableToFailedResult(t));
                                    }
                                } else {
                                    callback.accept(result);
                                    callback.accept(AppSearchResult.newFailedResult(result));
                                }
                            });
                        }
@@ -772,8 +790,9 @@ public final class AppSearchSession implements Closeable {
                        request.getVersion(),
                        mUserId,
                        new IAppSearchResultCallback.Stub() {
                            public void onResult(AppSearchResult result) {
                                setSchemaFuture.complete(result);
                            @Override
                            public void onResult(AppSearchResultParcel resultParcel) {
                                setSchemaFuture.complete(resultParcel.getResult());
                            }
                        });
                AppSearchResult<Bundle> setSchemaResult = setSchemaFuture.get();
@@ -823,8 +842,8 @@ public final class AppSearchSession implements Closeable {
                                mUserId,
                                new IAppSearchResultCallback.Stub() {
                                    @Override
                                    public void onResult(AppSearchResult result) {
                                        setSchema2Future.complete(result);
                                    public void onResult(AppSearchResultParcel resultParcel) {
                                        setSchema2Future.complete(resultParcel.getResult());
                                    }
                                });
                        AppSearchResult<Bundle> setSchema2Result = setSchema2Future.get();
+10 −5
Original line number Diff line number Diff line
@@ -16,10 +16,12 @@

package android.app.appsearch;


import android.annotation.CallbackExecutor;
import android.annotation.NonNull;
import android.annotation.UserIdInt;
import android.app.appsearch.aidl.AppSearchResultParcel;
import android.app.appsearch.aidl.IAppSearchManager;
import android.app.appsearch.aidl.IAppSearchResultCallback;
import android.os.RemoteException;
import android.util.Log;

@@ -71,13 +73,15 @@ public class GlobalSearchSession implements Closeable {
            @NonNull Consumer<AppSearchResult<GlobalSearchSession>> callback) {
        try {
            mService.initialize(mUserId, new IAppSearchResultCallback.Stub() {
                public void onResult(AppSearchResult result) {
                @Override
                public void onResult(AppSearchResultParcel resultParcel) {
                    executor.execute(() -> {
                        AppSearchResult<Void> result = resultParcel.getResult();
                        if (result.isSuccess()) {
                            callback.accept(
                                    AppSearchResult.newSuccessfulResult(GlobalSearchSession.this));
                        } else {
                            callback.accept(result);
                            callback.accept(AppSearchResult.newFailedResult(result));
                        }
                    });
                }
@@ -159,8 +163,9 @@ public class GlobalSearchSession implements Closeable {
                    /*systemUsage=*/ true,
                    mUserId,
                    new IAppSearchResultCallback.Stub() {
                        public void onResult(AppSearchResult result) {
                            executor.execute(() -> callback.accept(result));
                        @Override
                        public void onResult(AppSearchResultParcel resultParcel) {
                            executor.execute(() -> callback.accept(resultParcel.getResult()));
                        }
                    });
            mIsMutated = true;
Loading