From a830cb86f18f12593b73e648267ddfe837c76ad8 Mon Sep 17 00:00:00 2001 From: Arthur Ishiguro Date: Fri, 10 Dec 2021 17:04:56 +0000 Subject: [PATCH] Maintain separate callbacks for each Context Hub Current implementation does not distinguish various Context Hubs in registerCallback(). Bug: 194287786 Test: Run CHQTS Change-Id: Ie9b0c65c1a163a4139608522059c0685cc68b664 --- .../contexthub/IContextHubWrapper.java | 41 ++++++++++++++----- 1 file changed, 30 insertions(+), 11 deletions(-) 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 9078f3ffeb54a..cc5aaf4f7f452 100644 --- a/services/core/java/com/android/server/location/contexthub/IContextHubWrapper.java +++ b/services/core/java/com/android/server/location/contexthub/IContextHubWrapper.java @@ -41,8 +41,10 @@ import android.util.Pair; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.NoSuchElementException; import java.util.Set; @@ -320,9 +322,8 @@ public abstract class IContextHubWrapper { private static class ContextHubWrapperAidl extends IContextHubWrapper { private android.hardware.contexthub.IContextHub mHub; - private ICallback mCallback = null; - - private ContextHubAidlCallback mAidlCallback = new ContextHubAidlCallback(); + private final Map mAidlCallbackMap = + new HashMap<>(); // Use this thread in case where the execution requires to be on a service thread. // For instance, AppOpsManager.noteOp requires the UPDATE_APP_OPS_STATS permission. @@ -332,6 +333,14 @@ public abstract class IContextHubWrapper { private class ContextHubAidlCallback extends android.hardware.contexthub.IContextHubCallback.Stub { + private final int mContextHubId; + private final ICallback mCallback; + + ContextHubAidlCallback(int contextHubId, ICallback callback) { + mContextHubId = contextHubId; + mCallback = callback; + } + public void handleNanoappInfo(android.hardware.contexthub.NanoappInfo[] appInfo) { List nanoAppStateList = ContextHubServiceUtil.createNanoAppStateList(appInfo); @@ -481,8 +490,8 @@ public abstract class IContextHubWrapper { } public void registerCallback(int contextHubId, ICallback callback) throws RemoteException { - mCallback = callback; - mHub.registerCallback(contextHubId, mAidlCallback); + mAidlCallbackMap.put(contextHubId, new ContextHubAidlCallback(contextHubId, callback)); + mHub.registerCallback(contextHubId, mAidlCallbackMap.get(contextHubId)); } @ContextHubTransaction.Result @@ -508,10 +517,18 @@ public abstract class IContextHubWrapper { protected ICallback mCallback = null; - protected final ContextHubWrapperHidlCallback mHidlCallback = - new ContextHubWrapperHidlCallback(); + protected final Map mHidlCallbackMap = + new HashMap<>(); protected class ContextHubWrapperHidlCallback extends IContexthubCallback.Stub { + private final int mContextHubId; + private final ICallback mCallback; + + ContextHubWrapperHidlCallback(int contextHubId, ICallback callback) { + mContextHubId = contextHubId; + mCallback = callback; + } + @Override public void handleClientMsg(ContextHubMsg message) { mCallback.handleNanoappMessage( @@ -612,8 +629,9 @@ public abstract class IContextHubWrapper { } public void registerCallback(int contextHubId, ICallback callback) throws RemoteException { - mCallback = callback; - mHub.registerCallback(contextHubId, mHidlCallback); + mHidlCallbackMap.put(contextHubId, + new ContextHubWrapperHidlCallback(contextHubId, callback)); + mHub.registerCallback(contextHubId, mHidlCallbackMap.get(contextHubId)); } public void onWifiMainSettingChanged(boolean enabled) {} @@ -779,8 +797,9 @@ public abstract class IContextHubWrapper { } public void registerCallback(int contextHubId, ICallback callback) throws RemoteException { - mCallback = callback; - mHub.registerCallback_1_2(contextHubId, mHidlCallback); + mHidlCallbackMap.put(contextHubId, + new ContextHubWrapperHidlCallback(contextHubId, callback)); + mHub.registerCallback_1_2(contextHubId, mHidlCallbackMap.get(contextHubId)); } private void sendSettingChanged(byte setting, byte newValue) {