Merge "Support Multi-User AppSearch within SystemServer"

This commit is contained in:
Terry Wang
2020-12-23 21:32:24 +00:00
committed by Android (Google) Code Review
7 changed files with 130 additions and 60 deletions

View File

@@ -51,9 +51,11 @@ public class AppSearchManager {
public static final String DEFAULT_DATABASE_NAME = "";
private final IAppSearchManager mService;
private final Context mContext;
/** @hide */
public AppSearchManager(@NonNull IAppSearchManager service) {
public AppSearchManager(@NonNull Context context, @NonNull IAppSearchManager service) {
mContext = Objects.requireNonNull(context);
mService = Objects.requireNonNull(service);
}
@@ -137,7 +139,8 @@ public class AppSearchManager {
Objects.requireNonNull(searchContext);
Objects.requireNonNull(executor);
Objects.requireNonNull(callback);
AppSearchSession.createSearchSession(searchContext, mService, executor, callback);
AppSearchSession.createSearchSession(
searchContext, mService, mContext.getUserId(), executor, callback);
}
/**
@@ -158,7 +161,8 @@ public class AppSearchManager {
@NonNull Consumer<AppSearchResult<GlobalSearchSession>> callback) {
Objects.requireNonNull(executor);
Objects.requireNonNull(callback);
GlobalSearchSession.createGlobalSearchSession(mService, executor, callback);
GlobalSearchSession.createGlobalSearchSession(
mService, mContext.getUserId(), executor, callback);
}
/**
@@ -231,6 +235,7 @@ public class AppSearchManager {
schemaBundles,
new ArrayList<>(request.getSchemasNotPlatformSurfaceable()),
request.isForceOverride(),
mContext.getUserId(),
new IAppSearchResultCallback.Stub() {
public void onResult(AppSearchResult result) {
future.complete(result);
@@ -271,7 +276,7 @@ public class AppSearchManager {
}
AndroidFuture<AppSearchBatchResult> future = new AndroidFuture<>();
try {
mService.putDocuments(DEFAULT_DATABASE_NAME, documentBundles,
mService.putDocuments(DEFAULT_DATABASE_NAME, documentBundles, mContext.getUserId(),
new IAppSearchBatchResultCallback.Stub() {
public void onResult(AppSearchBatchResult result) {
future.complete(result);
@@ -312,6 +317,7 @@ public class AppSearchManager {
AndroidFuture<AppSearchBatchResult> future = new AndroidFuture<>();
try {
mService.getDocuments(DEFAULT_DATABASE_NAME, request.getNamespace(), uris,
mContext.getUserId(),
new IAppSearchBatchResultCallback.Stub() {
public void onResult(AppSearchBatchResult result) {
future.complete(result);
@@ -412,6 +418,7 @@ public class AppSearchManager {
AndroidFuture<AppSearchResult> future = new AndroidFuture<>();
try {
mService.query(DEFAULT_DATABASE_NAME, queryExpression, searchSpec.getBundle(),
mContext.getUserId(),
new IAppSearchResultCallback.Stub() {
public void onResult(AppSearchResult result) {
future.complete(result);
@@ -453,6 +460,7 @@ public class AppSearchManager {
AndroidFuture<AppSearchBatchResult> future = new AndroidFuture<>();
try {
mService.removeByUri(DEFAULT_DATABASE_NAME, request.getNamespace(), uris,
mContext.getUserId(),
new IAppSearchBatchResultCallback.Stub() {
public void onResult(AppSearchBatchResult result) {
future.complete(result);

View File

@@ -36,8 +36,9 @@ public class AppSearchManagerFrameworkInitializer {
* {@link SystemServiceRegistry}
*/
public static void initialize() {
SystemServiceRegistry.registerStaticService(
SystemServiceRegistry.registerContextAwareService(
Context.APP_SEARCH_SERVICE, AppSearchManager.class,
(service) -> new AppSearchManager(IAppSearchManager.Stub.asInterface(service)));
(context, service) ->
new AppSearchManager(context, IAppSearchManager.Stub.asInterface(service)));
}
}

View File

@@ -18,6 +18,7 @@ package android.app.appsearch;
import android.annotation.CallbackExecutor;
import android.annotation.NonNull;
import android.annotation.UserIdInt;
import android.os.Bundle;
import android.os.ParcelableException;
import android.os.RemoteException;
@@ -39,15 +40,18 @@ import java.util.function.Consumer;
*/
public final class AppSearchSession {
private final String mDatabaseName;
@UserIdInt
private final int mUserId;
private final IAppSearchManager mService;
static void createSearchSession(
@NonNull AppSearchManager.SearchContext searchContext,
@NonNull IAppSearchManager service,
@UserIdInt int userId,
@NonNull @CallbackExecutor Executor executor,
@NonNull Consumer<AppSearchResult<AppSearchSession>> callback) {
AppSearchSession searchSession =
new AppSearchSession(searchContext.mDatabaseName, service);
new AppSearchSession(service, userId, searchContext.mDatabaseName);
searchSession.initialize(executor, callback);
}
@@ -57,7 +61,7 @@ public final class AppSearchSession {
@NonNull @CallbackExecutor Executor executor,
@NonNull Consumer<AppSearchResult<AppSearchSession>> callback) {
try {
mService.initialize(new IAppSearchResultCallback.Stub() {
mService.initialize(mUserId, new IAppSearchResultCallback.Stub() {
public void onResult(AppSearchResult result) {
executor.execute(() -> {
if (result.isSuccess()) {
@@ -74,9 +78,11 @@ public final class AppSearchSession {
}
}
private AppSearchSession(@NonNull String databaseName, @NonNull IAppSearchManager service) {
private AppSearchSession(@NonNull IAppSearchManager service, @UserIdInt int userId,
@NonNull String databaseName) {
mDatabaseName = databaseName;
mService = service;
mUserId = userId;
}
/**
@@ -154,6 +160,7 @@ public final class AppSearchSession {
schemaBundles,
new ArrayList<>(request.getSchemasNotPlatformSurfaceable()),
request.isForceOverride(),
mUserId,
new IAppSearchResultCallback.Stub() {
public void onResult(AppSearchResult result) {
executor.execute(() -> callback.accept(result));
@@ -178,6 +185,7 @@ public final class AppSearchSession {
try {
mService.getSchema(
mDatabaseName,
mUserId,
new IAppSearchResultCallback.Stub() {
public void onResult(AppSearchResult result) {
executor.execute(() -> {
@@ -230,7 +238,7 @@ public final class AppSearchSession {
documentBundles.add(documents.get(i).getBundle());
}
try {
mService.putDocuments(mDatabaseName, documentBundles,
mService.putDocuments(mDatabaseName, documentBundles, mUserId,
new IAppSearchBatchResultCallback.Stub() {
public void onResult(AppSearchBatchResult result) {
executor.execute(() -> callback.onResult(result));
@@ -269,7 +277,7 @@ public final class AppSearchSession {
Objects.requireNonNull(callback);
try {
mService.getDocuments(mDatabaseName, request.getNamespace(),
new ArrayList<>(request.getUris()),
new ArrayList<>(request.getUris()), mUserId,
new IAppSearchBatchResultCallback.Stub() {
public void onResult(AppSearchBatchResult result) {
executor.execute(() -> {
@@ -371,7 +379,8 @@ public final class AppSearchSession {
Objects.requireNonNull(queryExpression);
Objects.requireNonNull(searchSpec);
Objects.requireNonNull(executor);
return new SearchResults(mService, mDatabaseName, queryExpression, searchSpec, executor);
return new SearchResults(mService, mDatabaseName, queryExpression, searchSpec, mUserId,
executor);
}
/**
@@ -397,7 +406,7 @@ public final class AppSearchSession {
Objects.requireNonNull(callback);
try {
mService.removeByUri(mDatabaseName, request.getNamespace(),
new ArrayList<>(request.getUris()),
new ArrayList<>(request.getUris()), mUserId,
new IAppSearchBatchResultCallback.Stub() {
public void onResult(AppSearchBatchResult result) {
executor.execute(() -> callback.onResult(result));
@@ -440,7 +449,7 @@ public final class AppSearchSession {
Objects.requireNonNull(executor);
Objects.requireNonNull(callback);
try {
mService.removeByQuery(mDatabaseName, queryExpression, searchSpec.getBundle(),
mService.removeByQuery(mDatabaseName, queryExpression, searchSpec.getBundle(), mUserId,
new IAppSearchResultCallback.Stub() {
public void onResult(AppSearchResult result) {
executor.execute(() -> callback.accept(result));

View File

@@ -20,6 +20,7 @@ package android.app.appsearch;
import android.annotation.CallbackExecutor;
import android.annotation.NonNull;
import android.annotation.SystemApi;
import android.annotation.UserIdInt;
import android.os.RemoteException;
import java.util.Objects;
@@ -36,12 +37,15 @@ import java.util.function.Consumer;
public class GlobalSearchSession {
private final IAppSearchManager mService;
@UserIdInt
private final int mUserId;
static void createGlobalSearchSession(
@NonNull IAppSearchManager service,
@UserIdInt int userId,
@NonNull @CallbackExecutor Executor executor,
@NonNull Consumer<AppSearchResult<GlobalSearchSession>> callback) {
GlobalSearchSession globalSearchSession = new GlobalSearchSession(service);
GlobalSearchSession globalSearchSession = new GlobalSearchSession(service, userId);
globalSearchSession.initialize(executor, callback);
}
@@ -51,7 +55,7 @@ public class GlobalSearchSession {
@NonNull @CallbackExecutor Executor executor,
@NonNull Consumer<AppSearchResult<GlobalSearchSession>> callback) {
try {
mService.initialize(new IAppSearchResultCallback.Stub() {
mService.initialize(mUserId, new IAppSearchResultCallback.Stub() {
public void onResult(AppSearchResult result) {
executor.execute(() -> {
if (result.isSuccess()) {
@@ -68,8 +72,9 @@ public class GlobalSearchSession {
}
}
private GlobalSearchSession(@NonNull IAppSearchManager service) {
private GlobalSearchSession(@NonNull IAppSearchManager service, @UserIdInt int userId) {
mService = service;
mUserId = userId;
}
/**
@@ -125,6 +130,6 @@ public class GlobalSearchSession {
Objects.requireNonNull(searchSpec);
Objects.requireNonNull(executor);
return new SearchResults(mService, /*databaseName=*/null, queryExpression,
searchSpec, executor);
searchSpec, mUserId, executor);
}
}

View File

@@ -36,6 +36,7 @@ interface IAppSearchManager {
* surfaces.
* @param forceOverride Whether to apply the new schema even if it is incompatible. All
* incompatible documents will be deleted.
* @param userId Id of the calling user
* @param callback {@link IAppSearchResultCallback#onResult} will be called with an
* {@link AppSearchResult}&lt;{@link Void}&gt;.
*/
@@ -44,6 +45,7 @@ interface IAppSearchManager {
in List<Bundle> schemaBundles,
in List<String> schemasNotPlatformSurfaceable,
boolean forceOverride,
in int userId,
in IAppSearchResultCallback callback);
@@ -51,17 +53,19 @@ interface IAppSearchManager {
* Retrieves the AppSearch schema for this database.
*
* @param databaseName The name of the database to retrieve.
* @param userId Id of the calling user
* @param callback {@link IAppSearchResultCallback#onResult} will be called with an
* {@link AppSearchResult}&lt;{@link List}&lt;{@link Bundle}&gt;&gt;, where the value are
* AppSearchSchema bundle.
*/
void getSchema(in String databaseName, in IAppSearchResultCallback callback);
void getSchema(in String databaseName, in int userId, in IAppSearchResultCallback callback);
/**
* Inserts documents into the index.
*
* @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 callback
* If the call fails to start, {@link IAppSearchBatchResultCallback#onSystemError}
* will be called with the cause throwable. Otherwise,
@@ -72,6 +76,7 @@ interface IAppSearchManager {
void putDocuments(
in String databaseName,
in List<Bundle> documentBundles,
in int userId,
in IAppSearchBatchResultCallback callback);
/**
@@ -80,6 +85,7 @@ interface IAppSearchManager {
* @param databaseName The databaseName this document resides in.
* @param namespace The namespace this document resides in.
* @param uris The URIs of the documents to retrieve
* @param userId Id of the calling user
* @param callback
* If the call fails to start, {@link IAppSearchBatchResultCallback#onSystemError}
* will be called with the cause throwable. Otherwise,
@@ -91,6 +97,7 @@ interface IAppSearchManager {
in String databaseName,
in String namespace,
in List<String> uris,
in int userId,
in IAppSearchBatchResultCallback callback);
/**
@@ -99,6 +106,7 @@ interface IAppSearchManager {
* @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 callback {@link AppSearchResult}&lt;{@link Bundle}&gt; of performing this
* operation.
*/
@@ -106,6 +114,7 @@ interface IAppSearchManager {
in String databaseName,
in String queryExpression,
in Bundle searchSpecBundle,
in int userId,
in IAppSearchResultCallback callback);
/**
@@ -114,12 +123,14 @@ interface IAppSearchManager {
*
* @param queryExpression String to search for
* @param searchSpecBundle SearchSpec bundle
* @param userId Id of the calling user
* @param callback {@link AppSearchResult}&lt;{@link Bundle}&gt; of performing this
* operation.
*/
void globalQuery(
in String queryExpression,
in Bundle searchSpecBundle,
in int userId,
in IAppSearchResultCallback callback);
/**
@@ -127,18 +138,20 @@ interface IAppSearchManager {
* 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 callback {@link AppSearchResult}&lt;{@link Bundle}&gt; of performing this
* operation.
*/
void getNextPage(in long nextPageToken, in IAppSearchResultCallback callback);
void getNextPage(in long nextPageToken, in int userId, 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
*/
void invalidateNextPageToken(in long nextPageToken);
void invalidateNextPageToken(in long nextPageToken, in int userId);
/**
* Removes documents by URI.
@@ -146,6 +159,7 @@ interface IAppSearchManager {
* @param databaseName The databaseName the document is in.
* @param namespace Namespace of the document to remove.
* @param uris The URIs of the documents to delete
* @param userId Id of the calling user
* @param callback
* If the call fails to start, {@link IAppSearchBatchResultCallback#onSystemError}
* will be called with the cause throwable. Otherwise,
@@ -158,6 +172,7 @@ interface IAppSearchManager {
in String databaseName,
in String namespace,
in List<String> uris,
in int userId,
in IAppSearchBatchResultCallback callback);
/**
@@ -166,6 +181,7 @@ interface IAppSearchManager {
* @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 callback {@link IAppSearchResultCallback#onResult} will be called with an
* {@link AppSearchResult}&lt;{@link Void}&gt;.
*/
@@ -173,13 +189,15 @@ interface IAppSearchManager {
in String databaseName,
in String queryExpression,
in Bundle searchSpecBundle,
in int userId,
in IAppSearchResultCallback callback);
/**
* Creates and initializes AppSearchImpl for the calling app.
*
* @param userId Id of the calling user
* @param callback {@link IAppSearchResultCallback#onResult} will be called with an
* {@link AppSearchResult}&lt;{@link Void}&gt;.
*/
void initialize(in IAppSearchResultCallback callback);
void initialize(in int userId, in IAppSearchResultCallback callback);
}

View File

@@ -19,14 +19,14 @@ package android.app.appsearch;
import android.annotation.CallbackExecutor;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.os.Bundle;
import android.os.RemoteException;
import android.util.Log;
import com.android.internal.util.Preconditions;
import java.io.Closeable;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.Executor;
import java.util.function.Consumer;
@@ -48,6 +48,9 @@ public class SearchResults implements Closeable {
@Nullable
private final String mDatabaseName;
@UserIdInt
private final int mUserId;
private final String mQueryExpression;
private final SearchSpec mSearchSpec;
@@ -62,12 +65,14 @@ public class SearchResults implements Closeable {
@Nullable String databaseName,
@NonNull String queryExpression,
@NonNull SearchSpec searchSpec,
@UserIdInt int userId,
@NonNull @CallbackExecutor Executor executor) {
mService = Preconditions.checkNotNull(service);
mExecutor = Preconditions.checkNotNull(executor);
mDatabaseName = databaseName;
mQueryExpression = Preconditions.checkNotNull(queryExpression);
mSearchSpec = Preconditions.checkNotNull(searchSpec);
mService = Objects.requireNonNull(service);
mUserId = userId;
mDatabaseName = Objects.requireNonNull(databaseName);
mQueryExpression = Objects.requireNonNull(queryExpression);
mSearchSpec = Objects.requireNonNull(searchSpec);
mExecutor = Objects.requireNonNull(executor);
}
/**
@@ -85,14 +90,14 @@ public class SearchResults implements Closeable {
if (mIsFirstLoad) {
mIsFirstLoad = false;
if (mDatabaseName == null) {
mService.globalQuery(mQueryExpression, mSearchSpec.getBundle(),
mService.globalQuery(mQueryExpression, mSearchSpec.getBundle(), mUserId,
wrapCallback(callback));
} else {
mService.query(mDatabaseName, mQueryExpression, mSearchSpec.getBundle(),
wrapCallback(callback));
mUserId, wrapCallback(callback));
}
} else {
mService.getNextPage(mNextPageToken, wrapCallback(callback));
mService.getNextPage(mNextPageToken, mUserId, wrapCallback(callback));
}
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
@@ -119,7 +124,7 @@ public class SearchResults implements Closeable {
public void close() {
mExecutor.execute(() -> {
try {
mService.invalidateNextPageToken(mNextPageToken);
mService.invalidateNextPageToken(mNextPageToken, mUserId);
} catch (RemoteException e) {
Log.d(TAG, "Unable to close the SearchResults", e);
}

View File

@@ -18,6 +18,8 @@ package com.android.server.appsearch;
import static android.app.appsearch.AppSearchResult.throwableToFailedResult;
import android.annotation.NonNull;
import android.annotation.UserIdInt;
import android.app.ActivityManager;
import android.app.appsearch.AppSearchBatchResult;
import android.app.appsearch.AppSearchResult;
import android.app.appsearch.AppSearchSchema;
@@ -32,7 +34,6 @@ import android.os.Binder;
import android.os.Bundle;
import android.os.ParcelableException;
import android.os.RemoteException;
import android.os.UserHandle;
import android.util.Log;
import com.android.internal.util.Preconditions;
@@ -64,12 +65,13 @@ public class AppSearchManagerService extends SystemService {
@NonNull List<Bundle> schemaBundles,
@NonNull List<String> schemasNotPlatformSurfaceable,
boolean forceOverride,
@UserIdInt int userId,
@NonNull IAppSearchResultCallback callback) {
Preconditions.checkNotNull(databaseName);
Preconditions.checkNotNull(schemaBundles);
Preconditions.checkNotNull(callback);
int callingUid = Binder.getCallingUidOrThrow();
int callingUserId = UserHandle.getUserId(callingUid);
int callingUid = Binder.getCallingUid();
int callingUserId = handleIncomingUser(userId, callingUid);
final long callingIdentity = Binder.clearCallingIdentity();
try {
List<AppSearchSchema> schemas = new ArrayList<>(schemaBundles.size());
@@ -92,11 +94,12 @@ public class AppSearchManagerService extends SystemService {
@Override
public void getSchema(
@NonNull String databaseName,
@UserIdInt int userId,
@NonNull IAppSearchResultCallback callback) {
Preconditions.checkNotNull(databaseName);
Preconditions.checkNotNull(callback);
int callingUid = Binder.getCallingUidOrThrow();
int callingUserId = UserHandle.getUserId(callingUid);
int callingUserId = handleIncomingUser(userId, callingUid);
final long callingIdentity = Binder.clearCallingIdentity();
try {
AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId);
@@ -119,12 +122,13 @@ public class AppSearchManagerService extends SystemService {
public void putDocuments(
@NonNull String databaseName,
@NonNull List<Bundle> documentBundles,
@UserIdInt int userId,
@NonNull IAppSearchBatchResultCallback callback) {
Preconditions.checkNotNull(databaseName);
Preconditions.checkNotNull(documentBundles);
Preconditions.checkNotNull(callback);
int callingUid = Binder.getCallingUidOrThrow();
int callingUserId = UserHandle.getUserId(callingUid);
int callingUid = Binder.getCallingUid();
int callingUserId = handleIncomingUser(userId, callingUid);
final long callingIdentity = Binder.clearCallingIdentity();
try {
AppSearchBatchResult.Builder<String, Void> resultBuilder =
@@ -151,15 +155,18 @@ public class AppSearchManagerService extends SystemService {
}
@Override
public void getDocuments(@NonNull String databaseName, @NonNull String namespace,
public void getDocuments(
@NonNull String databaseName,
@NonNull String namespace,
@NonNull List<String> uris,
@UserIdInt int userId,
@NonNull IAppSearchBatchResultCallback callback) {
Preconditions.checkNotNull(databaseName);
Preconditions.checkNotNull(namespace);
Preconditions.checkNotNull(uris);
Preconditions.checkNotNull(callback);
int callingUid = Binder.getCallingUidOrThrow();
int callingUserId = UserHandle.getUserId(callingUid);
int callingUid = Binder.getCallingUid();
int callingUserId = handleIncomingUser(userId, callingUid);
final long callingIdentity = Binder.clearCallingIdentity();
try {
AppSearchBatchResult.Builder<String, Bundle> resultBuilder =
@@ -190,13 +197,14 @@ public class AppSearchManagerService extends SystemService {
@NonNull String databaseName,
@NonNull String queryExpression,
@NonNull Bundle searchSpecBundle,
@UserIdInt int userId,
@NonNull IAppSearchResultCallback callback) {
Preconditions.checkNotNull(databaseName);
Preconditions.checkNotNull(queryExpression);
Preconditions.checkNotNull(searchSpecBundle);
Preconditions.checkNotNull(callback);
int callingUid = Binder.getCallingUidOrThrow();
int callingUserId = UserHandle.getUserId(callingUid);
int callingUid = Binder.getCallingUid();
int callingUserId = handleIncomingUser(userId, callingUid);
final long callingIdentity = Binder.clearCallingIdentity();
try {
AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId);
@@ -215,15 +223,17 @@ public class AppSearchManagerService extends SystemService {
}
}
@Override
public void globalQuery(
@NonNull String queryExpression,
@NonNull Bundle searchSpecBundle,
@UserIdInt int userId,
@NonNull IAppSearchResultCallback callback) {
Preconditions.checkNotNull(queryExpression);
Preconditions.checkNotNull(searchSpecBundle);
Preconditions.checkNotNull(callback);
int callingUid = Binder.getCallingUidOrThrow();
int callingUserId = UserHandle.getUserId(callingUid);
int callingUid = Binder.getCallingUid();
int callingUserId = handleIncomingUser(userId, callingUid);
final long callingIdentity = Binder.clearCallingIdentity();
try {
AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId);
@@ -240,11 +250,11 @@ public class AppSearchManagerService extends SystemService {
}
@Override
public void getNextPage(long nextPageToken,
public void getNextPage(long nextPageToken, @UserIdInt int userId,
@NonNull IAppSearchResultCallback callback) {
Preconditions.checkNotNull(callback);
int callingUid = Binder.getCallingUidOrThrow();
int callingUserId = UserHandle.getUserId(callingUid);
int callingUid = Binder.getCallingUid();
int callingUserId = handleIncomingUser(userId, callingUid);
final long callingIdentity = Binder.clearCallingIdentity();
// TODO(b/162450968) check nextPageToken is being advanced by the same uid as originally
// opened it
@@ -261,9 +271,9 @@ public class AppSearchManagerService extends SystemService {
}
@Override
public void invalidateNextPageToken(long nextPageToken) {
int callingUid = Binder.getCallingUidOrThrow();
int callingUserId = UserHandle.getUserId(callingUid);
public void invalidateNextPageToken(long nextPageToken, @UserIdInt int userId) {
int callingUid = Binder.getCallingUid();
int callingUserId = handleIncomingUser(userId, callingUid);
final long callingIdentity = Binder.clearCallingIdentity();
try {
AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId);
@@ -276,14 +286,17 @@ public class AppSearchManagerService extends SystemService {
}
@Override
public void removeByUri(@NonNull String databaseName, @NonNull String namespace,
public void removeByUri(
@NonNull String databaseName,
@NonNull String namespace,
@NonNull List<String> uris,
@UserIdInt int userId,
@NonNull IAppSearchBatchResultCallback callback) {
Preconditions.checkNotNull(databaseName);
Preconditions.checkNotNull(uris);
Preconditions.checkNotNull(callback);
int callingUid = Binder.getCallingUidOrThrow();
int callingUserId = UserHandle.getUserId(callingUid);
int callingUid = Binder.getCallingUid();
int callingUserId = handleIncomingUser(userId, callingUid);
final long callingIdentity = Binder.clearCallingIdentity();
try {
AppSearchBatchResult.Builder<String, Void> resultBuilder =
@@ -312,13 +325,14 @@ public class AppSearchManagerService extends SystemService {
@NonNull String databaseName,
@NonNull String queryExpression,
@NonNull Bundle searchSpecBundle,
@UserIdInt int userId,
@NonNull IAppSearchResultCallback callback) {
Preconditions.checkNotNull(databaseName);
Preconditions.checkNotNull(queryExpression);
Preconditions.checkNotNull(searchSpecBundle);
Preconditions.checkNotNull(callback);
int callingUid = Binder.getCallingUidOrThrow();
int callingUserId = UserHandle.getUserId(callingUid);
int callingUid = Binder.getCallingUid();
int callingUserId = handleIncomingUser(userId, callingUid);
final long callingIdentity = Binder.clearCallingIdentity();
try {
AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId);
@@ -334,10 +348,10 @@ public class AppSearchManagerService extends SystemService {
}
@Override
public void initialize(@NonNull IAppSearchResultCallback callback) {
public void initialize(@UserIdInt int userId, @NonNull IAppSearchResultCallback callback) {
Preconditions.checkNotNull(callback);
int callingUid = Binder.getCallingUidOrThrow();
int callingUserId = UserHandle.getUserId(callingUid);
int callingUid = Binder.getCallingUid();
int callingUserId = handleIncomingUser(userId, callingUid);
final long callingIdentity = Binder.clearCallingIdentity();
try {
ImplInstanceManager.getInstance(getContext(), callingUserId);
@@ -415,4 +429,14 @@ public class AppSearchManagerService extends SystemService {
}
}
}
//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) {
int callingPid = Binder.getCallingPid();
return ActivityManager.handleIncomingUser(callingPid, callingUid, userId,
/*allowAll=*/ false, /*requireFull=*/ false,
/*name=*/ null, /*callerPackage=*/ null);
}
}