Loading services/core/java/com/android/server/location/contexthub/ContextHubClientBroker.java +40 −9 Original line number Diff line number Diff line Loading @@ -19,11 +19,11 @@ package com.android.server.location.contexthub; import static android.content.pm.PackageManager.PERMISSION_GRANTED; import android.Manifest; import android.annotation.Nullable; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.hardware.contexthub.V1_0.ContextHubMsg; import android.hardware.contexthub.V1_0.IContexthub; import android.hardware.contexthub.V1_0.Result; import android.hardware.location.ContextHubInfo; import android.hardware.location.ContextHubManager; Loading @@ -39,6 +39,7 @@ import android.util.proto.ProtoOutputStream; import com.android.server.location.ClientBrokerProto; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.Set; Loading Loading @@ -67,7 +68,7 @@ public class ContextHubClientBroker extends IContextHubClient.Stub /* * The proxy to talk to the Context Hub HAL. */ private final IContexthub mContextHubProxy; private final IContextHubWrapper mContextHubProxy; /* * The manager that registered this client. Loading Loading @@ -95,6 +96,12 @@ public class ContextHubClientBroker extends IContextHubClient.Stub */ private boolean mRegistered = true; /** * String containing an attribution tag that was denoted in the {@link Context} of the * creator of this broker. This is used when attributing the permissions usage of the broker. */ private @Nullable String mAttributionTag; /* * Internal interface used to invoke client callbacks. */ Loading Loading @@ -176,9 +183,9 @@ public class ContextHubClientBroker extends IContextHubClient.Stub } /* package */ ContextHubClientBroker( Context context, IContexthub contextHubProxy, ContextHubClientManager clientManager, ContextHubInfo contextHubInfo, short hostEndPointId, IContextHubClientCallback callback) { Context context, IContextHubWrapper contextHubProxy, ContextHubClientManager clientManager, ContextHubInfo contextHubInfo, short hostEndPointId, IContextHubClientCallback callback, String attributionTag) { mContext = context; mContextHubProxy = contextHubProxy; mClientManager = clientManager; Loading @@ -187,15 +194,17 @@ public class ContextHubClientBroker extends IContextHubClient.Stub mCallbackInterface = callback; mPendingIntentRequest = new PendingIntentRequest(); mPackage = mContext.getPackageManager().getNameForUid(Binder.getCallingUid()); mAttributionTag = attributionTag; mHasAccessContextHubPermission = context.checkCallingPermission( Manifest.permission.ACCESS_CONTEXT_HUB) == PERMISSION_GRANTED; } /* package */ ContextHubClientBroker( Context context, IContexthub contextHubProxy, ContextHubClientManager clientManager, ContextHubInfo contextHubInfo, short hostEndPointId, PendingIntent pendingIntent, long nanoAppId) { Context context, IContextHubWrapper contextHubProxy, ContextHubClientManager clientManager, ContextHubInfo contextHubInfo, short hostEndPointId, PendingIntent pendingIntent, long nanoAppId, String attributionTag) { mContext = context; mContextHubProxy = contextHubProxy; mClientManager = clientManager; Loading @@ -203,6 +212,7 @@ public class ContextHubClientBroker extends IContextHubClient.Stub mHostEndPointId = hostEndPointId; mPendingIntentRequest = new PendingIntentRequest(pendingIntent, nanoAppId); mPackage = pendingIntent.getCreatorPackage(); mAttributionTag = attributionTag; mHasAccessContextHubPermission = context.checkCallingPermission( Manifest.permission.ACCESS_CONTEXT_HUB) == PERMISSION_GRANTED; Loading @@ -227,7 +237,10 @@ public class ContextHubClientBroker extends IContextHubClient.Stub int contextHubId = mAttachedContextHubInfo.getId(); try { result = mContextHubProxy.sendMessageToHub(contextHubId, messageToNanoApp); // TODO(166846988): Fill in host permissions before sending a message. result = mContextHubProxy.sendMessageToHub( contextHubId, messageToNanoApp, new ArrayList<String>() /* hostPermissions */); } catch (RemoteException e) { Log.e(TAG, "RemoteException in sendMessageToNanoApp (target hub ID = " + contextHubId + ")", e); Loading Loading @@ -262,6 +275,21 @@ public class ContextHubClientBroker extends IContextHubClient.Stub onClientExit(); } /** * Used to override the attribution tag with a newer value if a PendingIntent broker is * retrieved. */ /* package */ void setAttributionTag(String attributionTag) { mAttributionTag = attributionTag; } /** * @return the attribution tag associated with this broker. */ /* package */ String getAttributionTag() { return mAttributionTag; } /** * @return the ID of the context hub this client is attached to */ Loading Loading @@ -508,6 +536,9 @@ public class ContextHubClientBroker extends IContextHubClient.Stub String out = "[ContextHubClient "; out += "endpointID: " + getHostEndPointId() + ", "; out += "contextHub: " + getAttachedContextHubId() + ", "; if (mAttributionTag != null) { out += "attributionTag: " + getAttributionTag() + ", "; } if (mPendingIntentRequest.isValid()) { out += "intentCreatorPackage: " + mPackage + ", "; out += "nanoAppId: 0x" + Long.toHexString(mPendingIntentRequest.getNanoAppId()); Loading services/core/java/com/android/server/location/contexthub/ContextHubClientManager.java +14 −7 Original line number Diff line number Diff line Loading @@ -20,7 +20,6 @@ import android.annotation.IntDef; import android.app.PendingIntent; import android.content.Context; import android.hardware.contexthub.V1_0.ContextHubMsg; import android.hardware.contexthub.V1_0.IContexthub; import android.hardware.location.ContextHubInfo; import android.hardware.location.IContextHubClient; import android.hardware.location.IContextHubClientCallback; Loading Loading @@ -71,7 +70,7 @@ import java.util.function.Consumer; /* * The proxy to talk to the Context Hub. */ private final IContexthub mContextHubProxy; private final IContextHubWrapper mContextHubProxy; /* * A mapping of host endpoint IDs to the ContextHubClientBroker object of registered clients. Loading Loading @@ -138,7 +137,7 @@ import java.util.function.Consumer; } /* package */ ContextHubClientManager( Context context, IContexthub contextHubProxy) { Context context, IContextHubWrapper contextHubProxy) { mContext = context; mContextHubProxy = contextHubProxy; } Loading @@ -148,19 +147,21 @@ import java.util.function.Consumer; * * @param contextHubInfo the object describing the hub this client is attached to * @param clientCallback the callback interface of the client to register * @param attributionTag an optional attribution tag within the given package * * @return the client interface * * @throws IllegalStateException if max number of clients have already registered */ /* package */ IContextHubClient registerClient( ContextHubInfo contextHubInfo, IContextHubClientCallback clientCallback) { ContextHubInfo contextHubInfo, IContextHubClientCallback clientCallback, String attributionTag) { ContextHubClientBroker broker; synchronized (this) { short hostEndPointId = getHostEndPointId(); broker = new ContextHubClientBroker( mContext, mContextHubProxy, this /* clientManager */, contextHubInfo, hostEndPointId, clientCallback); hostEndPointId, clientCallback, attributionTag); mHostEndPointIdToClientMap.put(hostEndPointId, broker); mRegistrationRecordDeque.add( new RegistrationRecord(broker.toString(), ACTION_REGISTERED)); Loading @@ -185,13 +186,15 @@ import java.util.function.Consumer; * @param pendingIntent the callback interface of the client to register * @param contextHubInfo the object describing the hub this client is attached to * @param nanoAppId the ID of the nanoapp to receive Intent events for * @param attributionTag an optional attribution tag within the given package * * @return the client interface * * @throws IllegalStateException if there were too many registered clients at the service */ /* package */ IContextHubClient registerClient( ContextHubInfo contextHubInfo, PendingIntent pendingIntent, long nanoAppId) { ContextHubInfo contextHubInfo, PendingIntent pendingIntent, long nanoAppId, String attributionTag) { ContextHubClientBroker broker; String registerString = "Regenerated"; synchronized (this) { Loading @@ -201,11 +204,15 @@ import java.util.function.Consumer; short hostEndPointId = getHostEndPointId(); broker = new ContextHubClientBroker( mContext, mContextHubProxy, this /* clientManager */, contextHubInfo, hostEndPointId, pendingIntent, nanoAppId); hostEndPointId, pendingIntent, nanoAppId, attributionTag); mHostEndPointIdToClientMap.put(hostEndPointId, broker); registerString = "Registered"; mRegistrationRecordDeque.add( new RegistrationRecord(broker.toString(), ACTION_REGISTERED)); } else { // Update the attribution tag to the latest value provided by the client app in // case the app was updated and decided to change its tag. broker.setAttributionTag(attributionTag); } } Loading services/core/java/com/android/server/location/contexthub/ContextHubService.java +35 −14 Original line number Diff line number Diff line Loading @@ -27,10 +27,10 @@ import android.hardware.SensorPrivacyManager; 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.IContexthubCallback; 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; Loading @@ -53,6 +53,7 @@ import android.os.RemoteException; import android.os.UserHandle; import android.provider.Settings; import android.util.Log; import android.util.Pair; import android.util.proto.ProtoOutputStream; import com.android.internal.util.DumpUtils; Loading Loading @@ -137,7 +138,9 @@ public class ContextHubService extends IContextHubService.Stub { @Override public void handleClientMsg(ContextHubMsg message) { handleClientMessageCallback(mContextHubId, message); handleClientMessageCallback(mContextHubId, message, Collections.emptyList() /* nanoappPermissions */, Collections.emptyList() /* messageContentPermissions */); } @Override Loading @@ -156,7 +159,21 @@ public class ContextHubService extends IContextHubService.Stub { } @Override public void handleAppsInfo(ArrayList<HubAppInfo> nanoAppInfoList) { public void handleAppsInfo( ArrayList<android.hardware.contexthub.V1_0.HubAppInfo> nanoAppInfoList) { handleQueryAppsCallback(mContextHubId, ContextHubServiceUtil.toHubAppInfo_1_2(nanoAppInfoList)); } @Override public void handleClientMsg_1_2(android.hardware.contexthub.V1_2.ContextHubMsg message, ArrayList<String> messageContentPermissions) { handleClientMessageCallback(mContextHubId, message.msg_1_0, message.permissions, messageContentPermissions); } @Override public void handleAppsInfo_1_2(ArrayList<HubAppInfo> nanoAppInfoList) { handleQueryAppsCallback(mContextHubId, nanoAppInfoList); } } Loading @@ -174,30 +191,31 @@ public class ContextHubService extends IContextHubService.Stub { return; } mClientManager = new ContextHubClientManager(mContext, mContextHubWrapper.getHub()); mClientManager = new ContextHubClientManager(mContext, mContextHubWrapper); mTransactionManager = new ContextHubTransactionManager( mContextHubWrapper.getHub(), mClientManager, mNanoAppStateManager); List<ContextHub> hubList; Pair<List<ContextHub>, List<String>> hubInfo; try { hubList = mContextHubWrapper.getHub().getHubs(); hubInfo = mContextHubWrapper.getHubs(); } catch (RemoteException e) { Log.e(TAG, "RemoteException while getting Context Hub info", e); hubList = Collections.emptyList(); hubInfo = new Pair(Collections.emptyList(), Collections.emptyList()); } mContextHubIdToInfoMap = Collections.unmodifiableMap( ContextHubServiceUtil.createContextHubInfoMap(hubList)); ContextHubServiceUtil.createContextHubInfoMap(hubInfo.first)); mContextHubInfoList = new ArrayList<>(mContextHubIdToInfoMap.values()); HashMap<Integer, IContextHubClient> defaultClientMap = new HashMap<>(); for (int contextHubId : mContextHubIdToInfoMap.keySet()) { ContextHubInfo contextHubInfo = mContextHubIdToInfoMap.get(contextHubId); IContextHubClient client = mClientManager.registerClient( contextHubInfo, createDefaultClientCallback(contextHubId)); contextHubInfo, createDefaultClientCallback(contextHubId), null /* attributionTag */); defaultClientMap.put(contextHubId, client); try { mContextHubWrapper.getHub().registerCallback( mContextHubWrapper.registerCallback( contextHubId, new ContextHubServiceCallback(contextHubId)); } catch (RemoteException e) { Log.e(TAG, "RemoteException while registering service callback for hub (ID = " Loading Loading @@ -596,7 +614,9 @@ public class ContextHubService extends IContextHubService.Stub { * @param contextHubId the ID of the hub the message came from * @param message the message contents */ private void handleClientMessageCallback(int contextHubId, ContextHubMsg message) { private void handleClientMessageCallback( int contextHubId, ContextHubMsg message, List<String> nanoappPermissions, List<String> messageContentPermissions) { mClientManager.onMessageFromNanoApp(contextHubId, message); } Loading Loading @@ -721,7 +741,7 @@ public class ContextHubService extends IContextHubService.Stub { } ContextHubInfo contextHubInfo = mContextHubIdToInfoMap.get(contextHubId); return mClientManager.registerClient(contextHubInfo, clientCallback); return mClientManager.registerClient(contextHubInfo, clientCallback, attributionTag); } /** Loading @@ -745,7 +765,8 @@ public class ContextHubService extends IContextHubService.Stub { } ContextHubInfo contextHubInfo = mContextHubIdToInfoMap.get(contextHubId); return mClientManager.registerClient(contextHubInfo, pendingIntent, nanoAppId); return mClientManager.registerClient( contextHubInfo, pendingIntent, nanoAppId, attributionTag); } /** Loading services/core/java/com/android/server/location/contexthub/ContextHubServiceUtil.java +25 −2 Original line number Diff line number Diff line Loading @@ -23,8 +23,8 @@ import android.content.Context; import android.hardware.contexthub.V1_0.ContextHub; import android.hardware.contexthub.V1_0.ContextHubMsg; import android.hardware.contexthub.V1_0.HostEndPoint; import android.hardware.contexthub.V1_0.HubAppInfo; import android.hardware.contexthub.V1_0.Result; import android.hardware.contexthub.V1_2.HubAppInfo; import android.hardware.location.ContextHubInfo; import android.hardware.location.ContextHubTransaction; import android.hardware.location.NanoAppBinary; Loading Loading @@ -161,7 +161,8 @@ import java.util.Set; ArrayList<NanoAppState> nanoAppStateList = new ArrayList<>(); for (HubAppInfo appInfo : nanoAppInfoList) { nanoAppStateList.add( new NanoAppState(appInfo.appId, appInfo.version, appInfo.enabled)); new NanoAppState(appInfo.info_1_0.appId, appInfo.info_1_0.version, appInfo.info_1_0.enabled, appInfo.permissions)); } return nanoAppStateList; Loading Loading @@ -255,4 +256,26 @@ import java.util.Set; return ContextHubTransaction.RESULT_FAILED_UNKNOWN; } } /** * Converts old list of HubAppInfo received from the HAL to V1.2 HubAppInfo objects. * * @param oldInfoList list of V1.0 HubAppInfo objects * @return list of V1.2 HubAppInfo objects */ /* package */ static ArrayList<HubAppInfo> toHubAppInfo_1_2( ArrayList<android.hardware.contexthub.V1_0.HubAppInfo> oldInfoList) { ArrayList newAppInfo = new ArrayList<HubAppInfo>(); for (android.hardware.contexthub.V1_0.HubAppInfo oldInfo : oldInfoList) { HubAppInfo newInfo = new HubAppInfo(); newInfo.info_1_0.appId = oldInfo.appId; newInfo.info_1_0.version = oldInfo.version; newInfo.info_1_0.memUsage = oldInfo.memUsage; newInfo.info_1_0.enabled = oldInfo.enabled; newInfo.permissions = new ArrayList<String>(); newAppInfo.add(newInfo); } return newAppInfo; } } services/core/java/com/android/server/location/contexthub/IContextHubWrapper.java +85 −2 Original line number Diff line number Diff line Loading @@ -16,11 +16,17 @@ package com.android.server.location.contexthub; import android.annotation.Nullable; import android.hardware.contexthub.V1_0.ContextHub; import android.hardware.contexthub.V1_1.Setting; import android.hardware.contexthub.V1_1.SettingValue; import android.hardware.contexthub.V1_2.IContexthubCallback; import android.os.RemoteException; import android.util.Log; import android.util.Pair; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.NoSuchElementException; /** Loading Loading @@ -86,6 +92,24 @@ public abstract class IContextHubWrapper { return (proxy == null) ? null : new ContextHubWrapperV1_2(proxy); } /** * Calls the appropriate getHubs function depending on the HAL version. */ public abstract Pair<List<ContextHub>, 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; /** * Calls the appropriate sendMessageToHub function depending on the HAL version. */ public abstract int sendMessageToHub( int hubId, android.hardware.contexthub.V1_0.ContextHubMsg message, ArrayList<String> hostPermissions) throws RemoteException; /** * @return A valid instance of Contexthub HAL 1.0. */ Loading Loading @@ -148,6 +172,21 @@ public abstract class IContextHubWrapper { mHub = hub; } public Pair<List<ContextHub>, List<String>> getHubs() throws RemoteException { return new Pair(mHub.getHubs(), new ArrayList<String>()); } public void registerCallback( int hubId, IContexthubCallback callback) throws RemoteException { mHub.registerCallback(hubId, callback); } public int sendMessageToHub( int hubId, android.hardware.contexthub.V1_0.ContextHubMsg message, ArrayList<String> hostPermissions) throws RemoteException { return mHub.sendMessageToHub(hubId, message); } public android.hardware.contexthub.V1_0.IContexthub getHub() { return mHub; } Loading Loading @@ -188,6 +227,21 @@ public abstract class IContextHubWrapper { mHub = hub; } public Pair<List<ContextHub>, List<String>> getHubs() throws RemoteException { return new Pair(mHub.getHubs(), new ArrayList<String>()); } public void registerCallback( int hubId, IContexthubCallback callback) throws RemoteException { mHub.registerCallback(hubId, callback); } public int sendMessageToHub( int hubId, android.hardware.contexthub.V1_0.ContextHubMsg message, ArrayList<String> hostPermissions) throws RemoteException { return mHub.sendMessageToHub(hubId, message); } public android.hardware.contexthub.V1_0.IContexthub getHub() { return mHub; } Loading Loading @@ -227,13 +281,42 @@ public abstract class IContextHubWrapper { } } private static class ContextHubWrapperV1_2 extends IContextHubWrapper { private android.hardware.contexthub.V1_2.IContexthub mHub; private static class ContextHubWrapperV1_2 extends IContextHubWrapper implements android.hardware.contexthub.V1_2.IContexthub.getHubs_1_2Callback { private final android.hardware.contexthub.V1_2.IContexthub mHub; private Pair<List<ContextHub>, List<String>> mHubInfo = new Pair<>(Collections.emptyList(), Collections.emptyList()); ContextHubWrapperV1_2(android.hardware.contexthub.V1_2.IContexthub hub) { mHub = hub; } @Override public void onValues(ArrayList<ContextHub> hubs, ArrayList<String> supportedPermissions) { mHubInfo = new Pair(hubs, supportedPermissions); } public Pair<List<ContextHub>, List<String>> getHubs() throws RemoteException { mHub.getHubs_1_2(this); return mHubInfo; } public void registerCallback( int hubId, IContexthubCallback callback) throws RemoteException { mHub.registerCallback_1_2(hubId, callback); } public int sendMessageToHub( int hubId, android.hardware.contexthub.V1_0.ContextHubMsg message, ArrayList<String> hostPermissions) throws RemoteException { android.hardware.contexthub.V1_2.ContextHubMsg newMessage = new android.hardware.contexthub.V1_2.ContextHubMsg(); newMessage.msg_1_0 = message; newMessage.permissions = hostPermissions; return mHub.sendMessageToHub_1_2(hubId, newMessage); } public android.hardware.contexthub.V1_0.IContexthub getHub() { return mHub; } Loading Loading
services/core/java/com/android/server/location/contexthub/ContextHubClientBroker.java +40 −9 Original line number Diff line number Diff line Loading @@ -19,11 +19,11 @@ package com.android.server.location.contexthub; import static android.content.pm.PackageManager.PERMISSION_GRANTED; import android.Manifest; import android.annotation.Nullable; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.hardware.contexthub.V1_0.ContextHubMsg; import android.hardware.contexthub.V1_0.IContexthub; import android.hardware.contexthub.V1_0.Result; import android.hardware.location.ContextHubInfo; import android.hardware.location.ContextHubManager; Loading @@ -39,6 +39,7 @@ import android.util.proto.ProtoOutputStream; import com.android.server.location.ClientBrokerProto; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.Set; Loading Loading @@ -67,7 +68,7 @@ public class ContextHubClientBroker extends IContextHubClient.Stub /* * The proxy to talk to the Context Hub HAL. */ private final IContexthub mContextHubProxy; private final IContextHubWrapper mContextHubProxy; /* * The manager that registered this client. Loading Loading @@ -95,6 +96,12 @@ public class ContextHubClientBroker extends IContextHubClient.Stub */ private boolean mRegistered = true; /** * String containing an attribution tag that was denoted in the {@link Context} of the * creator of this broker. This is used when attributing the permissions usage of the broker. */ private @Nullable String mAttributionTag; /* * Internal interface used to invoke client callbacks. */ Loading Loading @@ -176,9 +183,9 @@ public class ContextHubClientBroker extends IContextHubClient.Stub } /* package */ ContextHubClientBroker( Context context, IContexthub contextHubProxy, ContextHubClientManager clientManager, ContextHubInfo contextHubInfo, short hostEndPointId, IContextHubClientCallback callback) { Context context, IContextHubWrapper contextHubProxy, ContextHubClientManager clientManager, ContextHubInfo contextHubInfo, short hostEndPointId, IContextHubClientCallback callback, String attributionTag) { mContext = context; mContextHubProxy = contextHubProxy; mClientManager = clientManager; Loading @@ -187,15 +194,17 @@ public class ContextHubClientBroker extends IContextHubClient.Stub mCallbackInterface = callback; mPendingIntentRequest = new PendingIntentRequest(); mPackage = mContext.getPackageManager().getNameForUid(Binder.getCallingUid()); mAttributionTag = attributionTag; mHasAccessContextHubPermission = context.checkCallingPermission( Manifest.permission.ACCESS_CONTEXT_HUB) == PERMISSION_GRANTED; } /* package */ ContextHubClientBroker( Context context, IContexthub contextHubProxy, ContextHubClientManager clientManager, ContextHubInfo contextHubInfo, short hostEndPointId, PendingIntent pendingIntent, long nanoAppId) { Context context, IContextHubWrapper contextHubProxy, ContextHubClientManager clientManager, ContextHubInfo contextHubInfo, short hostEndPointId, PendingIntent pendingIntent, long nanoAppId, String attributionTag) { mContext = context; mContextHubProxy = contextHubProxy; mClientManager = clientManager; Loading @@ -203,6 +212,7 @@ public class ContextHubClientBroker extends IContextHubClient.Stub mHostEndPointId = hostEndPointId; mPendingIntentRequest = new PendingIntentRequest(pendingIntent, nanoAppId); mPackage = pendingIntent.getCreatorPackage(); mAttributionTag = attributionTag; mHasAccessContextHubPermission = context.checkCallingPermission( Manifest.permission.ACCESS_CONTEXT_HUB) == PERMISSION_GRANTED; Loading @@ -227,7 +237,10 @@ public class ContextHubClientBroker extends IContextHubClient.Stub int contextHubId = mAttachedContextHubInfo.getId(); try { result = mContextHubProxy.sendMessageToHub(contextHubId, messageToNanoApp); // TODO(166846988): Fill in host permissions before sending a message. result = mContextHubProxy.sendMessageToHub( contextHubId, messageToNanoApp, new ArrayList<String>() /* hostPermissions */); } catch (RemoteException e) { Log.e(TAG, "RemoteException in sendMessageToNanoApp (target hub ID = " + contextHubId + ")", e); Loading Loading @@ -262,6 +275,21 @@ public class ContextHubClientBroker extends IContextHubClient.Stub onClientExit(); } /** * Used to override the attribution tag with a newer value if a PendingIntent broker is * retrieved. */ /* package */ void setAttributionTag(String attributionTag) { mAttributionTag = attributionTag; } /** * @return the attribution tag associated with this broker. */ /* package */ String getAttributionTag() { return mAttributionTag; } /** * @return the ID of the context hub this client is attached to */ Loading Loading @@ -508,6 +536,9 @@ public class ContextHubClientBroker extends IContextHubClient.Stub String out = "[ContextHubClient "; out += "endpointID: " + getHostEndPointId() + ", "; out += "contextHub: " + getAttachedContextHubId() + ", "; if (mAttributionTag != null) { out += "attributionTag: " + getAttributionTag() + ", "; } if (mPendingIntentRequest.isValid()) { out += "intentCreatorPackage: " + mPackage + ", "; out += "nanoAppId: 0x" + Long.toHexString(mPendingIntentRequest.getNanoAppId()); Loading
services/core/java/com/android/server/location/contexthub/ContextHubClientManager.java +14 −7 Original line number Diff line number Diff line Loading @@ -20,7 +20,6 @@ import android.annotation.IntDef; import android.app.PendingIntent; import android.content.Context; import android.hardware.contexthub.V1_0.ContextHubMsg; import android.hardware.contexthub.V1_0.IContexthub; import android.hardware.location.ContextHubInfo; import android.hardware.location.IContextHubClient; import android.hardware.location.IContextHubClientCallback; Loading Loading @@ -71,7 +70,7 @@ import java.util.function.Consumer; /* * The proxy to talk to the Context Hub. */ private final IContexthub mContextHubProxy; private final IContextHubWrapper mContextHubProxy; /* * A mapping of host endpoint IDs to the ContextHubClientBroker object of registered clients. Loading Loading @@ -138,7 +137,7 @@ import java.util.function.Consumer; } /* package */ ContextHubClientManager( Context context, IContexthub contextHubProxy) { Context context, IContextHubWrapper contextHubProxy) { mContext = context; mContextHubProxy = contextHubProxy; } Loading @@ -148,19 +147,21 @@ import java.util.function.Consumer; * * @param contextHubInfo the object describing the hub this client is attached to * @param clientCallback the callback interface of the client to register * @param attributionTag an optional attribution tag within the given package * * @return the client interface * * @throws IllegalStateException if max number of clients have already registered */ /* package */ IContextHubClient registerClient( ContextHubInfo contextHubInfo, IContextHubClientCallback clientCallback) { ContextHubInfo contextHubInfo, IContextHubClientCallback clientCallback, String attributionTag) { ContextHubClientBroker broker; synchronized (this) { short hostEndPointId = getHostEndPointId(); broker = new ContextHubClientBroker( mContext, mContextHubProxy, this /* clientManager */, contextHubInfo, hostEndPointId, clientCallback); hostEndPointId, clientCallback, attributionTag); mHostEndPointIdToClientMap.put(hostEndPointId, broker); mRegistrationRecordDeque.add( new RegistrationRecord(broker.toString(), ACTION_REGISTERED)); Loading @@ -185,13 +186,15 @@ import java.util.function.Consumer; * @param pendingIntent the callback interface of the client to register * @param contextHubInfo the object describing the hub this client is attached to * @param nanoAppId the ID of the nanoapp to receive Intent events for * @param attributionTag an optional attribution tag within the given package * * @return the client interface * * @throws IllegalStateException if there were too many registered clients at the service */ /* package */ IContextHubClient registerClient( ContextHubInfo contextHubInfo, PendingIntent pendingIntent, long nanoAppId) { ContextHubInfo contextHubInfo, PendingIntent pendingIntent, long nanoAppId, String attributionTag) { ContextHubClientBroker broker; String registerString = "Regenerated"; synchronized (this) { Loading @@ -201,11 +204,15 @@ import java.util.function.Consumer; short hostEndPointId = getHostEndPointId(); broker = new ContextHubClientBroker( mContext, mContextHubProxy, this /* clientManager */, contextHubInfo, hostEndPointId, pendingIntent, nanoAppId); hostEndPointId, pendingIntent, nanoAppId, attributionTag); mHostEndPointIdToClientMap.put(hostEndPointId, broker); registerString = "Registered"; mRegistrationRecordDeque.add( new RegistrationRecord(broker.toString(), ACTION_REGISTERED)); } else { // Update the attribution tag to the latest value provided by the client app in // case the app was updated and decided to change its tag. broker.setAttributionTag(attributionTag); } } Loading
services/core/java/com/android/server/location/contexthub/ContextHubService.java +35 −14 Original line number Diff line number Diff line Loading @@ -27,10 +27,10 @@ import android.hardware.SensorPrivacyManager; 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.IContexthubCallback; 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; Loading @@ -53,6 +53,7 @@ import android.os.RemoteException; import android.os.UserHandle; import android.provider.Settings; import android.util.Log; import android.util.Pair; import android.util.proto.ProtoOutputStream; import com.android.internal.util.DumpUtils; Loading Loading @@ -137,7 +138,9 @@ public class ContextHubService extends IContextHubService.Stub { @Override public void handleClientMsg(ContextHubMsg message) { handleClientMessageCallback(mContextHubId, message); handleClientMessageCallback(mContextHubId, message, Collections.emptyList() /* nanoappPermissions */, Collections.emptyList() /* messageContentPermissions */); } @Override Loading @@ -156,7 +159,21 @@ public class ContextHubService extends IContextHubService.Stub { } @Override public void handleAppsInfo(ArrayList<HubAppInfo> nanoAppInfoList) { public void handleAppsInfo( ArrayList<android.hardware.contexthub.V1_0.HubAppInfo> nanoAppInfoList) { handleQueryAppsCallback(mContextHubId, ContextHubServiceUtil.toHubAppInfo_1_2(nanoAppInfoList)); } @Override public void handleClientMsg_1_2(android.hardware.contexthub.V1_2.ContextHubMsg message, ArrayList<String> messageContentPermissions) { handleClientMessageCallback(mContextHubId, message.msg_1_0, message.permissions, messageContentPermissions); } @Override public void handleAppsInfo_1_2(ArrayList<HubAppInfo> nanoAppInfoList) { handleQueryAppsCallback(mContextHubId, nanoAppInfoList); } } Loading @@ -174,30 +191,31 @@ public class ContextHubService extends IContextHubService.Stub { return; } mClientManager = new ContextHubClientManager(mContext, mContextHubWrapper.getHub()); mClientManager = new ContextHubClientManager(mContext, mContextHubWrapper); mTransactionManager = new ContextHubTransactionManager( mContextHubWrapper.getHub(), mClientManager, mNanoAppStateManager); List<ContextHub> hubList; Pair<List<ContextHub>, List<String>> hubInfo; try { hubList = mContextHubWrapper.getHub().getHubs(); hubInfo = mContextHubWrapper.getHubs(); } catch (RemoteException e) { Log.e(TAG, "RemoteException while getting Context Hub info", e); hubList = Collections.emptyList(); hubInfo = new Pair(Collections.emptyList(), Collections.emptyList()); } mContextHubIdToInfoMap = Collections.unmodifiableMap( ContextHubServiceUtil.createContextHubInfoMap(hubList)); ContextHubServiceUtil.createContextHubInfoMap(hubInfo.first)); mContextHubInfoList = new ArrayList<>(mContextHubIdToInfoMap.values()); HashMap<Integer, IContextHubClient> defaultClientMap = new HashMap<>(); for (int contextHubId : mContextHubIdToInfoMap.keySet()) { ContextHubInfo contextHubInfo = mContextHubIdToInfoMap.get(contextHubId); IContextHubClient client = mClientManager.registerClient( contextHubInfo, createDefaultClientCallback(contextHubId)); contextHubInfo, createDefaultClientCallback(contextHubId), null /* attributionTag */); defaultClientMap.put(contextHubId, client); try { mContextHubWrapper.getHub().registerCallback( mContextHubWrapper.registerCallback( contextHubId, new ContextHubServiceCallback(contextHubId)); } catch (RemoteException e) { Log.e(TAG, "RemoteException while registering service callback for hub (ID = " Loading Loading @@ -596,7 +614,9 @@ public class ContextHubService extends IContextHubService.Stub { * @param contextHubId the ID of the hub the message came from * @param message the message contents */ private void handleClientMessageCallback(int contextHubId, ContextHubMsg message) { private void handleClientMessageCallback( int contextHubId, ContextHubMsg message, List<String> nanoappPermissions, List<String> messageContentPermissions) { mClientManager.onMessageFromNanoApp(contextHubId, message); } Loading Loading @@ -721,7 +741,7 @@ public class ContextHubService extends IContextHubService.Stub { } ContextHubInfo contextHubInfo = mContextHubIdToInfoMap.get(contextHubId); return mClientManager.registerClient(contextHubInfo, clientCallback); return mClientManager.registerClient(contextHubInfo, clientCallback, attributionTag); } /** Loading @@ -745,7 +765,8 @@ public class ContextHubService extends IContextHubService.Stub { } ContextHubInfo contextHubInfo = mContextHubIdToInfoMap.get(contextHubId); return mClientManager.registerClient(contextHubInfo, pendingIntent, nanoAppId); return mClientManager.registerClient( contextHubInfo, pendingIntent, nanoAppId, attributionTag); } /** Loading
services/core/java/com/android/server/location/contexthub/ContextHubServiceUtil.java +25 −2 Original line number Diff line number Diff line Loading @@ -23,8 +23,8 @@ import android.content.Context; import android.hardware.contexthub.V1_0.ContextHub; import android.hardware.contexthub.V1_0.ContextHubMsg; import android.hardware.contexthub.V1_0.HostEndPoint; import android.hardware.contexthub.V1_0.HubAppInfo; import android.hardware.contexthub.V1_0.Result; import android.hardware.contexthub.V1_2.HubAppInfo; import android.hardware.location.ContextHubInfo; import android.hardware.location.ContextHubTransaction; import android.hardware.location.NanoAppBinary; Loading Loading @@ -161,7 +161,8 @@ import java.util.Set; ArrayList<NanoAppState> nanoAppStateList = new ArrayList<>(); for (HubAppInfo appInfo : nanoAppInfoList) { nanoAppStateList.add( new NanoAppState(appInfo.appId, appInfo.version, appInfo.enabled)); new NanoAppState(appInfo.info_1_0.appId, appInfo.info_1_0.version, appInfo.info_1_0.enabled, appInfo.permissions)); } return nanoAppStateList; Loading Loading @@ -255,4 +256,26 @@ import java.util.Set; return ContextHubTransaction.RESULT_FAILED_UNKNOWN; } } /** * Converts old list of HubAppInfo received from the HAL to V1.2 HubAppInfo objects. * * @param oldInfoList list of V1.0 HubAppInfo objects * @return list of V1.2 HubAppInfo objects */ /* package */ static ArrayList<HubAppInfo> toHubAppInfo_1_2( ArrayList<android.hardware.contexthub.V1_0.HubAppInfo> oldInfoList) { ArrayList newAppInfo = new ArrayList<HubAppInfo>(); for (android.hardware.contexthub.V1_0.HubAppInfo oldInfo : oldInfoList) { HubAppInfo newInfo = new HubAppInfo(); newInfo.info_1_0.appId = oldInfo.appId; newInfo.info_1_0.version = oldInfo.version; newInfo.info_1_0.memUsage = oldInfo.memUsage; newInfo.info_1_0.enabled = oldInfo.enabled; newInfo.permissions = new ArrayList<String>(); newAppInfo.add(newInfo); } return newAppInfo; } }
services/core/java/com/android/server/location/contexthub/IContextHubWrapper.java +85 −2 Original line number Diff line number Diff line Loading @@ -16,11 +16,17 @@ package com.android.server.location.contexthub; import android.annotation.Nullable; import android.hardware.contexthub.V1_0.ContextHub; import android.hardware.contexthub.V1_1.Setting; import android.hardware.contexthub.V1_1.SettingValue; import android.hardware.contexthub.V1_2.IContexthubCallback; import android.os.RemoteException; import android.util.Log; import android.util.Pair; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.NoSuchElementException; /** Loading Loading @@ -86,6 +92,24 @@ public abstract class IContextHubWrapper { return (proxy == null) ? null : new ContextHubWrapperV1_2(proxy); } /** * Calls the appropriate getHubs function depending on the HAL version. */ public abstract Pair<List<ContextHub>, 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; /** * Calls the appropriate sendMessageToHub function depending on the HAL version. */ public abstract int sendMessageToHub( int hubId, android.hardware.contexthub.V1_0.ContextHubMsg message, ArrayList<String> hostPermissions) throws RemoteException; /** * @return A valid instance of Contexthub HAL 1.0. */ Loading Loading @@ -148,6 +172,21 @@ public abstract class IContextHubWrapper { mHub = hub; } public Pair<List<ContextHub>, List<String>> getHubs() throws RemoteException { return new Pair(mHub.getHubs(), new ArrayList<String>()); } public void registerCallback( int hubId, IContexthubCallback callback) throws RemoteException { mHub.registerCallback(hubId, callback); } public int sendMessageToHub( int hubId, android.hardware.contexthub.V1_0.ContextHubMsg message, ArrayList<String> hostPermissions) throws RemoteException { return mHub.sendMessageToHub(hubId, message); } public android.hardware.contexthub.V1_0.IContexthub getHub() { return mHub; } Loading Loading @@ -188,6 +227,21 @@ public abstract class IContextHubWrapper { mHub = hub; } public Pair<List<ContextHub>, List<String>> getHubs() throws RemoteException { return new Pair(mHub.getHubs(), new ArrayList<String>()); } public void registerCallback( int hubId, IContexthubCallback callback) throws RemoteException { mHub.registerCallback(hubId, callback); } public int sendMessageToHub( int hubId, android.hardware.contexthub.V1_0.ContextHubMsg message, ArrayList<String> hostPermissions) throws RemoteException { return mHub.sendMessageToHub(hubId, message); } public android.hardware.contexthub.V1_0.IContexthub getHub() { return mHub; } Loading Loading @@ -227,13 +281,42 @@ public abstract class IContextHubWrapper { } } private static class ContextHubWrapperV1_2 extends IContextHubWrapper { private android.hardware.contexthub.V1_2.IContexthub mHub; private static class ContextHubWrapperV1_2 extends IContextHubWrapper implements android.hardware.contexthub.V1_2.IContexthub.getHubs_1_2Callback { private final android.hardware.contexthub.V1_2.IContexthub mHub; private Pair<List<ContextHub>, List<String>> mHubInfo = new Pair<>(Collections.emptyList(), Collections.emptyList()); ContextHubWrapperV1_2(android.hardware.contexthub.V1_2.IContexthub hub) { mHub = hub; } @Override public void onValues(ArrayList<ContextHub> hubs, ArrayList<String> supportedPermissions) { mHubInfo = new Pair(hubs, supportedPermissions); } public Pair<List<ContextHub>, List<String>> getHubs() throws RemoteException { mHub.getHubs_1_2(this); return mHubInfo; } public void registerCallback( int hubId, IContexthubCallback callback) throws RemoteException { mHub.registerCallback_1_2(hubId, callback); } public int sendMessageToHub( int hubId, android.hardware.contexthub.V1_0.ContextHubMsg message, ArrayList<String> hostPermissions) throws RemoteException { android.hardware.contexthub.V1_2.ContextHubMsg newMessage = new android.hardware.contexthub.V1_2.ContextHubMsg(); newMessage.msg_1_0 = message; newMessage.permissions = hostPermissions; return mHub.sendMessageToHub_1_2(hubId, newMessage); } public android.hardware.contexthub.V1_0.IContexthub getHub() { return mHub; } Loading