summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/location/contexthub/ContextHubService.java97
-rw-r--r--services/core/java/com/android/server/location/contexthub/ContextHubServiceUtil.java18
-rw-r--r--services/core/java/com/android/server/location/contexthub/IContextHubWrapper.java138
-rw-r--r--services/core/java/com/android/server/location/contexthub/NanoAppStateManager.java34
4 files changed, 198 insertions, 89 deletions
diff --git a/services/core/java/com/android/server/location/contexthub/ContextHubService.java b/services/core/java/com/android/server/location/contexthub/ContextHubService.java
index fa84d127697f..27a78dd17d27 100644
--- a/services/core/java/com/android/server/location/contexthub/ContextHubService.java
+++ b/services/core/java/com/android/server/location/contexthub/ContextHubService.java
@@ -16,6 +16,7 @@
package com.android.server.location.contexthub;
+import android.annotation.IntDef;
import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.PendingIntent;
@@ -27,12 +28,6 @@ import android.content.pm.UserInfo;
import android.database.ContentObserver;
import android.hardware.SensorPrivacyManager;
import android.hardware.SensorPrivacyManagerInternal;
-import android.hardware.contexthub.V1_0.AsyncEventType;
-import android.hardware.contexthub.V1_0.ContextHubMsg;
-import android.hardware.contexthub.V1_0.Result;
-import android.hardware.contexthub.V1_0.TransactionResult;
-import android.hardware.contexthub.V1_2.HubAppInfo;
-import android.hardware.contexthub.V1_2.IContexthubCallback;
import android.hardware.location.ContextHubInfo;
import android.hardware.location.ContextHubMessage;
import android.hardware.location.ContextHubTransaction;
@@ -66,6 +61,8 @@ import com.android.server.location.ContextHubServiceProto;
import java.io.FileDescriptor;
import java.io.PrintWriter;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.ArrayList;
@@ -96,6 +93,20 @@ public class ContextHubService extends IContextHubService.Stub {
private static final int OS_APP_INSTANCE = -1;
+ /**
+ * Constants describing an async event from the Context Hub.
+ * {@hide}
+ */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(prefix = { "CONTEXT_HUB_EVENT_" }, value = {
+ CONTEXT_HUB_EVENT_UNKNOWN,
+ CONTEXT_HUB_EVENT_RESTARTED,
+ })
+ public @interface Type { }
+
+ public static final int CONTEXT_HUB_EVENT_UNKNOWN = 0;
+ public static final int CONTEXT_HUB_EVENT_RESTARTED = 1;
+
/*
* Local flag to enable debug logging.
*/
@@ -135,7 +146,7 @@ public class ContextHubService extends IContextHubService.Stub {
/**
* Class extending the callback to register with a Context Hub.
*/
- private class ContextHubServiceCallback extends IContexthubCallback.Stub {
+ private class ContextHubServiceCallback implements IContextHubWrapper.ICallback {
private final int mContextHubId;
ContextHubServiceCallback(int contextHubId) {
@@ -143,46 +154,31 @@ public class ContextHubService extends IContextHubService.Stub {
}
@Override
- public void handleClientMsg(ContextHubMsg message) {
- handleClientMessageCallback(mContextHubId, message,
- Collections.emptyList() /* nanoappPermissions */,
- Collections.emptyList() /* messagePermissions */);
- }
-
- @Override
- public void handleTxnResult(int transactionId, int result) {
- handleTransactionResultCallback(mContextHubId, transactionId,
- result == TransactionResult.SUCCESS);
+ public void handleTransactionResult(int transactionId, boolean success) {
+ handleTransactionResultCallback(mContextHubId, transactionId, success);
}
@Override
- public void handleHubEvent(int eventType) {
+ public void handleContextHubEvent(int eventType) {
handleHubEventCallback(mContextHubId, eventType);
}
@Override
- public void handleAppAbort(long nanoAppId, int abortCode) {
- handleAppAbortCallback(mContextHubId, nanoAppId, abortCode);
+ public void handleNanoappAbort(long nanoappId, int abortCode) {
+ handleAppAbortCallback(mContextHubId, nanoappId, abortCode);
}
@Override
- public void handleAppsInfo(
- ArrayList<android.hardware.contexthub.V1_0.HubAppInfo> nanoAppInfoList) {
- handleQueryAppsCallback(mContextHubId,
- ContextHubServiceUtil.toHubAppInfo_1_2(nanoAppInfoList));
+ public void handleNanoappInfo(List<NanoAppState> nanoappStateList) {
+ handleQueryAppsCallback(mContextHubId, nanoappStateList);
}
@Override
- public void handleClientMsg_1_2(android.hardware.contexthub.V1_2.ContextHubMsg message,
- ArrayList<String> messagePermissions) {
- handleClientMessageCallback(mContextHubId, message.msg_1_0, message.permissions,
+ public void handleNanoappMessage(short hostEndpointId, NanoAppMessage message,
+ List<String> nanoappPermissions, List<String> messagePermissions) {
+ handleClientMessageCallback(mContextHubId, hostEndpointId, message, nanoappPermissions,
messagePermissions);
}
-
- @Override
- public void handleAppsInfo_1_2(ArrayList<HubAppInfo> nanoAppInfoList) {
- handleQueryAppsCallback(mContextHubId, nanoAppInfoList);
- }
}
public ContextHubService(Context context) {
@@ -329,7 +325,7 @@ public class ContextHubService extends IContextHubService.Stub {
@Override
public void onHubReset() {
- byte[] data = {TransactionResult.SUCCESS};
+ byte[] data = {android.hardware.contexthub.V1_0.TransactionResult.SUCCESS};
onMessageReceiptOldApi(MSG_HUB_RESET, contextHubId, OS_APP_INSTANCE, data);
}
@@ -565,12 +561,12 @@ public class ContextHubService extends IContextHubService.Stub {
* cache or as a result of an explicit query requested by a client through the sendMessage API.
*
* @param contextHubId the ID of the hub to do the query
- * @return the result of the query
+ * @return true if the query succeeded
* @throws IllegalStateException if the transaction queue is full
*/
- private int queryNanoAppsInternal(int contextHubId) {
+ private boolean queryNanoAppsInternal(int contextHubId) {
if (mContextHubWrapper == null) {
- return Result.UNKNOWN_FAILURE;
+ return false;
}
IContextHubTransactionCallback onCompleteCallback =
@@ -579,7 +575,7 @@ public class ContextHubService extends IContextHubService.Stub {
contextHubId, onCompleteCallback, getCallingPackageName());
mTransactionManager.addTransaction(transaction);
- return Result.OK;
+ return true;
}
@Override
@@ -605,7 +601,7 @@ public class ContextHubService extends IContextHubService.Stub {
boolean success = false;
if (nanoAppHandle == OS_APP_INSTANCE) {
if (msg.getMsgType() == MSG_QUERY_NANO_APPS) {
- success = (queryNanoAppsInternal(contextHubHandle) == Result.OK);
+ success = queryNanoAppsInternal(contextHubHandle);
} else {
Log.e(TAG, "Invalid OS message params of type " + msg.getMsgType());
}
@@ -631,16 +627,16 @@ public class ContextHubService extends IContextHubService.Stub {
* Handles a unicast or broadcast message from a nanoapp.
*
* @param contextHubId the ID of the hub the message came from
+ * @param hostEndpointId the host endpoint ID of the client receiving this message
* @param message the message contents
* @param reqPermissions the permissions required to consume this message
*/
private void handleClientMessageCallback(
- int contextHubId, ContextHubMsg message, List<String> nanoappPermissions,
+ int contextHubId, short hostEndpointId, NanoAppMessage message,
+ List<String> nanoappPermissions,
List<String> messagePermissions) {
- NanoAppMessage clientMessage = ContextHubServiceUtil.createNanoAppMessage(message);
mClientManager.onMessageFromNanoApp(
- contextHubId, message.hostEndPoint, clientMessage, nanoappPermissions,
- messagePermissions);
+ contextHubId, hostEndpointId, message, nanoappPermissions, messagePermissions);
}
/**
@@ -690,10 +686,10 @@ public class ContextHubService extends IContextHubService.Stub {
* Handles an asynchronous event from a Context Hub.
*
* @param contextHubId the ID of the hub the response came from
- * @param eventType the type of the event as defined in Context Hub HAL AsyncEventType
+ * @param eventType the type of the event as in CONTEXT_HUB_EVENT_*
*/
private void handleHubEventCallback(int contextHubId, int eventType) {
- if (eventType == AsyncEventType.RESTARTED) {
+ if (eventType == CONTEXT_HUB_EVENT_RESTARTED) {
sendLocationSettingUpdate();
sendWifiSettingUpdate(true /* forceUpdate */);
sendAirplaneModeSettingUpdate();
@@ -723,15 +719,12 @@ public class ContextHubService extends IContextHubService.Stub {
/**
* Handles a query response from a Context Hub.
*
- * @param contextHubId the ID of the hub of the response
- * @param nanoAppInfoList the list of loaded nanoapps
+ * @param contextHubId the ID of the hub of the response
+ * @param nanoappStateList the list of loaded nanoapps
*/
- private void handleQueryAppsCallback(int contextHubId, List<HubAppInfo> nanoAppInfoList) {
- List<NanoAppState> nanoAppStateList =
- ContextHubServiceUtil.createNanoAppStateList(nanoAppInfoList);
-
- mNanoAppStateManager.updateCache(contextHubId, nanoAppInfoList);
- mTransactionManager.onQueryResponse(nanoAppStateList);
+ private void handleQueryAppsCallback(int contextHubId, List<NanoAppState> nanoappStateList) {
+ mNanoAppStateManager.updateCache(contextHubId, nanoappStateList);
+ mTransactionManager.onQueryResponse(nanoappStateList);
}
/**
diff --git a/services/core/java/com/android/server/location/contexthub/ContextHubServiceUtil.java b/services/core/java/com/android/server/location/contexthub/ContextHubServiceUtil.java
index d0e00c481e43..df6cc0517964 100644
--- a/services/core/java/com/android/server/location/contexthub/ContextHubServiceUtil.java
+++ b/services/core/java/com/android/server/location/contexthub/ContextHubServiceUtil.java
@@ -20,6 +20,7 @@ import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import android.Manifest;
import android.content.Context;
+import android.hardware.contexthub.V1_0.AsyncEventType;
import android.hardware.contexthub.V1_0.ContextHubMsg;
import android.hardware.contexthub.V1_0.HostEndPoint;
import android.hardware.contexthub.V1_0.Result;
@@ -256,4 +257,21 @@ import java.util.List;
}
return newAppInfo;
}
+
+ /**
+ * Converts a HIDL AsyncEventType to the corresponding ContextHubService.CONTEXT_HUB_EVENT_*.
+ *
+ * @param hidlEventType The AsyncEventType value.
+ * @return The converted event type.
+ */
+ /* package */
+ static int toContextHubEvent(int hidlEventType) {
+ switch (hidlEventType) {
+ case AsyncEventType.RESTARTED:
+ return ContextHubService.CONTEXT_HUB_EVENT_RESTARTED;
+ default:
+ Log.e(TAG, "toContextHubEvent: Unknown event type: " + hidlEventType);
+ return ContextHubService.CONTEXT_HUB_EVENT_UNKNOWN;
+ }
+ }
}
diff --git a/services/core/java/com/android/server/location/contexthub/IContextHubWrapper.java b/services/core/java/com/android/server/location/contexthub/IContextHubWrapper.java
index 092e1a1be7ee..d733db009726 100644
--- a/services/core/java/com/android/server/location/contexthub/IContextHubWrapper.java
+++ b/services/core/java/com/android/server/location/contexthub/IContextHubWrapper.java
@@ -15,16 +15,20 @@
*/
package com.android.server.location.contexthub;
+import android.annotation.NonNull;
import android.annotation.Nullable;
import android.hardware.contexthub.V1_0.ContextHub;
import android.hardware.contexthub.V1_0.ContextHubMsg;
+import android.hardware.contexthub.V1_0.TransactionResult;
import android.hardware.contexthub.V1_1.Setting;
import android.hardware.contexthub.V1_1.SettingValue;
+import android.hardware.contexthub.V1_2.HubAppInfo;
import android.hardware.contexthub.V1_2.IContexthubCallback;
import android.hardware.location.ContextHubInfo;
import android.hardware.location.ContextHubTransaction;
import android.hardware.location.NanoAppBinary;
import android.hardware.location.NanoAppMessage;
+import android.hardware.location.NanoAppState;
import android.os.RemoteException;
import android.util.Log;
import android.util.Pair;
@@ -41,6 +45,45 @@ public abstract class IContextHubWrapper {
private static final String TAG = "IContextHubWrapper";
/**
+ * The callback interface to use in registerCallback.
+ */
+ public interface ICallback {
+ /**
+ * @param transactionId The ID of the transaction that completed.
+ * @param success true if the transaction succeeded.
+ */
+ void handleTransactionResult(int transactionId, boolean success);
+
+ /**
+ * @param eventType The Context Hub event type defined by ContextHubService
+ * .CONTEXT_HUB_EVENT_*.
+ */
+ void handleContextHubEvent(int eventType);
+
+ /**
+ * @param nanoappId The ID of the nanoapp that aborted.
+ * @param abortCode The nanoapp-defined abort code.
+ */
+ void handleNanoappAbort(long nanoappId, int abortCode);
+
+ /**
+ * @param nanoappStateList The list of loaded nanoapps on the Context Hub.
+ */
+ void handleNanoappInfo(List<NanoAppState> nanoappStateList);
+
+ /**
+ * Handles a message from a nanoapp to a ContextHubClient.
+ *
+ * @param hostEndpointId The host endpoint ID of the recipient.
+ * @param message The message from the nanoapp.
+ * @param nanoappPermissions The list of permissions held by the nanoapp.
+ * @param messagePermissions The list of permissions required to receive the message.
+ */
+ void handleNanoappMessage(short hostEndpointId, NanoAppMessage message,
+ List<String> nanoappPermissions, List<String> messagePermissions);
+ }
+
+ /**
* Attempts to connect to the Contexthub HAL 1.0 service, if it exists.
*
* @return A valid IContextHubWrapper if the connection was successful, null otherwise.
@@ -103,12 +146,6 @@ public abstract class IContextHubWrapper {
public abstract Pair<List<ContextHubInfo>, List<String>> getHubs() throws RemoteException;
/**
- * Calls the appropriate registerCallback function depending on the HAL version.
- */
- public abstract void registerCallback(
- int hubId, IContexthubCallback callback) throws RemoteException;
-
- /**
* @return True if this version of the Contexthub HAL supports Location setting notifications.
*/
public abstract boolean supportsLocationSettingNotifications();
@@ -213,11 +250,75 @@ public abstract class IContextHubWrapper {
public abstract int queryNanoapps(int contextHubId) throws RemoteException;
/**
+ * Registers a callback with the Context Hub.
+ *
+ * @param contextHubId The ID of the Context Hub to register the callback with.
+ * @param callback The callback to register.
+ */
+ public abstract void registerCallback(int contextHubId, @NonNull ICallback callback)
+ throws RemoteException;
+
+ /**
* An abstract call that defines methods common to all HIDL IContextHubWrappers.
*/
private abstract static class ContextHubWrapperHidl extends IContextHubWrapper {
private android.hardware.contexthub.V1_0.IContexthub mHub;
+ protected ICallback mCallback = null;
+
+ protected final ContextHubWrapperHidlCallback mHidlCallback =
+ new ContextHubWrapperHidlCallback();
+
+ protected class ContextHubWrapperHidlCallback extends IContexthubCallback.Stub {
+ @Override
+ public void handleClientMsg(ContextHubMsg message) {
+ mCallback.handleNanoappMessage(
+ message.hostEndPoint,
+ ContextHubServiceUtil.createNanoAppMessage(message),
+ Collections.emptyList() /* nanoappPermissions */,
+ Collections.emptyList() /* messagePermissions */);
+ }
+
+ @Override
+ public void handleTxnResult(int transactionId, int result) {
+ mCallback.handleTransactionResult(transactionId,
+ result == TransactionResult.SUCCESS);
+ }
+
+ @Override
+ public void handleHubEvent(int eventType) {
+ mCallback.handleContextHubEvent(
+ ContextHubServiceUtil.toContextHubEvent(eventType));
+ }
+
+ @Override
+ public void handleAppAbort(long nanoAppId, int abortCode) {
+ mCallback.handleNanoappAbort(nanoAppId, abortCode);
+ }
+
+ @Override
+ public void handleAppsInfo(
+ ArrayList<android.hardware.contexthub.V1_0.HubAppInfo> nanoAppInfoList) {
+ handleAppsInfo_1_2(ContextHubServiceUtil.toHubAppInfo_1_2(nanoAppInfoList));
+ }
+
+ @Override
+ public void handleClientMsg_1_2(android.hardware.contexthub.V1_2.ContextHubMsg message,
+ ArrayList<String> messagePermissions) {
+ mCallback.handleNanoappMessage(
+ message.msg_1_0.hostEndPoint,
+ ContextHubServiceUtil.createNanoAppMessage(message.msg_1_0),
+ message.permissions, messagePermissions);
+ }
+
+ @Override
+ public void handleAppsInfo_1_2(ArrayList<HubAppInfo> nanoAppInfoList) {
+ List<NanoAppState> nanoAppStateList =
+ ContextHubServiceUtil.createNanoAppStateList(nanoAppInfoList);
+ mCallback.handleNanoappInfo(nanoAppStateList);
+ }
+ }
+
ContextHubWrapperHidl(android.hardware.contexthub.V1_0.IContexthub hub) {
mHub = hub;
}
@@ -267,6 +368,11 @@ public abstract class IContextHubWrapper {
return ContextHubServiceUtil.toTransactionResult(
mHub.queryApps(contextHubId));
}
+
+ public void registerCallback(int contextHubId, ICallback callback) throws RemoteException {
+ mCallback = callback;
+ mHub.registerCallback(contextHubId, mHidlCallback);
+ }
}
private static class ContextHubWrapperV1_0 extends ContextHubWrapperHidl {
@@ -285,11 +391,6 @@ public abstract class IContextHubWrapper {
return new Pair(hubInfoList, new ArrayList<String>());
}
- public void registerCallback(
- int hubId, IContexthubCallback callback) throws RemoteException {
- mHub.registerCallback(hubId, callback);
- }
-
public boolean supportsLocationSettingNotifications() {
return false;
}
@@ -335,11 +436,6 @@ public abstract class IContextHubWrapper {
return new Pair(hubInfoList, new ArrayList<String>());
}
- public void registerCallback(
- int hubId, IContexthubCallback callback) throws RemoteException {
- mHub.registerCallback(hubId, callback);
- }
-
public boolean supportsLocationSettingNotifications() {
return true;
}
@@ -401,11 +497,6 @@ public abstract class IContextHubWrapper {
return mHubInfo;
}
- public void registerCallback(
- int hubId, IContexthubCallback callback) throws RemoteException {
- mHub.registerCallback_1_2(hubId, callback);
- }
-
public boolean supportsLocationSettingNotifications() {
return true;
}
@@ -445,6 +536,11 @@ public abstract class IContextHubWrapper {
enabled ? SettingValue.DISABLED : SettingValue.ENABLED);
}
+ public void registerCallback(int contextHubId, ICallback callback) throws RemoteException {
+ mCallback = callback;
+ mHub.registerCallback_1_2(contextHubId, mHidlCallback);
+ }
+
private void sendSettingChanged(byte setting, byte newValue) {
try {
mHub.onSettingChanged_1_2(setting, newValue);
diff --git a/services/core/java/com/android/server/location/contexthub/NanoAppStateManager.java b/services/core/java/com/android/server/location/contexthub/NanoAppStateManager.java
index 667fb98f8649..b6d5496ca547 100644
--- a/services/core/java/com/android/server/location/contexthub/NanoAppStateManager.java
+++ b/services/core/java/com/android/server/location/contexthub/NanoAppStateManager.java
@@ -17,8 +17,8 @@
package com.android.server.location.contexthub;
import android.annotation.Nullable;
-import android.hardware.contexthub.V1_2.HubAppInfo;
import android.hardware.location.NanoAppInstanceInfo;
+import android.hardware.location.NanoAppState;
import android.util.Log;
import java.util.HashMap;
@@ -31,8 +31,8 @@ import java.util.function.Consumer;
* Manages the state of loaded nanoapps at the Context Hubs.
*
* This class maintains a list of nanoapps that have been informed as loaded at the hubs. The state
- * should be updated based on the hub callbacks (defined in IContexthubCallback.hal), as a result
- * of either loadNanoApp, unloadNanoApp, or queryApps.
+ * should be updated based on the hub callbacks (defined in IContexthubCallback.hal), as a result of
+ * either loadNanoApp, unloadNanoApp, or queryApps.
*
* The state tracked by this manager is used by clients of ContextHubService that use the old APIs.
*
@@ -61,7 +61,7 @@ import java.util.function.Consumer;
/**
* @param nanoAppHandle the nanoapp handle
* @return the NanoAppInstanceInfo for the given nanoapp, or null if the nanoapp does not exist
- * in the cache
+ * in the cache
*/
@Nullable
/* package */
@@ -83,7 +83,7 @@ import java.util.function.Consumer;
/**
* @param contextHubId the ID of the hub to search for the instance
- * @param nanoAppId the unique 64-bit ID of the nanoapp
+ * @param nanoAppId the unique 64-bit ID of the nanoapp
* @return the nanoapp handle, -1 if the nanoapp is not in the cache
*/
/* package */
@@ -99,12 +99,12 @@ import java.util.function.Consumer;
/**
* Adds a nanoapp instance to the cache.
- *
+ * <p>
* If the cache already contained the nanoapp, the entry is removed and a new nanoapp handle is
* generated.
*
- * @param contextHubId the ID of the hub the nanoapp is loaded in
- * @param nanoAppId the unique 64-bit ID of the nanoapp
+ * @param contextHubId the ID of the hub the nanoapp is loaded in
+ * @param nanoAppId the unique 64-bit ID of the nanoapp
* @param nanoAppVersion the version of the nanoapp
*/
/* package */
@@ -147,15 +147,17 @@ import java.util.function.Consumer;
/**
* Performs a batch update of the nanoapp cache given a nanoapp query response.
*
- * @param contextHubId the ID of the hub the response came from
- * @param nanoAppInfoList the list of loaded nanoapps
+ * @param contextHubId the ID of the hub the response came from
+ * @param nanoappStateList the list of loaded nanoapps
*/
/* package */
- synchronized void updateCache(int contextHubId, List<HubAppInfo> nanoAppInfoList) {
+ synchronized void updateCache(int contextHubId, List<NanoAppState> nanoappStateList) {
HashSet<Long> nanoAppIdSet = new HashSet<>();
- for (HubAppInfo appInfo : nanoAppInfoList) {
- handleQueryAppEntry(contextHubId, appInfo.info_1_0.appId, appInfo.info_1_0.version);
- nanoAppIdSet.add(appInfo.info_1_0.appId);
+ for (NanoAppState nanoappState : nanoappStateList) {
+ handleQueryAppEntry(
+ contextHubId, nanoappState.getNanoAppId(),
+ (int) nanoappState.getNanoAppVersion());
+ nanoAppIdSet.add(nanoappState.getNanoAppId());
}
Iterator<NanoAppInstanceInfo> iterator = mNanoAppHash.values().iterator();
@@ -172,8 +174,8 @@ import java.util.function.Consumer;
* If the nanoapp exists in the cache, then the entry is updated. Otherwise, inserts a new
* instance of the nanoapp in the cache. This method should only be invoked from updateCache.
*
- * @param contextHubId the ID of the hub the nanoapp is loaded in
- * @param nanoAppId the unique 64-bit ID of the nanoapp
+ * @param contextHubId the ID of the hub the nanoapp is loaded in
+ * @param nanoAppId the unique 64-bit ID of the nanoapp
* @param nanoAppVersion the version of the nanoapp
*/
private void handleQueryAppEntry(int contextHubId, long nanoAppId, int nanoAppVersion) {