summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/NeuralNetworks/framework/Android.bp17
-rw-r--r--packages/NeuralNetworks/framework/platform/java/android/app/ondeviceintelligence/Feature.aidl2
-rw-r--r--packages/NeuralNetworks/framework/platform/java/android/app/ondeviceintelligence/Feature.java10
-rw-r--r--packages/NeuralNetworks/framework/platform/java/android/app/ondeviceintelligence/FeatureDetails.aidl2
-rw-r--r--packages/NeuralNetworks/framework/platform/java/android/app/ondeviceintelligence/FeatureDetails.java13
-rw-r--r--packages/NeuralNetworks/framework/platform/java/android/app/ondeviceintelligence/IOnDeviceIntelligenceManager.aidl4
-rw-r--r--packages/NeuralNetworks/framework/platform/java/android/app/ondeviceintelligence/InferenceInfo.aidl2
-rw-r--r--packages/NeuralNetworks/framework/platform/java/android/app/ondeviceintelligence/OnDeviceIntelligenceManager.java93
-rw-r--r--packages/NeuralNetworks/framework/platform/java/android/app/ondeviceintelligence/TokenInfo.aidl2
-rw-r--r--packages/NeuralNetworks/framework/platform/java/android/service/ondeviceintelligence/IOnDeviceIntelligenceService.aidl4
-rw-r--r--packages/NeuralNetworks/framework/platform/java/android/service/ondeviceintelligence/IOnDeviceSandboxedInferenceService.aidl6
-rw-r--r--packages/NeuralNetworks/framework/platform/java/android/service/ondeviceintelligence/IRemoteStorageService.aidl2
-rw-r--r--packages/NeuralNetworks/framework/platform/java/android/service/ondeviceintelligence/OnDeviceIntelligenceService.java282
-rw-r--r--packages/NeuralNetworks/framework/platform/java/android/service/ondeviceintelligence/OnDeviceSandboxedInferenceService.java219
-rw-r--r--packages/NeuralNetworks/service/Android.bp13
-rw-r--r--packages/NeuralNetworks/service/platform/java/com/android/server/ondeviceintelligence/BundleUtil.java24
-rw-r--r--packages/NeuralNetworks/service/platform/java/com/android/server/ondeviceintelligence/InferenceInfoStore.java5
-rw-r--r--packages/NeuralNetworks/service/platform/java/com/android/server/ondeviceintelligence/OnDeviceIntelligenceManagerService.java207
-rw-r--r--packages/NeuralNetworks/service/platform/java/com/android/server/ondeviceintelligence/OnDeviceIntelligenceShellCommand.java8
-rw-r--r--packages/NeuralNetworks/service/platform/java/com/android/server/ondeviceintelligence/RemoteOnDeviceIntelligenceService.java15
-rw-r--r--packages/NeuralNetworks/service/platform/java/com/android/server/ondeviceintelligence/RemoteOnDeviceSandboxedInferenceService.java16
-rw-r--r--packages/NeuralNetworks/service/platform/java/com/android/server/ondeviceintelligence/callbacks/ListenableDownloadCallback.java4
-rw-r--r--services/Android.bp3
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"],
},
},
}