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
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:77adc203ddef604c5ec163a8872714d37efeccb8)
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:6ac8152487c0bd3e7f549234453db1fc09b95e82)
Merged-In: If72804788d5a3db9e152be4c0d387efe8b156d8a
Change-Id: If72804788d5a3db9e152be4c0d387efe8b156d8a
diff --git a/packages/NeuralNetworks/framework/Android.bp b/packages/NeuralNetworks/framework/Android.bp
index 6f45daa..af071ba 100644
--- a/packages/NeuralNetworks/framework/Android.bp
+++ b/packages/NeuralNetworks/framework/Android.bp
@@ -19,10 +19,21 @@
filegroup {
name: "framework-ondeviceintelligence-sources",
srcs: [
- "java/**/*.aidl",
- "java/**/*.java",
+ "module/java/**/*.aidl",
+ "module/java/**/*.java",
],
- path: "java",
+ visibility: [
+ "//frameworks/base:__subpackages__",
+ "//packages/modules/NeuralNetworks:__subpackages__",
+ ],
+}
+
+filegroup {
+ name: "framework-ondeviceintelligence-sources-platform",
+ srcs: [
+ "platform/java/**/*.aidl",
+ "platform/java/**/*.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 47cfb4a..18494d7 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 @@
/**
* @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 88f4de29..bcc56073 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.Parcelable;
import android.os.PersistableBundle;
-import java.util.Objects;
-
/**
* Represents a typical feature associated with on-device intelligence.
*
@@ -58,8 +56,9 @@
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 @@
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 @@
/**
* 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 c5b3532..0589bf8 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 @@
/**
* @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 063cfb8..0ee0cc3 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.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 @@
@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 @@
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 fac5ec6..1977a39 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 6f63254..6d70fc4 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 @@
/**
* @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 dc0665a..78cf1d7 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.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.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 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 @@
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 @@
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 @@
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 @@
@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 @@
@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 @@
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 @@
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 @@
@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 @@
@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 @@
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 @@
@Override
public void onSuccess(@InferenceParams Bundle result) {
- BinderUtils.withCleanCallingIdentity(() -> {
+ Binder.withCleanCallingIdentity(() -> {
callbackExecutor.execute(
() -> streamingProcessingCallback.onResult(result));
});
@@ -491,7 +463,7 @@
@Override
public void onFailure(int errorCode, String errorMessage,
PersistableBundle errorParams) {
- BinderUtils.withCleanCallingIdentity(() -> {
+ Binder.withCleanCallingIdentity(() -> {
callbackExecutor.execute(
() -> streamingProcessingCallback.onError(
new OnDeviceIntelligenceException(
@@ -503,7 +475,7 @@
@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 @@
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 @@
}, 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 599b337..2c19c1e 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 @@
/**
* @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 cba18c1..45c4350 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 @@
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 504fdd9..1af3b0f 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.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 253df89..a6f49e1 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.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 6907e2b..618d2a0 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 @@
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.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.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.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 @@
@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 @@
@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 @@
/** {@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 @@
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 @@
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 @@
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 @@
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 @@
@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 @@
}
/**
- * 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 @@
new IProcessingUpdateStatusCallback.Stub() {
@Override
public void onSuccess(PersistableBundle result) {
- BinderUtils.withCleanCallingIdentity(() -> {
+ Binder.withCleanCallingIdentity(() -> {
callbackExecutor.execute(
() -> statusReceiver.onResult(result));
});
@@ -430,7 +310,7 @@
@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 @@
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 @@
} 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 315dbaf..949fb8d 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 @@
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.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.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.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 @@
/**
* 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 @@
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 @@
* @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 @@
@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;
- }
- }
- };
+ mHandler = new Handler(Looper.getMainLooper(), null /* callback */, true /* async */);
}
- // 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;
- }
- }
-
+ /**
+ * @hide
+ */
@Nullable
@Override
public final IBinder onBind(@NonNull Intent intent) {
@@ -276,7 +168,8 @@
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 @@
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 @@
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 @@
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 @@
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 05c603f..cfdc1af 100644
--- a/packages/NeuralNetworks/service/Android.bp
+++ b/packages/NeuralNetworks/service/Android.bp
@@ -19,11 +19,20 @@
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 2626cc8..7dd8f2f 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_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.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 @@
/**
* 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 @@
* {@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 @@
* {@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 @@
* {@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 @@
};
}
- 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 @@
}
} 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 e8a1b322..bef3f80 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.List;
import java.util.TreeSet;
-/**
- * @hide
- */
public class InferenceInfoStore {
private static final String TAG = "InferenceInfoStore";
private final TreeSet<InferenceInfo> inferenceInfos;
@@ -101,4 +98,4 @@
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 a078f75..0a69af6 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.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.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 @@
remoteCallback.sendResult(null);
return;
}
- ensureRemoteIntelligenceServiceInitialized(/* throwServiceIfInvalid */ true);
+ ensureRemoteIntelligenceServiceInitialized();
mRemoteOnDeviceIntelligenceService.postAsync(
service -> {
AndroidFuture future = new AndroidFuture();
@@ -260,7 +265,7 @@
PersistableBundle.EMPTY);
return;
}
- ensureRemoteIntelligenceServiceInitialized(/* throwServiceIfInvalid */ true);
+ ensureRemoteIntelligenceServiceInitialized();
int callerUid = Binder.getCallingUid();
mRemoteOnDeviceIntelligenceService.postAsync(
service -> {
@@ -298,7 +303,7 @@
PersistableBundle.EMPTY);
return;
}
- ensureRemoteIntelligenceServiceInitialized(/* throwServiceIfInvalid */ true);
+ ensureRemoteIntelligenceServiceInitialized();
int callerUid = Binder.getCallingUid();
mRemoteOnDeviceIntelligenceService.postAsync(
service -> {
@@ -342,7 +347,7 @@
PersistableBundle.EMPTY);
return;
}
- ensureRemoteIntelligenceServiceInitialized(/* throwServiceIfInvalid */ true);
+ ensureRemoteIntelligenceServiceInitialized();
int callerUid = Binder.getCallingUid();
mRemoteOnDeviceIntelligenceService.postAsync(
service -> {
@@ -385,7 +390,7 @@
"OnDeviceIntelligenceManagerService is unavailable",
PersistableBundle.EMPTY);
}
- ensureRemoteIntelligenceServiceInitialized(/* throwServiceIfInvalid */ true);
+ ensureRemoteIntelligenceServiceInitialized();
int callerUid = Binder.getCallingUid();
mRemoteOnDeviceIntelligenceService.postAsync(
service -> {
@@ -425,7 +430,7 @@
"OnDeviceIntelligenceManagerService is unavailable",
PersistableBundle.EMPTY);
}
- ensureRemoteInferenceServiceInitialized(/* throwServiceIfInvalid */ true);
+ ensureRemoteInferenceServiceInitialized();
int callerUid = Binder.getCallingUid();
result = mRemoteInferenceService.postAsync(
service -> {
@@ -469,7 +474,7 @@
"OnDeviceIntelligenceManagerService is unavailable",
PersistableBundle.EMPTY);
}
- ensureRemoteInferenceServiceInitialized(/* throwServiceIfInvalid */ true);
+ ensureRemoteInferenceServiceInitialized();
int callerUid = Binder.getCallingUid();
result = mRemoteInferenceService.postAsync(
service -> {
@@ -515,7 +520,7 @@
"OnDeviceIntelligenceManagerService is unavailable",
PersistableBundle.EMPTY);
}
- ensureRemoteInferenceServiceInitialized(/* throwServiceIfInvalid */ true);
+ ensureRemoteInferenceServiceInitialized();
int callerUid = Binder.getCallingUid();
result = mRemoteInferenceService.postAsync(
service -> {
@@ -540,31 +545,20 @@
}
@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 @@
});
}
}
- return true;
}
@NonNull
@@ -597,21 +590,13 @@
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 @@
};
}
- 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 void onConnected(
@NonNull IOnDeviceSandboxedInferenceService service) {
try {
- if (!ensureRemoteIntelligenceServiceInitialized(
- /* throwServiceIfInvalid */
- false)) {
- return;
- }
+ ensureRemoteIntelligenceServiceInitialized();
service.registerRemoteStorageService(
getIRemoteStorageService(), new IRemoteCallback.Stub() {
@Override
@@ -667,29 +645,20 @@
@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 @@
if (mTemporaryConfigNamespace != null) {
return mTemporaryConfigNamespace;
}
+
return mContext.getResources().getString(
- android.R.string.config_defaultOnDeviceIntelligenceDeviceConfigNamespace);
+ R.string.config_defaultOnDeviceIntelligenceDeviceConfigNamespace);
}
}
@@ -775,11 +745,7 @@
}
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 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 void getReadOnlyFeatureFileDescriptorMap(
Feature feature,
RemoteCallback remoteCallback) {
- ensureRemoteIntelligenceServiceInitialized(/* throwServiceIfInvalid */ true);
+ ensureRemoteIntelligenceServiceInitialized();
mRemoteOnDeviceIntelligenceService.run(
service -> service.getReadOnlyFeatureFileDescriptorMap(
feature,
@@ -855,48 +815,40 @@
};
}
- 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 @@
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 @@
}
}
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 @@
}
}
- 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 @@
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 @@
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 c641de8..d2c84fa 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 @@
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 0c43a30..ac9747a 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.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 @@
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 8c5d5a7..18b1383 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.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 @@
* 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 @@
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 249bcd3..32f0698 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.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 @@
* 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 a7cb9bb..7298f14 100644
--- a/services/Android.bp
+++ b/services/Android.bp
@@ -233,8 +233,7 @@
libs: ["service-ondeviceintelligence.stubs.system_server"],
},
release_ondevice_intelligence_platform: {
- srcs: [":service-ondeviceintelligence-sources"],
- static_libs: ["modules-utils-backgroundthread"],
+ srcs: [":service-ondeviceintelligence-sources-platform"],
},
},
}