Add a dedicated error code for missing function ID
Flag: android.app.appfunctions.flags.enable_app_function_manager
Test: CTS
Bug: 375121362
Change-Id: I917df5c09090e549dade1c666e3d2ccaa8e8ac92
diff --git a/core/api/current.txt b/core/api/current.txt
index fa2060c..522d2f2 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -8836,9 +8836,10 @@
field public static final int RESULT_CANCELLED = 2001; // 0x7d1
field public static final int RESULT_DENIED = 1000; // 0x3e8
field public static final int RESULT_DISABLED = 1002; // 0x3ea
- field public static final int RESULT_INTERNAL_ERROR = 2000; // 0x7d0
+ field public static final int RESULT_FUNCTION_NOT_FOUND = 1003; // 0x3eb
field public static final int RESULT_INVALID_ARGUMENT = 1001; // 0x3e9
field public static final int RESULT_OK = 0; // 0x0
+ field public static final int RESULT_SYSTEM_ERROR = 2000; // 0x7d0
}
}
diff --git a/core/java/android/app/appfunctions/ExecuteAppFunctionResponse.java b/core/java/android/app/appfunctions/ExecuteAppFunctionResponse.java
index 7e34099..cdf02e6 100644
--- a/core/java/android/app/appfunctions/ExecuteAppFunctionResponse.java
+++ b/core/java/android/app/appfunctions/ExecuteAppFunctionResponse.java
@@ -99,18 +99,23 @@
/**
* The caller tried to execute a disabled app function.
*
- * <p>This error is in the request error category.
- *
* <p>This error is in the {@link #ERROR_CATEGORY_REQUEST_ERROR} category.
*/
public static final int RESULT_DISABLED = 1002;
/**
+ * The caller tried to execute a function that does not exist.
+ *
+ * <p>This error is in the {@link #ERROR_CATEGORY_REQUEST_ERROR} category.
+ */
+ public static final int RESULT_FUNCTION_NOT_FOUND = 1003;
+
+ /**
* An internal unexpected error coming from the system.
*
* <p>This error is in the {@link #ERROR_CATEGORY_SYSTEM} category.
*/
- public static final int RESULT_INTERNAL_ERROR = 2000;
+ public static final int RESULT_SYSTEM_ERROR = 2000;
/**
* The operation was cancelled. Use this error code to report that a cancellation is done after
@@ -369,7 +374,8 @@
RESULT_OK,
RESULT_DENIED,
RESULT_APP_UNKNOWN_ERROR,
- RESULT_INTERNAL_ERROR,
+ RESULT_FUNCTION_NOT_FOUND,
+ RESULT_SYSTEM_ERROR,
RESULT_INVALID_ARGUMENT,
RESULT_DISABLED,
RESULT_CANCELLED
diff --git a/libs/appfunctions/api/current.txt b/libs/appfunctions/api/current.txt
index 89cdba8..faf84a8 100644
--- a/libs/appfunctions/api/current.txt
+++ b/libs/appfunctions/api/current.txt
@@ -52,9 +52,10 @@
field public static final int RESULT_CANCELLED = 2001; // 0x7d1
field public static final int RESULT_DENIED = 1000; // 0x3e8
field public static final int RESULT_DISABLED = 1002; // 0x3ea
- field public static final int RESULT_INTERNAL_ERROR = 2000; // 0x7d0
+ field public static final int RESULT_FUNCTION_NOT_FOUND = 1003; // 0x3eb
field public static final int RESULT_INVALID_ARGUMENT = 1001; // 0x3e9
field public static final int RESULT_OK = 0; // 0x0
+ field public static final int RESULT_SYSTEM_ERROR = 2000; // 0x7d0
}
}
diff --git a/libs/appfunctions/java/com/google/android/appfunctions/sidecar/ExecuteAppFunctionResponse.java b/libs/appfunctions/java/com/google/android/appfunctions/sidecar/ExecuteAppFunctionResponse.java
index bf4ab45..4e88fb0 100644
--- a/libs/appfunctions/java/com/google/android/appfunctions/sidecar/ExecuteAppFunctionResponse.java
+++ b/libs/appfunctions/java/com/google/android/appfunctions/sidecar/ExecuteAppFunctionResponse.java
@@ -76,18 +76,23 @@
/**
* The caller tried to execute a disabled app function.
*
- * <p>This error is in the request error category.
- *
* <p>This error is in the {@link #ERROR_CATEGORY_REQUEST_ERROR} category.
*/
public static final int RESULT_DISABLED = 1002;
/**
+ * The caller tried to execute a function that does not exist.
+ *
+ * <p>This error is in the {@link #ERROR_CATEGORY_REQUEST_ERROR} category.
+ */
+ public static final int RESULT_FUNCTION_NOT_FOUND = 1003;
+
+ /**
* An internal unexpected error coming from the system.
*
* <p>This error is in the {@link #ERROR_CATEGORY_SYSTEM} category.
*/
- public static final int RESULT_INTERNAL_ERROR = 2000;
+ public static final int RESULT_SYSTEM_ERROR = 2000;
/**
* The operation was cancelled. Use this error code to report that a cancellation is done after
@@ -327,7 +332,8 @@
RESULT_OK,
RESULT_DENIED,
RESULT_APP_UNKNOWN_ERROR,
- RESULT_INTERNAL_ERROR,
+ RESULT_SYSTEM_ERROR,
+ RESULT_FUNCTION_NOT_FOUND,
RESULT_INVALID_ARGUMENT,
RESULT_DISABLED,
RESULT_CANCELLED
diff --git a/libs/appfunctions/tests/src/com/google/android/appfunctions/sidecar/tests/SidecarConverterTest.kt b/libs/appfunctions/tests/src/com/google/android/appfunctions/sidecar/tests/SidecarConverterTest.kt
index 1f9fddd..264f842 100644
--- a/libs/appfunctions/tests/src/com/google/android/appfunctions/sidecar/tests/SidecarConverterTest.kt
+++ b/libs/appfunctions/tests/src/com/google/android/appfunctions/sidecar/tests/SidecarConverterTest.kt
@@ -105,7 +105,7 @@
val emptyGd = GenericDocument.Builder<GenericDocument.Builder<*>>("", "", "").build()
val platformResponse =
ExecuteAppFunctionResponse.newFailure(
- ExecuteAppFunctionResponse.RESULT_INTERNAL_ERROR,
+ ExecuteAppFunctionResponse.RESULT_SYSTEM_ERROR,
null,
null
)
@@ -119,7 +119,7 @@
assertThat(sidecarResponse.resultDocument.id).isEqualTo(emptyGd.id)
assertThat(sidecarResponse.resultDocument.schemaType).isEqualTo(emptyGd.schemaType)
assertThat(sidecarResponse.resultCode)
- .isEqualTo(ExecuteAppFunctionResponse.RESULT_INTERNAL_ERROR)
+ .isEqualTo(ExecuteAppFunctionResponse.RESULT_SYSTEM_ERROR)
assertThat(sidecarResponse.errorMessage).isNull()
}
@@ -152,7 +152,7 @@
val emptyGd = GenericDocument.Builder<GenericDocument.Builder<*>>("", "", "").build()
val sidecarResponse =
com.google.android.appfunctions.sidecar.ExecuteAppFunctionResponse.newFailure(
- ExecuteAppFunctionResponse.RESULT_INTERNAL_ERROR,
+ ExecuteAppFunctionResponse.RESULT_SYSTEM_ERROR,
null,
null
)
@@ -166,7 +166,7 @@
assertThat(platformResponse.resultDocument.id).isEqualTo(emptyGd.id)
assertThat(platformResponse.resultDocument.schemaType).isEqualTo(emptyGd.schemaType)
assertThat(platformResponse.resultCode)
- .isEqualTo(ExecuteAppFunctionResponse.RESULT_INTERNAL_ERROR)
+ .isEqualTo(ExecuteAppFunctionResponse.RESULT_SYSTEM_ERROR)
assertThat(platformResponse.errorMessage).isNull()
}
}
diff --git a/services/appfunctions/java/com/android/server/appfunctions/AppFunctionManagerServiceImpl.java b/services/appfunctions/java/com/android/server/appfunctions/AppFunctionManagerServiceImpl.java
index 89f14b0..268e564 100644
--- a/services/appfunctions/java/com/android/server/appfunctions/AppFunctionManagerServiceImpl.java
+++ b/services/appfunctions/java/com/android/server/appfunctions/AppFunctionManagerServiceImpl.java
@@ -86,7 +86,6 @@
private final Context mContext;
private final Map<String, Object> mLocks = new WeakHashMap<>();
-
public AppFunctionManagerServiceImpl(@NonNull Context context) {
this(
context,
@@ -201,7 +200,7 @@
if (mCallerValidator.isUserOrganizationManaged(targetUser)) {
safeExecuteAppFunctionCallback.onResult(
ExecuteAppFunctionResponse.newFailure(
- ExecuteAppFunctionResponse.RESULT_INTERNAL_ERROR,
+ ExecuteAppFunctionResponse.RESULT_SYSTEM_ERROR,
"Cannot run on a device with a device owner or from the managed"
+ " profile.",
/* extras= */ null));
@@ -256,7 +255,7 @@
if (serviceIntent == null) {
safeExecuteAppFunctionCallback.onResult(
ExecuteAppFunctionResponse.newFailure(
- ExecuteAppFunctionResponse.RESULT_INTERNAL_ERROR,
+ ExecuteAppFunctionResponse.RESULT_SYSTEM_ERROR,
"Cannot find the target service.",
/* extras= */ null));
return;
@@ -449,7 +448,7 @@
Slog.e(TAG, "Failed to bind to the AppFunctionService");
safeExecuteAppFunctionCallback.onResult(
ExecuteAppFunctionResponse.newFailure(
- ExecuteAppFunctionResponse.RESULT_INTERNAL_ERROR,
+ ExecuteAppFunctionResponse.RESULT_SYSTEM_ERROR,
"Failed to bind the AppFunctionService.",
/* extras= */ null));
}
@@ -464,7 +463,7 @@
if (e instanceof CompletionException) {
e = e.getCause();
}
- int resultCode = ExecuteAppFunctionResponse.RESULT_INTERNAL_ERROR;
+ int resultCode = ExecuteAppFunctionResponse.RESULT_SYSTEM_ERROR;
if (e instanceof AppSearchException appSearchException) {
resultCode =
mapAppSearchResultFailureCodeToExecuteAppFunctionResponse(
@@ -486,13 +485,13 @@
switch (resultCode) {
case AppSearchResult.RESULT_NOT_FOUND:
- return ExecuteAppFunctionResponse.RESULT_INVALID_ARGUMENT;
+ return ExecuteAppFunctionResponse.RESULT_FUNCTION_NOT_FOUND;
case AppSearchResult.RESULT_INVALID_ARGUMENT:
case AppSearchResult.RESULT_INTERNAL_ERROR:
case AppSearchResult.RESULT_SECURITY_ERROR:
// fall-through
}
- return ExecuteAppFunctionResponse.RESULT_INTERNAL_ERROR;
+ return ExecuteAppFunctionResponse.RESULT_SYSTEM_ERROR;
}
private void registerAppSearchObserver(@NonNull TargetUser user) {
@@ -543,12 +542,13 @@
});
}
}
+
/**
* Retrieves the lock object associated with the given package name.
*
- * This method returns the lock object from the {@code mLocks} map if it exists.
- * If no lock is found for the given package name, a new lock object is created,
- * stored in the map, and returned.
+ * <p>This method returns the lock object from the {@code mLocks} map if it exists. If no lock
+ * is found for the given package name, a new lock object is created, stored in the map, and
+ * returned.
*/
@VisibleForTesting
@NonNull