From 2e6ebbc453ddd873c3ef9616de9537d856e55db6 Mon Sep 17 00:00:00 2001 From: Anthony Stange Date: Thu, 11 Feb 2021 18:08:15 +0000 Subject: [PATCH] Add new ContextHubTransaction error code To support synchronous sendMessageToNanoapp failures resulting from invalid permissions, add a new error code that indicates the transaction failed due to invalid permissions. Also adds a recommendation for how apps should behave when interacting with nanoapps. Bug: 166846988 Test: compile Change-Id: I189b387fbcd5c4425a12391e4413519f6befae5e --- core/api/system-current.txt | 1 + .../hardware/location/ContextHubClient.java | 14 ++++++++++++++ .../location/ContextHubClientCallback.java | 9 +++++---- .../hardware/location/ContextHubTransaction.java | 8 +++++++- 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/core/api/system-current.txt b/core/api/system-current.txt index f5a22543f9405..e0cecac4d89a2 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -3506,6 +3506,7 @@ package android.hardware.location { field public static final int RESULT_FAILED_BAD_PARAMS = 2; // 0x2 field public static final int RESULT_FAILED_BUSY = 4; // 0x4 field public static final int RESULT_FAILED_HAL_UNAVAILABLE = 8; // 0x8 + field public static final int RESULT_FAILED_PERMISSION_DENIED = 9; // 0x9 field public static final int RESULT_FAILED_SERVICE_INTERNAL_FAILURE = 7; // 0x7 field public static final int RESULT_FAILED_TIMEOUT = 6; // 0x6 field public static final int RESULT_FAILED_UNINITIALIZED = 3; // 0x3 diff --git a/core/java/android/hardware/location/ContextHubClient.java b/core/java/android/hardware/location/ContextHubClient.java index 43480ab9cc44c..49beeb3a2e967 100644 --- a/core/java/android/hardware/location/ContextHubClient.java +++ b/core/java/android/hardware/location/ContextHubClient.java @@ -127,6 +127,20 @@ public class ContextHubClient implements Closeable { * This function returns RESULT_SUCCESS if the message has reached the HAL, but * does not guarantee delivery of the message to the target nanoapp. * + * Before sending the first message to your nanoapp, it's recommended that the following + * operations should be performed: + * 1) Invoke {@link ContextHubManager#queryNanoApps(ContextHubInfo)} to verify the nanoapp is + * present. + * 2) Validate that you have the permissions to communicate with the nanoapp by looking at + * {@link NanoAppState#getNanoAppPermissions}. + * 3) If you don't have permissions, send an idempotent message to the nanoapp ensuring any + * work your app previously may have asked it to do is stopped. This is useful if your app + * restarts due to permission changes and no longer has the permissions when it is started + * again. + * 4) If you have valid permissions, send a message to your nanoapp to resubscribe so that it's + * aware you have restarted or so you can initially subscribe if this is the first time you + * have sent it a message. + * * @param message the message object to send * * @return the result of sending the message defined as in ContextHubTransaction.Result diff --git a/core/java/android/hardware/location/ContextHubClientCallback.java b/core/java/android/hardware/location/ContextHubClientCallback.java index b31b85fdabf67..7e484dda283c2 100644 --- a/core/java/android/hardware/location/ContextHubClientCallback.java +++ b/core/java/android/hardware/location/ContextHubClientCallback.java @@ -117,10 +117,11 @@ public class ContextHubClientCallback { * 4) {@link ContextHubClient} performs any cleanup required with the nanoapp * 5) Callback invoked with the nanoapp ID and {@link ContextHubManager#AUTHORIZATION_DENIED}. * At this point, any further attempts of communication between the nanoapp and the - * {@link ContextHubClient} will be dropped by the contexthub along with - * {@link ContextHubManager#AUTHORIZATION_DENIED} being sent. The {@link ContextHubClient} - * should assume no communciation can happen again until - * {@link ContextHubManager#AUTHORIZATION_GRANTED} is received. + * {@link ContextHubClient} will be dropped by the contexthub and a return value of + * {@link ContextHubTransaction#RESULT_FAILED_PERMISSION_DENIED} will be used when calling + * {@link ContextHubClient#sendMessageToNanoApp}. The {@link ContextHubClient} should assume + * no communciation can happen again until {@link ContextHubManager#AUTHORIZATION_GRANTED} is + * received. * * @param client the client that is associated with this callback * @param nanoAppId the ID of the nanoapp associated with the new diff --git a/core/java/android/hardware/location/ContextHubTransaction.java b/core/java/android/hardware/location/ContextHubTransaction.java index d11e0a9b60819..86f77c0bf1386 100644 --- a/core/java/android/hardware/location/ContextHubTransaction.java +++ b/core/java/android/hardware/location/ContextHubTransaction.java @@ -81,7 +81,8 @@ public class ContextHubTransaction { RESULT_FAILED_AT_HUB, RESULT_FAILED_TIMEOUT, RESULT_FAILED_SERVICE_INTERNAL_FAILURE, - RESULT_FAILED_HAL_UNAVAILABLE + RESULT_FAILED_HAL_UNAVAILABLE, + RESULT_FAILED_PERMISSION_DENIED }) public @interface Result {} public static final int RESULT_SUCCESS = 0; @@ -117,6 +118,11 @@ public class ContextHubTransaction { * Failure mode when the Context Hub HAL was not available. */ public static final int RESULT_FAILED_HAL_UNAVAILABLE = 8; + /** + * Failure mode when the user of the API doesn't have the required permissions to perform the + * operation. + */ + public static final int RESULT_FAILED_PERMISSION_DENIED = 9; /** * A class describing the response for a ContextHubTransaction.