diff options
author | 2024-12-11 17:19:25 +0000 | |
---|---|---|
committer | 2024-12-12 08:16:03 -0800 | |
commit | 77adc203ddef604c5ec163a8872714d37efeccb8 (patch) | |
tree | 45cffabe08f4282425ec6ca02c26826dfaf9e1fb /packages/NeuralNetworks | |
parent | 9f0ff89cc2f442869497d3c305475d5eaf3201be (diff) |
Revert module related chanages in platform folder
In order to allow migration to mainline module, certain hidden API calls were replaced to alternate usages in ag/30507833
These changes are not supposed to be used when the build flag is false, this CL reverts all such changes and brings them back to state before the refactor for module migration was done.
Flag: build.release_ondevice_intelligence_module
Bug: 376427781
Change-Id: If72804788d5a3db9e152be4c0d387efe8b156d8a
Diffstat (limited to 'packages/NeuralNetworks')
22 files changed, 313 insertions, 637 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; |