diff options
3 files changed, 40 insertions, 5 deletions
diff --git a/core/java/android/app/appfunctions/AppFunctionManager.java b/core/java/android/app/appfunctions/AppFunctionManager.java index 0a3891fe47a1..a66d59ba9cb6 100644 --- a/core/java/android/app/appfunctions/AppFunctionManager.java +++ b/core/java/android/app/appfunctions/AppFunctionManager.java @@ -27,6 +27,7 @@ import android.annotation.NonNull; import android.annotation.RequiresPermission; import android.annotation.SystemService; import android.annotation.UserHandleAware; +import android.app.appfunctions.AppFunctionManagerHelper.AppFunctionNotFoundException; import android.app.appsearch.AppSearchManager; import android.content.Context; import android.os.CancellationSignal; @@ -325,8 +326,28 @@ public final class AppFunctionManager { return; } + // Wrap the callback to convert AppFunctionNotFoundException to IllegalArgumentException + // to match the documentation. + OutcomeReceiver<Boolean, Exception> callbackWithExceptionInterceptor = + new OutcomeReceiver<>() { + @Override + public void onResult(@NonNull Boolean result) { + callback.onResult(result); + } + + @Override + public void onError(@NonNull Exception exception) { + if (exception instanceof AppFunctionNotFoundException) { + exception = new IllegalArgumentException(exception); + } + callback.onError(exception); + } + }; + AppFunctionManagerHelper.isAppFunctionEnabled( - functionIdentifier, targetPackage, appSearchManager, executor, callback); + functionIdentifier, targetPackage, appSearchManager, executor, + callbackWithExceptionInterceptor); + } private static class CallbackWrapper extends IAppFunctionEnabledCallback.Stub { diff --git a/core/java/android/app/appfunctions/AppFunctionManagerHelper.java b/core/java/android/app/appfunctions/AppFunctionManagerHelper.java index cc3ca03f423d..83abc048af8a 100644 --- a/core/java/android/app/appfunctions/AppFunctionManagerHelper.java +++ b/core/java/android/app/appfunctions/AppFunctionManagerHelper.java @@ -60,8 +60,8 @@ public class AppFunctionManagerHelper { * <p>If operation fails, the callback's {@link OutcomeReceiver#onError} is called with errors: * * <ul> - * <li>{@link IllegalArgumentException}, if the function is not found or the caller does not - * have access to it. + * <li>{@link AppFunctionNotFoundException}, if the function is not found or the caller does + * not have access to it. * </ul> * * @param functionIdentifier the identifier of the app function to check (unique within the @@ -216,7 +216,7 @@ public class AppFunctionManagerHelper { private static @NonNull Exception failedResultToException( @NonNull AppSearchResult appSearchResult) { return switch (appSearchResult.getResultCode()) { - case AppSearchResult.RESULT_INVALID_ARGUMENT -> new IllegalArgumentException( + case AppSearchResult.RESULT_INVALID_ARGUMENT -> new AppFunctionNotFoundException( appSearchResult.getErrorMessage()); case AppSearchResult.RESULT_IO_ERROR -> new IOException( appSearchResult.getErrorMessage()); @@ -225,4 +225,15 @@ public class AppFunctionManagerHelper { default -> new IllegalStateException(appSearchResult.getErrorMessage()); }; } + + /** + * Throws when the app function is not found. + * + * @hide + */ + public static class AppFunctionNotFoundException extends RuntimeException { + private AppFunctionNotFoundException(@NonNull String errorMessage) { + super(errorMessage); + } + } } diff --git a/services/appfunctions/java/com/android/server/appfunctions/AppFunctionManagerServiceImpl.java b/services/appfunctions/java/com/android/server/appfunctions/AppFunctionManagerServiceImpl.java index 43764442e2cf..d0ee7af1bbfb 100644 --- a/services/appfunctions/java/com/android/server/appfunctions/AppFunctionManagerServiceImpl.java +++ b/services/appfunctions/java/com/android/server/appfunctions/AppFunctionManagerServiceImpl.java @@ -27,6 +27,7 @@ import android.annotation.WorkerThread; import android.app.appfunctions.AppFunctionException; import android.app.appfunctions.AppFunctionManager; import android.app.appfunctions.AppFunctionManagerHelper; +import android.app.appfunctions.AppFunctionManagerHelper.AppFunctionNotFoundException; import android.app.appfunctions.AppFunctionRuntimeMetadata; import android.app.appfunctions.AppFunctionStaticMetadataHelper; import android.app.appfunctions.ExecuteAppFunctionAidlRequest; @@ -513,7 +514,9 @@ public class AppFunctionManagerServiceImpl extends IAppFunctionManager.Stub { e = e.getCause(); } int resultCode = AppFunctionException.ERROR_SYSTEM_ERROR; - if (e instanceof AppSearchException appSearchException) { + if (e instanceof AppFunctionNotFoundException) { + resultCode = AppFunctionException.ERROR_FUNCTION_NOT_FOUND; + } else if (e instanceof AppSearchException appSearchException) { resultCode = mapAppSearchResultFailureCodeToExecuteAppFunctionResponse( appSearchException.getResultCode()); |