diff options
author | Zak Cohen <zakcohen@google.com> | 2019-03-08 12:59:01 -0800 |
---|---|---|
committer | Zak Cohen <zakcohen@google.com> | 2019-03-14 14:44:56 -0700 |
commit | 4834e9f02cae8188604af82dbdb8c83882cd1984 (patch) | |
tree | 0e6d9f86c1345d15accbfde2bd76f39907eaee6a | |
parent | 7c8b15414177bccc5e84366d0a045c013f2c4831 (diff) |
ContentSuggestionsManager - API updates.
Adds isEnabled for the manager.
Manager also requires a user for construction, this is the user for
query for suggestions, not the calling user.
Bug: 125912329
Test: compile and CTS
Change-Id: I07145681fdf792965fee868b65f31d2978df7599
5 files changed, 77 insertions, 20 deletions
diff --git a/api/system-current.txt b/api/system-current.txt index 866c1383bdda..c53745484807 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -985,6 +985,7 @@ package android.app.contentsuggestions { public final class ContentSuggestionsManager { method public void classifyContentSelections(@NonNull android.app.contentsuggestions.ClassificationsRequest, @NonNull java.util.concurrent.Executor, @NonNull android.app.contentsuggestions.ContentSuggestionsManager.ClassificationsCallback); + method public boolean isEnabled(); method public void notifyInteraction(@NonNull String, @NonNull android.os.Bundle); method public void provideContextImage(int, @NonNull android.os.Bundle); method public void suggestContentSelections(@NonNull android.app.contentsuggestions.SelectionsRequest, @NonNull java.util.concurrent.Executor, @NonNull android.app.contentsuggestions.ContentSuggestionsManager.SelectionsCallback); diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java index 6103818254f7..08e08806a310 100644 --- a/core/java/android/app/SystemServiceRegistry.java +++ b/core/java/android/app/SystemServiceRegistry.java @@ -1188,7 +1188,7 @@ final class SystemServiceRegistry { Context.CONTENT_SUGGESTIONS_SERVICE); IContentSuggestionsManager service = IContentSuggestionsManager.Stub.asInterface(b); - return new ContentSuggestionsManager(service); + return new ContentSuggestionsManager(ctx.getUserId(), service); } }); diff --git a/core/java/android/app/contentsuggestions/ContentSuggestionsManager.java b/core/java/android/app/contentsuggestions/ContentSuggestionsManager.java index b4d89774cc3b..1bb81b1487af 100644 --- a/core/java/android/app/contentsuggestions/ContentSuggestionsManager.java +++ b/core/java/android/app/contentsuggestions/ContentSuggestionsManager.java @@ -20,11 +20,14 @@ import android.annotation.CallbackExecutor; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; +import android.annotation.UserIdInt; import android.os.Binder; import android.os.Bundle; import android.os.RemoteException; import android.util.Log; +import com.android.internal.util.SyncResultReceiver; + import java.util.List; import java.util.concurrent.Executor; @@ -44,12 +47,22 @@ import java.util.concurrent.Executor; public final class ContentSuggestionsManager { private static final String TAG = ContentSuggestionsManager.class.getSimpleName(); + /** + * Timeout for calls to system_server. + */ + private static final int SYNC_CALLS_TIMEOUT_MS = 5000; + @Nullable private final IContentSuggestionsManager mService; + @NonNull + private final int mUser; + /** @hide */ - public ContentSuggestionsManager(@Nullable IContentSuggestionsManager service) { + public ContentSuggestionsManager( + @UserIdInt int userId, @Nullable IContentSuggestionsManager service) { mService = service; + mUser = userId; } /** @@ -60,14 +73,15 @@ public final class ContentSuggestionsManager { * @param imageContextRequestExtras sent with with request to provide implementation specific * extra information. */ - public void provideContextImage(int taskId, @NonNull Bundle imageContextRequestExtras) { + public void provideContextImage( + int taskId, @NonNull Bundle imageContextRequestExtras) { if (mService == null) { Log.e(TAG, "provideContextImage called, but no ContentSuggestionsManager configured"); return; } try { - mService.provideContextImage(taskId, imageContextRequestExtras); + mService.provideContextImage(mUser, taskId, imageContextRequestExtras); } catch (RemoteException e) { e.rethrowFromSystemServer(); } @@ -96,7 +110,7 @@ public final class ContentSuggestionsManager { try { mService.suggestContentSelections( - request, new SelectionsCallbackWrapper(callback, callbackExecutor)); + mUser, request, new SelectionsCallbackWrapper(callback, callbackExecutor)); } catch (RemoteException e) { e.rethrowFromSystemServer(); } @@ -123,7 +137,7 @@ public final class ContentSuggestionsManager { try { mService.classifyContentSelections( - request, new ClassificationsCallbackWrapper(callback, callbackExecutor)); + mUser, request, new ClassificationsCallbackWrapper(callback, callbackExecutor)); } catch (RemoteException e) { e.rethrowFromSystemServer(); } @@ -135,17 +149,39 @@ public final class ContentSuggestionsManager { * @param requestId the id for the associated interaction * @param interaction to report back to the system content suggestions service. */ - public void notifyInteraction(@NonNull String requestId, @NonNull Bundle interaction) { + public void notifyInteraction( + @NonNull String requestId, @NonNull Bundle interaction) { if (mService == null) { Log.e(TAG, "notifyInteraction called, but no ContentSuggestionsManager configured"); return; } try { - mService.notifyInteraction(requestId, interaction); + mService.notifyInteraction(mUser, requestId, interaction); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + } + } + + /** + * Indicates that Content Suggestions is available and enabled for the provided user. That is, + * has an implementation and not disabled through device management. + * + * @return {@code true} if Content Suggestions is enabled and available for the provided user. + */ + public boolean isEnabled() { + if (mService == null) { + return false; + } + + SyncResultReceiver receiver = new SyncResultReceiver(SYNC_CALLS_TIMEOUT_MS); + try { + mService.isEnabled(mUser, receiver); + return receiver.getIntResult() != 0; } catch (RemoteException e) { e.rethrowFromSystemServer(); } + return false; } /** diff --git a/core/java/android/app/contentsuggestions/IContentSuggestionsManager.aidl b/core/java/android/app/contentsuggestions/IContentSuggestionsManager.aidl index 24f5ad866635..b18a758ff69e 100644 --- a/core/java/android/app/contentsuggestions/IContentSuggestionsManager.aidl +++ b/core/java/android/app/contentsuggestions/IContentSuggestionsManager.aidl @@ -21,17 +21,23 @@ import android.app.contentsuggestions.ISelectionsCallback; import android.app.contentsuggestions.ClassificationsRequest; import android.app.contentsuggestions.SelectionsRequest; import android.os.Bundle; +import android.os.UserHandle; +import com.android.internal.os.IResultReceiver; /** @hide */ oneway interface IContentSuggestionsManager { void provideContextImage( + int userId, int taskId, in Bundle imageContextRequestExtras); void suggestContentSelections( + int userId, in SelectionsRequest request, in ISelectionsCallback callback); void classifyContentSelections( + int userId, in ClassificationsRequest request, in IClassificationsCallback callback); - void notifyInteraction(in String requestId, in Bundle interaction); + void notifyInteraction(int userId, in String requestId, in Bundle interaction); + void isEnabled(int userId, in IResultReceiver receiver); } diff --git a/services/contentsuggestions/java/com/android/server/contentsuggestions/ContentSuggestionsManagerService.java b/services/contentsuggestions/java/com/android/server/contentsuggestions/ContentSuggestionsManagerService.java index 69b4672213c4..55a062187bb1 100644 --- a/services/contentsuggestions/java/com/android/server/contentsuggestions/ContentSuggestionsManagerService.java +++ b/services/contentsuggestions/java/com/android/server/contentsuggestions/ContentSuggestionsManagerService.java @@ -35,6 +35,7 @@ import android.os.UserHandle; import android.os.UserManager; import android.util.Slog; +import com.android.internal.os.IResultReceiver; import com.android.server.LocalServices; import com.android.server.infra.AbstractMasterSystemService; import com.android.server.infra.FrameworkResourcesServiceNameResolver; @@ -114,13 +115,14 @@ public class ContentSuggestionsManagerService extends private class ContentSuggestionsManagerStub extends IContentSuggestionsManager.Stub { @Override - public void provideContextImage(int taskId, @NonNull Bundle imageContextRequestExtras) { + public void provideContextImage( + int userId, + int taskId, + @NonNull Bundle imageContextRequestExtras) { if (imageContextRequestExtras == null) { throw new IllegalArgumentException("Expected non-null imageContextRequestExtras"); } - - final int userId = UserHandle.getCallingUserId(); - enforceCallerIsRecents(userId, "provideContextImage"); + enforceCallerIsRecents(UserHandle.getCallingUserId(), "provideContextImage"); synchronized (mLock) { final ContentSuggestionsPerUserService service = getServiceForUserLocked(userId); @@ -136,10 +138,10 @@ public class ContentSuggestionsManagerService extends @Override public void suggestContentSelections( + int userId, @NonNull SelectionsRequest selectionsRequest, @NonNull ISelectionsCallback selectionsCallback) { - final int userId = UserHandle.getCallingUserId(); - enforceCallerIsRecents(userId, "suggestContentSelections"); + enforceCallerIsRecents(UserHandle.getCallingUserId(), "suggestContentSelections"); synchronized (mLock) { final ContentSuggestionsPerUserService service = getServiceForUserLocked(userId); @@ -155,10 +157,10 @@ public class ContentSuggestionsManagerService extends @Override public void classifyContentSelections( + int userId, @NonNull ClassificationsRequest classificationsRequest, @NonNull IClassificationsCallback callback) { - final int userId = UserHandle.getCallingUserId(); - enforceCallerIsRecents(userId, "classifyContentSelections"); + enforceCallerIsRecents(UserHandle.getCallingUserId(), "classifyContentSelections"); synchronized (mLock) { final ContentSuggestionsPerUserService service = getServiceForUserLocked(userId); @@ -173,9 +175,9 @@ public class ContentSuggestionsManagerService extends } @Override - public void notifyInteraction(@NonNull String requestId, @NonNull Bundle bundle) { - final int userId = UserHandle.getCallingUserId(); - enforceCallerIsRecents(userId, "notifyInteraction"); + public void notifyInteraction( + int userId, @NonNull String requestId, @NonNull Bundle bundle) { + enforceCallerIsRecents(UserHandle.getCallingUserId(), "notifyInteraction"); synchronized (mLock) { final ContentSuggestionsPerUserService service = getServiceForUserLocked(userId); @@ -189,6 +191,18 @@ public class ContentSuggestionsManagerService extends } } + @Override + public void isEnabled(int userId, @NonNull IResultReceiver receiver) + throws RemoteException { + enforceCallerIsRecents(UserHandle.getCallingUserId(), "isEnabled"); + + boolean isDisabled; + synchronized (mLock) { + isDisabled = isDisabledLocked(userId); + } + receiver.send(isDisabled ? 0 : 1, null); + } + public void onShellCommand(@Nullable FileDescriptor in, @Nullable FileDescriptor out, @Nullable FileDescriptor err, @NonNull String[] args, @Nullable ShellCallback callback, |