diff options
23 files changed, 314 insertions, 639 deletions
diff --git a/packages/NeuralNetworks/framework/Android.bp b/packages/NeuralNetworks/framework/Android.bp index 6f45daae0802..af071ba48b1f 100644 --- a/packages/NeuralNetworks/framework/Android.bp +++ b/packages/NeuralNetworks/framework/Android.bp @@ -19,10 +19,21 @@ package { filegroup { name: "framework-ondeviceintelligence-sources", srcs: [ - "java/**/*.aidl", - "java/**/*.java", + "module/java/**/*.aidl", + "module/java/**/*.java", + ], + visibility: [ + "//frameworks/base:__subpackages__", + "//packages/modules/NeuralNetworks:__subpackages__", + ], +} + +filegroup { + name: "framework-ondeviceintelligence-sources-platform", + srcs: [ + "platform/java/**/*.aidl", + "platform/java/**/*.java", ], - path: "java", visibility: [ "//frameworks/base:__subpackages__", "//packages/modules/NeuralNetworks:__subpackages__", diff --git a/packages/NeuralNetworks/framework/platform/java/android/app/ondeviceintelligence/Feature.aidl b/packages/NeuralNetworks/framework/platform/java/android/app/ondeviceintelligence/Feature.aidl index 47cfb4a60dc4..18494d754674 100644 --- a/packages/NeuralNetworks/framework/platform/java/android/app/ondeviceintelligence/Feature.aidl +++ b/packages/NeuralNetworks/framework/platform/java/android/app/ondeviceintelligence/Feature.aidl @@ -19,4 +19,4 @@ package android.app.ondeviceintelligence; /** * @hide */ -@JavaOnlyStableParcelable parcelable Feature; +parcelable Feature; diff --git a/packages/NeuralNetworks/framework/platform/java/android/app/ondeviceintelligence/Feature.java b/packages/NeuralNetworks/framework/platform/java/android/app/ondeviceintelligence/Feature.java index 88f4de2989e4..bcc56073e51c 100644 --- a/packages/NeuralNetworks/framework/platform/java/android/app/ondeviceintelligence/Feature.java +++ b/packages/NeuralNetworks/framework/platform/java/android/app/ondeviceintelligence/Feature.java @@ -26,8 +26,6 @@ import android.os.Parcel; import android.os.Parcelable; import android.os.PersistableBundle; -import java.util.Objects; - /** * Represents a typical feature associated with on-device intelligence. * @@ -58,8 +56,9 @@ public final class Feature implements Parcelable { this.mModelName = modelName; this.mType = type; this.mVariant = variant; - this.mFeatureParams = Objects.requireNonNull(featureParams, - "featureParams should be non-null."); + this.mFeatureParams = featureParams; + com.android.internal.util.AnnotationValidations.validate( + NonNull.class, null, mFeatureParams); } /** Returns the unique and immutable identifier of this feature. */ @@ -168,6 +167,8 @@ public final class Feature implements Parcelable { this.mType = type; this.mVariant = variant; this.mFeatureParams = featureParams; + com.android.internal.util.AnnotationValidations.validate( + NonNull.class, null, mFeatureParams); } public static final @NonNull Parcelable.Creator<Feature> CREATOR @@ -199,7 +200,6 @@ public final class Feature implements Parcelable { /** * Provides a builder instance to create a feature for given id. - * * @param id the unique identifier for the feature. */ public Builder(int id) { diff --git a/packages/NeuralNetworks/framework/platform/java/android/app/ondeviceintelligence/FeatureDetails.aidl b/packages/NeuralNetworks/framework/platform/java/android/app/ondeviceintelligence/FeatureDetails.aidl index c5b3532796cd..0589bf8bacb9 100644 --- a/packages/NeuralNetworks/framework/platform/java/android/app/ondeviceintelligence/FeatureDetails.aidl +++ b/packages/NeuralNetworks/framework/platform/java/android/app/ondeviceintelligence/FeatureDetails.aidl @@ -19,4 +19,4 @@ package android.app.ondeviceintelligence; /** * @hide */ -@JavaOnlyStableParcelable parcelable FeatureDetails; +parcelable FeatureDetails; diff --git a/packages/NeuralNetworks/framework/platform/java/android/app/ondeviceintelligence/FeatureDetails.java b/packages/NeuralNetworks/framework/platform/java/android/app/ondeviceintelligence/FeatureDetails.java index 063cfb8c321e..0ee0cc34c512 100644 --- a/packages/NeuralNetworks/framework/platform/java/android/app/ondeviceintelligence/FeatureDetails.java +++ b/packages/NeuralNetworks/framework/platform/java/android/app/ondeviceintelligence/FeatureDetails.java @@ -30,7 +30,6 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.text.MessageFormat; -import java.util.Objects; /** * Represents a status of a requested {@link Feature}. @@ -79,12 +78,18 @@ public final class FeatureDetails implements Parcelable { @Status int featureStatus, @NonNull PersistableBundle featureDetailParams) { this.mFeatureStatus = featureStatus; - this.mFeatureDetailParams = Objects.requireNonNull(featureDetailParams); + com.android.internal.util.AnnotationValidations.validate( + Status.class, null, mFeatureStatus); + this.mFeatureDetailParams = featureDetailParams; + com.android.internal.util.AnnotationValidations.validate( + NonNull.class, null, mFeatureDetailParams); } public FeatureDetails( @Status int featureStatus) { this.mFeatureStatus = featureStatus; + com.android.internal.util.AnnotationValidations.validate( + Status.class, null, mFeatureStatus); this.mFeatureDetailParams = new PersistableBundle(); } @@ -149,7 +154,11 @@ public final class FeatureDetails implements Parcelable { PersistableBundle.CREATOR); this.mFeatureStatus = status; + com.android.internal.util.AnnotationValidations.validate( + Status.class, null, mFeatureStatus); this.mFeatureDetailParams = persistableBundle; + com.android.internal.util.AnnotationValidations.validate( + NonNull.class, null, mFeatureDetailParams); } diff --git a/packages/NeuralNetworks/framework/platform/java/android/app/ondeviceintelligence/IOnDeviceIntelligenceManager.aidl b/packages/NeuralNetworks/framework/platform/java/android/app/ondeviceintelligence/IOnDeviceIntelligenceManager.aidl index fac5ec6064f8..1977a3923578 100644 --- a/packages/NeuralNetworks/framework/platform/java/android/app/ondeviceintelligence/IOnDeviceIntelligenceManager.aidl +++ b/packages/NeuralNetworks/framework/platform/java/android/app/ondeviceintelligence/IOnDeviceIntelligenceManager.aidl @@ -16,8 +16,8 @@ package android.app.ondeviceintelligence; - import com.android.modules.utils.AndroidFuture; - import android.app.ondeviceintelligence.ICancellationSignal; + import com.android.internal.infra.AndroidFuture; + import android.os.ICancellationSignal; import android.os.ParcelFileDescriptor; import android.os.PersistableBundle; import android.os.RemoteCallback; diff --git a/packages/NeuralNetworks/framework/platform/java/android/app/ondeviceintelligence/InferenceInfo.aidl b/packages/NeuralNetworks/framework/platform/java/android/app/ondeviceintelligence/InferenceInfo.aidl index 6f6325408979..6d70fc4577a2 100644 --- a/packages/NeuralNetworks/framework/platform/java/android/app/ondeviceintelligence/InferenceInfo.aidl +++ b/packages/NeuralNetworks/framework/platform/java/android/app/ondeviceintelligence/InferenceInfo.aidl @@ -19,4 +19,4 @@ package android.app.ondeviceintelligence; /** * @hide */ -@JavaOnlyStableParcelable parcelable InferenceInfo; +parcelable InferenceInfo; diff --git a/packages/NeuralNetworks/framework/platform/java/android/app/ondeviceintelligence/OnDeviceIntelligenceManager.java b/packages/NeuralNetworks/framework/platform/java/android/app/ondeviceintelligence/OnDeviceIntelligenceManager.java index dc0665a5cea7..78cf1d7a611b 100644 --- a/packages/NeuralNetworks/framework/platform/java/android/app/ondeviceintelligence/OnDeviceIntelligenceManager.java +++ b/packages/NeuralNetworks/framework/platform/java/android/app/ondeviceintelligence/OnDeviceIntelligenceManager.java @@ -29,12 +29,13 @@ import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.SystemService; -import android.app.ondeviceintelligence.utils.BinderUtils; import android.content.Context; import android.graphics.Bitmap; +import android.os.Binder; import android.os.Bundle; import android.os.CancellationSignal; import android.os.IBinder; +import android.os.ICancellationSignal; import android.os.OutcomeReceiver; import android.os.PersistableBundle; import android.os.RemoteCallback; @@ -42,7 +43,7 @@ import android.os.RemoteException; import android.system.OsConstants; import android.util.Log; -import com.android.modules.utils.AndroidFuture; +import com.android.internal.infra.AndroidFuture; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; @@ -78,39 +79,10 @@ public final class OnDeviceIntelligenceManager { public static final String AUGMENT_REQUEST_CONTENT_BUNDLE_KEY = "AugmentRequestContentBundleKey"; - /** - * Timeout to be used for unbinding to the configured remote {@link - * android.service.ondeviceintelligence.OnDeviceIntelligenceService} if there are no requests in - * the queue. A value of -1 represents to never unbind. - * - * @hide - */ - public static final String ON_DEVICE_INTELLIGENCE_UNBIND_TIMEOUT_MS = - "on_device_intelligence_unbind_timeout_ms"; - - /** - * Timeout that represents maximum idle time before which a callback should be populated. - * - * @hide - */ - public static final String ON_DEVICE_INTELLIGENCE_IDLE_TIMEOUT_MS = - "on_device_intelligence_idle_timeout_ms"; - - /** - * Timeout to be used for unbinding to the configured remote {@link - * android.service.ondeviceintelligence.OnDeviceSandboxedInferenceService} if there are no - * requests in the queue. A value of -1 represents to never unbind. - * - * @hide - */ - public static final String ON_DEVICE_INFERENCE_UNBIND_TIMEOUT_MS = - "on_device_inference_unbind_timeout_ms"; - private static final String TAG = "OnDeviceIntelligence"; private final Context mContext; private final IOnDeviceIntelligenceManager mService; - /** * @hide */ @@ -132,11 +104,11 @@ public final class OnDeviceIntelligenceManager { try { RemoteCallback callback = new RemoteCallback(result -> { if (result == null) { - BinderUtils.withCleanCallingIdentity( + Binder.withCleanCallingIdentity( () -> callbackExecutor.execute(() -> versionConsumer.accept(0))); } long version = result.getLong(API_VERSION_BUNDLE_KEY); - BinderUtils.withCleanCallingIdentity( + Binder.withCleanCallingIdentity( () -> callbackExecutor.execute(() -> versionConsumer.accept(version))); }); mService.getVersion(callback); @@ -178,14 +150,14 @@ public final class OnDeviceIntelligenceManager { new IFeatureCallback.Stub() { @Override public void onSuccess(Feature result) { - BinderUtils.withCleanCallingIdentity(() -> callbackExecutor.execute( + Binder.withCleanCallingIdentity(() -> callbackExecutor.execute( () -> featureReceiver.onResult(result))); } @Override public void onFailure(int errorCode, String errorMessage, PersistableBundle errorParams) { - BinderUtils.withCleanCallingIdentity(() -> callbackExecutor.execute( + Binder.withCleanCallingIdentity(() -> callbackExecutor.execute( () -> featureReceiver.onError( new OnDeviceIntelligenceException( errorCode, errorMessage, errorParams)))); @@ -212,14 +184,14 @@ public final class OnDeviceIntelligenceManager { new IListFeaturesCallback.Stub() { @Override public void onSuccess(List<Feature> result) { - BinderUtils.withCleanCallingIdentity(() -> callbackExecutor.execute( + Binder.withCleanCallingIdentity(() -> callbackExecutor.execute( () -> featureListReceiver.onResult(result))); } @Override public void onFailure(int errorCode, String errorMessage, PersistableBundle errorParams) { - BinderUtils.withCleanCallingIdentity(() -> callbackExecutor.execute( + Binder.withCleanCallingIdentity(() -> callbackExecutor.execute( () -> featureListReceiver.onError( new OnDeviceIntelligenceException( errorCode, errorMessage, errorParams)))); @@ -250,14 +222,14 @@ public final class OnDeviceIntelligenceManager { @Override public void onSuccess(FeatureDetails result) { - BinderUtils.withCleanCallingIdentity(() -> callbackExecutor.execute( + Binder.withCleanCallingIdentity(() -> callbackExecutor.execute( () -> featureDetailsReceiver.onResult(result))); } @Override public void onFailure(int errorCode, String errorMessage, PersistableBundle errorParams) { - BinderUtils.withCleanCallingIdentity(() -> callbackExecutor.execute( + Binder.withCleanCallingIdentity(() -> callbackExecutor.execute( () -> featureDetailsReceiver.onError( new OnDeviceIntelligenceException(errorCode, errorMessage, errorParams)))); @@ -295,27 +267,27 @@ public final class OnDeviceIntelligenceManager { @Override public void onDownloadStarted(long bytesToDownload) { - BinderUtils.withCleanCallingIdentity(() -> callbackExecutor.execute( + Binder.withCleanCallingIdentity(() -> callbackExecutor.execute( () -> callback.onDownloadStarted(bytesToDownload))); } @Override public void onDownloadProgress(long bytesDownloaded) { - BinderUtils.withCleanCallingIdentity(() -> callbackExecutor.execute( + Binder.withCleanCallingIdentity(() -> callbackExecutor.execute( () -> callback.onDownloadProgress(bytesDownloaded))); } @Override public void onDownloadFailed(int failureStatus, String errorMessage, PersistableBundle errorParams) { - BinderUtils.withCleanCallingIdentity(() -> callbackExecutor.execute( + Binder.withCleanCallingIdentity(() -> callbackExecutor.execute( () -> callback.onDownloadFailed(failureStatus, errorMessage, errorParams))); } @Override public void onDownloadCompleted(PersistableBundle downloadParams) { - BinderUtils.withCleanCallingIdentity(() -> callbackExecutor.execute( + Binder.withCleanCallingIdentity(() -> callbackExecutor.execute( () -> callback.onDownloadCompleted(downloadParams))); } }; @@ -352,14 +324,14 @@ public final class OnDeviceIntelligenceManager { ITokenInfoCallback callback = new ITokenInfoCallback.Stub() { @Override public void onSuccess(TokenInfo tokenInfo) { - BinderUtils.withCleanCallingIdentity(() -> callbackExecutor.execute( + Binder.withCleanCallingIdentity(() -> callbackExecutor.execute( () -> outcomeReceiver.onResult(tokenInfo))); } @Override public void onFailure(int errorCode, String errorMessage, PersistableBundle errorParams) { - BinderUtils.withCleanCallingIdentity(() -> callbackExecutor.execute( + Binder.withCleanCallingIdentity(() -> callbackExecutor.execute( () -> outcomeReceiver.onError( new OnDeviceIntelligenceException( errorCode, errorMessage, errorParams)))); @@ -404,7 +376,7 @@ public final class OnDeviceIntelligenceManager { IResponseCallback callback = new IResponseCallback.Stub() { @Override public void onSuccess(@InferenceParams Bundle result) { - BinderUtils.withCleanCallingIdentity(() -> { + Binder.withCleanCallingIdentity(() -> { callbackExecutor.execute(() -> processingCallback.onResult(result)); }); } @@ -412,7 +384,7 @@ public final class OnDeviceIntelligenceManager { @Override public void onFailure(int errorCode, String errorMessage, PersistableBundle errorParams) { - BinderUtils.withCleanCallingIdentity(() -> callbackExecutor.execute( + Binder.withCleanCallingIdentity(() -> callbackExecutor.execute( () -> processingCallback.onError( new OnDeviceIntelligenceException( errorCode, errorMessage, errorParams)))); @@ -421,7 +393,7 @@ public final class OnDeviceIntelligenceManager { @Override public void onDataAugmentRequest(@NonNull @InferenceParams Bundle request, @NonNull RemoteCallback contentCallback) { - BinderUtils.withCleanCallingIdentity(() -> callbackExecutor.execute( + Binder.withCleanCallingIdentity(() -> callbackExecutor.execute( () -> processingCallback.onDataAugmentRequest(request, result -> { Bundle bundle = new Bundle(); bundle.putParcelable(AUGMENT_REQUEST_CONTENT_BUNDLE_KEY, result); @@ -474,7 +446,7 @@ public final class OnDeviceIntelligenceManager { IStreamingResponseCallback callback = new IStreamingResponseCallback.Stub() { @Override public void onNewContent(@InferenceParams Bundle result) { - BinderUtils.withCleanCallingIdentity(() -> { + Binder.withCleanCallingIdentity(() -> { callbackExecutor.execute( () -> streamingProcessingCallback.onPartialResult(result)); }); @@ -482,7 +454,7 @@ public final class OnDeviceIntelligenceManager { @Override public void onSuccess(@InferenceParams Bundle result) { - BinderUtils.withCleanCallingIdentity(() -> { + Binder.withCleanCallingIdentity(() -> { callbackExecutor.execute( () -> streamingProcessingCallback.onResult(result)); }); @@ -491,7 +463,7 @@ public final class OnDeviceIntelligenceManager { @Override public void onFailure(int errorCode, String errorMessage, PersistableBundle errorParams) { - BinderUtils.withCleanCallingIdentity(() -> { + Binder.withCleanCallingIdentity(() -> { callbackExecutor.execute( () -> streamingProcessingCallback.onError( new OnDeviceIntelligenceException( @@ -503,7 +475,7 @@ public final class OnDeviceIntelligenceManager { @Override public void onDataAugmentRequest(@NonNull @InferenceParams Bundle content, @NonNull RemoteCallback contentCallback) { - BinderUtils.withCleanCallingIdentity(() -> callbackExecutor.execute( + Binder.withCleanCallingIdentity(() -> callbackExecutor.execute( () -> streamingProcessingCallback.onDataAugmentRequest(content, contentResponse -> { Bundle bundle = new Bundle(); @@ -641,17 +613,8 @@ public final class OnDeviceIntelligenceManager { if (error != null || cancellationTransport == null) { Log.e(TAG, "Unable to receive the remote cancellation signal.", error); } else { - ICancellationSignal remoteCancellationSignal = - ICancellationSignal.Stub.asInterface(cancellationTransport); - cancellationSignal.setOnCancelListener( - () -> { - try { - remoteCancellationSignal.cancel(); - } catch (RemoteException e) { - Log.w(TAG, "Unable to propagate cancellation signal.", - e); - } - }); + cancellationSignal.setRemote( + ICancellationSignal.Stub.asInterface(cancellationTransport)); } }, callbackExecutor); return cancellationFuture; @@ -674,4 +637,6 @@ public final class OnDeviceIntelligenceManager { }, executor); return processingSignalFuture; } -}
\ No newline at end of file + + +} diff --git a/packages/NeuralNetworks/framework/platform/java/android/app/ondeviceintelligence/TokenInfo.aidl b/packages/NeuralNetworks/framework/platform/java/android/app/ondeviceintelligence/TokenInfo.aidl index 599b337fd20f..2c19c1eb246c 100644 --- a/packages/NeuralNetworks/framework/platform/java/android/app/ondeviceintelligence/TokenInfo.aidl +++ b/packages/NeuralNetworks/framework/platform/java/android/app/ondeviceintelligence/TokenInfo.aidl @@ -19,4 +19,4 @@ package android.app.ondeviceintelligence; /** * @hide */ -@JavaOnlyStableParcelable parcelable TokenInfo; +parcelable TokenInfo; diff --git a/packages/NeuralNetworks/framework/platform/java/android/service/ondeviceintelligence/IOnDeviceIntelligenceService.aidl b/packages/NeuralNetworks/framework/platform/java/android/service/ondeviceintelligence/IOnDeviceIntelligenceService.aidl index cba18c1ef36d..45c43502d6de 100644 --- a/packages/NeuralNetworks/framework/platform/java/android/service/ondeviceintelligence/IOnDeviceIntelligenceService.aidl +++ b/packages/NeuralNetworks/framework/platform/java/android/service/ondeviceintelligence/IOnDeviceIntelligenceService.aidl @@ -18,14 +18,14 @@ package android.service.ondeviceintelligence; import android.os.PersistableBundle; import android.os.ParcelFileDescriptor; -import android.app.ondeviceintelligence.ICancellationSignal; +import android.os.ICancellationSignal; import android.os.RemoteCallback; import android.app.ondeviceintelligence.IDownloadCallback; import android.app.ondeviceintelligence.Feature; import android.app.ondeviceintelligence.IFeatureCallback; import android.app.ondeviceintelligence.IListFeaturesCallback; import android.app.ondeviceintelligence.IFeatureDetailsCallback; -import com.android.modules.utils.AndroidFuture; +import com.android.internal.infra.AndroidFuture; import android.service.ondeviceintelligence.IRemoteProcessingService; diff --git a/packages/NeuralNetworks/framework/platform/java/android/service/ondeviceintelligence/IOnDeviceSandboxedInferenceService.aidl b/packages/NeuralNetworks/framework/platform/java/android/service/ondeviceintelligence/IOnDeviceSandboxedInferenceService.aidl index 504fdd9b17f9..1af3b0f374f1 100644 --- a/packages/NeuralNetworks/framework/platform/java/android/service/ondeviceintelligence/IOnDeviceSandboxedInferenceService.aidl +++ b/packages/NeuralNetworks/framework/platform/java/android/service/ondeviceintelligence/IOnDeviceSandboxedInferenceService.aidl @@ -21,11 +21,11 @@ import android.app.ondeviceintelligence.IResponseCallback; import android.app.ondeviceintelligence.ITokenInfoCallback; import android.app.ondeviceintelligence.IProcessingSignal; import android.app.ondeviceintelligence.Feature; -import android.app.ondeviceintelligence.IRemoteCallback; -import android.app.ondeviceintelligence.ICancellationSignal; +import android.os.IRemoteCallback; +import android.os.ICancellationSignal; import android.os.PersistableBundle; import android.os.Bundle; -import com.android.modules.utils.AndroidFuture; +import com.android.internal.infra.AndroidFuture; import android.service.ondeviceintelligence.IRemoteStorageService; import android.service.ondeviceintelligence.IProcessingUpdateStatusCallback; diff --git a/packages/NeuralNetworks/framework/platform/java/android/service/ondeviceintelligence/IRemoteStorageService.aidl b/packages/NeuralNetworks/framework/platform/java/android/service/ondeviceintelligence/IRemoteStorageService.aidl index 253df890b198..a6f49e17d80e 100644 --- a/packages/NeuralNetworks/framework/platform/java/android/service/ondeviceintelligence/IRemoteStorageService.aidl +++ b/packages/NeuralNetworks/framework/platform/java/android/service/ondeviceintelligence/IRemoteStorageService.aidl @@ -20,7 +20,7 @@ import android.app.ondeviceintelligence.Feature; import android.os.ParcelFileDescriptor; import android.os.RemoteCallback; -import com.android.modules.utils.AndroidFuture; +import com.android.internal.infra.AndroidFuture; /** * Interface for a concrete implementation to provide access to storage read access diff --git a/packages/NeuralNetworks/framework/platform/java/android/service/ondeviceintelligence/OnDeviceIntelligenceService.java b/packages/NeuralNetworks/framework/platform/java/android/service/ondeviceintelligence/OnDeviceIntelligenceService.java index 6907e2bdf2b3..618d2a096916 100644 --- a/packages/NeuralNetworks/framework/platform/java/android/service/ondeviceintelligence/OnDeviceIntelligenceService.java +++ b/packages/NeuralNetworks/framework/platform/java/android/service/ondeviceintelligence/OnDeviceIntelligenceService.java @@ -18,6 +18,8 @@ package android.service.ondeviceintelligence; import static android.app.ondeviceintelligence.flags.Flags.FLAG_ENABLE_ON_DEVICE_INTELLIGENCE; +import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage; + import android.annotation.CallSuper; import android.annotation.CallbackExecutor; import android.annotation.FlaggedApi; @@ -29,7 +31,6 @@ import android.app.Service; import android.app.ondeviceintelligence.DownloadCallback; import android.app.ondeviceintelligence.Feature; import android.app.ondeviceintelligence.FeatureDetails; -import android.app.ondeviceintelligence.ICancellationSignal; import android.app.ondeviceintelligence.IDownloadCallback; import android.app.ondeviceintelligence.IFeatureCallback; import android.app.ondeviceintelligence.IFeatureDetailsCallback; @@ -37,14 +38,14 @@ import android.app.ondeviceintelligence.IListFeaturesCallback; import android.app.ondeviceintelligence.OnDeviceIntelligenceException; import android.app.ondeviceintelligence.OnDeviceIntelligenceManager; import android.app.ondeviceintelligence.OnDeviceIntelligenceManager.StateParams; -import android.app.ondeviceintelligence.utils.BinderUtils; import android.content.Intent; +import android.os.Binder; import android.os.Bundle; import android.os.CancellationSignal; import android.os.Handler; import android.os.IBinder; +import android.os.ICancellationSignal; import android.os.Looper; -import android.os.Message; import android.os.OutcomeReceiver; import android.os.ParcelFileDescriptor; import android.os.PersistableBundle; @@ -53,11 +54,10 @@ import android.os.RemoteException; import android.util.Log; import android.util.Slog; -import com.android.modules.utils.AndroidFuture; +import com.android.internal.infra.AndroidFuture; import java.io.File; import java.io.FileNotFoundException; -import java.io.IOException; import java.util.Collection; import java.util.List; import java.util.Map; @@ -91,18 +91,6 @@ import java.util.function.LongConsumer; @SystemApi @FlaggedApi(FLAG_ENABLE_ON_DEVICE_INTELLIGENCE) public abstract class OnDeviceIntelligenceService extends Service { - private static final int MSG_ON_READY = 1; - private static final int MSG_GET_VERSION = 2; - private static final int MSG_LIST_FEATURES = 3; - private static final int MSG_GET_FEATURE = 4; - private static final int MSG_GET_FEATURE_DETAILS = 5; - private static final int MSG_DOWNLOAD_FEATURE = 6; - private static final int MSG_GET_READ_ONLY_FILE_DESCRIPTOR = 7; - private static final int MSG_GET_READ_ONLY_FEATURE_FILE_DESCRIPTOR_MAP = 8; - private static final int MSG_REGISTER_REMOTE_SERVICES = 9; - private static final int MSG_INFERENCE_SERVICE_CONNECTED = 10; - private static final int MSG_INFERENCE_SERVICE_DISCONNECTED = 11; - private static final String TAG = OnDeviceIntelligenceService.class.getSimpleName(); private volatile IRemoteProcessingService mRemoteProcessingService; @@ -112,71 +100,19 @@ public abstract class OnDeviceIntelligenceService extends Service { @Override public void onCreate() { super.onCreate(); - mHandler = new Handler(Looper.getMainLooper()) { - @Override - public void handleMessage(@NonNull Message msg) { - switch (msg.what) { - case MSG_ON_READY: - OnDeviceIntelligenceService.this.onReady(); - break; - case MSG_GET_VERSION: - OnDeviceIntelligenceService.this.onGetVersion( - (LongConsumer) msg.obj); - break; - case MSG_LIST_FEATURES: - OnDeviceIntelligenceService.this.onListFeatures( - msg.arg1, - (OutcomeReceiver<List<Feature>, OnDeviceIntelligenceException>) msg.obj); - break; - case MSG_GET_FEATURE: - GetFeatureParams params = (GetFeatureParams) msg.obj; - OnDeviceIntelligenceService.this.onGetFeature( - msg.arg1, - msg.arg2, - params.callback); - break; - case MSG_GET_FEATURE_DETAILS: - FeatureDetailsParams detailsParams = (FeatureDetailsParams) msg.obj; - OnDeviceIntelligenceService.this.onGetFeatureDetails( - msg.arg1, - detailsParams.feature, - detailsParams.callback); - break; - case MSG_DOWNLOAD_FEATURE: - DownloadParams downloadParams = (DownloadParams) msg.obj; - OnDeviceIntelligenceService.this.onDownloadFeature( - msg.arg1, - downloadParams.feature, - downloadParams.cancellationSignal, - downloadParams.callback); - break; - case MSG_GET_READ_ONLY_FILE_DESCRIPTOR: - FileDescriptorParams fdParams = (FileDescriptorParams) msg.obj; - OnDeviceIntelligenceService.this.onGetReadOnlyFileDescriptor( - fdParams.fileName, - fdParams.future); - break; - case MSG_GET_READ_ONLY_FEATURE_FILE_DESCRIPTOR_MAP: - FeatureFileDescriptorParams ffdParams = - (FeatureFileDescriptorParams) msg.obj; - OnDeviceIntelligenceService.this.onGetReadOnlyFeatureFileDescriptorMap( - ffdParams.feature, - ffdParams.consumer); - break; - case MSG_REGISTER_REMOTE_SERVICES: - mRemoteProcessingService = (IRemoteProcessingService) msg.obj; - break; - case MSG_INFERENCE_SERVICE_CONNECTED: - OnDeviceIntelligenceService.this.onInferenceServiceConnected(); - break; - case MSG_INFERENCE_SERVICE_DISCONNECTED: - OnDeviceIntelligenceService.this.onInferenceServiceDisconnected(); - break; - } - } - }; + mHandler = new Handler(Looper.getMainLooper(), null /* callback */, true /* async */); } + /** + * The {@link Intent} that must be declared as handled by the service. To be supported, the + * service must also require the + * {@link android.Manifest.permission#BIND_ON_DEVICE_INTELLIGENCE_SERVICE} + * permission so that other applications can not abuse it. + */ + @SdkConstant(SdkConstant.SdkConstantType.SERVICE_ACTION) + public static final String SERVICE_INTERFACE = + "android.service.ondeviceintelligence.OnDeviceIntelligenceService"; + /** * @hide @@ -189,37 +125,45 @@ public abstract class OnDeviceIntelligenceService extends Service { /** {@inheritDoc} */ @Override public void ready() { - mHandler.sendEmptyMessage(MSG_ON_READY); + mHandler.executeOrSendMessage( + obtainMessage(OnDeviceIntelligenceService::onReady, + OnDeviceIntelligenceService.this)); } @Override public void getVersion(RemoteCallback remoteCallback) { Objects.requireNonNull(remoteCallback); - Message msg = Message.obtain(mHandler, MSG_GET_VERSION, - (LongConsumer) (l -> { - Bundle b = new Bundle(); - b.putLong(OnDeviceIntelligenceManager.API_VERSION_BUNDLE_KEY, l); - remoteCallback.sendResult(b); - })); - mHandler.sendMessage(msg); + mHandler.executeOrSendMessage( + obtainMessage( + OnDeviceIntelligenceService::onGetVersion, + OnDeviceIntelligenceService.this, l -> { + Bundle b = new Bundle(); + b.putLong( + OnDeviceIntelligenceManager.API_VERSION_BUNDLE_KEY, + l); + remoteCallback.sendResult(b); + })); } @Override public void listFeatures(int callerUid, IListFeaturesCallback listFeaturesCallback) { Objects.requireNonNull(listFeaturesCallback); - Message msg = Message.obtain(mHandler, MSG_LIST_FEATURES, - callerUid, 0, wrapListFeaturesCallback(listFeaturesCallback)); - mHandler.sendMessage(msg); + mHandler.executeOrSendMessage( + obtainMessage( + OnDeviceIntelligenceService::onListFeatures, + OnDeviceIntelligenceService.this, callerUid, + wrapListFeaturesCallback(listFeaturesCallback))); } @Override public void getFeature(int callerUid, int id, IFeatureCallback featureCallback) { Objects.requireNonNull(featureCallback); - Message msg = Message.obtain(mHandler, MSG_GET_FEATURE, - callerUid, id, - new GetFeatureParams(wrapFeatureCallback(featureCallback))); - mHandler.sendMessage(msg); + mHandler.executeOrSendMessage( + obtainMessage( + OnDeviceIntelligenceService::onGetFeature, + OnDeviceIntelligenceService.this, callerUid, + id, wrapFeatureCallback(featureCallback))); } @@ -228,11 +172,11 @@ public abstract class OnDeviceIntelligenceService extends Service { IFeatureDetailsCallback featureDetailsCallback) { Objects.requireNonNull(feature); Objects.requireNonNull(featureDetailsCallback); - Message msg = Message.obtain(mHandler, MSG_GET_FEATURE_DETAILS, - new FeatureDetailsParams(feature, - wrapFeatureDetailsCallback(featureDetailsCallback))); - msg.arg1 = callerUid; - mHandler.sendMessage(msg); + mHandler.executeOrSendMessage( + obtainMessage( + OnDeviceIntelligenceService::onGetFeatureDetails, + OnDeviceIntelligenceService.this, callerUid, + feature, wrapFeatureDetailsCallback(featureDetailsCallback))); } @Override @@ -241,24 +185,18 @@ public abstract class OnDeviceIntelligenceService extends Service { IDownloadCallback downloadCallback) { Objects.requireNonNull(feature); Objects.requireNonNull(downloadCallback); - - CancellationSignal cancellationSignal = new CancellationSignal(); + ICancellationSignal transport = null; if (cancellationSignalFuture != null) { - ICancellationSignal transport = new ICancellationSignal.Stub() { - @Override - public void cancel() { - cancellationSignal.cancel(); - } - }; + transport = CancellationSignal.createTransport(); cancellationSignalFuture.complete(transport); } - - Message msg = Message.obtain(mHandler, MSG_DOWNLOAD_FEATURE, - new DownloadParams(feature, - cancellationSignalFuture != null ? cancellationSignal : null, + mHandler.executeOrSendMessage( + obtainMessage( + OnDeviceIntelligenceService::onDownloadFeature, + OnDeviceIntelligenceService.this, callerUid, + feature, + CancellationSignal.fromTransport(transport), wrapDownloadCallback(downloadCallback))); - msg.arg1 = callerUid; - mHandler.sendMessage(msg); } @Override @@ -266,9 +204,11 @@ public abstract class OnDeviceIntelligenceService extends Service { AndroidFuture<ParcelFileDescriptor> future) { Objects.requireNonNull(fileName); Objects.requireNonNull(future); - Message msg = Message.obtain(mHandler, MSG_GET_READ_ONLY_FILE_DESCRIPTOR, - new FileDescriptorParams(fileName, future)); - mHandler.sendMessage(msg); + mHandler.executeOrSendMessage( + obtainMessage( + OnDeviceIntelligenceService::onGetReadOnlyFileDescriptor, + OnDeviceIntelligenceService.this, fileName, + future)); } @Override @@ -276,15 +216,16 @@ public abstract class OnDeviceIntelligenceService extends Service { Feature feature, RemoteCallback remoteCallback) { Objects.requireNonNull(feature); Objects.requireNonNull(remoteCallback); - Message msg = Message.obtain(mHandler, - MSG_GET_READ_ONLY_FEATURE_FILE_DESCRIPTOR_MAP, - new FeatureFileDescriptorParams(feature, parcelFileDescriptorMap -> { - Bundle bundle = new Bundle(); - parcelFileDescriptorMap.forEach(bundle::putParcelable); - remoteCallback.sendResult(bundle); - tryClosePfds(parcelFileDescriptorMap.values()); - })); - mHandler.sendMessage(msg); + mHandler.executeOrSendMessage( + obtainMessage( + OnDeviceIntelligenceService::onGetReadOnlyFeatureFileDescriptorMap, + OnDeviceIntelligenceService.this, feature, + parcelFileDescriptorMap -> { + Bundle bundle = new Bundle(); + parcelFileDescriptorMap.forEach(bundle::putParcelable); + remoteCallback.sendResult(bundle); + tryClosePfds(parcelFileDescriptorMap.values()); + })); } @Override @@ -295,12 +236,18 @@ public abstract class OnDeviceIntelligenceService extends Service { @Override public void notifyInferenceServiceConnected() { - mHandler.sendEmptyMessage(MSG_INFERENCE_SERVICE_CONNECTED); + mHandler.executeOrSendMessage( + obtainMessage( + OnDeviceIntelligenceService::onInferenceServiceConnected, + OnDeviceIntelligenceService.this)); } @Override public void notifyInferenceServiceDisconnected() { - mHandler.sendEmptyMessage(MSG_INFERENCE_SERVICE_DISCONNECTED); + mHandler.executeOrSendMessage( + obtainMessage( + OnDeviceIntelligenceService::onInferenceServiceDisconnected, + OnDeviceIntelligenceService.this)); } }; } @@ -309,77 +256,10 @@ public abstract class OnDeviceIntelligenceService extends Service { } /** - * The {@link Intent} that must be declared as handled by the service. To be supported, the - * service must also require the - * {@link android.Manifest.permission#BIND_ON_DEVICE_INTELLIGENCE_SERVICE} - * permission so that other applications can not abuse it. - */ - @SdkConstant(SdkConstant.SdkConstantType.SERVICE_ACTION) - public static final String SERVICE_INTERFACE = - "android.service.ondeviceintelligence.OnDeviceIntelligenceService"; - - // Parameter holder classes - private static class GetFeatureParams { - final OutcomeReceiver<Feature, OnDeviceIntelligenceException> callback; - - GetFeatureParams(OutcomeReceiver<Feature, OnDeviceIntelligenceException> callback) { - this.callback = callback; - } - } - - private static class FeatureDetailsParams { - final Feature feature; - final OutcomeReceiver<FeatureDetails, OnDeviceIntelligenceException> callback; - - FeatureDetailsParams(Feature feature, - OutcomeReceiver<FeatureDetails, OnDeviceIntelligenceException> callback) { - this.feature = feature; - this.callback = callback; - } - } - - private static class DownloadParams { - final Feature feature; - final CancellationSignal cancellationSignal; - final DownloadCallback callback; - - DownloadParams(Feature feature, CancellationSignal cancellationSignal, - DownloadCallback callback) { - this.feature = feature; - this.cancellationSignal = cancellationSignal; - this.callback = callback; - } - } - - private static class FileDescriptorParams { - final String fileName; - final AndroidFuture<ParcelFileDescriptor> future; - - FileDescriptorParams(String fileName, AndroidFuture<ParcelFileDescriptor> future) { - this.fileName = fileName; - this.future = future; - } - } - - private static class FeatureFileDescriptorParams { - final Feature feature; - final Consumer<Map<String, ParcelFileDescriptor>> consumer; - - FeatureFileDescriptorParams(Feature feature, - Consumer<Map<String, ParcelFileDescriptor>> consumer) { - this.feature = feature; - this.consumer = consumer; - } - } - - /** * Using this signal to assertively a signal each time service binds successfully, used only in * tests to get a signal that service instance is ready. This is needed because we cannot rely * on {@link #onCreate} or {@link #onBind} to be invoke on each binding. - * - * @hide */ - @SystemApi public void onReady() { } @@ -422,7 +302,7 @@ public abstract class OnDeviceIntelligenceService extends Service { new IProcessingUpdateStatusCallback.Stub() { @Override public void onSuccess(PersistableBundle result) { - BinderUtils.withCleanCallingIdentity(() -> { + Binder.withCleanCallingIdentity(() -> { callbackExecutor.execute( () -> statusReceiver.onResult(result)); }); @@ -430,7 +310,7 @@ public abstract class OnDeviceIntelligenceService extends Service { @Override public void onFailure(int errorCode, String errorMessage) { - BinderUtils.withCleanCallingIdentity(() -> callbackExecutor.execute( + Binder.withCleanCallingIdentity(() -> callbackExecutor.execute( () -> statusReceiver.onError( new OnDeviceIntelligenceException( errorCode, errorMessage)))); @@ -575,7 +455,7 @@ public abstract class OnDeviceIntelligenceService extends Service { private void onGetReadOnlyFileDescriptor(@NonNull String fileName, @NonNull AndroidFuture<ParcelFileDescriptor> future) { Slog.v(TAG, "onGetReadOnlyFileDescriptor " + fileName); - BinderUtils.withCleanCallingIdentity(() -> { + Binder.withCleanCallingIdentity(() -> { Slog.v(TAG, "onGetReadOnlyFileDescriptor: " + fileName + " under internal app storage."); File f = new File(getBaseContext().getFilesDir(), fileName); @@ -592,11 +472,7 @@ public abstract class OnDeviceIntelligenceService extends Service { } finally { future.complete(pfd); if (pfd != null) { - try { - pfd.close(); - } catch (IOException e) { - Log.w(TAG, "Error closing FD", e); - } + pfd.close(); } } }); diff --git a/packages/NeuralNetworks/framework/platform/java/android/service/ondeviceintelligence/OnDeviceSandboxedInferenceService.java b/packages/NeuralNetworks/framework/platform/java/android/service/ondeviceintelligence/OnDeviceSandboxedInferenceService.java index 315dbaf919e5..949fb8ddda9d 100644 --- a/packages/NeuralNetworks/framework/platform/java/android/service/ondeviceintelligence/OnDeviceSandboxedInferenceService.java +++ b/packages/NeuralNetworks/framework/platform/java/android/service/ondeviceintelligence/OnDeviceSandboxedInferenceService.java @@ -19,6 +19,8 @@ package android.service.ondeviceintelligence; import static android.app.ondeviceintelligence.OnDeviceIntelligenceManager.AUGMENT_REQUEST_CONTENT_BUNDLE_KEY; import static android.app.ondeviceintelligence.flags.Flags.FLAG_ENABLE_ON_DEVICE_INTELLIGENCE; +import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage; + import android.annotation.CallSuper; import android.annotation.CallbackExecutor; import android.annotation.FlaggedApi; @@ -29,9 +31,7 @@ import android.annotation.SuppressLint; import android.annotation.SystemApi; import android.app.Service; import android.app.ondeviceintelligence.Feature; -import android.app.ondeviceintelligence.ICancellationSignal; import android.app.ondeviceintelligence.IProcessingSignal; -import android.app.ondeviceintelligence.IRemoteCallback; import android.app.ondeviceintelligence.IResponseCallback; import android.app.ondeviceintelligence.IStreamingResponseCallback; import android.app.ondeviceintelligence.ITokenInfoCallback; @@ -48,9 +48,11 @@ import android.content.Intent; import android.os.Bundle; import android.os.CancellationSignal; import android.os.Handler; +import android.os.HandlerExecutor; import android.os.IBinder; +import android.os.ICancellationSignal; +import android.os.IRemoteCallback; import android.os.Looper; -import android.os.Message; import android.os.OutcomeReceiver; import android.os.ParcelFileDescriptor; import android.os.PersistableBundle; @@ -59,8 +61,7 @@ import android.os.RemoteException; import android.util.Log; import android.util.Slog; -import com.android.modules.utils.AndroidFuture; -import com.android.modules.utils.HandlerExecutor; +import com.android.internal.infra.AndroidFuture; import java.io.FileInputStream; import java.io.FileNotFoundException; @@ -73,7 +74,7 @@ import java.util.function.Consumer; /** * Abstract base class for performing inference in a isolated process. This service exposes its - * methods via {@link android.app.ondeviceintelligence.OnDeviceIntelligenceManager}. + * methods via {@link OnDeviceIntelligenceManager}. * * <p> A service that provides methods to perform on-device inference both in streaming and * non-streaming fashion. Also, provides a way to register a storage service that will be used to @@ -99,12 +100,6 @@ import java.util.function.Consumer; public abstract class OnDeviceSandboxedInferenceService extends Service { private static final String TAG = OnDeviceSandboxedInferenceService.class.getSimpleName(); - private static final int MSG_TOKEN_INFO_REQUEST = 1; - private static final int MSG_PROCESS_REQUEST_STREAMING = 2; - private static final int MSG_PROCESS_REQUEST = 3; - private static final int MSG_UPDATE_PROCESSING_STATE = 4; - - /** * @hide */ @@ -138,12 +133,12 @@ public abstract class OnDeviceSandboxedInferenceService extends Service { * @hide */ public static final String MODEL_LOADED_BROADCAST_INTENT = - "android.service.ondeviceintelligence.MODEL_LOADED"; + "android.service.ondeviceintelligence.MODEL_LOADED"; /** * @hide */ public static final String MODEL_UNLOADED_BROADCAST_INTENT = - "android.service.ondeviceintelligence.MODEL_UNLOADED"; + "android.service.ondeviceintelligence.MODEL_UNLOADED"; /** * @hide @@ -157,115 +152,12 @@ public abstract class OnDeviceSandboxedInferenceService extends Service { @Override public void onCreate() { super.onCreate(); - mHandler = new Handler(Looper.getMainLooper()) { - @Override - public void handleMessage(Message msg) { - switch (msg.what) { - case MSG_TOKEN_INFO_REQUEST: - TokenInfoParams params = (TokenInfoParams) msg.obj; - OnDeviceSandboxedInferenceService.this.onTokenInfoRequest( - msg.arg1, - params.feature, - params.request, - params.cancellationSignal, - params.callback); - break; - case MSG_PROCESS_REQUEST_STREAMING: - StreamingRequestParams streamParams = (StreamingRequestParams) msg.obj; - OnDeviceSandboxedInferenceService.this.onProcessRequestStreaming( - msg.arg1, - streamParams.feature, - streamParams.request, - msg.arg2, - streamParams.cancellationSignal, - streamParams.processingSignal, - streamParams.callback); - break; - case MSG_PROCESS_REQUEST: - RequestParams requestParams = (RequestParams) msg.obj; - OnDeviceSandboxedInferenceService.this.onProcessRequest( - msg.arg1, - requestParams.feature, - requestParams.request, - msg.arg2, - requestParams.cancellationSignal, - requestParams.processingSignal, - requestParams.callback); - break; - case MSG_UPDATE_PROCESSING_STATE: - UpdateStateParams stateParams = (UpdateStateParams) msg.obj; - OnDeviceSandboxedInferenceService.this.onUpdateProcessingState( - stateParams.processingState, - stateParams.callback); - break; - } - } - }; - } - - // Parameter holder classes - private static class TokenInfoParams { - final Feature feature; - final Bundle request; - final CancellationSignal cancellationSignal; - final OutcomeReceiver<TokenInfo, OnDeviceIntelligenceException> callback; - - TokenInfoParams(Feature feature, Bundle request, CancellationSignal cancellationSignal, - OutcomeReceiver<TokenInfo, OnDeviceIntelligenceException> callback) { - this.feature = feature; - this.request = request; - this.cancellationSignal = cancellationSignal; - this.callback = callback; - } - } - - private static class StreamingRequestParams { - final Feature feature; - final Bundle request; - final CancellationSignal cancellationSignal; - final ProcessingSignal processingSignal; - final StreamingProcessingCallback callback; - - StreamingRequestParams(Feature feature, Bundle request, - CancellationSignal cancellationSignal, ProcessingSignal processingSignal, - StreamingProcessingCallback callback) { - this.feature = feature; - this.request = request; - this.cancellationSignal = cancellationSignal; - this.processingSignal = processingSignal; - this.callback = callback; - } - } - - private static class RequestParams { - final Feature feature; - final Bundle request; - final CancellationSignal cancellationSignal; - final ProcessingSignal processingSignal; - final ProcessingCallback callback; - - RequestParams(Feature feature, Bundle request, - CancellationSignal cancellationSignal, ProcessingSignal processingSignal, - ProcessingCallback callback) { - this.feature = feature; - this.request = request; - this.cancellationSignal = cancellationSignal; - this.processingSignal = processingSignal; - this.callback = callback; - } - } - - private static class UpdateStateParams { - final Bundle processingState; - final OutcomeReceiver<PersistableBundle, OnDeviceIntelligenceException> callback; - - UpdateStateParams(Bundle processingState, - OutcomeReceiver<PersistableBundle, OnDeviceIntelligenceException> callback) { - this.processingState = processingState; - this.callback = callback; - } + mHandler = new Handler(Looper.getMainLooper(), null /* callback */, true /* async */); } + /** + * @hide + */ @Nullable @Override public final IBinder onBind(@NonNull Intent intent) { @@ -276,7 +168,8 @@ public abstract class OnDeviceSandboxedInferenceService extends Service { IRemoteCallback remoteCallback) throws RemoteException { Objects.requireNonNull(storageService); mRemoteStorageService = storageService; - remoteCallback.sendResult(Bundle.EMPTY); + remoteCallback.sendResult( + Bundle.EMPTY); //to notify caller uid to system-server. } @Override @@ -285,42 +178,34 @@ public abstract class OnDeviceSandboxedInferenceService extends Service { ITokenInfoCallback tokenInfoCallback) { Objects.requireNonNull(feature); Objects.requireNonNull(tokenInfoCallback); - CancellationSignal cancellationSignal = new CancellationSignal(); + ICancellationSignal transport = null; if (cancellationSignalFuture != null) { - ICancellationSignal transport = new ICancellationSignal.Stub() { - @Override - public void cancel() { - cancellationSignal.cancel(); - } - }; + transport = CancellationSignal.createTransport(); cancellationSignalFuture.complete(transport); } - Message msg = Message.obtain(mHandler, MSG_TOKEN_INFO_REQUEST, - callerUid, 0, - new TokenInfoParams(feature, request, - cancellationSignalFuture != null ? cancellationSignal : null, + mHandler.executeOrSendMessage( + obtainMessage( + OnDeviceSandboxedInferenceService::onTokenInfoRequest, + OnDeviceSandboxedInferenceService.this, + callerUid, feature, + request, + CancellationSignal.fromTransport(transport), wrapTokenInfoCallback(tokenInfoCallback))); - mHandler.sendMessage(msg); } @Override - public void processRequestStreaming(int callerUid, Feature feature, - Bundle request, int requestType, + public void processRequestStreaming(int callerUid, Feature feature, Bundle request, + int requestType, AndroidFuture cancellationSignalFuture, AndroidFuture processingSignalFuture, IStreamingResponseCallback callback) { Objects.requireNonNull(feature); Objects.requireNonNull(callback); - CancellationSignal cancellationSignal = new CancellationSignal(); + ICancellationSignal transport = null; if (cancellationSignalFuture != null) { - ICancellationSignal transport = new ICancellationSignal.Stub() { - @Override - public void cancel() { - cancellationSignal.cancel(); - } - }; + transport = CancellationSignal.createTransport(); cancellationSignalFuture.complete(transport); } IProcessingSignal processingSignalTransport = null; @@ -329,32 +214,30 @@ public abstract class OnDeviceSandboxedInferenceService extends Service { processingSignalFuture.complete(processingSignalTransport); } - Message msg = Message.obtain(mHandler, MSG_PROCESS_REQUEST_STREAMING, - callerUid, requestType, - new StreamingRequestParams(feature, request, - cancellationSignalFuture != null ? cancellationSignal : null, + + mHandler.executeOrSendMessage( + obtainMessage( + OnDeviceSandboxedInferenceService::onProcessRequestStreaming, + OnDeviceSandboxedInferenceService.this, callerUid, + feature, + request, + requestType, + CancellationSignal.fromTransport(transport), ProcessingSignal.fromTransport(processingSignalTransport), wrapStreamingResponseCallback(callback))); - mHandler.sendMessage(msg); } @Override - public void processRequest(int callerUid, Feature feature, - Bundle request, int requestType, + public void processRequest(int callerUid, Feature feature, Bundle request, + int requestType, AndroidFuture cancellationSignalFuture, AndroidFuture processingSignalFuture, IResponseCallback callback) { Objects.requireNonNull(feature); Objects.requireNonNull(callback); - - CancellationSignal cancellationSignal = new CancellationSignal(); + ICancellationSignal transport = null; if (cancellationSignalFuture != null) { - ICancellationSignal transport = new ICancellationSignal.Stub() { - @Override - public void cancel() { - cancellationSignal.cancel(); - } - }; + transport = CancellationSignal.createTransport(); cancellationSignalFuture.complete(transport); } IProcessingSignal processingSignalTransport = null; @@ -362,14 +245,14 @@ public abstract class OnDeviceSandboxedInferenceService extends Service { processingSignalTransport = ProcessingSignal.createTransport(); processingSignalFuture.complete(processingSignalTransport); } - - Message msg = Message.obtain(mHandler, MSG_PROCESS_REQUEST, - callerUid, requestType, - new RequestParams(feature, request, - cancellationSignalFuture != null ? cancellationSignal : null, + mHandler.executeOrSendMessage( + obtainMessage( + OnDeviceSandboxedInferenceService::onProcessRequest, + OnDeviceSandboxedInferenceService.this, callerUid, feature, + request, requestType, + CancellationSignal.fromTransport(transport), ProcessingSignal.fromTransport(processingSignalTransport), wrapResponseCallback(callback))); - mHandler.sendMessage(msg); } @Override @@ -377,11 +260,11 @@ public abstract class OnDeviceSandboxedInferenceService extends Service { IProcessingUpdateStatusCallback callback) { Objects.requireNonNull(processingState); Objects.requireNonNull(callback); - - Message msg = Message.obtain(mHandler, MSG_UPDATE_PROCESSING_STATE, - new UpdateStateParams(processingState, + mHandler.executeOrSendMessage( + obtainMessage( + OnDeviceSandboxedInferenceService::onUpdateProcessingState, + OnDeviceSandboxedInferenceService.this, processingState, wrapOutcomeReceiver(callback))); - mHandler.sendMessage(msg); } }; } diff --git a/packages/NeuralNetworks/service/Android.bp b/packages/NeuralNetworks/service/Android.bp index 05c603f5ebce..cfdc1af6857f 100644 --- a/packages/NeuralNetworks/service/Android.bp +++ b/packages/NeuralNetworks/service/Android.bp @@ -19,11 +19,20 @@ package { filegroup { name: "service-ondeviceintelligence-sources", srcs: [ - "java/**/*.java", + "module/java/**/*.java", ], - path: "java", visibility: [ "//frameworks/base:__subpackages__", "//packages/modules/NeuralNetworks:__subpackages__", ], } + +filegroup { + name: "service-ondeviceintelligence-sources-platform", + srcs: [ + "platform/java/**/*.java", + ], + visibility: [ + "//frameworks/base:__subpackages__", + ], +} diff --git a/packages/NeuralNetworks/service/platform/java/com/android/server/ondeviceintelligence/BundleUtil.java b/packages/NeuralNetworks/service/platform/java/com/android/server/ondeviceintelligence/BundleUtil.java index 2626cc880e09..7dd8f2fdcecb 100644 --- a/packages/NeuralNetworks/service/platform/java/com/android/server/ondeviceintelligence/BundleUtil.java +++ b/packages/NeuralNetworks/service/platform/java/com/android/server/ondeviceintelligence/BundleUtil.java @@ -21,7 +21,6 @@ import static android.system.OsConstants.O_ACCMODE; import static android.system.OsConstants.O_RDONLY; import static android.system.OsConstants.PROT_READ; -import android.annotation.SuppressLint; import android.app.ondeviceintelligence.IResponseCallback; import android.app.ondeviceintelligence.IStreamingResponseCallback; import android.app.ondeviceintelligence.ITokenInfoCallback; @@ -43,7 +42,7 @@ import android.system.ErrnoException; import android.system.Os; import android.util.Log; -import com.android.modules.utils.AndroidFuture; +import com.android.internal.infra.AndroidFuture; import java.util.concurrent.Executor; import java.util.concurrent.TimeoutException; @@ -51,8 +50,6 @@ import java.util.concurrent.TimeoutException; /** * Util methods for ensuring the Bundle passed in various methods are read-only and restricted to * some known types. - * - * @hide */ public class BundleUtil { private static final String TAG = "BundleUtil"; @@ -79,7 +76,7 @@ public class BundleUtil { * {@link ClassNotFoundException} exception is swallowed and `null` is returned * instead. We want to ensure cleanup of null entries in such case. */ - bundle.putParcelable(key, null); + bundle.putObject(key, null); continue; } if (canMarshall(obj) || obj instanceof CursorWindow) { @@ -125,7 +122,7 @@ public class BundleUtil { * {@link ClassNotFoundException} exception is swallowed and `null` is returned * instead. We want to ensure cleanup of null entries in such case. */ - bundle.putParcelable(key, null); + bundle.putObject(key, null); continue; } if (canMarshall(obj)) { @@ -170,7 +167,7 @@ public class BundleUtil { * {@link ClassNotFoundException} exception is swallowed and `null` is returned * instead. We want to ensure cleanup of null entries in such case. */ - bundle.putParcelable(key, null); + bundle.putObject(key, null); continue; } if (canMarshall(obj)) { @@ -320,16 +317,11 @@ public class BundleUtil { }; } - private static boolean canMarshall(Object value) { - return (value instanceof byte[]) || (value instanceof Integer) || (value instanceof Long) || - (value instanceof Double) || (value instanceof String) || - (value instanceof int[]) || (value instanceof long[]) || - (value instanceof double[]) || (value instanceof String[]) || - (value instanceof PersistableBundle) || (value == null) || - (value instanceof Boolean) || (value instanceof boolean[]); + private static boolean canMarshall(Object obj) { + return obj instanceof byte[] || obj instanceof PersistableBundle + || PersistableBundle.isValidType(obj); } - @SuppressLint("NewApi") private static void ensureValidBundle(Bundle bundle) { if (bundle == null) { throw new IllegalArgumentException("Request passed is expected to be non-null"); @@ -372,7 +364,7 @@ public class BundleUtil { } } catch (ErrnoException e) { throw new BadParcelableException( - "Invalid File descriptor passed in the Bundle."); + "Invalid File descriptor passed in the Bundle.", e); } } diff --git a/packages/NeuralNetworks/service/platform/java/com/android/server/ondeviceintelligence/InferenceInfoStore.java b/packages/NeuralNetworks/service/platform/java/com/android/server/ondeviceintelligence/InferenceInfoStore.java index e8a1b322f661..bef3f8048da1 100644 --- a/packages/NeuralNetworks/service/platform/java/com/android/server/ondeviceintelligence/InferenceInfoStore.java +++ b/packages/NeuralNetworks/service/platform/java/com/android/server/ondeviceintelligence/InferenceInfoStore.java @@ -28,9 +28,6 @@ import java.util.Comparator; import java.util.List; import java.util.TreeSet; -/** - * @hide - */ public class InferenceInfoStore { private static final String TAG = "InferenceInfoStore"; private final TreeSet<InferenceInfo> inferenceInfos; @@ -101,4 +98,4 @@ public class InferenceInfoStore { info.startTimeMs).setEndTimeMillis(info.endTimeMs).setSuspendedTimeMillis( info.suspendedTimeMs).build(); } -} +}
\ No newline at end of file diff --git a/packages/NeuralNetworks/service/platform/java/com/android/server/ondeviceintelligence/OnDeviceIntelligenceManagerService.java b/packages/NeuralNetworks/service/platform/java/com/android/server/ondeviceintelligence/OnDeviceIntelligenceManagerService.java index a078f7542c11..0a69af67a8bf 100644 --- a/packages/NeuralNetworks/service/platform/java/com/android/server/ondeviceintelligence/OnDeviceIntelligenceManagerService.java +++ b/packages/NeuralNetworks/service/platform/java/com/android/server/ondeviceintelligence/OnDeviceIntelligenceManagerService.java @@ -16,40 +16,38 @@ package com.android.server.ondeviceintelligence; -import static android.app.ondeviceintelligence.OnDeviceIntelligenceManager.ON_DEVICE_INTELLIGENCE_IDLE_TIMEOUT_MS; import static android.service.ondeviceintelligence.OnDeviceSandboxedInferenceService.DEVICE_CONFIG_UPDATE_BUNDLE_KEY; -import static android.service.ondeviceintelligence.OnDeviceSandboxedInferenceService.MODEL_LOADED_BROADCAST_INTENT; import static android.service.ondeviceintelligence.OnDeviceSandboxedInferenceService.MODEL_LOADED_BUNDLE_KEY; -import static android.service.ondeviceintelligence.OnDeviceSandboxedInferenceService.MODEL_UNLOADED_BROADCAST_INTENT; import static android.service.ondeviceintelligence.OnDeviceSandboxedInferenceService.MODEL_UNLOADED_BUNDLE_KEY; +import static android.service.ondeviceintelligence.OnDeviceSandboxedInferenceService.MODEL_LOADED_BROADCAST_INTENT; +import static android.service.ondeviceintelligence.OnDeviceSandboxedInferenceService.MODEL_UNLOADED_BROADCAST_INTENT; import static android.service.ondeviceintelligence.OnDeviceSandboxedInferenceService.REGISTER_MODEL_UPDATE_CALLBACK_BUNDLE_KEY; import static com.android.server.ondeviceintelligence.BundleUtil.sanitizeInferenceParams; -import static com.android.server.ondeviceintelligence.BundleUtil.sanitizeStateParams; import static com.android.server.ondeviceintelligence.BundleUtil.validatePfdReadOnly; +import static com.android.server.ondeviceintelligence.BundleUtil.sanitizeStateParams; import static com.android.server.ondeviceintelligence.BundleUtil.wrapWithValidation; + import android.Manifest; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; +import android.app.AppGlobals; import android.app.ondeviceintelligence.DownloadCallback; import android.app.ondeviceintelligence.Feature; import android.app.ondeviceintelligence.FeatureDetails; -import android.app.ondeviceintelligence.ICancellationSignal; import android.app.ondeviceintelligence.IDownloadCallback; import android.app.ondeviceintelligence.IFeatureCallback; import android.app.ondeviceintelligence.IFeatureDetailsCallback; import android.app.ondeviceintelligence.IListFeaturesCallback; import android.app.ondeviceintelligence.IOnDeviceIntelligenceManager; import android.app.ondeviceintelligence.IProcessingSignal; -import android.app.ondeviceintelligence.IRemoteCallback; import android.app.ondeviceintelligence.IResponseCallback; import android.app.ondeviceintelligence.IStreamingResponseCallback; import android.app.ondeviceintelligence.ITokenInfoCallback; import android.app.ondeviceintelligence.InferenceInfo; import android.app.ondeviceintelligence.OnDeviceIntelligenceException; -import android.app.ondeviceintelligence.utils.BinderUtils; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -60,12 +58,16 @@ import android.os.Binder; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; +import android.os.ICancellationSignal; +import android.os.IRemoteCallback; import android.os.Looper; import android.os.Message; import android.os.ParcelFileDescriptor; import android.os.PersistableBundle; import android.os.RemoteCallback; import android.os.RemoteException; +import android.os.ResultReceiver; +import android.os.ShellCallback; import android.os.UserHandle; import android.provider.DeviceConfig; import android.provider.Settings; @@ -80,14 +82,17 @@ import android.text.TextUtils; import android.util.Log; import android.util.Slog; +import com.android.internal.R; import com.android.internal.annotations.GuardedBy; -import com.android.modules.utils.AndroidFuture; -import com.android.modules.utils.BackgroundThread; -import com.android.modules.utils.ServiceConnector; +import com.android.internal.infra.AndroidFuture; +import com.android.internal.infra.ServiceConnector; +import com.android.internal.os.BackgroundThread; import com.android.server.LocalManagerRegistry; import com.android.server.SystemService; +import com.android.server.SystemService.TargetUser; import com.android.server.ondeviceintelligence.callbacks.ListenableDownloadCallback; +import java.io.FileDescriptor; import java.io.IOException; import java.util.List; import java.util.Objects; @@ -232,7 +237,7 @@ public class OnDeviceIntelligenceManagerService extends SystemService { remoteCallback.sendResult(null); return; } - ensureRemoteIntelligenceServiceInitialized(/* throwServiceIfInvalid */ true); + ensureRemoteIntelligenceServiceInitialized(); mRemoteOnDeviceIntelligenceService.postAsync( service -> { AndroidFuture future = new AndroidFuture(); @@ -260,7 +265,7 @@ public class OnDeviceIntelligenceManagerService extends SystemService { PersistableBundle.EMPTY); return; } - ensureRemoteIntelligenceServiceInitialized(/* throwServiceIfInvalid */ true); + ensureRemoteIntelligenceServiceInitialized(); int callerUid = Binder.getCallingUid(); mRemoteOnDeviceIntelligenceService.postAsync( service -> { @@ -298,7 +303,7 @@ public class OnDeviceIntelligenceManagerService extends SystemService { PersistableBundle.EMPTY); return; } - ensureRemoteIntelligenceServiceInitialized(/* throwServiceIfInvalid */ true); + ensureRemoteIntelligenceServiceInitialized(); int callerUid = Binder.getCallingUid(); mRemoteOnDeviceIntelligenceService.postAsync( service -> { @@ -342,7 +347,7 @@ public class OnDeviceIntelligenceManagerService extends SystemService { PersistableBundle.EMPTY); return; } - ensureRemoteIntelligenceServiceInitialized(/* throwServiceIfInvalid */ true); + ensureRemoteIntelligenceServiceInitialized(); int callerUid = Binder.getCallingUid(); mRemoteOnDeviceIntelligenceService.postAsync( service -> { @@ -385,7 +390,7 @@ public class OnDeviceIntelligenceManagerService extends SystemService { "OnDeviceIntelligenceManagerService is unavailable", PersistableBundle.EMPTY); } - ensureRemoteIntelligenceServiceInitialized(/* throwServiceIfInvalid */ true); + ensureRemoteIntelligenceServiceInitialized(); int callerUid = Binder.getCallingUid(); mRemoteOnDeviceIntelligenceService.postAsync( service -> { @@ -425,7 +430,7 @@ public class OnDeviceIntelligenceManagerService extends SystemService { "OnDeviceIntelligenceManagerService is unavailable", PersistableBundle.EMPTY); } - ensureRemoteInferenceServiceInitialized(/* throwServiceIfInvalid */ true); + ensureRemoteInferenceServiceInitialized(); int callerUid = Binder.getCallingUid(); result = mRemoteInferenceService.postAsync( service -> { @@ -469,7 +474,7 @@ public class OnDeviceIntelligenceManagerService extends SystemService { "OnDeviceIntelligenceManagerService is unavailable", PersistableBundle.EMPTY); } - ensureRemoteInferenceServiceInitialized(/* throwServiceIfInvalid */ true); + ensureRemoteInferenceServiceInitialized(); int callerUid = Binder.getCallingUid(); result = mRemoteInferenceService.postAsync( service -> { @@ -515,7 +520,7 @@ public class OnDeviceIntelligenceManagerService extends SystemService { "OnDeviceIntelligenceManagerService is unavailable", PersistableBundle.EMPTY); } - ensureRemoteInferenceServiceInitialized(/* throwServiceIfInvalid */ true); + ensureRemoteInferenceServiceInitialized(); int callerUid = Binder.getCallingUid(); result = mRemoteInferenceService.postAsync( service -> { @@ -540,31 +545,20 @@ public class OnDeviceIntelligenceManagerService extends SystemService { } @Override - public int handleShellCommand(@NonNull ParcelFileDescriptor in, - @NonNull ParcelFileDescriptor out, @NonNull ParcelFileDescriptor err, - @NonNull String[] args) { - return new com.android.server.ondeviceintelligence.OnDeviceIntelligenceShellCommand( - OnDeviceIntelligenceManagerService.this).exec( - this, - in.getFileDescriptor(), - out.getFileDescriptor(), - err.getFileDescriptor(), - args); + public void onShellCommand(FileDescriptor in, FileDescriptor out, FileDescriptor err, + String[] args, ShellCallback callback, ResultReceiver resultReceiver) { + new OnDeviceIntelligenceShellCommand(OnDeviceIntelligenceManagerService.this).exec( + this, in, out, err, args, callback, resultReceiver); } }; } - private boolean ensureRemoteIntelligenceServiceInitialized(boolean throwIfServiceInvalid) { + private void ensureRemoteIntelligenceServiceInitialized() { synchronized (mLock) { if (mRemoteOnDeviceIntelligenceService == null) { String serviceName = getServiceNames()[0]; - if (!BinderUtils.withCleanCallingIdentity( - () -> validateServiceElevated(serviceName, false, - throwIfServiceInvalid))) { - return false; - } - mRemoteOnDeviceIntelligenceService = new RemoteOnDeviceIntelligenceService( - mContext, + Binder.withCleanCallingIdentity(() -> validateServiceElevated(serviceName, false)); + mRemoteOnDeviceIntelligenceService = new RemoteOnDeviceIntelligenceService(mContext, ComponentName.unflattenFromString(serviceName), UserHandle.SYSTEM.getIdentifier()); mRemoteOnDeviceIntelligenceService.setServiceLifecycleCallbacks( @@ -583,7 +577,6 @@ public class OnDeviceIntelligenceManagerService extends SystemService { }); } } - return true; } @NonNull @@ -597,21 +590,13 @@ public class OnDeviceIntelligenceManagerService extends SystemService { AndroidFuture<Void> result = null; try { sanitizeStateParams(processingState); - if (ensureRemoteInferenceServiceInitialized(/* throwServiceIfInvalid */ - false)) { - result = mRemoteInferenceService.post( - service -> service.updateProcessingState( - processingState, callback)); - result.whenCompleteAsync( - (c, e) -> BundleUtil.tryCloseResource(processingState), - resourceClosingExecutor); - } else { - callback.onFailure( - OnDeviceIntelligenceException.PROCESSING_ERROR_SERVICE_UNAVAILABLE, - "Remote service cannot be initialized."); - } - } catch (RemoteException e) { - Slog.w("Failed to invoke updateProcessingState", e); + ensureRemoteInferenceServiceInitialized(); + result = mRemoteInferenceService.post( + service -> service.updateProcessingState( + processingState, callback)); + result.whenCompleteAsync( + (c, e) -> BundleUtil.tryCloseResource(processingState), + resourceClosingExecutor); } finally { if (result == null) { resourceClosingExecutor.execute( @@ -623,14 +608,11 @@ public class OnDeviceIntelligenceManagerService extends SystemService { }; } - private boolean ensureRemoteInferenceServiceInitialized(boolean throwIfServiceInvalid) { + private void ensureRemoteInferenceServiceInitialized() { synchronized (mLock) { if (mRemoteInferenceService == null) { String serviceName = getServiceNames()[1]; - if (!BinderUtils.withCleanCallingIdentity( - () -> validateServiceElevated(serviceName, true, throwIfServiceInvalid))) { - return false; - } + Binder.withCleanCallingIdentity(() -> validateServiceElevated(serviceName, true)); mRemoteInferenceService = new RemoteOnDeviceSandboxedInferenceService(mContext, ComponentName.unflattenFromString(serviceName), UserHandle.SYSTEM.getIdentifier()); @@ -640,11 +622,7 @@ public class OnDeviceIntelligenceManagerService extends SystemService { public void onConnected( @NonNull IOnDeviceSandboxedInferenceService service) { try { - if (!ensureRemoteIntelligenceServiceInitialized( - /* throwServiceIfInvalid */ - false)) { - return; - } + ensureRemoteIntelligenceServiceInitialized(); service.registerRemoteStorageService( getIRemoteStorageService(), new IRemoteCallback.Stub() { @Override @@ -667,29 +645,20 @@ public class OnDeviceIntelligenceManagerService extends SystemService { @Override public void onDisconnected( @NonNull IOnDeviceSandboxedInferenceService service) { - if (!ensureRemoteIntelligenceServiceInitialized( - /* throwServiceIfInvalid */ - false)) { - return; - } + ensureRemoteIntelligenceServiceInitialized(); mRemoteOnDeviceIntelligenceService.run( IOnDeviceIntelligenceService::notifyInferenceServiceDisconnected); } @Override public void onBinderDied() { - if (!ensureRemoteIntelligenceServiceInitialized( - /* throwServiceIfInvalid */ - false)) { - return; - } + ensureRemoteIntelligenceServiceInitialized(); mRemoteOnDeviceIntelligenceService.run( IOnDeviceIntelligenceService::notifyInferenceServiceDisconnected); } }); } } - return true; } private void registerModelLoadingBroadcasts(IOnDeviceSandboxedInferenceService service) { @@ -760,8 +729,9 @@ public class OnDeviceIntelligenceManagerService extends SystemService { if (mTemporaryConfigNamespace != null) { return mTemporaryConfigNamespace; } + return mContext.getResources().getString( - android.R.string.config_defaultOnDeviceIntelligenceDeviceConfigNamespace); + R.string.config_defaultOnDeviceIntelligenceDeviceConfigNamespace); } } @@ -775,11 +745,7 @@ public class OnDeviceIntelligenceManagerService extends SystemService { } Bundle bundle = new Bundle(); bundle.putParcelable(DEVICE_CONFIG_UPDATE_BUNDLE_KEY, persistableBundle); - if (!ensureRemoteIntelligenceServiceInitialized( - /* throwServiceIfInvalid */ - false)) { - return; - } + ensureRemoteInferenceServiceInitialized(); mRemoteInferenceService.run(service -> service.updateProcessingState(bundle, new IProcessingUpdateStatusCallback.Stub() { @Override @@ -802,13 +768,7 @@ public class OnDeviceIntelligenceManagerService extends SystemService { public void getReadOnlyFileDescriptor( String filePath, AndroidFuture<ParcelFileDescriptor> future) { - if (!ensureRemoteIntelligenceServiceInitialized( - /* throwServiceIfInvalid */ - false)) { - future.completeExceptionally(new OnDeviceIntelligenceException( - OnDeviceIntelligenceException.PROCESSING_ERROR_NOT_AVAILABLE)); - return; - } + ensureRemoteIntelligenceServiceInitialized(); AndroidFuture<ParcelFileDescriptor> pfdFuture = new AndroidFuture<>(); mRemoteOnDeviceIntelligenceService.run( service -> service.getReadOnlyFileDescriptor( @@ -831,7 +791,7 @@ public class OnDeviceIntelligenceManagerService extends SystemService { public void getReadOnlyFeatureFileDescriptorMap( Feature feature, RemoteCallback remoteCallback) { - ensureRemoteIntelligenceServiceInitialized(/* throwServiceIfInvalid */ true); + ensureRemoteIntelligenceServiceInitialized(); mRemoteOnDeviceIntelligenceService.run( service -> service.getReadOnlyFeatureFileDescriptorMap( feature, @@ -855,48 +815,40 @@ public class OnDeviceIntelligenceManagerService extends SystemService { }; } - private boolean validateServiceElevated(String serviceName, boolean checkIsolated, - boolean throwIfServiceInvalid) { + private void validateServiceElevated(String serviceName, boolean checkIsolated) { try { if (TextUtils.isEmpty(serviceName)) { - if (throwIfServiceInvalid) { - throw new IllegalStateException( - "Remote service is not configured to complete the request"); - } - return false; + throw new IllegalStateException( + "Remote service is not configured to complete the request"); } ComponentName serviceComponent = ComponentName.unflattenFromString( serviceName); - ServiceInfo serviceInfo = mContext.getPackageManager().getServiceInfo( + ServiceInfo serviceInfo = AppGlobals.getPackageManager().getServiceInfo( serviceComponent, PackageManager.MATCH_DIRECT_BOOT_AWARE - | PackageManager.MATCH_DIRECT_BOOT_UNAWARE); - if (!checkIsolated) { - checkServiceRequiresPermission(serviceInfo, - Manifest.permission.BIND_ON_DEVICE_INTELLIGENCE_SERVICE); - return true; - } + | PackageManager.MATCH_DIRECT_BOOT_UNAWARE, + UserHandle.SYSTEM.getIdentifier()); + if (serviceInfo != null) { + if (!checkIsolated) { + checkServiceRequiresPermission(serviceInfo, + Manifest.permission.BIND_ON_DEVICE_INTELLIGENCE_SERVICE); + return; + } - checkServiceRequiresPermission(serviceInfo, - Manifest.permission.BIND_ON_DEVICE_SANDBOXED_INFERENCE_SERVICE); - if (!isIsolatedService(serviceInfo)) { - throw new SecurityException( - "Call required an isolated service, but the configured service: " - + serviceName + ", is not isolated"); - } - } catch (PackageManager.NameNotFoundException e) { - if (throwIfServiceInvalid) { + checkServiceRequiresPermission(serviceInfo, + Manifest.permission.BIND_ON_DEVICE_SANDBOXED_INFERENCE_SERVICE); + if (!isIsolatedService(serviceInfo)) { + throw new SecurityException( + "Call required an isolated service, but the configured service: " + + serviceName + ", is not isolated"); + } + } else { throw new IllegalStateException( "Remote service is not configured to complete the request."); } - return false; - } catch (SecurityException e) { - if (throwIfServiceInvalid) { - throw e; - } - return false; + } catch (RemoteException e) { + throw new IllegalStateException("Could not fetch service info for remote services", e); } - return true; } private static void checkServiceRequiresPermission(ServiceInfo serviceInfo, @@ -904,8 +856,8 @@ public class OnDeviceIntelligenceManagerService extends SystemService { final String permission = serviceInfo.permission; if (!requiredPermission.equals(permission)) { throw new SecurityException(String.format( - "%s requires %s permission. Found %s permission", - serviceInfo, + "Service %s requires %s permission. Found %s permission", + serviceInfo.getComponentName(), requiredPermission, serviceInfo.permission)); } @@ -944,9 +896,9 @@ public class OnDeviceIntelligenceManagerService extends SystemService { } } return new String[]{mContext.getResources().getString( - android.R.string.config_defaultOnDeviceIntelligenceService), + R.string.config_defaultOnDeviceIntelligenceService), mContext.getResources().getString( - android.R.string.config_defaultOnDeviceSandboxedInferenceService)}; + R.string.config_defaultOnDeviceSandboxedInferenceService)}; } protected String[] getBroadcastKeys() throws Resources.NotFoundException { @@ -957,7 +909,7 @@ public class OnDeviceIntelligenceManagerService extends SystemService { } } - return new String[]{MODEL_LOADED_BROADCAST_INTENT, MODEL_UNLOADED_BROADCAST_INTENT}; + return new String[]{ MODEL_LOADED_BROADCAST_INTENT, MODEL_UNLOADED_BROADCAST_INTENT }; } @RequiresPermission(Manifest.permission.USE_ON_DEVICE_INTELLIGENCE) @@ -1102,7 +1054,7 @@ public class OnDeviceIntelligenceManagerService extends SystemService { private synchronized Handler getTemporaryHandler() { if (mTemporaryHandler == null) { - mTemporaryHandler = new Handler(Looper.getMainLooper()) { + mTemporaryHandler = new Handler(Looper.getMainLooper(), null, true) { @Override public void handleMessage(Message msg) { synchronized (mLock) { @@ -1124,13 +1076,10 @@ public class OnDeviceIntelligenceManagerService extends SystemService { return mTemporaryHandler; } - // Using #getLong here as the timeout settings are only applicable to the services running in - // SYSTEM user only. - @SuppressWarnings("NonUserGetterCalled") private long getIdleTimeoutMs() { - return Settings.Secure.getLong(mContext.getContentResolver(), - ON_DEVICE_INTELLIGENCE_IDLE_TIMEOUT_MS, - TimeUnit.HOURS.toMillis(1)); + return Settings.Secure.getLongForUser(mContext.getContentResolver(), + Settings.Secure.ON_DEVICE_INTELLIGENCE_IDLE_TIMEOUT_MS, TimeUnit.HOURS.toMillis(1), + mContext.getUserId()); } private int getRemoteInferenceServiceUid() { diff --git a/packages/NeuralNetworks/service/platform/java/com/android/server/ondeviceintelligence/OnDeviceIntelligenceShellCommand.java b/packages/NeuralNetworks/service/platform/java/com/android/server/ondeviceintelligence/OnDeviceIntelligenceShellCommand.java index c641de8b47b1..d2c84fa1b18a 100644 --- a/packages/NeuralNetworks/service/platform/java/com/android/server/ondeviceintelligence/OnDeviceIntelligenceShellCommand.java +++ b/packages/NeuralNetworks/service/platform/java/com/android/server/ondeviceintelligence/OnDeviceIntelligenceShellCommand.java @@ -18,16 +18,12 @@ package com.android.server.ondeviceintelligence; import android.annotation.NonNull; import android.os.Binder; - -import com.android.modules.utils.BasicShellCommandHandler; +import android.os.ShellCommand; import java.io.PrintWriter; import java.util.Objects; -/** - * @hide - */ -final class OnDeviceIntelligenceShellCommand extends BasicShellCommandHandler { +final class OnDeviceIntelligenceShellCommand extends ShellCommand { private static final String TAG = OnDeviceIntelligenceShellCommand.class.getSimpleName(); @NonNull diff --git a/packages/NeuralNetworks/service/platform/java/com/android/server/ondeviceintelligence/RemoteOnDeviceIntelligenceService.java b/packages/NeuralNetworks/service/platform/java/com/android/server/ondeviceintelligence/RemoteOnDeviceIntelligenceService.java index 0c43a309c456..ac9747aa83b3 100644 --- a/packages/NeuralNetworks/service/platform/java/com/android/server/ondeviceintelligence/RemoteOnDeviceIntelligenceService.java +++ b/packages/NeuralNetworks/service/platform/java/com/android/server/ondeviceintelligence/RemoteOnDeviceIntelligenceService.java @@ -16,7 +16,6 @@ package com.android.server.ondeviceintelligence; -import static android.app.ondeviceintelligence.OnDeviceIntelligenceManager.ON_DEVICE_INTELLIGENCE_UNBIND_TIMEOUT_MS; import static android.content.Context.BIND_FOREGROUND_SERVICE; import static android.content.Context.BIND_INCLUDE_CAPABILITIES; @@ -27,15 +26,13 @@ import android.provider.Settings; import android.service.ondeviceintelligence.IOnDeviceIntelligenceService; import android.service.ondeviceintelligence.OnDeviceIntelligenceService; -import com.android.modules.utils.ServiceConnector; +import com.android.internal.infra.ServiceConnector; import java.util.concurrent.TimeUnit; /** * Manages the connection to the remote on-device intelligence service. Also, handles unbinding * logic set by the service implementation via a Secure Settings flag. - * - * @hide */ public class RemoteOnDeviceIntelligenceService extends ServiceConnector.Impl<IOnDeviceIntelligenceService> { @@ -59,13 +56,11 @@ public class RemoteOnDeviceIntelligenceService extends return LONG_TIMEOUT; } - // Using #getLong here as the timeout settings are only applicable to the services running in - // SYSTEM user only. @Override - @SuppressWarnings("NonUserGetterCalled") protected long getAutoDisconnectTimeoutMs() { - return Settings.Secure.getLong(mContext.getContentResolver(), - ON_DEVICE_INTELLIGENCE_UNBIND_TIMEOUT_MS, - TimeUnit.SECONDS.toMillis(30)); + return Settings.Secure.getLongForUser(mContext.getContentResolver(), + Settings.Secure.ON_DEVICE_INTELLIGENCE_UNBIND_TIMEOUT_MS, + TimeUnit.SECONDS.toMillis(30), + mContext.getUserId()); } } diff --git a/packages/NeuralNetworks/service/platform/java/com/android/server/ondeviceintelligence/RemoteOnDeviceSandboxedInferenceService.java b/packages/NeuralNetworks/service/platform/java/com/android/server/ondeviceintelligence/RemoteOnDeviceSandboxedInferenceService.java index 8c5d5a7ba736..18b13838ea7c 100644 --- a/packages/NeuralNetworks/service/platform/java/com/android/server/ondeviceintelligence/RemoteOnDeviceSandboxedInferenceService.java +++ b/packages/NeuralNetworks/service/platform/java/com/android/server/ondeviceintelligence/RemoteOnDeviceSandboxedInferenceService.java @@ -16,7 +16,6 @@ package com.android.server.ondeviceintelligence; -import static android.app.ondeviceintelligence.OnDeviceIntelligenceManager.ON_DEVICE_INFERENCE_UNBIND_TIMEOUT_MS; import static android.content.Context.BIND_FOREGROUND_SERVICE; import static android.content.Context.BIND_INCLUDE_CAPABILITIES; @@ -27,7 +26,7 @@ import android.provider.Settings; import android.service.ondeviceintelligence.IOnDeviceSandboxedInferenceService; import android.service.ondeviceintelligence.OnDeviceSandboxedInferenceService; -import com.android.modules.utils.ServiceConnector; +import com.android.internal.infra.ServiceConnector; import java.util.concurrent.TimeUnit; @@ -36,8 +35,6 @@ import java.util.concurrent.TimeUnit; * Manages the connection to the remote on-device sand boxed inference service. Also, handles * unbinding * logic set by the service implementation via a SecureSettings flag. - * - * @hide */ public class RemoteOnDeviceSandboxedInferenceService extends ServiceConnector.Impl<IOnDeviceSandboxedInferenceService> { @@ -68,13 +65,12 @@ public class RemoteOnDeviceSandboxedInferenceService extends return LONG_TIMEOUT; } - // Using #getLong here as the timeout settings are only applicable to the services running in - // SYSTEM user only. + @Override - @SuppressWarnings("NonUserGetterCalled") protected long getAutoDisconnectTimeoutMs() { - return Settings.Secure.getLong(mContext.getContentResolver(), - ON_DEVICE_INFERENCE_UNBIND_TIMEOUT_MS, - TimeUnit.SECONDS.toMillis(30)); + return Settings.Secure.getLongForUser(mContext.getContentResolver(), + Settings.Secure.ON_DEVICE_INFERENCE_UNBIND_TIMEOUT_MS, + TimeUnit.SECONDS.toMillis(30), + mContext.getUserId()); } } diff --git a/packages/NeuralNetworks/service/platform/java/com/android/server/ondeviceintelligence/callbacks/ListenableDownloadCallback.java b/packages/NeuralNetworks/service/platform/java/com/android/server/ondeviceintelligence/callbacks/ListenableDownloadCallback.java index 249bcd37db5d..32f0698a8f9c 100644 --- a/packages/NeuralNetworks/service/platform/java/com/android/server/ondeviceintelligence/callbacks/ListenableDownloadCallback.java +++ b/packages/NeuralNetworks/service/platform/java/com/android/server/ondeviceintelligence/callbacks/ListenableDownloadCallback.java @@ -21,7 +21,7 @@ import android.os.Handler; import android.os.PersistableBundle; import android.os.RemoteException; -import com.android.modules.utils.AndroidFuture; +import com.android.internal.infra.AndroidFuture; import java.util.concurrent.TimeoutException; @@ -32,8 +32,6 @@ import java.util.concurrent.TimeoutException; * some cases. Instead, in such cases we rely on the remote service sending progress updates and if * there are *no* progress callbacks in the duration of {@link #idleTimeoutMs}, we can assume the * download will not complete and enabling faster cleanup. - * - * @hide */ public class ListenableDownloadCallback extends IDownloadCallback.Stub implements Runnable { private final IDownloadCallback callback; diff --git a/services/Android.bp b/services/Android.bp index a7cb9bb9af24..7298f1408eec 100644 --- a/services/Android.bp +++ b/services/Android.bp @@ -233,8 +233,7 @@ ondeviceintelligence_module_java_defaults { libs: ["service-ondeviceintelligence.stubs.system_server"], }, release_ondevice_intelligence_platform: { - srcs: [":service-ondeviceintelligence-sources"], - static_libs: ["modules-utils-backgroundthread"], + srcs: [":service-ondeviceintelligence-sources-platform"], }, }, } |