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

Commit 95573751 authored by Cassie Wang's avatar Cassie Wang Committed by Android (Google) Code Review
Browse files

Merge "Pass global query package name to AppSearchImpl."

parents a8786df7 15667427
Loading
Loading
Loading
Loading
+15 −13
Original line number Diff line number Diff line
@@ -54,6 +54,7 @@ import java.util.Objects;
public class AppSearchManagerService extends SystemService {
    private static final String TAG = "AppSearchManagerService";
    private PackageManagerInternal mPackageManagerInternal;
    private ImplInstanceManager mImplInstanceManager;

    public AppSearchManagerService(Context context) {
        super(context);
@@ -63,6 +64,7 @@ public class AppSearchManagerService extends SystemService {
    public void onStart() {
        publishBinderService(Context.APP_SEARCH_SERVICE, new Stub());
        mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class);
        mImplInstanceManager = new ImplInstanceManager(getContext());
    }

    private class Stub extends IAppSearchManager.Stub {
@@ -100,7 +102,7 @@ public class AppSearchManagerService extends SystemService {
                    }
                    schemasPackageAccessible.put(entry.getKey(), packageIdentifiers);
                }
                AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId);
                AppSearchImpl impl = mImplInstanceManager.getInstance(callingUserId);
                impl.setSchema(
                        packageName,
                        databaseName,
@@ -131,7 +133,7 @@ public class AppSearchManagerService extends SystemService {
            final long callingIdentity = Binder.clearCallingIdentity();
            try {
                verifyCallingPackage(callingUid, packageName);
                AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId);
                AppSearchImpl impl = mImplInstanceManager.getInstance(callingUserId);
                List<AppSearchSchema> schemas = impl.getSchema(packageName, databaseName);
                List<Bundle> schemaBundles = new ArrayList<>(schemas.size());
                for (int i = 0; i < schemas.size(); i++) {
@@ -164,7 +166,7 @@ public class AppSearchManagerService extends SystemService {
                verifyCallingPackage(callingUid, packageName);
                AppSearchBatchResult.Builder<String, Void> resultBuilder =
                        new AppSearchBatchResult.Builder<>();
                AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId);
                AppSearchImpl impl = mImplInstanceManager.getInstance(callingUserId);
                for (int i = 0; i < documentBundles.size(); i++) {
                    GenericDocument document = new GenericDocument(documentBundles.get(i));
                    try {
@@ -205,7 +207,7 @@ public class AppSearchManagerService extends SystemService {
                verifyCallingPackage(callingUid, packageName);
                AppSearchBatchResult.Builder<String, Bundle> resultBuilder =
                        new AppSearchBatchResult.Builder<>();
                AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId);
                AppSearchImpl impl = mImplInstanceManager.getInstance(callingUserId);
                for (int i = 0; i < uris.size(); i++) {
                    String uri = uris.get(i);
                    try {
@@ -243,7 +245,7 @@ public class AppSearchManagerService extends SystemService {
            final long callingIdentity = Binder.clearCallingIdentity();
            try {
                verifyCallingPackage(callingUid, packageName);
                AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId);
                AppSearchImpl impl = mImplInstanceManager.getInstance(callingUserId);
                SearchResultPage searchResultPage =
                        impl.query(
                                packageName,
@@ -276,7 +278,7 @@ public class AppSearchManagerService extends SystemService {
            final long callingIdentity = Binder.clearCallingIdentity();
            try {
                verifyCallingPackage(callingUid, packageName);
                AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId);
                AppSearchImpl impl = mImplInstanceManager.getInstance(callingUserId);
                SearchResultPage searchResultPage = impl.globalQuery(
                        queryExpression,
                        new SearchSpec(searchSpecBundle),
@@ -304,7 +306,7 @@ public class AppSearchManagerService extends SystemService {
            // TODO(b/162450968) check nextPageToken is being advanced by the same uid as originally
            // opened it
            try {
                AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId);
                AppSearchImpl impl = mImplInstanceManager.getInstance(callingUserId);
                SearchResultPage searchResultPage = impl.getNextPage(nextPageToken);
                invokeCallbackOnResult(
                        callback,
@@ -322,7 +324,7 @@ public class AppSearchManagerService extends SystemService {
            int callingUserId = handleIncomingUser(userId, callingUid);
            final long callingIdentity = Binder.clearCallingIdentity();
            try {
                AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId);
                AppSearchImpl impl = mImplInstanceManager.getInstance(callingUserId);
                impl.invalidateNextPageToken(nextPageToken);
            } catch (Throwable t) {
                Log.e(TAG, "Unable to invalidate the query page token", t);
@@ -348,7 +350,7 @@ public class AppSearchManagerService extends SystemService {
            int callingUserId = handleIncomingUser(userId, callingUid);
            final long callingIdentity = Binder.clearCallingIdentity();
            try {
                AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId);
                AppSearchImpl impl = mImplInstanceManager.getInstance(callingUserId);
                impl.reportUsage(
                        packageName,
                        databaseName,
@@ -383,7 +385,7 @@ public class AppSearchManagerService extends SystemService {
                verifyCallingPackage(callingUid, packageName);
                AppSearchBatchResult.Builder<String, Void> resultBuilder =
                        new AppSearchBatchResult.Builder<>();
                AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId);
                AppSearchImpl impl = mImplInstanceManager.getInstance(callingUserId);
                for (int i = 0; i < uris.size(); i++) {
                    String uri = uris.get(i);
                    try {
@@ -419,7 +421,7 @@ public class AppSearchManagerService extends SystemService {
            final long callingIdentity = Binder.clearCallingIdentity();
            try {
                verifyCallingPackage(callingUid, packageName);
                AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId);
                AppSearchImpl impl = mImplInstanceManager.getInstance(callingUserId);
                impl.removeByQuery(
                        packageName,
                        databaseName,
@@ -439,7 +441,7 @@ public class AppSearchManagerService extends SystemService {
            int callingUserId = handleIncomingUser(userId, callingUid);
            final long callingIdentity = Binder.clearCallingIdentity();
            try {
                AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId);
                AppSearchImpl impl = mImplInstanceManager.getInstance(callingUserId);
                impl.persistToDisk();
            } catch (Throwable t) {
                Log.e(TAG, "Unable to persist the data to disk", t);
@@ -455,7 +457,7 @@ public class AppSearchManagerService extends SystemService {
            int callingUserId = handleIncomingUser(userId, callingUid);
            final long callingIdentity = Binder.clearCallingIdentity();
            try {
                ImplInstanceManager.getInstance(getContext(), callingUserId);
                mImplInstanceManager.getInstance(callingUserId);
                invokeCallbackOnResult(callback, AppSearchResult.newSuccessfulResult(null));
            } catch (Throwable t) {
                invokeCallbackOnError(callback, t);
+44 −9
Original line number Diff line number Diff line
@@ -16,14 +16,19 @@

package com.android.server.appsearch;

import static android.content.pm.PackageManager.MATCH_FACTORY_ONLY;

import android.annotation.NonNull;
import android.annotation.UserIdInt;
import android.app.appsearch.exceptions.AppSearchException;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Environment;
import android.os.UserHandle;
import android.os.storage.StorageManager;
import android.util.SparseArray;

import com.android.internal.R;
import com.android.server.appsearch.external.localstorage.AppSearchImpl;

import java.io.File;
@@ -38,7 +43,13 @@ public final class ImplInstanceManager {

    private static final SparseArray<AppSearchImpl> sInstances = new SparseArray<>();

    private ImplInstanceManager() {}
    private final Context mContext;
    private final String mGlobalQuerierPackage;

    public ImplInstanceManager(@NonNull Context context) {
        mContext = context;
        mGlobalQuerierPackage = getGlobalAppSearchDataQuerierPackageName(mContext);
    }

    /**
     * Gets an instance of AppSearchImpl for the given user.
@@ -46,19 +57,18 @@ public final class ImplInstanceManager {
     * <p>If no AppSearchImpl instance exists for this user, Icing will be initialized and one will
     * be created.
     *
     * @param context The Android context
     * @param userId The multi-user userId of the device user calling AppSearch
     * @return An initialized {@link AppSearchImpl} for this user
     */
    @NonNull
    public static AppSearchImpl getInstance(@NonNull Context context, @UserIdInt int userId)
    public AppSearchImpl getInstance(@UserIdInt int userId)
            throws AppSearchException {
        AppSearchImpl instance = sInstances.get(userId);
        if (instance == null) {
            synchronized (ImplInstanceManager.class) {
                instance = sInstances.get(userId);
                if (instance == null) {
                    instance = createImpl(context, userId);
                    instance = createImpl(userId);
                    sInstances.put(userId, instance);
                }
            }
@@ -66,16 +76,41 @@ public final class ImplInstanceManager {
        return instance;
    }

    private static AppSearchImpl createImpl(@NonNull Context context, @UserIdInt int userId)
    private AppSearchImpl createImpl(@UserIdInt int userId)
            throws AppSearchException {
        File appSearchDir = getAppSearchDir(context, userId);
        return AppSearchImpl.create(appSearchDir, context, userId, /*globalQuerierPackage=*/"");
        File appSearchDir = getAppSearchDir(mContext, userId);
        return AppSearchImpl.create(
                appSearchDir, mContext, userId, mGlobalQuerierPackage);
    }

    private static File getAppSearchDir(@NonNull Context context, @UserIdInt int userId) {
        // See com.android.internal.app.ChooserActivity::getPinnedSharedPrefs
        File userCeDir = Environment.getDataUserCePackageDirectory(
        File userCeDir =
                Environment.getDataUserCePackageDirectory(
                        StorageManager.UUID_PRIVATE_INTERNAL, userId, context.getPackageName());
        return new File(userCeDir, APP_SEARCH_DIR);
    }

    /**
     * Returns the global querier package if it's a system package. Otherwise, empty string.
     *
     * @param context Context of the system service.
     */
    private static String getGlobalAppSearchDataQuerierPackageName(Context context) {
        String globalAppSearchDataQuerierPackage =
                context.getString(R.string.config_globalAppSearchDataQuerierPackage);
        try {
            if (context.getPackageManager()
                            .getPackageInfoAsUser(
                                    globalAppSearchDataQuerierPackage,
                                    MATCH_FACTORY_ONLY,
                                    UserHandle.USER_SYSTEM)
                    == null) {
                return "";
            }
        } catch (PackageManager.NameNotFoundException e) {
            return "";
        }
        return globalAppSearchDataQuerierPackage;
    }
}