Remove PackageManagerInternal from AppSearchService.
Most public and system APIs use UserHandle instead of UserIdInt, so this
CL ports AppSearch to do so as well, so that there are less conversions
required.
Bug: 181787682
Test: Presubmit
Change-Id: I29e4ba6bc73b994f1ece077ce515e1465ce54b12
diff --git a/apex/appsearch/framework/java/android/app/appsearch/AppSearchManager.java b/apex/appsearch/framework/java/android/app/appsearch/AppSearchManager.java
index 59b940a..3c70276 100644
--- a/apex/appsearch/framework/java/android/app/appsearch/AppSearchManager.java
+++ b/apex/appsearch/framework/java/android/app/appsearch/AppSearchManager.java
@@ -205,7 +205,7 @@
AppSearchSession.createSearchSession(
searchContext,
mService,
- mContext.getUser().getIdentifier(),
+ mContext.getUser(),
getPackageName(),
executor,
callback);
@@ -228,7 +228,7 @@
Objects.requireNonNull(executor);
Objects.requireNonNull(callback);
GlobalSearchSession.createGlobalSearchSession(
- mService, mContext.getUser().getIdentifier(), getPackageName(), executor, callback);
+ mService, mContext.getUser(), getPackageName(), executor, callback);
}
/** Returns the package name that should be used for uid verification. */
diff --git a/apex/appsearch/framework/java/android/app/appsearch/AppSearchMigrationHelper.java b/apex/appsearch/framework/java/android/app/appsearch/AppSearchMigrationHelper.java
index 353051c..c738504 100644
--- a/apex/appsearch/framework/java/android/app/appsearch/AppSearchMigrationHelper.java
+++ b/apex/appsearch/framework/java/android/app/appsearch/AppSearchMigrationHelper.java
@@ -21,7 +21,6 @@
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;
@@ -31,6 +30,7 @@
import android.os.Parcel;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
+import android.os.UserHandle;
import android.util.ArraySet;
import java.io.Closeable;
@@ -57,20 +57,20 @@
private final IAppSearchManager mService;
private final String mPackageName;
private final String mDatabaseName;
- private final int mUserId;
+ private final UserHandle mUserHandle;
private final File mMigratedFile;
private final Set<String> mDestinationTypes;
private boolean mAreDocumentsMigrated = false;
AppSearchMigrationHelper(@NonNull IAppSearchManager service,
- @UserIdInt int userId,
+ @NonNull UserHandle userHandle,
@NonNull String packageName,
@NonNull String databaseName,
@NonNull Set<AppSearchSchema> newSchemas) throws IOException {
mService = Objects.requireNonNull(service);
+ mUserHandle = Objects.requireNonNull(userHandle);
mPackageName = Objects.requireNonNull(packageName);
mDatabaseName = Objects.requireNonNull(databaseName);
- mUserId = userId;
mMigratedFile = File.createTempFile(/*prefix=*/"appsearch", /*suffix=*/null);
mDestinationTypes = new ArraySet<>(newSchemas.size());
for (AppSearchSchema newSchema : newSchemas) {
@@ -105,7 +105,7 @@
.addFilterSchemas(schemaType)
.setTermMatch(SearchSpec.TERM_MATCH_EXACT_ONLY)
.build().getBundle(),
- mUserId,
+ mUserHandle,
new IAppSearchResultCallback.Stub() {
@Override
public void onResult(AppSearchResultParcel resultParcel) {
@@ -145,7 +145,7 @@
try (ParcelFileDescriptor fileDescriptor =
ParcelFileDescriptor.open(mMigratedFile, MODE_READ_ONLY)) {
CompletableFuture<AppSearchResult<List<Bundle>>> future = new CompletableFuture<>();
- mService.putDocumentsFromFile(mPackageName, mDatabaseName, fileDescriptor, mUserId,
+ mService.putDocumentsFromFile(mPackageName, mDatabaseName, fileDescriptor, mUserHandle,
new IAppSearchResultCallback.Stub() {
@Override
public void onResult(AppSearchResultParcel resultParcel) {
diff --git a/apex/appsearch/framework/java/android/app/appsearch/AppSearchSession.java b/apex/appsearch/framework/java/android/app/appsearch/AppSearchSession.java
index 43bf08d..4ef91b5 100644
--- a/apex/appsearch/framework/java/android/app/appsearch/AppSearchSession.java
+++ b/apex/appsearch/framework/java/android/app/appsearch/AppSearchSession.java
@@ -18,7 +18,6 @@
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;
@@ -30,6 +29,7 @@
import android.os.Bundle;
import android.os.RemoteException;
import android.os.SystemClock;
+import android.os.UserHandle;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Log;
@@ -61,26 +61,25 @@
private final String mPackageName;
private final String mDatabaseName;
- @UserIdInt
- private final int mUserId;
+ private final UserHandle mUserHandle;
private final IAppSearchManager mService;
private boolean mIsMutated = false;
private boolean mIsClosed = false;
/**
- * Creates a search session for the client, defined by the {@code userId} and
+ * Creates a search session for the client, defined by the {@code userHandle} and
* {@code packageName}.
*/
static void createSearchSession(
@NonNull AppSearchManager.SearchContext searchContext,
@NonNull IAppSearchManager service,
- @UserIdInt int userId,
+ @NonNull UserHandle userHandle,
@NonNull String packageName,
@NonNull @CallbackExecutor Executor executor,
@NonNull Consumer<AppSearchResult<AppSearchSession>> callback) {
AppSearchSession searchSession =
- new AppSearchSession(service, userId, packageName, searchContext.mDatabaseName);
+ new AppSearchSession(service, userHandle, packageName, searchContext.mDatabaseName);
searchSession.initialize(executor, callback);
}
@@ -90,7 +89,8 @@
@NonNull @CallbackExecutor Executor executor,
@NonNull Consumer<AppSearchResult<AppSearchSession>> callback) {
try {
- mService.initialize(mUserId,
+ mService.initialize(
+ mUserHandle,
/*binderCallStartTimeMillis=*/ SystemClock.elapsedRealtime(),
new IAppSearchResultCallback.Stub() {
@Override
@@ -112,10 +112,10 @@
}
}
- private AppSearchSession(@NonNull IAppSearchManager service, @UserIdInt int userId,
+ private AppSearchSession(@NonNull IAppSearchManager service, @NonNull UserHandle userHandle,
@NonNull String packageName, @NonNull String databaseName) {
mService = service;
- mUserId = userId;
+ mUserHandle = userHandle;
mPackageName = packageName;
mDatabaseName = databaseName;
}
@@ -199,7 +199,7 @@
mService.getSchema(
mPackageName,
mDatabaseName,
- mUserId,
+ mUserHandle,
new IAppSearchResultCallback.Stub() {
@Override
public void onResult(AppSearchResultParcel resultParcel) {
@@ -236,7 +236,7 @@
mService.getNamespaces(
mPackageName,
mDatabaseName,
- mUserId,
+ mUserHandle,
new IAppSearchResultCallback.Stub() {
@Override
public void onResult(AppSearchResultParcel resultParcel) {
@@ -289,7 +289,7 @@
documentBundles.add(documents.get(i).getBundle());
}
try {
- mService.putDocuments(mPackageName, mDatabaseName, documentBundles, mUserId,
+ mService.putDocuments(mPackageName, mDatabaseName, documentBundles, mUserHandle,
/*binderCallStartTimeMillis=*/ SystemClock.elapsedRealtime(),
new IAppSearchBatchResultCallback.Stub() {
@Override
@@ -352,7 +352,7 @@
request.getNamespace(),
new ArrayList<>(request.getIds()),
request.getProjectionsInternal(),
- mUserId,
+ mUserHandle,
/*binderCallStartTimeMillis=*/ SystemClock.elapsedRealtime(),
new IAppSearchBatchResultCallback.Stub() {
@Override
@@ -472,7 +472,7 @@
Objects.requireNonNull(searchSpec);
Preconditions.checkState(!mIsClosed, "AppSearchSession has already been closed");
return new SearchResults(mService, mPackageName, mDatabaseName, queryExpression,
- searchSpec, mUserId);
+ searchSpec, mUserHandle);
}
/**
@@ -508,7 +508,7 @@
request.getDocumentId(),
request.getUsageTimestampMillis(),
/*systemUsage=*/ false,
- mUserId,
+ mUserHandle,
new IAppSearchResultCallback.Stub() {
@Override
public void onResult(AppSearchResultParcel resultParcel) {
@@ -565,8 +565,12 @@
Objects.requireNonNull(callback);
Preconditions.checkState(!mIsClosed, "AppSearchSession has already been closed");
try {
- mService.removeByDocumentId(mPackageName, mDatabaseName, request.getNamespace(),
- new ArrayList<>(request.getIds()), mUserId,
+ mService.removeByDocumentId(
+ mPackageName,
+ mDatabaseName,
+ request.getNamespace(),
+ new ArrayList<>(request.getIds()),
+ mUserHandle,
/*binderCallStartTimeMillis=*/ SystemClock.elapsedRealtime(),
new IAppSearchBatchResultCallback.Stub() {
@Override
@@ -616,8 +620,12 @@
Objects.requireNonNull(callback);
Preconditions.checkState(!mIsClosed, "AppSearchSession has already been closed");
try {
- mService.removeByQuery(mPackageName, mDatabaseName, queryExpression,
- searchSpec.getBundle(), mUserId,
+ mService.removeByQuery(
+ mPackageName,
+ mDatabaseName,
+ queryExpression,
+ searchSpec.getBundle(),
+ mUserHandle,
/*binderCallStartTimeMillis=*/ SystemClock.elapsedRealtime(),
new IAppSearchResultCallback.Stub() {
@Override
@@ -650,7 +658,7 @@
mService.getStorageInfo(
mPackageName,
mDatabaseName,
- mUserId,
+ mUserHandle,
new IAppSearchResultCallback.Stub() {
@Override
public void onResult(AppSearchResultParcel resultParcel) {
@@ -678,8 +686,8 @@
public void close() {
if (mIsMutated && !mIsClosed) {
try {
- mService.persistToDisk(mUserId,
- /*binderCallStartTimeMillis=*/ SystemClock.elapsedRealtime());
+ mService.persistToDisk(
+ mUserHandle, /*binderCallStartTimeMillis=*/ SystemClock.elapsedRealtime());
mIsClosed = true;
} catch (RemoteException e) {
Log.e(TAG, "Unable to close the AppSearchSession", e);
@@ -708,7 +716,7 @@
schemasPackageAccessibleBundles,
request.isForceOverride(),
request.getVersion(),
- mUserId,
+ mUserHandle,
/*binderCallStartTimeMillis=*/ SystemClock.elapsedRealtime(),
new IAppSearchResultCallback.Stub() {
@Override
@@ -796,7 +804,7 @@
schemasPackageAccessibleBundles,
/*forceOverride=*/ false,
request.getVersion(),
- mUserId,
+ mUserHandle,
/*binderCallStartTimeMillis=*/ SystemClock.elapsedRealtime(),
new IAppSearchResultCallback.Stub() {
@Override
@@ -822,7 +830,7 @@
}
try (AppSearchMigrationHelper migrationHelper = new AppSearchMigrationHelper(
- mService, mUserId, mPackageName, mDatabaseName, request.getSchemas())) {
+ mService, mUserHandle, mPackageName, mDatabaseName, request.getSchemas())) {
// 4. Trigger migration for all migrators.
// TODO(b/177266929) trigger migration for all types together rather than
@@ -848,7 +856,7 @@
schemasPackageAccessibleBundles,
/*forceOverride=*/ true,
request.getVersion(),
- mUserId,
+ mUserHandle,
/*binderCallStartTimeMillis=*/ SystemClock.elapsedRealtime(),
new IAppSearchResultCallback.Stub() {
@Override
diff --git a/apex/appsearch/framework/java/android/app/appsearch/GlobalSearchSession.java b/apex/appsearch/framework/java/android/app/appsearch/GlobalSearchSession.java
index bb8d565..247eb08 100644
--- a/apex/appsearch/framework/java/android/app/appsearch/GlobalSearchSession.java
+++ b/apex/appsearch/framework/java/android/app/appsearch/GlobalSearchSession.java
@@ -18,12 +18,12 @@
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.os.SystemClock;
+import android.os.UserHandle;
import android.util.Log;
import com.android.internal.util.Preconditions;
@@ -45,24 +45,23 @@
private static final String TAG = "AppSearchGlobalSearchSe";
private final String mPackageName;
- @UserIdInt
- private final int mUserId;
+ private final UserHandle mUserHandle;
private final IAppSearchManager mService;
private boolean mIsMutated = false;
private boolean mIsClosed = false;
/**
- * Creates a search session for the client, defined by the {@code userId} and
+ * Creates a search session for the client, defined by the {@code userHandle} and
* {@code packageName}.
*/
static void createGlobalSearchSession(
@NonNull IAppSearchManager service,
- @UserIdInt int userId,
+ @NonNull UserHandle userHandle,
@NonNull String packageName,
@NonNull @CallbackExecutor Executor executor,
@NonNull Consumer<AppSearchResult<GlobalSearchSession>> callback) {
- GlobalSearchSession globalSearchSession = new GlobalSearchSession(service, userId,
+ GlobalSearchSession globalSearchSession = new GlobalSearchSession(service, userHandle,
packageName);
globalSearchSession.initialize(executor, callback);
}
@@ -73,7 +72,8 @@
@NonNull @CallbackExecutor Executor executor,
@NonNull Consumer<AppSearchResult<GlobalSearchSession>> callback) {
try {
- mService.initialize(mUserId,
+ mService.initialize(
+ mUserHandle,
/*binderCallStartTimeMillis=*/ SystemClock.elapsedRealtime(),
new IAppSearchResultCallback.Stub() {
@Override
@@ -95,10 +95,10 @@
}
}
- private GlobalSearchSession(@NonNull IAppSearchManager service, @UserIdInt int userId,
+ private GlobalSearchSession(@NonNull IAppSearchManager service, @NonNull UserHandle userHandle,
@NonNull String packageName) {
mService = service;
- mUserId = userId;
+ mUserHandle = userHandle;
mPackageName = packageName;
}
@@ -127,7 +127,7 @@
Objects.requireNonNull(searchSpec);
Preconditions.checkState(!mIsClosed, "GlobalSearchSession has already been closed");
return new SearchResults(mService, mPackageName, /*databaseName=*/null, queryExpression,
- searchSpec, mUserId);
+ searchSpec, mUserHandle);
}
/**
@@ -165,7 +165,7 @@
request.getDocumentId(),
request.getUsageTimestampMillis(),
/*systemUsage=*/ true,
- mUserId,
+ mUserHandle,
new IAppSearchResultCallback.Stub() {
@Override
public void onResult(AppSearchResultParcel resultParcel) {
@@ -186,8 +186,8 @@
public void close() {
if (mIsMutated && !mIsClosed) {
try {
- mService.persistToDisk(mUserId,
- /*binderCallStartTimeMillis=*/ SystemClock.elapsedRealtime());
+ mService.persistToDisk(
+ mUserHandle, /*binderCallStartTimeMillis=*/ SystemClock.elapsedRealtime());
mIsClosed = true;
} catch (RemoteException e) {
Log.e(TAG, "Unable to close the GlobalSearchSession", e);
diff --git a/apex/appsearch/framework/java/android/app/appsearch/SearchResults.java b/apex/appsearch/framework/java/android/app/appsearch/SearchResults.java
index 0106b0f..eb5d22e 100644
--- a/apex/appsearch/framework/java/android/app/appsearch/SearchResults.java
+++ b/apex/appsearch/framework/java/android/app/appsearch/SearchResults.java
@@ -19,13 +19,13 @@
import android.annotation.CallbackExecutor;
import android.annotation.NonNull;
import android.annotation.Nullable;
-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.Bundle;
import android.os.RemoteException;
import android.os.SystemClock;
+import android.os.UserHandle;
import android.util.Log;
import com.android.internal.util.Preconditions;
@@ -66,8 +66,7 @@
private final SearchSpec mSearchSpec;
- @UserIdInt
- private final int mUserId;
+ private final UserHandle mUserHandle;
private long mNextPageToken;
@@ -81,13 +80,13 @@
@Nullable String databaseName,
@NonNull String queryExpression,
@NonNull SearchSpec searchSpec,
- @UserIdInt int userId) {
+ @NonNull UserHandle userHandle) {
mService = Objects.requireNonNull(service);
mPackageName = packageName;
mDatabaseName = databaseName;
mQueryExpression = Objects.requireNonNull(queryExpression);
mSearchSpec = Objects.requireNonNull(searchSpec);
- mUserId = userId;
+ mUserHandle = Objects.requireNonNull(userHandle);
}
/**
@@ -114,18 +113,18 @@
if (mDatabaseName == null) {
// Global query, there's no one package-database combination to check.
mService.globalQuery(mPackageName, mQueryExpression,
- mSearchSpec.getBundle(), mUserId,
+ mSearchSpec.getBundle(), mUserHandle,
binderCallStartTimeMillis,
wrapCallback(executor, callback));
} else {
// Normal local query, pass in specified database.
mService.query(mPackageName, mDatabaseName, mQueryExpression,
- mSearchSpec.getBundle(), mUserId,
+ mSearchSpec.getBundle(), mUserHandle,
binderCallStartTimeMillis,
wrapCallback(executor, callback));
}
} else {
- mService.getNextPage(mNextPageToken, mUserId, wrapCallback(executor, callback));
+ mService.getNextPage(mNextPageToken, mUserHandle, wrapCallback(executor, callback));
}
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
@@ -136,7 +135,7 @@
public void close() {
if (!mIsClosed) {
try {
- mService.invalidateNextPageToken(mNextPageToken, mUserId);
+ mService.invalidateNextPageToken(mNextPageToken, mUserHandle);
mIsClosed = true;
} catch (RemoteException e) {
Log.e(TAG, "Unable to close the SearchResults", e);
diff --git a/apex/appsearch/framework/java/android/app/appsearch/aidl/IAppSearchManager.aidl b/apex/appsearch/framework/java/android/app/appsearch/aidl/IAppSearchManager.aidl
index 18ebddc..0b26e14 100644
--- a/apex/appsearch/framework/java/android/app/appsearch/aidl/IAppSearchManager.aidl
+++ b/apex/appsearch/framework/java/android/app/appsearch/aidl/IAppSearchManager.aidl
@@ -16,6 +16,7 @@
package android.app.appsearch.aidl;
import android.os.Bundle;
+import android.os.UserHandle;
import android.app.appsearch.aidl.IAppSearchBatchResultCallback;
import android.app.appsearch.aidl.IAppSearchResultCallback;
@@ -36,7 +37,7 @@
* @param forceOverride Whether to apply the new schema even if it is incompatible. All
* incompatible documents will be deleted.
* @param schemaVersion The overall schema version number of the request.
- * @param userId Id of the calling user
+ * @param userHandle Handle of the calling user
* @param binderCallStartTimeMillis start timestamp of binder call in Millis
* @param callback {@link IAppSearchResultCallback#onResult} will be called with an
* {@link AppSearchResult}<{@link Bundle}>, where the value are
@@ -50,7 +51,7 @@
in Map<String, List<Bundle>> schemasPackageAccessibleBundles,
boolean forceOverride,
in int schemaVersion,
- in int userId,
+ in UserHandle userHandle,
in long binderCallStartTimeMillis,
in IAppSearchResultCallback callback);
@@ -59,14 +60,14 @@
*
* @param packageName The name of the package that owns the schema.
* @param databaseName The name of the database to retrieve.
- * @param userId Id of the calling user
+ * @param userHandle Handle of the calling user
* @param callback {@link IAppSearchResultCallback#onResult} will be called with an
* {@link AppSearchResult}<{@link Bundle}> where the bundle is a GetSchemaResponse.
*/
void getSchema(
in String packageName,
in String databaseName,
- in int userId,
+ in UserHandle userHandle,
in IAppSearchResultCallback callback);
/**
@@ -74,14 +75,14 @@
*
* @param packageName The name of the package that owns the schema.
* @param databaseName The name of the database to retrieve.
- * @param userId Id of the calling user
+ * @param userHandle Handle of the calling user
* @param callback {@link IAppSearchResultCallback#onResult} will be called with an
* {@link AppSearchResult}<{@link List}<{@link String}>>.
*/
void getNamespaces(
in String packageName,
in String databaseName,
- in int userId,
+ in UserHandle userHandle,
in IAppSearchResultCallback callback);
/**
@@ -90,7 +91,7 @@
* @param packageName The name of the package that owns this document.
* @param databaseName The name of the database where this document lives.
* @param documentBundes List of GenericDocument bundles.
- * @param userId Id of the calling user
+ * @param userHandle Handle of the calling user
* @param binderCallStartTimeMillis start timestamp of binder call in Millis
* @param callback
* If the call fails to start, {@link IAppSearchBatchResultCallback#onSystemError}
@@ -103,7 +104,7 @@
in String packageName,
in String databaseName,
in List<Bundle> documentBundles,
- in int userId,
+ in UserHandle userHandle,
in long binderCallStartTimeMillis,
in IAppSearchBatchResultCallback callback);
@@ -116,7 +117,7 @@
* @param ids The IDs of the documents to retrieve
* @param typePropertyPaths A map of schema type to a list of property paths to return in the
* result.
- * @param userId Id of the calling user
+ * @param userHandle Handle of the calling user
* @param binderCallStartTimeMillis start timestamp of binder call in Millis
* @param callback
* If the call fails to start, {@link IAppSearchBatchResultCallback#onSystemError}
@@ -131,7 +132,7 @@
in String namespace,
in List<String> ids,
in Map<String, List<String>> typePropertyPaths,
- in int userId,
+ in UserHandle userHandle,
in long binderCallStartTimeMillis,
in IAppSearchBatchResultCallback callback);
@@ -142,7 +143,7 @@
* @param databaseName The databaseName this query for.
* @param queryExpression String to search for
* @param searchSpecBundle SearchSpec bundle
- * @param userId Id of the calling user
+ * @param userHandle Handle of the calling user
* @param binderCallStartTimeMillis start timestamp of binder call in Millis
* @param callback {@link AppSearchResult}<{@link Bundle}> of performing this
* operation.
@@ -152,7 +153,7 @@
in String databaseName,
in String queryExpression,
in Bundle searchSpecBundle,
- in int userId,
+ in UserHandle userHandle,
in long binderCallStartTimeMillis,
in IAppSearchResultCallback callback);
@@ -163,7 +164,7 @@
* @param packageName The name of the package making the query.
* @param queryExpression String to search for
* @param searchSpecBundle SearchSpec bundle
- * @param userId Id of the calling user
+ * @param userHandle Handle of the calling user
* @param binderCallStartTimeMillis start timestamp of binder call in Millis
* @param callback {@link AppSearchResult}<{@link Bundle}> of performing this
* operation.
@@ -172,7 +173,7 @@
in String packageName,
in String queryExpression,
in Bundle searchSpecBundle,
- in int userId,
+ in UserHandle userHandle,
in long binderCallStartTimeMillis,
in IAppSearchResultCallback callback);
@@ -181,20 +182,20 @@
* next-page token is invalid or all pages have been returned.
*
* @param nextPageToken The token of pre-loaded results of previously executed query.
- * @param userId Id of the calling user
+ * @param userHandle Handle of the calling user
* @param callback {@link AppSearchResult}<{@link Bundle}> of performing this
* operation.
*/
- void getNextPage(in long nextPageToken, in int userId, in IAppSearchResultCallback callback);
+ void getNextPage(in long nextPageToken, in UserHandle userHandle, in IAppSearchResultCallback callback);
/**
* Invalidates the next-page token so that no more results of the related query can be returned.
*
* @param nextPageToken The token of pre-loaded results of previously executed query to be
* Invalidated.
- * @param userId Id of the calling user
+ * @param userHandle Handle of the calling user
*/
- void invalidateNextPageToken(in long nextPageToken, in int userId);
+ void invalidateNextPageToken(in long nextPageToken, in UserHandle userHandle);
/**
* Searches a document based on a given specifications.
@@ -206,7 +207,7 @@
* @param fileDescriptor The ParcelFileDescriptor where documents should be written to.
* @param queryExpression String to search for.
* @param searchSpecBundle SearchSpec bundle.
- * @param userId Id of the calling user.
+ * @param userHandle Handle of the calling user.
* @param callback {@link IAppSearchResultCallback#onResult} will be called with an
* {@link AppSearchResult}<{@code Void}>.
*/
@@ -216,7 +217,7 @@
in ParcelFileDescriptor fileDescriptor,
in String queryExpression,
in Bundle searchSpecBundle,
- in int userId,
+ in UserHandle userHandle,
in IAppSearchResultCallback callback);
/**
@@ -225,7 +226,7 @@
* @param packageName The name of the package that owns this document.
* @param databaseName The name of the database where this document lives.
* @param fileDescriptor The ParcelFileDescriptor where documents should be read from.
- * @param userId Id of the calling user.
+ * @param userHandle Handle of the calling user.
* @param callback {@link IAppSearchResultCallback#onResult} will be called with an
* {@link AppSearchResult}<{@link List}<{@link Bundle}>>, where the value are
* MigrationFailure bundles.
@@ -234,7 +235,7 @@
in String packageName,
in String databaseName,
in ParcelFileDescriptor fileDescriptor,
- in int userId,
+ in UserHandle userHandle,
in IAppSearchResultCallback callback);
/**
@@ -255,7 +256,7 @@
* @param id ID of the document being used.
* @param usageTimestampMillis The timestamp at which the document was used.
* @param systemUsage Whether the usage was reported by a system app against another app's doc.
- * @param userId Id of the calling user
+ * @param userHandle Handle of the calling user
* @param callback {@link IAppSearchResultCallback#onResult} will be called with an
* {@link AppSearchResult}<{@link Void}>.
*/
@@ -266,7 +267,7 @@
in String id,
in long usageTimestampMillis,
in boolean systemUsage,
- in int userId,
+ in UserHandle userHandle,
in IAppSearchResultCallback callback);
/**
@@ -276,7 +277,7 @@
* @param databaseName The databaseName the document is in.
* @param namespace Namespace of the document to remove.
* @param ids The IDs of the documents to delete
- * @param userId Id of the calling user
+ * @param userHandle Handle of the calling user
* @param binderCallStartTimeMillis start timestamp of binder call in Millis
* @param callback
* If the call fails to start, {@link IAppSearchBatchResultCallback#onSystemError}
@@ -291,7 +292,7 @@
in String databaseName,
in String namespace,
in List<String> ids,
- in int userId,
+ in UserHandle userHandle,
in long binderCallStartTimeMillis,
in IAppSearchBatchResultCallback callback);
@@ -302,7 +303,7 @@
* @param databaseName The databaseName this query for.
* @param queryExpression String to search for
* @param searchSpecBundle SearchSpec bundle
- * @param userId Id of the calling user
+ * @param userHandle Handle of the calling user
* @param binderCallStartTimeMillis start timestamp of binder call in Millis
* @param callback {@link IAppSearchResultCallback#onResult} will be called with an
* {@link AppSearchResult}<{@link Void}>.
@@ -312,7 +313,7 @@
in String databaseName,
in String queryExpression,
in Bundle searchSpecBundle,
- in int userId,
+ in UserHandle userHandle,
in long binderCallStartTimeMillis,
in IAppSearchResultCallback callback);
@@ -321,7 +322,7 @@
*
* @param packageName The name of the package to get the storage info for.
* @param databaseName The databaseName to get the storage info for.
- * @param userId Id of the calling user
+ * @param userHandle Handle of the calling user
* @param callback {@link IAppSearchResultCallback#onResult} will be called with an
* {@link AppSearchResult}<{@link Bundle}>, where the value is a
* {@link StorageInfo}.
@@ -329,27 +330,27 @@
void getStorageInfo(
in String packageName,
in String databaseName,
- in int userId,
+ in UserHandle userHandle,
in IAppSearchResultCallback callback);
/**
* Persists all update/delete requests to the disk.
*
- * @param userId Id of the calling user
+ * @param userHandle Handle of the calling user
* @param binderCallStartTimeMillis start timestamp of binder call in Millis
*/
- void persistToDisk(in int userId, in long binderCallStartTimeMillis);
+ void persistToDisk(in UserHandle userHandle, in long binderCallStartTimeMillis);
/**
* Creates and initializes AppSearchImpl for the calling app.
*
- * @param userId Id of the calling user
+ * @param userHandle Handle of the calling user
* @param binderCallStartTimeMillis start timestamp of binder call in Millis
* @param callback {@link IAppSearchResultCallback#onResult} will be called with an
* {@link AppSearchResult}<{@link Void}>.
*/
void initialize(
- in int userId,
+ in UserHandle userHandle,
in long binderCallStartTimeMillis,
in IAppSearchResultCallback callback);
}
diff --git a/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java b/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java
index 61ac63e..754cc41 100644
--- a/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java
+++ b/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java
@@ -21,7 +21,6 @@
import android.annotation.ElapsedRealtimeLong;
import android.annotation.NonNull;
-import android.annotation.UserIdInt;
import android.app.ActivityManager;
import android.app.appsearch.AppSearchBatchResult;
import android.app.appsearch.AppSearchMigrationHelper;
@@ -45,7 +44,6 @@
import android.content.IntentFilter;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
-import android.content.pm.PackageManagerInternal;
import android.content.pm.PackageStats;
import android.os.Binder;
import android.os.Bundle;
@@ -60,7 +58,6 @@
import com.android.internal.annotations.GuardedBy;
import com.android.server.LocalManagerRegistry;
-import com.android.server.LocalServices;
import com.android.server.SystemService;
import com.android.server.appsearch.external.localstorage.AppSearchImpl;
import com.android.server.appsearch.external.localstorage.stats.CallStats;
@@ -91,7 +88,6 @@
private static final String TAG = "AppSearchManagerService";
private final Context mContext;
private PackageManager mPackageManager;
- private PackageManagerInternal mPackageManagerInternal;
private ImplInstanceManager mImplInstanceManager;
private UserManager mUserManager;
private LoggerInstanceManager mLoggerInstanceManager;
@@ -104,11 +100,11 @@
Runtime.getRuntime().availableProcessors(), /*keepAliveTime*/ 60L, TimeUnit.SECONDS,
new LinkedBlockingQueue<>());
- // Cache of unlocked user ids so we don't have to query UserManager service each time. The
- // "locked" suffix refers to the fact that access to the field should be locked; unrelated to
- // the unlocked status of user ids.
- @GuardedBy("mUnlockedUserIdsLocked")
- private final Set<Integer> mUnlockedUserIdsLocked = new ArraySet<>();
+ // Cache of unlocked users so we don't have to query UserManager service each time. The "locked"
+ // suffix refers to the fact that access to the field should be locked; unrelated to the
+ // unlocked status of users.
+ @GuardedBy("mUnlockedUsersLocked")
+ private final Set<UserHandle> mUnlockedUsersLocked = new ArraySet<>();
public AppSearchManagerService(Context context) {
super(context);
@@ -119,7 +115,6 @@
public void onStart() {
publishBinderService(Context.APP_SEARCH_SERVICE, new Stub());
mPackageManager = getContext().getPackageManager();
- mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class);
mImplInstanceManager = ImplInstanceManager.getInstance(mContext);
mUserManager = mContext.getSystemService(UserManager.class);
mLoggerInstanceManager = LoggerInstanceManager.getInstance();
@@ -148,6 +143,9 @@
private class UserActionReceiver extends BroadcastReceiver {
@Override
public void onReceive(@NonNull Context context, @NonNull Intent intent) {
+ Objects.requireNonNull(context);
+ Objects.requireNonNull(intent);
+
switch (intent.getAction()) {
case Intent.ACTION_USER_REMOVED:
int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, USER_NULL);
@@ -155,7 +153,7 @@
Log.e(TAG, "userId is missing in the intent: " + intent);
return;
}
- handleUserRemoved(userId);
+ handleUserRemoved(UserHandle.of(userId));
break;
default:
Log.e(TAG, "Received unknown intent: " + intent);
@@ -170,23 +168,26 @@
* "credential encrypted" system directory of each user. That directory will be auto-deleted
* when a user is removed.
*
- * @param userId The multi-user userId of the user that need to be removed.
+ * @param userHandle The multi-user handle of the user that need to be removed.
*
* @see android.os.Environment#getDataSystemCeDirectory
*/
- private void handleUserRemoved(@UserIdInt int userId) {
+ private void handleUserRemoved(@NonNull UserHandle userHandle) {
try {
- mImplInstanceManager.removeAppSearchImplForUser(userId);
- mLoggerInstanceManager.removePlatformLoggerForUser(userId);
- Log.i(TAG, "Removed AppSearchImpl instance for user: " + userId);
+ mImplInstanceManager.removeAppSearchImplForUser(userHandle);
+ mLoggerInstanceManager.removePlatformLoggerForUser(userHandle);
+ Log.i(TAG, "Removed AppSearchImpl instance for: " + userHandle);
} catch (Throwable t) {
- Log.e(TAG, "Unable to remove data for user: " + userId, t);
+ Log.e(TAG, "Unable to remove data for: " + userHandle, t);
}
}
private class PackageChangedReceiver extends BroadcastReceiver {
@Override
public void onReceive(@NonNull Context context, @NonNull Intent intent) {
+ Objects.requireNonNull(context);
+ Objects.requireNonNull(intent);
+
switch (intent.getAction()) {
case Intent.ACTION_PACKAGE_FULLY_REMOVED:
case Intent.ACTION_PACKAGE_DATA_CLEARED:
@@ -208,19 +209,19 @@
}
}
- private void handlePackageRemoved(String packageName, int uid) {
- int userId = UserHandle.getUserId(uid);
+ private void handlePackageRemoved(@NonNull String packageName, int uid) {
+ UserHandle userHandle = UserHandle.getUserHandleForUid(uid);
try {
- if (isUserLocked(userId)) {
+ if (isUserLocked(userHandle)) {
//TODO(b/186151459) clear the uninstalled package data when user is unlocked.
return;
}
- if (ImplInstanceManager.getAppSearchDir(userId).exists()) {
+ if (ImplInstanceManager.getAppSearchDir(userHandle).exists()) {
// Only clear the package's data if AppSearch exists for this user.
PlatformLogger logger = mLoggerInstanceManager.getOrCreatePlatformLogger(mContext,
- userId);
+ userHandle);
AppSearchImpl impl = mImplInstanceManager.getOrCreateAppSearchImpl(mContext,
- userId, logger);
+ userHandle, logger);
//TODO(b/145759910) clear visibility setting for package.
impl.clearPackageData(packageName);
logger.removeCachedUidForPackage(packageName);
@@ -232,38 +233,42 @@
@Override
public void onUserUnlocking(@NonNull TargetUser user) {
- synchronized (mUnlockedUserIdsLocked) {
- mUnlockedUserIdsLocked.add(user.getUserIdentifier());
+ Objects.requireNonNull(user);
+ synchronized (mUnlockedUsersLocked) {
+ mUnlockedUsersLocked.add(user.getUserHandle());
}
}
@Override
public void onUserStopping(@NonNull TargetUser user) {
- synchronized (mUnlockedUserIdsLocked) {
- mUnlockedUserIdsLocked.remove(user.getUserIdentifier());
+ Objects.requireNonNull(user);
+
+ synchronized (mUnlockedUsersLocked) {
+ UserHandle userHandle = user.getUserHandle();
+ mUnlockedUsersLocked.remove(userHandle);
try {
- mImplInstanceManager.closeAndRemoveAppSearchImplForUser(user.getUserIdentifier());
+ mImplInstanceManager.closeAndRemoveAppSearchImplForUser(userHandle);
} catch (Throwable t) {
Log.e(TAG, "Error handling user stopping.", t);
}
}
}
- private void verifyUserUnlocked(int callingUserId) {
- if (isUserLocked(callingUserId)) {
- throw new IllegalStateException("User " + callingUserId + " is locked or not running.");
+ private void verifyUserUnlocked(@NonNull UserHandle callingUser) {
+ if (isUserLocked(callingUser)) {
+ throw new IllegalStateException(callingUser + " is locked or not running.");
}
}
- private boolean isUserLocked(int callingUserId) {
- synchronized (mUnlockedUserIdsLocked) {
+ private boolean isUserLocked(@NonNull UserHandle callingUser) {
+ synchronized (mUnlockedUsersLocked) {
// First, check the local copy.
- if (mUnlockedUserIdsLocked.contains(callingUserId)) {
+ if (mUnlockedUsersLocked.contains(callingUser)) {
return false;
}
// If the local copy says the user is locked, check with UM for the actual state,
// since the user might just have been unlocked.
- return !mUserManager.isUserUnlockingOrUnlocked(UserHandle.of(callingUserId));
+ return !mUserManager.isUserUnlockingOrUnlocked(callingUser);
}
}
@@ -277,24 +282,28 @@
@NonNull Map<String, List<Bundle>> schemasPackageAccessibleBundles,
boolean forceOverride,
int schemaVersion,
- @UserIdInt int userId,
+ @NonNull UserHandle userHandle,
@ElapsedRealtimeLong long binderCallStartTimeMillis,
@NonNull IAppSearchResultCallback callback) {
Objects.requireNonNull(packageName);
Objects.requireNonNull(databaseName);
Objects.requireNonNull(schemaBundles);
+ Objects.requireNonNull(schemasNotDisplayedBySystem);
+ Objects.requireNonNull(schemasPackageAccessibleBundles);
+ Objects.requireNonNull(userHandle);
Objects.requireNonNull(callback);
+
long totalLatencyStartTimeMillis = SystemClock.elapsedRealtime();
int callingUid = Binder.getCallingUid();
- int callingUserId = handleIncomingUser(userId, callingUid);
+ UserHandle callingUser = handleIncomingUser(userHandle, callingUid);
EXECUTOR.execute(() -> {
@AppSearchResult.ResultCode int statusCode = AppSearchResult.RESULT_OK;
PlatformLogger logger = null;
int operationSuccessCount = 0;
int operationFailureCount = 0;
try {
- verifyUserUnlocked(callingUserId);
- verifyCallingPackage(callingUid, packageName);
+ verifyUserUnlocked(callingUser);
+ verifyCallingPackage(callingUser, callingUid, packageName);
List<AppSearchSchema> schemas = new ArrayList<>(schemaBundles.size());
for (int i = 0; i < schemaBundles.size(); i++) {
schemas.add(new AppSearchSchema(schemaBundles.get(i)));
@@ -311,8 +320,8 @@
}
schemasPackageAccessible.put(entry.getKey(), packageIdentifiers);
}
- AppSearchImpl impl = mImplInstanceManager.getAppSearchImpl(callingUserId);
- logger = mLoggerInstanceManager.getPlatformLogger(callingUserId);
+ AppSearchImpl impl = mImplInstanceManager.getAppSearchImpl(callingUser);
+ logger = mLoggerInstanceManager.getPlatformLogger(callingUser);
SetSchemaResponse setSchemaResponse = impl.setSchema(
packageName,
databaseName,
@@ -356,19 +365,20 @@
public void getSchema(
@NonNull String packageName,
@NonNull String databaseName,
- @UserIdInt int userId,
+ @NonNull UserHandle userHandle,
@NonNull IAppSearchResultCallback callback) {
Objects.requireNonNull(packageName);
Objects.requireNonNull(databaseName);
+ Objects.requireNonNull(userHandle);
Objects.requireNonNull(callback);
+
int callingUid = Binder.getCallingUid();
- int callingUserId = handleIncomingUser(userId, callingUid);
+ UserHandle callingUser = handleIncomingUser(userHandle, callingUid);
EXECUTOR.execute(() -> {
try {
- verifyUserUnlocked(callingUserId);
- verifyCallingPackage(callingUid, packageName);
- AppSearchImpl impl =
- mImplInstanceManager.getAppSearchImpl(callingUserId);
+ verifyUserUnlocked(callingUser);
+ verifyCallingPackage(callingUser, callingUid, packageName);
+ AppSearchImpl impl = mImplInstanceManager.getAppSearchImpl(callingUser);
GetSchemaResponse response = impl.getSchema(packageName, databaseName);
invokeCallbackOnResult(
callback,
@@ -383,19 +393,20 @@
public void getNamespaces(
@NonNull String packageName,
@NonNull String databaseName,
- @UserIdInt int userId,
+ @NonNull UserHandle userHandle,
@NonNull IAppSearchResultCallback callback) {
Objects.requireNonNull(packageName);
Objects.requireNonNull(databaseName);
+ Objects.requireNonNull(userHandle);
Objects.requireNonNull(callback);
+
int callingUid = Binder.getCallingUid();
- int callingUserId = handleIncomingUser(userId, callingUid);
+ UserHandle callingUser = handleIncomingUser(userHandle, callingUid);
EXECUTOR.execute(() -> {
try {
- verifyUserUnlocked(callingUserId);
- verifyCallingPackage(callingUid, packageName);
- AppSearchImpl impl =
- mImplInstanceManager.getAppSearchImpl(callingUserId);
+ verifyUserUnlocked(callingUser);
+ verifyCallingPackage(callingUser, callingUid, packageName);
+ AppSearchImpl impl = mImplInstanceManager.getAppSearchImpl(callingUser);
List<String> namespaces = impl.getNamespaces(packageName, databaseName);
invokeCallbackOnResult(callback,
AppSearchResult.newSuccessfulResult(namespaces));
@@ -410,29 +421,30 @@
@NonNull String packageName,
@NonNull String databaseName,
@NonNull List<Bundle> documentBundles,
- @UserIdInt int userId,
+ @NonNull UserHandle userHandle,
@ElapsedRealtimeLong long binderCallStartTimeMillis,
@NonNull IAppSearchBatchResultCallback callback) {
Objects.requireNonNull(packageName);
Objects.requireNonNull(databaseName);
Objects.requireNonNull(documentBundles);
+ Objects.requireNonNull(userHandle);
Objects.requireNonNull(callback);
+
long totalLatencyStartTimeMillis = SystemClock.elapsedRealtime();
int callingUid = Binder.getCallingUid();
- int callingUserId = handleIncomingUser(userId, callingUid);
+ UserHandle callingUser = handleIncomingUser(userHandle, callingUid);
EXECUTOR.execute(() -> {
@AppSearchResult.ResultCode int statusCode = AppSearchResult.RESULT_OK;
PlatformLogger logger = null;
int operationSuccessCount = 0;
int operationFailureCount = 0;
try {
- verifyUserUnlocked(callingUserId);
- verifyCallingPackage(callingUid, packageName);
+ verifyUserUnlocked(callingUser);
+ verifyCallingPackage(callingUser, callingUid, packageName);
AppSearchBatchResult.Builder<String, Void> resultBuilder =
new AppSearchBatchResult.Builder<>();
- AppSearchImpl impl =
- mImplInstanceManager.getAppSearchImpl(callingUserId);
- logger = mLoggerInstanceManager.getPlatformLogger(callingUserId);
+ AppSearchImpl impl = mImplInstanceManager.getAppSearchImpl(callingUser);
+ logger = mLoggerInstanceManager.getPlatformLogger(callingUser);
for (int i = 0; i < documentBundles.size(); i++) {
GenericDocument document = new GenericDocument(documentBundles.get(i));
try {
@@ -488,30 +500,32 @@
@NonNull String namespace,
@NonNull List<String> ids,
@NonNull Map<String, List<String>> typePropertyPaths,
- @UserIdInt int userId,
+ @NonNull UserHandle userHandle,
@ElapsedRealtimeLong long binderCallStartTimeMillis,
@NonNull IAppSearchBatchResultCallback callback) {
Objects.requireNonNull(packageName);
Objects.requireNonNull(databaseName);
Objects.requireNonNull(namespace);
Objects.requireNonNull(ids);
+ Objects.requireNonNull(typePropertyPaths);
+ Objects.requireNonNull(userHandle);
Objects.requireNonNull(callback);
+
long totalLatencyStartTimeMillis = SystemClock.elapsedRealtime();
int callingUid = Binder.getCallingUid();
- int callingUserId = handleIncomingUser(userId, callingUid);
+ UserHandle callingUser = handleIncomingUser(userHandle, callingUid);
EXECUTOR.execute(() -> {
@AppSearchResult.ResultCode int statusCode = AppSearchResult.RESULT_OK;
PlatformLogger logger = null;
int operationSuccessCount = 0;
int operationFailureCount = 0;
try {
- verifyUserUnlocked(callingUserId);
- verifyCallingPackage(callingUid, packageName);
+ verifyUserUnlocked(callingUser);
+ verifyCallingPackage(callingUser, callingUid, packageName);
AppSearchBatchResult.Builder<String, Bundle> resultBuilder =
new AppSearchBatchResult.Builder<>();
- AppSearchImpl impl =
- mImplInstanceManager.getAppSearchImpl(callingUserId);
- logger = mLoggerInstanceManager.getPlatformLogger(callingUserId);
+ AppSearchImpl impl = mImplInstanceManager.getAppSearchImpl(callingUser);
+ logger = mLoggerInstanceManager.getPlatformLogger(callingUser);
for (int i = 0; i < ids.size(); i++) {
String id = ids.get(i);
try {
@@ -568,28 +582,29 @@
@NonNull String databaseName,
@NonNull String queryExpression,
@NonNull Bundle searchSpecBundle,
- @UserIdInt int userId,
+ @NonNull UserHandle userHandle,
@ElapsedRealtimeLong long binderCallStartTimeMillis,
@NonNull IAppSearchResultCallback callback) {
Objects.requireNonNull(packageName);
Objects.requireNonNull(databaseName);
Objects.requireNonNull(queryExpression);
Objects.requireNonNull(searchSpecBundle);
+ Objects.requireNonNull(userHandle);
Objects.requireNonNull(callback);
+
long totalLatencyStartTimeMillis = SystemClock.elapsedRealtime();
int callingUid = Binder.getCallingUid();
- int callingUserId = handleIncomingUser(userId, callingUid);
+ UserHandle callingUser = handleIncomingUser(userHandle, callingUid);
EXECUTOR.execute(() -> {
@AppSearchResult.ResultCode int statusCode = AppSearchResult.RESULT_OK;
PlatformLogger logger = null;
int operationSuccessCount = 0;
int operationFailureCount = 0;
try {
- verifyUserUnlocked(callingUserId);
- verifyCallingPackage(callingUid, packageName);
- AppSearchImpl impl =
- mImplInstanceManager.getAppSearchImpl(callingUserId);
- logger = mLoggerInstanceManager.getPlatformLogger(callingUserId);
+ verifyUserUnlocked(callingUser);
+ verifyCallingPackage(callingUser, callingUid, packageName);
+ AppSearchImpl impl = mImplInstanceManager.getAppSearchImpl(callingUser);
+ logger = mLoggerInstanceManager.getPlatformLogger(callingUser);
SearchResultPage searchResultPage =
impl.query(
packageName,
@@ -634,27 +649,28 @@
@NonNull String packageName,
@NonNull String queryExpression,
@NonNull Bundle searchSpecBundle,
- @UserIdInt int userId,
+ @NonNull UserHandle userHandle,
@ElapsedRealtimeLong long binderCallStartTimeMillis,
@NonNull IAppSearchResultCallback callback) {
Objects.requireNonNull(packageName);
Objects.requireNonNull(queryExpression);
Objects.requireNonNull(searchSpecBundle);
+ Objects.requireNonNull(userHandle);
Objects.requireNonNull(callback);
+
long totalLatencyStartTimeMillis = SystemClock.elapsedRealtime();
int callingUid = Binder.getCallingUid();
- int callingUserId = handleIncomingUser(userId, callingUid);
+ UserHandle callingUser = handleIncomingUser(userHandle, callingUid);
EXECUTOR.execute(() -> {
@AppSearchResult.ResultCode int statusCode = AppSearchResult.RESULT_OK;
PlatformLogger logger = null;
int operationSuccessCount = 0;
int operationFailureCount = 0;
try {
- verifyUserUnlocked(callingUserId);
- verifyCallingPackage(callingUid, packageName);
- logger = mLoggerInstanceManager.getPlatformLogger(callingUserId);
- AppSearchImpl impl =
- mImplInstanceManager.getAppSearchImpl(callingUserId);
+ verifyUserUnlocked(callingUser);
+ verifyCallingPackage(callingUser, callingUid, packageName);
+ logger = mLoggerInstanceManager.getPlatformLogger(callingUser);
+ AppSearchImpl impl = mImplInstanceManager.getAppSearchImpl(callingUser);
SearchResultPage searchResultPage =
impl.globalQuery(
queryExpression,
@@ -698,18 +714,19 @@
@Override
public void getNextPage(
long nextPageToken,
- @UserIdInt int userId,
+ @NonNull UserHandle userHandle,
@NonNull IAppSearchResultCallback callback) {
+ Objects.requireNonNull(userHandle);
Objects.requireNonNull(callback);
+
int callingUid = Binder.getCallingUid();
- int callingUserId = handleIncomingUser(userId, callingUid);
+ UserHandle callingUser = handleIncomingUser(userHandle, callingUid);
// TODO(b/162450968) check nextPageToken is being advanced by the same uid as originally
// opened it
EXECUTOR.execute(() -> {
try {
- verifyUserUnlocked(callingUserId);
- AppSearchImpl impl =
- mImplInstanceManager.getAppSearchImpl(callingUserId);
+ verifyUserUnlocked(callingUser);
+ AppSearchImpl impl = mImplInstanceManager.getAppSearchImpl(callingUser);
SearchResultPage searchResultPage = impl.getNextPage(nextPageToken);
invokeCallbackOnResult(
callback,
@@ -721,14 +738,15 @@
}
@Override
- public void invalidateNextPageToken(long nextPageToken, @UserIdInt int userId) {
+ public void invalidateNextPageToken(long nextPageToken, @NonNull UserHandle userHandle) {
+ Objects.requireNonNull(userHandle);
+
int callingUid = Binder.getCallingUid();
- int callingUserId = handleIncomingUser(userId, callingUid);
+ UserHandle callingUser = handleIncomingUser(userHandle, callingUid);
EXECUTOR.execute(() -> {
try {
- verifyUserUnlocked(callingUserId);
- AppSearchImpl impl =
- mImplInstanceManager.getAppSearchImpl(callingUserId);
+ verifyUserUnlocked(callingUser);
+ AppSearchImpl impl = mImplInstanceManager.getAppSearchImpl(callingUser);
impl.invalidateNextPageToken(nextPageToken);
} catch (Throwable t) {
Log.e(TAG, "Unable to invalidate the query page token", t);
@@ -743,15 +761,22 @@
@NonNull ParcelFileDescriptor fileDescriptor,
@NonNull String queryExpression,
@NonNull Bundle searchSpecBundle,
- @UserIdInt int userId,
+ @NonNull UserHandle userHandle,
@NonNull IAppSearchResultCallback callback) {
+ Objects.requireNonNull(packageName);
+ Objects.requireNonNull(databaseName);
+ Objects.requireNonNull(fileDescriptor);
+ Objects.requireNonNull(queryExpression);
+ Objects.requireNonNull(searchSpecBundle);
+ Objects.requireNonNull(userHandle);
+ Objects.requireNonNull(callback);
+
int callingUid = Binder.getCallingUid();
- int callingUserId = handleIncomingUser(userId, callingUid);
+ UserHandle callingUser = handleIncomingUser(userHandle, callingUid);
EXECUTOR.execute(() -> {
try {
- verifyCallingPackage(callingUid, packageName);
- AppSearchImpl impl =
- mImplInstanceManager.getAppSearchImpl(callingUserId);
+ verifyCallingPackage(callingUser, callingUid, packageName);
+ AppSearchImpl impl = mImplInstanceManager.getAppSearchImpl(callingUser);
// we don't need to append the file. The file is always brand new.
try (DataOutputStream outputStream = new DataOutputStream(
new FileOutputStream(fileDescriptor.getFileDescriptor()))) {
@@ -783,15 +808,20 @@
@NonNull String packageName,
@NonNull String databaseName,
@NonNull ParcelFileDescriptor fileDescriptor,
- @UserIdInt int userId,
+ @NonNull UserHandle userHandle,
@NonNull IAppSearchResultCallback callback) {
+ Objects.requireNonNull(packageName);
+ Objects.requireNonNull(databaseName);
+ Objects.requireNonNull(fileDescriptor);
+ Objects.requireNonNull(userHandle);
+ Objects.requireNonNull(callback);
+
int callingUid = Binder.getCallingUid();
- int callingUserId = handleIncomingUser(userId, callingUid);
+ UserHandle callingUser = handleIncomingUser(userHandle, callingUid);
EXECUTOR.execute(() -> {
try {
- verifyCallingPackage(callingUid, packageName);
- AppSearchImpl impl =
- mImplInstanceManager.getAppSearchImpl(callingUserId);
+ verifyCallingPackage(callingUser, callingUid, packageName);
+ AppSearchImpl impl = mImplInstanceManager.getAppSearchImpl(callingUser);
GenericDocument document;
ArrayList<Bundle> migrationFailureBundles = new ArrayList<>();
@@ -835,24 +865,26 @@
@NonNull String documentId,
long usageTimeMillis,
boolean systemUsage,
- @UserIdInt int userId,
+ @NonNull UserHandle userHandle,
@NonNull IAppSearchResultCallback callback) {
+ Objects.requireNonNull(packageName);
Objects.requireNonNull(databaseName);
Objects.requireNonNull(namespace);
Objects.requireNonNull(documentId);
+ Objects.requireNonNull(userHandle);
Objects.requireNonNull(callback);
+
int callingUid = Binder.getCallingUid();
- int callingUserId = handleIncomingUser(userId, callingUid);
+ UserHandle callingUser = handleIncomingUser(userHandle, callingUid);
EXECUTOR.execute(() -> {
try {
- verifyUserUnlocked(callingUserId);
+ verifyUserUnlocked(callingUser);
if (systemUsage) {
// TODO(b/183031844): Validate that the call comes from the system
}
- AppSearchImpl impl =
- mImplInstanceManager.getAppSearchImpl(callingUserId);
+ AppSearchImpl impl = mImplInstanceManager.getAppSearchImpl(callingUser);
impl.reportUsage(
packageName, databaseName, namespace, documentId,
usageTimeMillis, systemUsage);
@@ -870,29 +902,31 @@
@NonNull String databaseName,
@NonNull String namespace,
@NonNull List<String> ids,
- @UserIdInt int userId,
+ @NonNull UserHandle userHandle,
@ElapsedRealtimeLong long binderCallStartTimeMillis,
@NonNull IAppSearchBatchResultCallback callback) {
Objects.requireNonNull(packageName);
Objects.requireNonNull(databaseName);
+ Objects.requireNonNull(namespace);
Objects.requireNonNull(ids);
+ Objects.requireNonNull(userHandle);
Objects.requireNonNull(callback);
+
long totalLatencyStartTimeMillis = SystemClock.elapsedRealtime();
int callingUid = Binder.getCallingUid();
- int callingUserId = handleIncomingUser(userId, callingUid);
+ UserHandle callingUser = handleIncomingUser(userHandle, callingUid);
EXECUTOR.execute(() -> {
@AppSearchResult.ResultCode int statusCode = AppSearchResult.RESULT_OK;
PlatformLogger logger = null;
int operationSuccessCount = 0;
int operationFailureCount = 0;
try {
- verifyUserUnlocked(callingUserId);
- verifyCallingPackage(callingUid, packageName);
+ verifyUserUnlocked(callingUser);
+ verifyCallingPackage(callingUser, callingUid, packageName);
AppSearchBatchResult.Builder<String, Void> resultBuilder =
new AppSearchBatchResult.Builder<>();
- AppSearchImpl impl =
- mImplInstanceManager.getAppSearchImpl(callingUserId);
- logger = mLoggerInstanceManager.getPlatformLogger(callingUserId);
+ AppSearchImpl impl = mImplInstanceManager.getAppSearchImpl(callingUser);
+ logger = mLoggerInstanceManager.getPlatformLogger(callingUser);
for (int i = 0; i < ids.size(); i++) {
String id = ids.get(i);
try {
@@ -945,7 +979,7 @@
@NonNull String databaseName,
@NonNull String queryExpression,
@NonNull Bundle searchSpecBundle,
- @UserIdInt int userId,
+ @NonNull UserHandle userHandle,
@ElapsedRealtimeLong long binderCallStartTimeMillis,
@NonNull IAppSearchResultCallback callback) {
// TODO(b/173532925) log CallStats once we have CALL_TYPE_REMOVE_BY_QUERY added
@@ -953,21 +987,22 @@
Objects.requireNonNull(databaseName);
Objects.requireNonNull(queryExpression);
Objects.requireNonNull(searchSpecBundle);
+ Objects.requireNonNull(userHandle);
Objects.requireNonNull(callback);
+
long totalLatencyStartTimeMillis = SystemClock.elapsedRealtime();
int callingUid = Binder.getCallingUid();
- int callingUserId = handleIncomingUser(userId, callingUid);
+ UserHandle callingUser = handleIncomingUser(userHandle, callingUid);
EXECUTOR.execute(() -> {
@AppSearchResult.ResultCode int statusCode = AppSearchResult.RESULT_OK;
PlatformLogger logger = null;
int operationSuccessCount = 0;
int operationFailureCount = 0;
try {
- verifyUserUnlocked(callingUserId);
- verifyCallingPackage(callingUid, packageName);
- AppSearchImpl impl =
- mImplInstanceManager.getAppSearchImpl(callingUserId);
- logger = mLoggerInstanceManager.getPlatformLogger(callingUserId);
+ verifyUserUnlocked(callingUser);
+ verifyCallingPackage(callingUser, callingUid, packageName);
+ AppSearchImpl impl = mImplInstanceManager.getAppSearchImpl(callingUser);
+ logger = mLoggerInstanceManager.getPlatformLogger(callingUser);
impl.removeByQuery(
packageName,
databaseName,
@@ -1009,19 +1044,20 @@
public void getStorageInfo(
@NonNull String packageName,
@NonNull String databaseName,
- @UserIdInt int userId,
+ @NonNull UserHandle userHandle,
@NonNull IAppSearchResultCallback callback) {
Objects.requireNonNull(packageName);
Objects.requireNonNull(databaseName);
+ Objects.requireNonNull(userHandle);
Objects.requireNonNull(callback);
+
int callingUid = Binder.getCallingUid();
- int callingUserId = handleIncomingUser(userId, callingUid);
+ UserHandle callingUser = handleIncomingUser(userHandle, callingUid);
EXECUTOR.execute(() -> {
try {
- verifyUserUnlocked(callingUserId);
- verifyCallingPackage(callingUid, packageName);
- AppSearchImpl impl =
- mImplInstanceManager.getAppSearchImpl(callingUserId);
+ verifyUserUnlocked(callingUser);
+ verifyCallingPackage(callingUser, callingUid, packageName);
+ AppSearchImpl impl = mImplInstanceManager.getAppSearchImpl(callingUser);
StorageInfo storageInfo = impl.getStorageInfoForDatabase(packageName,
databaseName);
Bundle storageInfoBundle = storageInfo.getBundle();
@@ -1034,21 +1070,23 @@
}
@Override
- public void persistToDisk(@UserIdInt int userId,
+ public void persistToDisk(
+ @NonNull UserHandle userHandle,
@ElapsedRealtimeLong long binderCallStartTimeMillis) {
+ Objects.requireNonNull(userHandle);
+
long totalLatencyStartTimeMillis = SystemClock.elapsedRealtime();
int callingUid = Binder.getCallingUid();
- int callingUserId = handleIncomingUser(userId, callingUid);
+ UserHandle callingUser = handleIncomingUser(userHandle, callingUid);
EXECUTOR.execute(() -> {
@AppSearchResult.ResultCode int statusCode = AppSearchResult.RESULT_OK;
PlatformLogger logger = null;
int operationSuccessCount = 0;
int operationFailureCount = 0;
try {
- verifyUserUnlocked(callingUserId);
- AppSearchImpl impl =
- mImplInstanceManager.getAppSearchImpl(callingUserId);
- logger = mLoggerInstanceManager.getPlatformLogger(callingUserId);
+ verifyUserUnlocked(callingUser);
+ AppSearchImpl impl = mImplInstanceManager.getAppSearchImpl(callingUser);
+ logger = mLoggerInstanceManager.getPlatformLogger(callingUser);
impl.persistToDisk(PersistType.Code.FULL);
++operationSuccessCount;
} catch (Throwable t) {
@@ -1080,23 +1118,26 @@
}
@Override
- public void initialize(@UserIdInt int userId,
+ public void initialize(
+ @NonNull UserHandle userHandle,
@ElapsedRealtimeLong long binderCallStartTimeMillis,
@NonNull IAppSearchResultCallback callback) {
+ Objects.requireNonNull(userHandle);
Objects.requireNonNull(callback);
+
long totalLatencyStartTimeMillis = SystemClock.elapsedRealtime();
int callingUid = Binder.getCallingUid();
- int callingUserId = handleIncomingUser(userId, callingUid);
+ UserHandle callingUser = handleIncomingUser(userHandle, callingUid);
EXECUTOR.execute(() -> {
@AppSearchResult.ResultCode int statusCode = AppSearchResult.RESULT_OK;
PlatformLogger logger = null;
int operationSuccessCount = 0;
int operationFailureCount = 0;
try {
- verifyUserUnlocked(callingUserId);
- logger = mLoggerInstanceManager.getOrCreatePlatformLogger(mContext,
- callingUserId);
- mImplInstanceManager.getOrCreateAppSearchImpl(mContext, callingUserId, logger);
+ verifyUserUnlocked(callingUser);
+ logger = mLoggerInstanceManager.getOrCreatePlatformLogger(
+ mContext, callingUser);
+ mImplInstanceManager.getOrCreateAppSearchImpl(mContext, callingUser, logger);
++operationSuccessCount;
invokeCallbackOnResult(callback, AppSearchResult.newSuccessfulResult(null));
} catch (Throwable t) {
@@ -1129,16 +1170,29 @@
});
}
- private void verifyCallingPackage(int callingUid, @NonNull String callingPackage) {
- Objects.requireNonNull(callingPackage);
- if (mPackageManagerInternal.getPackageUid(
- callingPackage, /*flags=*/ 0, UserHandle.getUserId(callingUid))
- != callingUid) {
+ private void verifyCallingPackage(
+ @NonNull UserHandle actualCallingUser,
+ int actualCallingUid,
+ @NonNull String claimedCallingPackage) {
+ Objects.requireNonNull(actualCallingUser);
+ Objects.requireNonNull(claimedCallingPackage);
+
+ int claimedCallingUid;
+ try {
+ Context claimedCallingContext =
+ mContext.createContextAsUser(actualCallingUser, /*flags=*/ 0);
+ claimedCallingUid = claimedCallingContext.getPackageManager().getPackageUid(
+ claimedCallingPackage, /*flags=*/ 0);
+ } catch (PackageManager.NameNotFoundException e) {
+ throw new SecurityException(
+ "Specified calling package [" + claimedCallingPackage + "] not found");
+ }
+ if (claimedCallingUid != actualCallingUid) {
throw new SecurityException(
"Specified calling package ["
- + callingPackage
+ + claimedCallingPackage
+ "] does not match the calling uid "
- + callingUid);
+ + actualCallingUid);
}
}
@@ -1192,19 +1246,28 @@
}
}
+ /**
+ * Helper for dealing with incoming user arguments to system service calls.
+ *
+ * <p>Takes care of checking permissions and converting USER_CURRENT to the actual current user.
+ *
+ * @return the user handle that the call should run as. Will always be a concrete user.
+ */
// TODO(b/173553485) verifying that the caller has permission to access target user's data
// TODO(b/173553485) Handle ACTION_USER_REMOVED broadcast
// TODO(b/173553485) Implement SystemService.onUserStopping()
- private static int handleIncomingUser(@UserIdInt int userId, int callingUid) {
+ @NonNull
+ private static UserHandle handleIncomingUser(@NonNull UserHandle userHandle, int callingUid) {
int callingPid = Binder.getCallingPid();
- return ActivityManager.handleIncomingUser(
+ int finalUserId = ActivityManager.handleIncomingUser(
callingPid,
callingUid,
- userId,
+ userHandle.getIdentifier(),
/*allowAll=*/ false,
/*requireFull=*/ false,
/*name=*/ null,
/*callerPackage=*/ null);
+ return UserHandle.of(finalUserId);
}
// TODO(b/179160886): Cache the previous storage stats.
@@ -1218,19 +1281,19 @@
Objects.requireNonNull(stats);
Objects.requireNonNull(packageName);
Objects.requireNonNull(userHandle);
- int userId = userHandle.getIdentifier();
+
try {
- verifyUserUnlocked(userId);
- PlatformLogger logger = mLoggerInstanceManager.getOrCreatePlatformLogger(mContext,
- userId);
- AppSearchImpl impl = mImplInstanceManager.getOrCreateAppSearchImpl(mContext,
- userId, logger);
+ verifyUserUnlocked(userHandle);
+ PlatformLogger logger = mLoggerInstanceManager.getOrCreatePlatformLogger(
+ mContext, userHandle);
+ AppSearchImpl impl = mImplInstanceManager.getOrCreateAppSearchImpl(
+ mContext, userHandle, logger);
stats.dataSize += impl.getStorageInfoForPackage(packageName).getSizeBytes();
} catch (Throwable t) {
Log.e(
TAG,
- "Unable to augment storage stats for userId "
- + userId
+ "Unable to augment storage stats for "
+ + userHandle
+ " packageName "
+ packageName,
t);
@@ -1241,17 +1304,18 @@
public void augmentStatsForUid(
@NonNull PackageStats stats, int uid, boolean canCallerAccessAllStats) {
Objects.requireNonNull(stats);
- int userId = UserHandle.getUserId(uid);
+
+ UserHandle userHandle = UserHandle.getUserHandleForUid(uid);
try {
- verifyUserUnlocked(userId);
+ verifyUserUnlocked(userHandle);
String[] packagesForUid = mPackageManager.getPackagesForUid(uid);
if (packagesForUid == null) {
return;
}
- PlatformLogger logger = mLoggerInstanceManager.getOrCreatePlatformLogger(mContext,
- userId);
- AppSearchImpl impl = mImplInstanceManager.getOrCreateAppSearchImpl(mContext,
- userId, logger);
+ PlatformLogger logger = mLoggerInstanceManager.getOrCreatePlatformLogger(
+ mContext, userHandle);
+ AppSearchImpl impl = mImplInstanceManager.getOrCreateAppSearchImpl(
+ mContext, userHandle, logger);
for (int i = 0; i < packagesForUid.length; i++) {
stats.dataSize +=
impl.getStorageInfoForPackage(packagesForUid[i]).getSizeBytes();
@@ -1269,24 +1333,24 @@
// size of the icing dir (or use the overall StorageInfo without interpolating it).
Objects.requireNonNull(stats);
Objects.requireNonNull(userHandle);
- int userId = userHandle.getIdentifier();
+
try {
- verifyUserUnlocked(userId);
- List<PackageInfo> packagesForUser =
- mPackageManager.getInstalledPackagesAsUser(/*flags=*/0, userId);
+ verifyUserUnlocked(userHandle);
+ List<PackageInfo> packagesForUser = mPackageManager.getInstalledPackagesAsUser(
+ /*flags=*/0, userHandle.getIdentifier());
if (packagesForUser == null) {
return;
}
- PlatformLogger logger = mLoggerInstanceManager.getOrCreatePlatformLogger(mContext,
- userId);
+ PlatformLogger logger = mLoggerInstanceManager.getOrCreatePlatformLogger(
+ mContext, userHandle);
AppSearchImpl impl =
- mImplInstanceManager.getOrCreateAppSearchImpl(mContext, userId, logger);
+ mImplInstanceManager.getOrCreateAppSearchImpl(mContext, userHandle, logger);
for (int i = 0; i < packagesForUser.size(); i++) {
String packageName = packagesForUser.get(i).packageName;
stats.dataSize += impl.getStorageInfoForPackage(packageName).getSizeBytes();
}
} catch (Throwable t) {
- Log.e(TAG, "Unable to augment storage stats for user " + userId, t);
+ Log.e(TAG, "Unable to augment storage stats for " + userHandle, t);
}
}
}
diff --git a/apex/appsearch/service/java/com/android/server/appsearch/ImplInstanceManager.java b/apex/appsearch/service/java/com/android/server/appsearch/ImplInstanceManager.java
index f8bc473..6477489 100644
--- a/apex/appsearch/service/java/com/android/server/appsearch/ImplInstanceManager.java
+++ b/apex/appsearch/service/java/com/android/server/appsearch/ImplInstanceManager.java
@@ -20,13 +20,12 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
-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.util.SparseArray;
+import android.util.ArrayMap;
import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
@@ -34,6 +33,8 @@
import com.android.server.appsearch.external.localstorage.AppSearchLogger;
import java.io.File;
+import java.util.Map;
+import java.util.Objects;
/**
* Manages the lifecycle of instances of {@link AppSearchImpl}.
@@ -46,7 +47,7 @@
private static ImplInstanceManager sImplInstanceManager;
@GuardedBy("mInstancesLocked")
- private final SparseArray<AppSearchImpl> mInstancesLocked = new SparseArray<>();
+ private final Map<UserHandle, AppSearchImpl> mInstancesLocked = new ArrayMap<>();
private final String mGlobalQuerierPackage;
@@ -79,8 +80,9 @@
*
* <p>This folder should only be accessed after unlock.
*/
- public static File getAppSearchDir(@UserIdInt int userId) {
- return new File(Environment.getDataSystemCeDirectory(userId), APP_SEARCH_DIR);
+ public static File getAppSearchDir(@NonNull UserHandle userHandle) {
+ return new File(
+ Environment.getDataSystemCeDirectory(userHandle.getIdentifier()), APP_SEARCH_DIR);
}
/**
@@ -90,18 +92,22 @@
* one will be created.
*
* @param context The context
- * @param userId The multi-user userId of the device user calling AppSearch
+ * @param userHandle The multi-user handle of the device user calling AppSearch
* @return An initialized {@link AppSearchImpl} for this user
*/
@NonNull
public AppSearchImpl getOrCreateAppSearchImpl(
- @NonNull Context context, @UserIdInt int userId, @Nullable AppSearchLogger logger)
- throws AppSearchException {
+ @NonNull Context context,
+ @NonNull UserHandle userHandle,
+ @Nullable AppSearchLogger logger) throws AppSearchException {
+ Objects.requireNonNull(context);
+ Objects.requireNonNull(userHandle);
+
synchronized (mInstancesLocked) {
- AppSearchImpl instance = mInstancesLocked.get(userId);
+ AppSearchImpl instance = mInstancesLocked.get(userHandle);
if (instance == null) {
- instance = createImpl(context, userId, logger);
- mInstancesLocked.put(userId, instance);
+ instance = createImpl(context, userHandle, logger);
+ mInstancesLocked.put(userHandle, instance);
}
return instance;
}
@@ -116,12 +122,13 @@
* <p>If the user is removed, the "credential encrypted" system directory where icing lives will
* be auto-deleted. So we shouldn't worry about persist data or close the AppSearchImpl.
*
- * @param userId The multi-user userId of the user that need to be removed.
+ * @param userHandle The multi-user user handle of the user that need to be removed.
*/
- public void removeAppSearchImplForUser(@UserIdInt int userId) {
+ public void removeAppSearchImplForUser(@NonNull UserHandle userHandle) {
+ Objects.requireNonNull(userHandle);
synchronized (mInstancesLocked) {
// no need to close and persist data to disk since we are removing them now.
- mInstancesLocked.remove(userId);
+ mInstancesLocked.remove(userHandle);
}
}
@@ -130,14 +137,15 @@
*
* <p>All mutation apply to this {@link AppSearchImpl} will be persisted to disk.
*
- * @param userId The multi-user userId of the user that need to be removed.
+ * @param userHandle The multi-user user handle of the user that need to be removed.
*/
- public void closeAndRemoveAppSearchImplForUser(@UserIdInt int userId) {
+ public void closeAndRemoveAppSearchImplForUser(@NonNull UserHandle userHandle) {
+ Objects.requireNonNull(userHandle);
synchronized (mInstancesLocked) {
- AppSearchImpl appSearchImpl = mInstancesLocked.get(userId);
+ AppSearchImpl appSearchImpl = mInstancesLocked.get(userHandle);
if (appSearchImpl != null) {
appSearchImpl.close();
- mInstancesLocked.remove(userId);
+ mInstancesLocked.remove(userHandle);
}
}
}
@@ -148,31 +156,39 @@
* <p>This method should only be called by an initialized SearchSession, which has been already
* created the AppSearchImpl instance for the given user.
*
- * @param userId The multi-user userId of the device user calling AppSearch
+ * @param userHandle The multi-user handle of the device user calling AppSearch
* @return An initialized {@link AppSearchImpl} for this user
* @throws IllegalStateException if {@link AppSearchImpl} haven't created for the given user.
*/
@NonNull
- public AppSearchImpl getAppSearchImpl(@UserIdInt int userId) {
+ public AppSearchImpl getAppSearchImpl(@NonNull UserHandle userHandle) {
+ Objects.requireNonNull(userHandle);
synchronized (mInstancesLocked) {
- AppSearchImpl instance = mInstancesLocked.get(userId);
+ AppSearchImpl instance = mInstancesLocked.get(userHandle);
if (instance == null) {
// Impossible scenario, user cannot call an uninitialized SearchSession,
// getInstance should always find the instance for the given user and never try to
// create an instance for this user again.
throw new IllegalStateException(
- "AppSearchImpl has never been created for this user: " + userId);
+ "AppSearchImpl has never been created for: " + userHandle);
}
return instance;
}
}
- private AppSearchImpl createImpl(@NonNull Context context, @UserIdInt int userId,
+ private AppSearchImpl createImpl(
+ @NonNull Context context,
+ @NonNull UserHandle userHandle,
@Nullable AppSearchLogger logger)
throws AppSearchException {
- File appSearchDir = getAppSearchDir(userId);
+ File appSearchDir = getAppSearchDir(userHandle);
+ // TODO(b/181787682): Swap AppSearchImpl and VisibilityStore to accept a UserHandle too
return AppSearchImpl.create(
- appSearchDir, context, userId, mGlobalQuerierPackage, logger);
+ appSearchDir,
+ context,
+ userHandle.getIdentifier(),
+ mGlobalQuerierPackage,
+ /*logger=*/ null);
}
/**
diff --git a/apex/appsearch/service/java/com/android/server/appsearch/stats/LoggerInstanceManager.java b/apex/appsearch/service/java/com/android/server/appsearch/stats/LoggerInstanceManager.java
index 4544063..cb65e42 100644
--- a/apex/appsearch/service/java/com/android/server/appsearch/stats/LoggerInstanceManager.java
+++ b/apex/appsearch/service/java/com/android/server/appsearch/stats/LoggerInstanceManager.java
@@ -17,14 +17,17 @@
package com.android.server.appsearch.stats;
import android.annotation.NonNull;
-import android.annotation.UserIdInt;
import android.content.Context;
-import android.util.SparseArray;
+import android.os.UserHandle;
+import android.util.ArrayMap;
import android.util.SparseIntArray;
import com.android.internal.annotations.GuardedBy;
import com.android.server.appsearch.AppSearchManagerService;
+import java.util.Map;
+import java.util.Objects;
+
/**
* Manages the lifecycle of instances of {@link PlatformLogger}.
*
@@ -40,7 +43,7 @@
private static volatile LoggerInstanceManager sLoggerInstanceManager;
@GuardedBy("mInstancesLocked")
- private final SparseArray<PlatformLogger> mInstancesLocked = new SparseArray<>();
+ private final Map<UserHandle, PlatformLogger> mInstancesLocked = new ArrayMap<>();
private LoggerInstanceManager() {
}
@@ -68,48 +71,49 @@
* Gets an instance of PlatformLogger for the given user, or creates one if none exists.
*
* @param context The context
- * @param userId The multi-user userId of the device user calling AppSearch
+ * @param userHandle The multi-user handle of the device user calling AppSearch
* @return An initialized {@link PlatformLogger} for this user
*/
@NonNull
public PlatformLogger getOrCreatePlatformLogger(
- @NonNull Context context, @UserIdInt int userId) {
+ @NonNull Context context, @NonNull UserHandle userHandle) {
+ Objects.requireNonNull(userHandle);
synchronized (mInstancesLocked) {
- PlatformLogger instance = mInstancesLocked.get(userId);
+ PlatformLogger instance = mInstancesLocked.get(userHandle);
if (instance == null) {
- instance = new PlatformLogger(context, userId, new PlatformLogger.Config(
+ instance = new PlatformLogger(context, userHandle, new PlatformLogger.Config(
MIN_TIME_INTERVAL_BETWEEN_SAMPLES_MILLIS,
DEFAULT_SAMPLING_RATIO,
// TODO(b/173532925) re-enable sampling ratios for different stats types
// once we have P/H flag manager setup in ag/13977824
/*samplingRatios=*/ new SparseIntArray()));
- mInstancesLocked.put(userId, instance);
+ mInstancesLocked.put(userHandle, instance);
}
return instance;
}
}
-
/**
* Gets an instance of PlatformLogger for the given user.
*
* <p>This method should only be called by an initialized SearchSession, which has been already
* created the PlatformLogger instance for the given user.
*
- * @param userId The multi-user userId of the device user calling AppSearch
+ * @param userHandle The multi-user handle of the device user calling AppSearch
* @return An initialized {@link PlatformLogger} for this user
* @throws IllegalStateException if {@link PlatformLogger} haven't created for the given user.
*/
@NonNull
- public PlatformLogger getPlatformLogger(@UserIdInt int userId) {
+ public PlatformLogger getPlatformLogger(@NonNull UserHandle userHandle) {
+ Objects.requireNonNull(userHandle);
synchronized (mInstancesLocked) {
- PlatformLogger instance = mInstancesLocked.get(userId);
+ PlatformLogger instance = mInstancesLocked.get(userHandle);
if (instance == null) {
// Impossible scenario, user cannot call an uninitialized SearchSession,
// getInstance should always find the instance for the given user and never try to
// create an instance for this user again.
throw new IllegalStateException(
- "PlatformLogger has never been created for this user: " + userId);
+ "PlatformLogger has never been created for: " + userHandle);
}
return instance;
}
@@ -121,11 +125,12 @@
* <p>This method should only be called if {@link AppSearchManagerService} receives an
* ACTION_USER_REMOVED, which the logger instance of given user should be removed.
*
- * @param userId The multi-user userId of the user that need to be removed.
+ * @param userHandle The multi-user handle of the user that need to be removed.
*/
- public void removePlatformLoggerForUser(@UserIdInt int userId) {
+ public void removePlatformLoggerForUser(@NonNull UserHandle userHandle) {
+ Objects.requireNonNull(userHandle);
synchronized (mInstancesLocked) {
- mInstancesLocked.remove(userId);
+ mInstancesLocked.remove(userHandle);
}
}
}
diff --git a/apex/appsearch/service/java/com/android/server/appsearch/stats/PlatformLogger.java b/apex/appsearch/service/java/com/android/server/appsearch/stats/PlatformLogger.java
index df59306..74aedbd 100644
--- a/apex/appsearch/service/java/com/android/server/appsearch/stats/PlatformLogger.java
+++ b/apex/appsearch/service/java/com/android/server/appsearch/stats/PlatformLogger.java
@@ -23,6 +23,7 @@
import android.content.pm.PackageManager;
import android.os.Process;
import android.os.SystemClock;
+import android.os.UserHandle;
import android.util.ArrayMap;
import android.util.Log;
import android.util.SparseIntArray;
@@ -56,8 +57,8 @@
// Context of the system service.
private final Context mContext;
- // User ID of the caller who we're logging for.
- private final int mUserId;
+ // User we're logging for.
+ private final UserHandle mUserHandle;
// Configuration for the logger
private final Config mConfig;
@@ -164,10 +165,11 @@
/**
* Westworld constructor
*/
- public PlatformLogger(@NonNull Context context, int userId, @NonNull Config config) {
+ public PlatformLogger(
+ @NonNull Context context, @NonNull UserHandle userHandle, @NonNull Config config) {
mContext = Objects.requireNonNull(context);
+ mUserHandle = Objects.requireNonNull(userHandle);
mConfig = Objects.requireNonNull(config);
- mUserId = userId;
}
/** Logs {@link CallStats}. */
@@ -493,7 +495,8 @@
// TODO(b/173532925) since VisibilityStore has the same method, we can make this a
// utility function
try {
- packageUid = mContext.getPackageManager().getPackageUidAsUser(packageName, mUserId);
+ packageUid = mContext.getPackageManager().getPackageUidAsUser(
+ packageName, mUserHandle.getIdentifier());
mPackageUidCacheLocked.put(packageName, packageUid);
return packageUid;
} catch (PackageManager.NameNotFoundException e) {
diff --git a/services/tests/servicestests/src/com/android/server/appsearch/stats/PlatformLoggerTest.java b/services/tests/servicestests/src/com/android/server/appsearch/stats/PlatformLoggerTest.java
index e5bdafd..747dd1d 100644
--- a/services/tests/servicestests/src/com/android/server/appsearch/stats/PlatformLoggerTest.java
+++ b/services/tests/servicestests/src/com/android/server/appsearch/stats/PlatformLoggerTest.java
@@ -75,7 +75,7 @@
public void testCreateExtraStatsLocked_nullSamplingRatioMap_returnsDefaultSamplingRatio() {
PlatformLogger logger = new PlatformLogger(
ApplicationProvider.getApplicationContext(),
- UserHandle.USER_NULL,
+ UserHandle.of(UserHandle.USER_NULL),
new PlatformLogger.Config(
TEST_MIN_TIME_INTERVAL_BETWEEN_SAMPLES_MILLIS,
TEST_DEFAULT_SAMPLING_RATIO,
@@ -106,7 +106,7 @@
samplingRatios.put(CallStats.CALL_TYPE_SEARCH, querySamplingRatio);
PlatformLogger logger = new PlatformLogger(
ApplicationProvider.getApplicationContext(),
- UserHandle.USER_NULL,
+ UserHandle.of(UserHandle.USER_NULL),
new PlatformLogger.Config(
TEST_MIN_TIME_INTERVAL_BETWEEN_SAMPLES_MILLIS,
TEST_DEFAULT_SAMPLING_RATIO,
@@ -207,7 +207,7 @@
final String testPackageName = "packageName";
PlatformLogger logger = new PlatformLogger(
ApplicationProvider.getApplicationContext(),
- UserHandle.USER_NULL,
+ UserHandle.of(UserHandle.USER_NULL),
new PlatformLogger.Config(
TEST_MIN_TIME_INTERVAL_BETWEEN_SAMPLES_MILLIS,
samplingRatio,
@@ -225,7 +225,7 @@
final String testPackageName = "packageName";
PlatformLogger logger = new PlatformLogger(
ApplicationProvider.getApplicationContext(),
- UserHandle.USER_NULL,
+ UserHandle.of(UserHandle.USER_NULL),
new PlatformLogger.Config(
TEST_MIN_TIME_INTERVAL_BETWEEN_SAMPLES_MILLIS,
samplingRatio,
@@ -247,7 +247,7 @@
final String testPackageName = "packageName";
PlatformLogger logger = new PlatformLogger(
ApplicationProvider.getApplicationContext(),
- UserHandle.USER_NULL,
+ UserHandle.of(UserHandle.USER_NULL),
new PlatformLogger.Config(
minTimeIntervalBetweenSamplesMillis,
samplingRatio,
@@ -269,7 +269,7 @@
final String testPackageName = "packageName";
PlatformLogger logger = new PlatformLogger(
ApplicationProvider.getApplicationContext(),
- UserHandle.USER_NULL,
+ UserHandle.of(UserHandle.USER_NULL),
new PlatformLogger.Config(
minTimeIntervalBetweenSamplesMillis,
samplingRatio,
@@ -289,7 +289,7 @@
final int testUid = 1234;
PlatformLogger logger = new PlatformLogger(
mContext,
- mContext.getUserId(),
+ mContext.getUser(),
new PlatformLogger.Config(
TEST_MIN_TIME_INTERVAL_BETWEEN_SAMPLES_MILLIS,
TEST_DEFAULT_SAMPLING_RATIO,
diff --git a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
index b2ddbf0..f6baa6bb 100644
--- a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
@@ -653,15 +653,15 @@
new ArrayMap<>(1);
private Map<String, Map<String, GenericDocument>> mDocumentMap = new ArrayMap<>(1);
- private String getKey(int userId, String databaseName) {
- return new StringBuilder().append(userId).append("@").append(databaseName).toString();
+ private String getKey(UserHandle userHandle, String databaseName) {
+ return userHandle.getIdentifier() + "@" + databaseName;
}
@Override
public void setSchema(String packageName, String databaseName, List<Bundle> schemaBundles,
List<String> schemasNotPlatformSurfaceable,
Map<String, List<Bundle>> schemasPackageAccessibleBundles, boolean forceOverride,
- int userId, int version, long binderCallStartTimeMillis,
+ int version, UserHandle userHandle, long binderCallStartTimeMillis,
IAppSearchResultCallback callback) throws RemoteException {
for (Map.Entry<String, List<Bundle>> entry :
schemasPackageAccessibleBundles.entrySet()) {
@@ -684,20 +684,20 @@
}
@Override
- public void getSchema(String packageName, String databaseName, int userId,
+ public void getSchema(String packageName, String databaseName, UserHandle userHandle,
IAppSearchResultCallback callback) throws RemoteException {
ignore(callback);
}
@Override
- public void getNamespaces(String packageName, String databaseName, int userId,
+ public void getNamespaces(String packageName, String databaseName, UserHandle userHandle,
IAppSearchResultCallback callback) throws RemoteException {
ignore(callback);
}
@Override
public void putDocuments(String packageName, String databaseName,
- List<Bundle> documentBundles, int userId, long binderCallStartTimeMillis,
+ List<Bundle> documentBundles, UserHandle userHandle, long binderCallStartTimeMillis,
IAppSearchBatchResultCallback callback)
throws RemoteException {
final List<GenericDocument> docs = new ArrayList<>(documentBundles.size());
@@ -706,7 +706,7 @@
}
final AppSearchBatchResult.Builder<String, Void> builder =
new AppSearchBatchResult.Builder<>();
- final String key = getKey(userId, databaseName);
+ final String key = getKey(userHandle, databaseName);
Map<String, GenericDocument> docMap = mDocumentMap.get(key);
for (GenericDocument doc : docs) {
builder.setSuccess(doc.getId(), null);
@@ -721,12 +721,12 @@
@Override
public void getDocuments(String packageName, String databaseName, String namespace,
- List<String> ids, Map<String, List<String>> typePropertyPaths, int userId,
- long binderCallStartTimeMillis,
+ List<String> ids, Map<String, List<String>> typePropertyPaths,
+ UserHandle userHandle, long binderCallStartTimeMillis,
IAppSearchBatchResultCallback callback) throws RemoteException {
final AppSearchBatchResult.Builder<String, Bundle> builder =
new AppSearchBatchResult.Builder<>();
- final String key = getKey(userId, databaseName);
+ final String key = getKey(userHandle, databaseName);
if (!mDocumentMap.containsKey(key)) {
for (String id : ids) {
builder.setFailure(id, AppSearchResult.RESULT_NOT_FOUND,
@@ -748,10 +748,10 @@
@Override
public void query(String packageName, String databaseName, String queryExpression,
- Bundle searchSpecBundle, int userId, long binderCallStartTimeMillis,
+ Bundle searchSpecBundle, UserHandle userHandle, long binderCallStartTimeMillis,
IAppSearchResultCallback callback)
throws RemoteException {
- final String key = getKey(userId, databaseName);
+ final String key = getKey(userHandle, databaseName);
if (!mDocumentMap.containsKey(key)) {
final Bundle page = new Bundle();
page.putLong(SearchResultPage.NEXT_PAGE_TOKEN_FIELD, 1);
@@ -779,14 +779,14 @@
@Override
public void globalQuery(String packageName, String queryExpression, Bundle searchSpecBundle,
- int userId, long binderCallStartTimeMillis, IAppSearchResultCallback callback)
- throws RemoteException {
+ UserHandle userHandle, long binderCallStartTimeMillis,
+ IAppSearchResultCallback callback) throws RemoteException {
ignore(callback);
}
@Override
- public void getNextPage(long nextPageToken, int userId, IAppSearchResultCallback callback)
- throws RemoteException {
+ public void getNextPage(long nextPageToken, UserHandle userHandle,
+ IAppSearchResultCallback callback) throws RemoteException {
final Bundle page = new Bundle();
page.putLong(SearchResultPage.NEXT_PAGE_TOKEN_FIELD, 1);
page.putParcelableArrayList(SearchResultPage.RESULTS_FIELD, new ArrayList<>());
@@ -795,28 +795,30 @@
}
@Override
- public void invalidateNextPageToken(long nextPageToken, int userId) throws RemoteException {
-
+ public void invalidateNextPageToken(long nextPageToken, UserHandle userHandle)
+ throws RemoteException {
}
@Override
public void writeQueryResultsToFile(String packageName, String databaseName,
ParcelFileDescriptor fileDescriptor, String queryExpression,
- Bundle searchSpecBundle, int userId, IAppSearchResultCallback callback)
+ Bundle searchSpecBundle, UserHandle userHandle, IAppSearchResultCallback callback)
throws RemoteException {
ignore(callback);
}
@Override
public void putDocumentsFromFile(String packageName, String databaseName,
- ParcelFileDescriptor fileDescriptor, int userId, IAppSearchResultCallback callback)
+ ParcelFileDescriptor fileDescriptor, UserHandle userHandle,
+ IAppSearchResultCallback callback)
throws RemoteException {
ignore(callback);
}
@Override
public void reportUsage(String packageName, String databaseName, String namespace,
- String documentId, long usageTimestampMillis, boolean systemUsage, int userId,
+ String documentId, long usageTimestampMillis, boolean systemUsage,
+ UserHandle userHandle,
IAppSearchResultCallback callback)
throws RemoteException {
ignore(callback);
@@ -824,12 +826,12 @@
@Override
public void removeByDocumentId(String packageName, String databaseName, String namespace,
- List<String> ids, int userId, long binderCallStartTimeMillis,
+ List<String> ids, UserHandle userHandle, long binderCallStartTimeMillis,
IAppSearchBatchResultCallback callback)
throws RemoteException {
final AppSearchBatchResult.Builder<String, Void> builder =
new AppSearchBatchResult.Builder<>();
- final String key = getKey(userId, databaseName);
+ final String key = getKey(userHandle, databaseName);
if (!mDocumentMap.containsKey(key)) {
for (String id : ids) {
builder.setFailure(id, AppSearchResult.RESULT_NOT_FOUND,
@@ -852,10 +854,10 @@
@Override
public void removeByQuery(String packageName, String databaseName, String queryExpression,
- Bundle searchSpecBundle, int userId, long binderCallStartTimeMillis,
+ Bundle searchSpecBundle, UserHandle userHandle, long binderCallStartTimeMillis,
IAppSearchResultCallback callback)
throws RemoteException {
- final String key = getKey(userId, databaseName);
+ final String key = getKey(userHandle, databaseName);
if (!mDocumentMap.containsKey(key)) {
callback.onResult(
new AppSearchResultParcel<>(AppSearchResult.newSuccessfulResult(null)));
@@ -867,19 +869,18 @@
}
@Override
- public void getStorageInfo(String packageName, String databaseName, int userId,
+ public void getStorageInfo(String packageName, String databaseName, UserHandle userHandle,
IAppSearchResultCallback callback) throws RemoteException {
ignore(callback);
}
@Override
- public void persistToDisk(int userId, long binderCallStartTimeMillis)
+ public void persistToDisk(UserHandle userHandle, long binderCallStartTimeMillis)
throws RemoteException {
-
}
@Override
- public void initialize(int userId, long binderCallStartTimeMillis,
+ public void initialize(UserHandle userHandle, long binderCallStartTimeMillis,
IAppSearchResultCallback callback)
throws RemoteException {
ignore(callback);