diff options
8 files changed, 185 insertions, 129 deletions
diff --git a/core/java/android/app/ondeviceintelligence/IOnDeviceIntelligenceManager.aidl b/core/java/android/app/ondeviceintelligence/IOnDeviceIntelligenceManager.aidl index 0dbe18156904..8bf288abb0f9 100644 --- a/core/java/android/app/ondeviceintelligence/IOnDeviceIntelligenceManager.aidl +++ b/core/java/android/app/ondeviceintelligence/IOnDeviceIntelligenceManager.aidl @@ -53,19 +53,22 @@ void getFeatureDetails(in Feature feature, in IFeatureDetailsCallback featureDetailsCallback) = 4; @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.USE_ON_DEVICE_INTELLIGENCE)") - void requestFeatureDownload(in Feature feature, in ICancellationSignal signal, in IDownloadCallback callback) = 5; + void requestFeatureDownload(in Feature feature, in AndroidFuture cancellationSignalFuture, in IDownloadCallback callback) = 5; @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.USE_ON_DEVICE_INTELLIGENCE)") - void requestTokenInfo(in Feature feature, in Bundle requestBundle, in ICancellationSignal signal, + void requestTokenInfo(in Feature feature, in Bundle requestBundle, in AndroidFuture cancellationSignalFuture, in ITokenInfoCallback tokenInfocallback) = 6; @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.USE_ON_DEVICE_INTELLIGENCE)") - void processRequest(in Feature feature, in Bundle requestBundle, int requestType, in ICancellationSignal cancellationSignal, - in IProcessingSignal signal, in IResponseCallback responseCallback) = 7; + void processRequest(in Feature feature, in Bundle requestBundle, int requestType, + in AndroidFuture cancellationSignalFuture, + in AndroidFuture processingSignalFuture, + in IResponseCallback responseCallback) = 7; @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.USE_ON_DEVICE_INTELLIGENCE)") void processRequestStreaming(in Feature feature, - in Bundle requestBundle, int requestType, in ICancellationSignal cancellationSignal, in IProcessingSignal signal, + in Bundle requestBundle, int requestType, in AndroidFuture cancellationSignalFuture, + in AndroidFuture processingSignalFuture, in IStreamingResponseCallback streamingCallback) = 8; String getRemoteServicePackageName() = 9; diff --git a/core/java/android/app/ondeviceintelligence/OnDeviceIntelligenceManager.java b/core/java/android/app/ondeviceintelligence/OnDeviceIntelligenceManager.java index a465e3cbb6ec..bc50d2e492ae 100644 --- a/core/java/android/app/ondeviceintelligence/OnDeviceIntelligenceManager.java +++ b/core/java/android/app/ondeviceintelligence/OnDeviceIntelligenceManager.java @@ -26,22 +26,23 @@ import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.SystemService; -import android.content.ComponentName; 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; import android.os.RemoteException; import android.system.OsConstants; +import android.util.Log; import androidx.annotation.IntDef; -import com.android.internal.R; +import com.android.internal.infra.AndroidFuture; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; @@ -76,6 +77,8 @@ public final class OnDeviceIntelligenceManager { */ public static final String AUGMENT_REQUEST_CONTENT_BUNDLE_KEY = "AugmentRequestContentBundleKey"; + + private static final String TAG = "OnDeviceIntelligence"; private final Context mContext; private final IOnDeviceIntelligenceManager mService; @@ -121,9 +124,9 @@ public final class OnDeviceIntelligenceManager { @RequiresPermission(Manifest.permission.USE_ON_DEVICE_INTELLIGENCE) public String getRemoteServicePackageName() { String result; - try{ - result = mService.getRemoteServicePackageName(); - } catch (RemoteException e){ + try { + result = mService.getRemoteServicePackageName(); + } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } return result; @@ -288,18 +291,15 @@ public final class OnDeviceIntelligenceManager { } }; - ICancellationSignal transport = null; - if (cancellationSignal != null) { - transport = CancellationSignal.createTransport(); - cancellationSignal.setRemote(transport); - } - - mService.requestFeatureDownload(feature, transport, downloadCallback); + mService.requestFeatureDownload(feature, + configureRemoteCancellationFuture(cancellationSignal, callbackExecutor), + downloadCallback); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } + /** * The methods computes the token related information for a given request payload using the * provided {@link Feature}. @@ -337,13 +337,9 @@ public final class OnDeviceIntelligenceManager { } }; - ICancellationSignal transport = null; - if (cancellationSignal != null) { - transport = CancellationSignal.createTransport(); - cancellationSignal.setRemote(transport); - } - - mService.requestTokenInfo(feature, request, transport, callback); + mService.requestTokenInfo(feature, request, + configureRemoteCancellationFuture(cancellationSignal, callbackExecutor), + callback); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -407,19 +403,9 @@ public final class OnDeviceIntelligenceManager { }; - IProcessingSignal transport = null; - if (processingSignal != null) { - transport = ProcessingSignal.createTransport(); - processingSignal.setRemote(transport); - } - - ICancellationSignal cancellationTransport = null; - if (cancellationSignal != null) { - cancellationTransport = CancellationSignal.createTransport(); - cancellationSignal.setRemote(cancellationTransport); - } - - mService.processRequest(feature, request, requestType, cancellationTransport, transport, + mService.processRequest(feature, request, requestType, + configureRemoteCancellationFuture(cancellationSignal, callbackExecutor), + configureRemoteProcessingSignalFuture(processingSignal, callbackExecutor), callback); } catch (RemoteException e) { @@ -449,7 +435,8 @@ public final class OnDeviceIntelligenceManager { * @param callbackExecutor executor to run the callback on. */ @RequiresPermission(Manifest.permission.USE_ON_DEVICE_INTELLIGENCE) - public void processRequestStreaming(@NonNull Feature feature, @NonNull @InferenceParams Bundle request, + public void processRequestStreaming(@NonNull Feature feature, + @NonNull @InferenceParams Bundle request, @RequestType int requestType, @Nullable CancellationSignal cancellationSignal, @Nullable ProcessingSignal processingSignal, @@ -500,20 +487,11 @@ public final class OnDeviceIntelligenceManager { } }; - IProcessingSignal transport = null; - if (processingSignal != null) { - transport = ProcessingSignal.createTransport(); - processingSignal.setRemote(transport); - } - - ICancellationSignal cancellationTransport = null; - if (cancellationSignal != null) { - cancellationTransport = CancellationSignal.createTransport(); - cancellationSignal.setRemote(cancellationTransport); - } - mService.processRequestStreaming( - feature, request, requestType, cancellationTransport, transport, callback); + feature, request, requestType, + configureRemoteCancellationFuture(cancellationSignal, callbackExecutor), + configureRemoteProcessingSignalFuture(processingSignal, callbackExecutor), + callback); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -574,4 +552,45 @@ public final class OnDeviceIntelligenceManager { @Target({ElementType.PARAMETER, ElementType.FIELD}) public @interface InferenceParams { } + + + @Nullable + private static AndroidFuture<IBinder> configureRemoteCancellationFuture( + @Nullable CancellationSignal cancellationSignal, + @NonNull Executor callbackExecutor) { + if (cancellationSignal == null) { + return null; + } + AndroidFuture<IBinder> cancellationFuture = new AndroidFuture<>(); + cancellationFuture.whenCompleteAsync( + (cancellationTransport, error) -> { + if (error != null || cancellationTransport == null) { + Log.e(TAG, "Unable to receive the remote cancellation signal.", error); + } else { + cancellationSignal.setRemote( + ICancellationSignal.Stub.asInterface(cancellationTransport)); + } + }, callbackExecutor); + return cancellationFuture; + } + + @Nullable + private static AndroidFuture<IBinder> configureRemoteProcessingSignalFuture( + ProcessingSignal processingSignal, Executor executor) { + if (processingSignal == null) { + return null; + } + AndroidFuture<IBinder> processingSignalFuture = new AndroidFuture<>(); + processingSignalFuture.whenCompleteAsync( + (transport, error) -> { + if (error != null || transport == null) { + Log.e(TAG, "Unable to receive the remote processing signal.", error); + } else { + processingSignal.setRemote(IProcessingSignal.Stub.asInterface(transport)); + } + }, executor); + return processingSignalFuture; + } + + } diff --git a/core/java/android/app/ondeviceintelligence/ProcessingSignal.java b/core/java/android/app/ondeviceintelligence/ProcessingSignal.java index c275cc786007..733f4fad96f4 100644 --- a/core/java/android/app/ondeviceintelligence/ProcessingSignal.java +++ b/core/java/android/app/ondeviceintelligence/ProcessingSignal.java @@ -123,10 +123,10 @@ public final class ProcessingSignal { * Sets the processing signal callback to be called when signals are received. * * This method is intended to be used by the recipient of a processing signal - * such as the remote implementation for {@link OnDeviceIntelligenceManager} to handle - * cancellation requests while performing a long-running operation. This method is not - * intended - * to be used by applications themselves. + * such as the remote implementation in + * {@link android.service.ondeviceintelligence.OnDeviceSandboxedInferenceService} to handle + * processing signals while performing a long-running operation. This method is not + * intended to be used by the caller themselves. * * If {@link ProcessingSignal#sendSignal} has already been called, then the provided callback * is invoked immediately and all previously queued actions are passed to remote signal. @@ -200,7 +200,7 @@ public final class ProcessingSignal { } /** - * Given a locally created transport, returns its associated cancellation signal. + * Given a locally created transport, returns its associated processing signal. * * @param transport The locally created transport, or null if none. * @return The associated processing signal, or null if none. diff --git a/core/java/android/service/ondeviceintelligence/IOnDeviceIntelligenceService.aidl b/core/java/android/service/ondeviceintelligence/IOnDeviceIntelligenceService.aidl index 6dbff7185f6f..908ab5f69775 100644 --- a/core/java/android/service/ondeviceintelligence/IOnDeviceIntelligenceService.aidl +++ b/core/java/android/service/ondeviceintelligence/IOnDeviceIntelligenceService.aidl @@ -41,7 +41,9 @@ oneway interface IOnDeviceIntelligenceService { void getFeatureDetails(int callerUid, in Feature feature, in IFeatureDetailsCallback featureDetailsCallback); void getReadOnlyFileDescriptor(in String fileName, in AndroidFuture<ParcelFileDescriptor> future); void getReadOnlyFeatureFileDescriptorMap(in Feature feature, in RemoteCallback remoteCallback); - void requestFeatureDownload(int callerUid, in Feature feature, in ICancellationSignal cancellationSignal, in IDownloadCallback downloadCallback); + void requestFeatureDownload(int callerUid, in Feature feature, + in AndroidFuture<ICancellationSignal> cancellationSignal, + in IDownloadCallback downloadCallback); void registerRemoteServices(in IRemoteProcessingService remoteProcessingService); void notifyInferenceServiceConnected(); void notifyInferenceServiceDisconnected(); diff --git a/core/java/android/service/ondeviceintelligence/IOnDeviceSandboxedInferenceService.aidl b/core/java/android/service/ondeviceintelligence/IOnDeviceSandboxedInferenceService.aidl index 799c7545968e..4213a0996e4c 100644 --- a/core/java/android/service/ondeviceintelligence/IOnDeviceSandboxedInferenceService.aidl +++ b/core/java/android/service/ondeviceintelligence/IOnDeviceSandboxedInferenceService.aidl @@ -24,6 +24,7 @@ import android.app.ondeviceintelligence.Feature; import android.os.ICancellationSignal; import android.os.PersistableBundle; import android.os.Bundle; +import com.android.internal.infra.AndroidFuture; import android.service.ondeviceintelligence.IRemoteStorageService; import android.service.ondeviceintelligence.IProcessingUpdateStatusCallback; @@ -34,13 +35,16 @@ import android.service.ondeviceintelligence.IProcessingUpdateStatusCallback; */ oneway interface IOnDeviceSandboxedInferenceService { void registerRemoteStorageService(in IRemoteStorageService storageService); - void requestTokenInfo(int callerUid, in Feature feature, in Bundle request, in ICancellationSignal cancellationSignal, + void requestTokenInfo(int callerUid, in Feature feature, in Bundle request, + in AndroidFuture<ICancellationSignal> cancellationSignal, in ITokenInfoCallback tokenInfoCallback); void processRequest(int callerUid, in Feature feature, in Bundle request, in int requestType, - in ICancellationSignal cancellationSignal, in IProcessingSignal processingSignal, + in AndroidFuture<ICancellationSignal> cancellationSignal, + in AndroidFuture<IProcessingSignal> processingSignal, in IResponseCallback callback); void processRequestStreaming(int callerUid, in Feature feature, in Bundle request, in int requestType, - in ICancellationSignal cancellationSignal, in IProcessingSignal processingSignal, + in AndroidFuture<ICancellationSignal> cancellationSignal, + in AndroidFuture<IProcessingSignal> processingSignal, in IStreamingResponseCallback callback); void updateProcessingState(in Bundle processingState, in IProcessingUpdateStatusCallback callback); diff --git a/core/java/android/service/ondeviceintelligence/OnDeviceIntelligenceService.java b/core/java/android/service/ondeviceintelligence/OnDeviceIntelligenceService.java index 93213182d284..86320b801f6c 100644 --- a/core/java/android/service/ondeviceintelligence/OnDeviceIntelligenceService.java +++ b/core/java/android/service/ondeviceintelligence/OnDeviceIntelligenceService.java @@ -148,14 +148,18 @@ public abstract class OnDeviceIntelligenceService extends Service { @Override public void requestFeatureDownload(int callerUid, Feature feature, - ICancellationSignal cancellationSignal, + AndroidFuture cancellationSignalFuture, IDownloadCallback downloadCallback) { Objects.requireNonNull(feature); Objects.requireNonNull(downloadCallback); - + ICancellationSignal transport = null; + if (cancellationSignalFuture != null) { + transport = CancellationSignal.createTransport(); + cancellationSignalFuture.complete(transport); + } OnDeviceIntelligenceService.this.onDownloadFeature(callerUid, feature, - CancellationSignal.fromTransport(cancellationSignal), + CancellationSignal.fromTransport(transport), wrapDownloadCallback(downloadCallback)); } diff --git a/core/java/android/service/ondeviceintelligence/OnDeviceSandboxedInferenceService.java b/core/java/android/service/ondeviceintelligence/OnDeviceSandboxedInferenceService.java index fc7a4c83f82c..96c45eef3731 100644 --- a/core/java/android/service/ondeviceintelligence/OnDeviceSandboxedInferenceService.java +++ b/core/java/android/service/ondeviceintelligence/OnDeviceSandboxedInferenceService.java @@ -122,46 +122,72 @@ public abstract class OnDeviceSandboxedInferenceService extends Service { @Override public void requestTokenInfo(int callerUid, Feature feature, Bundle request, - ICancellationSignal cancellationSignal, + AndroidFuture cancellationSignalFuture, ITokenInfoCallback tokenInfoCallback) { Objects.requireNonNull(feature); Objects.requireNonNull(tokenInfoCallback); + ICancellationSignal transport = null; + if (cancellationSignalFuture != null) { + transport = CancellationSignal.createTransport(); + cancellationSignalFuture.complete(transport); + } OnDeviceSandboxedInferenceService.this.onTokenInfoRequest(callerUid, feature, request, - CancellationSignal.fromTransport(cancellationSignal), + CancellationSignal.fromTransport(transport), wrapTokenInfoCallback(tokenInfoCallback)); } @Override public void processRequestStreaming(int callerUid, Feature feature, Bundle request, - int requestType, ICancellationSignal cancellationSignal, - IProcessingSignal processingSignal, + int requestType, + AndroidFuture cancellationSignalFuture, + AndroidFuture processingSignalFuture, IStreamingResponseCallback callback) { Objects.requireNonNull(feature); Objects.requireNonNull(callback); + ICancellationSignal transport = null; + if (cancellationSignalFuture != null) { + transport = CancellationSignal.createTransport(); + cancellationSignalFuture.complete(transport); + } + IProcessingSignal processingSignalTransport = null; + if (processingSignalFuture != null) { + processingSignalTransport = ProcessingSignal.createTransport(); + processingSignalFuture.complete(processingSignalTransport); + } OnDeviceSandboxedInferenceService.this.onProcessRequestStreaming(callerUid, feature, request, requestType, - CancellationSignal.fromTransport(cancellationSignal), - ProcessingSignal.fromTransport(processingSignal), + CancellationSignal.fromTransport(transport), + ProcessingSignal.fromTransport(processingSignalTransport), wrapStreamingResponseCallback(callback)); } @Override public void processRequest(int callerUid, Feature feature, Bundle request, - int requestType, ICancellationSignal cancellationSignal, - IProcessingSignal processingSignal, + int requestType, + AndroidFuture cancellationSignalFuture, + AndroidFuture processingSignalFuture, IResponseCallback callback) { Objects.requireNonNull(feature); Objects.requireNonNull(callback); - + ICancellationSignal transport = null; + if (cancellationSignalFuture != null) { + transport = CancellationSignal.createTransport(); + cancellationSignalFuture.complete(transport); + } + IProcessingSignal processingSignalTransport = null; + if (processingSignalFuture != null) { + processingSignalTransport = ProcessingSignal.createTransport(); + processingSignalFuture.complete(processingSignalTransport); + } OnDeviceSandboxedInferenceService.this.onProcessRequest(callerUid, feature, request, requestType, - CancellationSignal.fromTransport(cancellationSignal), - ProcessingSignal.fromTransport(processingSignal), + CancellationSignal.fromTransport(transport), + ProcessingSignal.fromTransport(processingSignalTransport), wrapResponseCallback(callback)); } @@ -206,7 +232,8 @@ public abstract class OnDeviceSandboxedInferenceService extends Service { * Invoked when caller provides a request for a particular feature to be processed in a * streaming manner. The expectation from the implementation is that when processing the * request, - * it periodically populates the {@link StreamingProcessingCallback#onPartialResult} to continuously + * it periodically populates the {@link StreamingProcessingCallback#onPartialResult} to + * continuously * provide partial Bundle results for the caller to utilize. Optionally the implementation can * provide the complete response in the {@link StreamingProcessingCallback#onResult} upon * processing completion. diff --git a/services/core/java/com/android/server/ondeviceintelligence/OnDeviceIntelligenceManagerService.java b/services/core/java/com/android/server/ondeviceintelligence/OnDeviceIntelligenceManagerService.java index 37023e14eb41..953300ac43a6 100644 --- a/services/core/java/com/android/server/ondeviceintelligence/OnDeviceIntelligenceManagerService.java +++ b/services/core/java/com/android/server/ondeviceintelligence/OnDeviceIntelligenceManagerService.java @@ -163,7 +163,7 @@ public class OnDeviceIntelligenceManagerService extends SystemService { } @Override - public void getVersion(RemoteCallback remoteCallback) throws RemoteException { + public void getVersion(RemoteCallback remoteCallback) { Slog.i(TAG, "OnDeviceIntelligenceManagerInternal getVersion"); Objects.requireNonNull(remoteCallback); mContext.enforceCallingOrSelfPermission( @@ -244,7 +244,7 @@ public class OnDeviceIntelligenceManagerService extends SystemService { @Override public void requestFeatureDownload(Feature feature, - ICancellationSignal cancellationSignal, + AndroidFuture cancellationSignalFuture, IDownloadCallback downloadCallback) throws RemoteException { Slog.i(TAG, "OnDeviceIntelligenceManagerInternal requestFeatureDownload"); Objects.requireNonNull(feature); @@ -261,16 +261,17 @@ public class OnDeviceIntelligenceManagerService extends SystemService { ensureRemoteIntelligenceServiceInitialized(); mRemoteOnDeviceIntelligenceService.run( service -> service.requestFeatureDownload(Binder.getCallingUid(), feature, - cancellationSignal, + cancellationSignalFuture, downloadCallback)); } @Override public void requestTokenInfo(Feature feature, - Bundle request, ICancellationSignal cancellationSignal, + Bundle request, + AndroidFuture cancellationSignalFuture, ITokenInfoCallback tokenInfoCallback) throws RemoteException { - Slog.i(TAG, "OnDeviceIntelligenceManagerInternal prepareFeatureProcessing"); + Slog.i(TAG, "OnDeviceIntelligenceManagerInternal requestTokenInfo"); Objects.requireNonNull(feature); Objects.requireNonNull(request); Objects.requireNonNull(tokenInfoCallback); @@ -285,10 +286,11 @@ public class OnDeviceIntelligenceManagerService extends SystemService { PersistableBundle.EMPTY); } ensureRemoteInferenceServiceInitialized(); + mRemoteInferenceService.run( service -> service.requestTokenInfo(Binder.getCallingUid(), feature, request, - cancellationSignal, + cancellationSignalFuture, tokenInfoCallback)); } @@ -296,8 +298,8 @@ public class OnDeviceIntelligenceManagerService extends SystemService { public void processRequest(Feature feature, Bundle request, int requestType, - ICancellationSignal cancellationSignal, - IProcessingSignal processingSignal, + AndroidFuture cancellationSignalFuture, + AndroidFuture processingSignalFuture, IResponseCallback responseCallback) throws RemoteException { Slog.i(TAG, "OnDeviceIntelligenceManagerInternal processRequest"); @@ -316,7 +318,7 @@ public class OnDeviceIntelligenceManagerService extends SystemService { mRemoteInferenceService.run( service -> service.processRequest(Binder.getCallingUid(), feature, request, requestType, - cancellationSignal, processingSignal, + cancellationSignalFuture, processingSignalFuture, responseCallback)); } @@ -324,8 +326,8 @@ public class OnDeviceIntelligenceManagerService extends SystemService { public void processRequestStreaming(Feature feature, Bundle request, int requestType, - ICancellationSignal cancellationSignal, - IProcessingSignal processingSignal, + AndroidFuture cancellationSignalFuture, + AndroidFuture processingSignalFuture, IStreamingResponseCallback streamingCallback) throws RemoteException { Slog.i(TAG, "OnDeviceIntelligenceManagerInternal processRequestStreaming"); Objects.requireNonNull(feature); @@ -343,7 +345,7 @@ public class OnDeviceIntelligenceManagerService extends SystemService { mRemoteInferenceService.run( service -> service.processRequestStreaming(Binder.getCallingUid(), feature, request, requestType, - cancellationSignal, processingSignal, + cancellationSignalFuture, processingSignalFuture, streamingCallback)); } @@ -356,7 +358,7 @@ public class OnDeviceIntelligenceManagerService extends SystemService { }; } - private void ensureRemoteIntelligenceServiceInitialized() throws RemoteException { + private void ensureRemoteIntelligenceServiceInitialized() { synchronized (mLock) { if (mRemoteOnDeviceIntelligenceService == null) { String serviceName = getServiceNames()[0]; @@ -388,25 +390,15 @@ public class OnDeviceIntelligenceManagerService extends SystemService { public void updateProcessingState( Bundle processingState, IProcessingUpdateStatusCallback callback) { - try { - ensureRemoteInferenceServiceInitialized(); - mRemoteInferenceService.run( - service -> service.updateProcessingState( - processingState, callback)); - } catch (RemoteException unused) { - try { - callback.onFailure( - OnDeviceIntelligenceException.PROCESSING_UPDATE_STATUS_CONNECTION_FAILED, - "Received failure invoking the remote processing service."); - } catch (RemoteException ex) { - Slog.w(TAG, "Failed to send failure status.", ex); - } - } + ensureRemoteInferenceServiceInitialized(); + mRemoteInferenceService.run( + service -> service.updateProcessingState( + processingState, callback)); } }; } - private void ensureRemoteInferenceServiceInitialized() throws RemoteException { + private void ensureRemoteInferenceServiceInitialized() { synchronized (mLock) { if (mRemoteInferenceService == null) { String serviceName = getServiceNames()[1]; @@ -457,34 +449,38 @@ public class OnDeviceIntelligenceManagerService extends SystemService { }; } - private static void validateServiceElevated(String serviceName, boolean checkIsolated) - throws RemoteException { - if (TextUtils.isEmpty(serviceName)) { - throw new IllegalArgumentException("Received null/empty service name : " + serviceName); - } - ComponentName serviceComponent = ComponentName.unflattenFromString( - serviceName); - ServiceInfo serviceInfo = AppGlobals.getPackageManager().getServiceInfo( - serviceComponent, - PackageManager.MATCH_DIRECT_BOOT_AWARE - | PackageManager.MATCH_DIRECT_BOOT_UNAWARE, 0); - if (serviceInfo != null) { - if (!checkIsolated) { - checkServiceRequiresPermission(serviceInfo, - Manifest.permission.BIND_ON_DEVICE_INTELLIGENCE_SERVICE); - return; + private void validateServiceElevated(String serviceName, boolean checkIsolated) { + try { + if (TextUtils.isEmpty(serviceName)) { + throw new IllegalStateException( + "Remote service is not configured to complete the request"); } + ComponentName serviceComponent = ComponentName.unflattenFromString( + serviceName); + ServiceInfo serviceInfo = AppGlobals.getPackageManager().getServiceInfo( + serviceComponent, + PackageManager.MATCH_DIRECT_BOOT_AWARE + | PackageManager.MATCH_DIRECT_BOOT_UNAWARE, 0); + 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"); + 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."); } - } else { - throw new RuntimeException( - "Could not find service info for serviceName: " + serviceName); + } catch (RemoteException e) { + throw new IllegalStateException("Could not fetch service info for remote services", e); } } @@ -542,7 +538,8 @@ public class OnDeviceIntelligenceManagerService extends SystemService { Manifest.permission.USE_ON_DEVICE_INTELLIGENCE, TAG); synchronized (mLock) { mTemporaryServiceNames = componentNames; - + mRemoteOnDeviceIntelligenceService = null; + mRemoteInferenceService = null; if (mTemporaryHandler == null) { mTemporaryHandler = new Handler(Looper.getMainLooper(), null, true) { @Override |