diff --git a/api/system-current.txt b/api/system-current.txt index a9f977ecbbb49..f538061b4202b 100755 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -1174,6 +1174,7 @@ package android.app.contentsuggestions { 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(@NonNull android.graphics.Bitmap, @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/contentsuggestions/ContentSuggestionsManager.java b/core/java/android/app/contentsuggestions/ContentSuggestionsManager.java index 1e6ab41361872..bea1bd6e70d6c 100644 --- a/core/java/android/app/contentsuggestions/ContentSuggestionsManager.java +++ b/core/java/android/app/contentsuggestions/ContentSuggestionsManager.java @@ -21,6 +21,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; import android.annotation.UserIdInt; +import android.graphics.Bitmap; import android.os.Binder; import android.os.Bundle; import android.os.RemoteException; @@ -76,6 +77,28 @@ public final class ContentSuggestionsManager { mUser = userId; } + /** + * Hints to the system that a new context image using the provided bitmap should be sent to + * the system content suggestions service. + * + * @param bitmap the new context image + * @param imageContextRequestExtras sent with request to provide implementation specific + * extra information. + */ + public void provideContextImage( + @NonNull Bitmap bitmap, @NonNull Bundle imageContextRequestExtras) { + if (mService == null) { + Log.e(TAG, "provideContextImage called, but no ContentSuggestionsManager configured"); + return; + } + + try { + mService.provideContextBitmap(mUser, bitmap, imageContextRequestExtras); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + } + } + /** * Hints to the system that a new context image for the provided task should be sent to the * system content suggestions service. diff --git a/core/java/android/app/contentsuggestions/IContentSuggestionsManager.aidl b/core/java/android/app/contentsuggestions/IContentSuggestionsManager.aidl index b18a758ff69e3..8e6338babf223 100644 --- a/core/java/android/app/contentsuggestions/IContentSuggestionsManager.aidl +++ b/core/java/android/app/contentsuggestions/IContentSuggestionsManager.aidl @@ -20,6 +20,7 @@ import android.app.contentsuggestions.IClassificationsCallback; import android.app.contentsuggestions.ISelectionsCallback; import android.app.contentsuggestions.ClassificationsRequest; import android.app.contentsuggestions.SelectionsRequest; +import android.graphics.Bitmap; import android.os.Bundle; import android.os.UserHandle; import com.android.internal.os.IResultReceiver; @@ -30,6 +31,10 @@ oneway interface IContentSuggestionsManager { int userId, int taskId, in Bundle imageContextRequestExtras); + void provideContextBitmap( + int userId, + in Bitmap bitmap, + in Bundle imageContextRequestExtras); void suggestContentSelections( int userId, in SelectionsRequest request, diff --git a/services/contentsuggestions/java/com/android/server/contentsuggestions/ContentSuggestionsManagerService.java b/services/contentsuggestions/java/com/android/server/contentsuggestions/ContentSuggestionsManagerService.java index 9cdb58d8c0191..b54ec4ea94412 100644 --- a/services/contentsuggestions/java/com/android/server/contentsuggestions/ContentSuggestionsManagerService.java +++ b/services/contentsuggestions/java/com/android/server/contentsuggestions/ContentSuggestionsManagerService.java @@ -27,6 +27,7 @@ import android.app.contentsuggestions.IContentSuggestionsManager; import android.app.contentsuggestions.ISelectionsCallback; import android.app.contentsuggestions.SelectionsRequest; import android.content.Context; +import android.graphics.Bitmap; import android.os.Binder; import android.os.Bundle; import android.os.RemoteException; @@ -61,6 +62,10 @@ public class ContentSuggestionsManagerService extends private static final boolean VERBOSE = false; // TODO: make dynamic private static final int MAX_TEMP_SERVICE_DURATION_MS = 1_000 * 60 * 2; // 2 minutes + /** + * Key into the extras Bundle passed to {@link #provideContextImage(int, Bundle)}. + */ + private static final String EXTRA_BITMAP = "android.contentsuggestions.extra.BITMAP"; private ActivityTaskManagerInternal mActivityTaskManagerInternal; @@ -110,6 +115,33 @@ public class ContentSuggestionsManagerService extends } private class ContentSuggestionsManagerStub extends IContentSuggestionsManager.Stub { + @Override + public void provideContextBitmap( + int userId, + @NonNull Bitmap bitmap, + @NonNull Bundle imageContextRequestExtras) { + if (bitmap == null) { + throw new IllegalArgumentException("Expected non-null bitmap"); + } + if (imageContextRequestExtras == null) { + throw new IllegalArgumentException("Expected non-null imageContextRequestExtras"); + } + enforceCaller(UserHandle.getCallingUserId(), "provideContextBitmap"); + + synchronized (mLock) { + final ContentSuggestionsPerUserService service = getServiceForUserLocked(userId); + if (service != null) { + // TODO(b/147324195): Temporarily pass bitmap until we change the service API. + imageContextRequestExtras.putParcelable(EXTRA_BITMAP, bitmap); + service.provideContextImageLocked(/* taskId = */ -1, imageContextRequestExtras); + } else { + if (VERBOSE) { + Slog.v(TAG, "provideContextImageLocked: no service for " + userId); + } + } + } + } + @Override public void provideContextImage( int userId,