summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Anthony Stange <stange@google.com> 2020-02-07 18:45:47 -0500
committer Anthony Stange <stange@google.com> 2020-02-13 13:41:44 -0500
commit521a905c97857da7978ca37c3052bd749331da52 (patch)
treed58652f243251384029aafd3aabbcbb3143788d5
parentd946b24e563c9ff56d6b05154027a52371cc0e8b (diff)
Create IContextHubWrapper
IContextHubWrapper will be used to help abstract implementation-specific features of different versions of the Contexthub HAL to make it easier for the framework to interact with the HAL. Bug: 135951924 Test: compile Change-Id: I827b744b9f91298848105c881dfd0dc3abba61fb
-rw-r--r--Android.bp1
-rw-r--r--services/core/java/com/android/server/location/ContextHubService.java44
-rw-r--r--services/core/java/com/android/server/location/IContextHubWrapper.java141
3 files changed, 161 insertions, 25 deletions
diff --git a/Android.bp b/Android.bp
index 412099dede85..8ff338bd8e71 100644
--- a/Android.bp
+++ b/Android.bp
@@ -346,6 +346,7 @@ java_library {
"android.hardware.cas-V1.1-java",
"android.hardware.cas-V1.2-java",
"android.hardware.contexthub-V1.0-java",
+ "android.hardware.contexthub-V1.1-java",
"android.hardware.gnss-V1.0-java",
"android.hardware.gnss-V2.1-java",
"android.hardware.health-V1.0-java-constants",
diff --git a/services/core/java/com/android/server/location/ContextHubService.java b/services/core/java/com/android/server/location/ContextHubService.java
index e79eddf247cb..90b6d024909a 100644
--- a/services/core/java/com/android/server/location/ContextHubService.java
+++ b/services/core/java/com/android/server/location/ContextHubService.java
@@ -22,7 +22,6 @@ import android.hardware.contexthub.V1_0.AsyncEventType;
import android.hardware.contexthub.V1_0.ContextHub;
import android.hardware.contexthub.V1_0.ContextHubMsg;
import android.hardware.contexthub.V1_0.HubAppInfo;
-import android.hardware.contexthub.V1_0.IContexthub;
import android.hardware.contexthub.V1_0.IContexthubCallback;
import android.hardware.contexthub.V1_0.Result;
import android.hardware.contexthub.V1_0.TransactionResult;
@@ -56,7 +55,6 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.NoSuchElementException;
/**
* @hide
@@ -92,7 +90,7 @@ public class ContextHubService extends IContextHubService.Stub {
new RemoteCallbackList<>();
// Proxy object to communicate with the Context Hub HAL
- private final IContexthub mContextHubProxy;
+ private final IContextHubWrapper mContextHubWrapper;
// The manager for transaction queue
private final ContextHubTransactionManager mTransactionManager;
@@ -145,8 +143,8 @@ public class ContextHubService extends IContextHubService.Stub {
public ContextHubService(Context context) {
mContext = context;
- mContextHubProxy = getContextHubProxy();
- if (mContextHubProxy == null) {
+ mContextHubWrapper = getContextHubWrapper();
+ if (mContextHubWrapper == null) {
mTransactionManager = null;
mClientManager = null;
mDefaultClientMap = Collections.emptyMap();
@@ -155,13 +153,13 @@ public class ContextHubService extends IContextHubService.Stub {
return;
}
- mClientManager = new ContextHubClientManager(mContext, mContextHubProxy);
+ mClientManager = new ContextHubClientManager(mContext, mContextHubWrapper.getHub());
mTransactionManager = new ContextHubTransactionManager(
- mContextHubProxy, mClientManager, mNanoAppStateManager);
+ mContextHubWrapper.getHub(), mClientManager, mNanoAppStateManager);
List<ContextHub> hubList;
try {
- hubList = mContextHubProxy.getHubs();
+ hubList = mContextHubWrapper.getHub().getHubs();
} catch (RemoteException e) {
Log.e(TAG, "RemoteException while getting Context Hub info", e);
hubList = Collections.emptyList();
@@ -178,7 +176,7 @@ public class ContextHubService extends IContextHubService.Stub {
defaultClientMap.put(contextHubId, client);
try {
- mContextHubProxy.registerCallback(
+ mContextHubWrapper.getHub().registerCallback(
contextHubId, new ContextHubServiceCallback(contextHubId));
} catch (RemoteException e) {
Log.e(TAG, "RemoteException while registering service callback for hub (ID = "
@@ -239,19 +237,15 @@ public class ContextHubService extends IContextHubService.Stub {
}
/**
- * @return the IContexthub proxy interface
+ * @return the IContextHubWrapper interface
*/
- private IContexthub getContextHubProxy() {
- IContexthub proxy = null;
- try {
- proxy = IContexthub.getService(true /* retry */);
- } catch (RemoteException e) {
- Log.e(TAG, "RemoteException while attaching to Context Hub HAL proxy", e);
- } catch (NoSuchElementException e) {
- Log.i(TAG, "Context Hub HAL service not found");
+ private IContextHubWrapper getContextHubWrapper() {
+ IContextHubWrapper wrapper = IContextHubWrapper.maybeConnectTo1_1();
+ if (wrapper == null) {
+ wrapper = IContextHubWrapper.maybeConnectTo1_0();
}
- return proxy;
+ return wrapper;
}
@Override
@@ -355,7 +349,7 @@ public class ContextHubService extends IContextHubService.Stub {
@Override
public int loadNanoApp(int contextHubHandle, NanoApp nanoApp) throws RemoteException {
checkPermissions();
- if (mContextHubProxy == null) {
+ if (mContextHubWrapper == null) {
return -1;
}
if (!isValidContextHubId(contextHubHandle)) {
@@ -382,7 +376,7 @@ public class ContextHubService extends IContextHubService.Stub {
@Override
public int unloadNanoApp(int nanoAppHandle) throws RemoteException {
checkPermissions();
- if (mContextHubProxy == null) {
+ if (mContextHubWrapper == null) {
return -1;
}
@@ -444,7 +438,7 @@ public class ContextHubService extends IContextHubService.Stub {
* @throws IllegalStateException if the transaction queue is full
*/
private int queryNanoAppsInternal(int contextHubId) {
- if (mContextHubProxy == null) {
+ if (mContextHubWrapper == null) {
return Result.UNKNOWN_FAILURE;
}
@@ -461,7 +455,7 @@ public class ContextHubService extends IContextHubService.Stub {
public int sendMessage(int contextHubHandle, int nanoAppHandle, ContextHubMessage msg)
throws RemoteException {
checkPermissions();
- if (mContextHubProxy == null) {
+ if (mContextHubWrapper == null) {
return -1;
}
if (msg == null) {
@@ -870,12 +864,12 @@ public class ContextHubService extends IContextHubService.Stub {
* @param callback the client transaction callback interface
* @param transactionType the type of the transaction
*
- * @return {@code true} if mContextHubProxy and contextHubId is valid, {@code false} otherwise
+ * @return {@code true} if mContextHubWrapper and contextHubId is valid, {@code false} otherwise
*/
private boolean checkHalProxyAndContextHubId(
int contextHubId, IContextHubTransactionCallback callback,
@ContextHubTransaction.Type int transactionType) {
- if (mContextHubProxy == null) {
+ if (mContextHubWrapper == null) {
try {
callback.onTransactionComplete(
ContextHubTransaction.RESULT_FAILED_HAL_UNAVAILABLE);
diff --git a/services/core/java/com/android/server/location/IContextHubWrapper.java b/services/core/java/com/android/server/location/IContextHubWrapper.java
new file mode 100644
index 000000000000..79fa5c7b3a95
--- /dev/null
+++ b/services/core/java/com/android/server/location/IContextHubWrapper.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.server.location;
+
+import android.annotation.Nullable;
+import android.hardware.contexthub.V1_1.Setting;
+import android.hardware.contexthub.V1_1.SettingValue;
+import android.os.RemoteException;
+import android.util.Log;
+
+import java.util.NoSuchElementException;
+
+/**
+ * @hide
+ */
+public abstract class IContextHubWrapper {
+ private static final String TAG = "IContextHubWrapper";
+
+ /**
+ * Attempts to connect to the Contexthub HAL 1.0 service, if it exists.
+ *
+ * @return A valid IContextHubWrapper if the connection was successful, null otherwise.
+ */
+ @Nullable
+ public static IContextHubWrapper maybeConnectTo1_0() {
+ android.hardware.contexthub.V1_0.IContexthub proxy = null;
+ try {
+ proxy = android.hardware.contexthub.V1_0.IContexthub.getService(true /* retry */);
+ } catch (RemoteException e) {
+ Log.e(TAG, "RemoteException while attaching to Context Hub HAL proxy", e);
+ } catch (NoSuchElementException e) {
+ Log.i(TAG, "Context Hub HAL service not found");
+ }
+
+ ContextHubWrapperV1_0 wrapper = null;
+ if (proxy != null) {
+ wrapper = new ContextHubWrapperV1_0(proxy);
+ }
+
+ return wrapper;
+ }
+
+ /**
+ * Attempts to connect to the Contexthub HAL 1.1 service, if it exists.
+ *
+ * @return A valid IContextHubWrapper if the connection was successful, null otherwise.
+ */
+ @Nullable
+ public static IContextHubWrapper maybeConnectTo1_1() {
+ android.hardware.contexthub.V1_1.IContexthub proxy = null;
+ try {
+ proxy = android.hardware.contexthub.V1_1.IContexthub.getService(true /* retry */);
+ } catch (RemoteException e) {
+ Log.e(TAG, "RemoteException while attaching to Context Hub HAL proxy", e);
+ } catch (NoSuchElementException e) {
+ Log.i(TAG, "Context Hub HAL service not found");
+ }
+
+ ContextHubWrapperV1_1 wrapper = null;
+ if (proxy != null) {
+ wrapper = new ContextHubWrapperV1_1(proxy);
+ }
+
+ return wrapper;
+ }
+
+ /**
+ * @return A valid instance of Contexthub HAL 1.0.
+ */
+ public abstract android.hardware.contexthub.V1_0.IContexthub getHub();
+
+ /**
+ * @return True if this version of the Contexthub HAL supports setting notifications.
+ */
+ public abstract boolean supportsSettingNotifications();
+
+ /**
+ * Notifies the Contexthub implementation of a user setting change.
+ *
+ * @param setting The user setting that has changed. MUST be one of the values from the
+ * {@link Setting} enum
+ * @param newValue The value of the user setting that changed. MUST be one of the values
+ * from the {@link SettingValue} enum.
+ */
+ public abstract void onSettingChanged(byte setting, byte newValue);
+
+ private static class ContextHubWrapperV1_0 extends IContextHubWrapper {
+ private android.hardware.contexthub.V1_0.IContexthub mHub;
+
+ ContextHubWrapperV1_0(android.hardware.contexthub.V1_0.IContexthub hub) {
+ mHub = hub;
+ }
+
+ public android.hardware.contexthub.V1_0.IContexthub getHub() {
+ return mHub;
+ }
+
+ public boolean supportsSettingNotifications() {
+ return false;
+ }
+
+ public void onSettingChanged(byte setting, byte newValue) {}
+ }
+
+ private static class ContextHubWrapperV1_1 extends IContextHubWrapper {
+ private android.hardware.contexthub.V1_1.IContexthub mHub;
+
+ ContextHubWrapperV1_1(android.hardware.contexthub.V1_1.IContexthub hub) {
+ mHub = hub;
+ }
+
+ public android.hardware.contexthub.V1_0.IContexthub getHub() {
+ return mHub;
+ }
+
+ public boolean supportsSettingNotifications() {
+ return true;
+ }
+
+ public void onSettingChanged(byte setting, byte newValue) {
+ try {
+ mHub.onSettingChanged(setting, newValue);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failed to send setting change to Contexthub", e);
+ }
+ }
+ }
+}