diff options
6 files changed, 202 insertions, 37 deletions
diff --git a/services/core/java/com/android/server/location/contexthub/ContextHubClientBroker.java b/services/core/java/com/android/server/location/contexthub/ContextHubClientBroker.java index cc510fbc38bd..d3c853da9b02 100644 --- a/services/core/java/com/android/server/location/contexthub/ContextHubClientBroker.java +++ b/services/core/java/com/android/server/location/contexthub/ContextHubClientBroker.java @@ -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; @@ -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; @@ -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. @@ -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. */ @@ -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; @@ -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; @@ -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; @@ -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); @@ -263,6 +276,21 @@ public class ContextHubClientBroker extends IContextHubClient.Stub } /** + * 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 */ /* package */ int getAttachedContextHubId() { @@ -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()); diff --git a/services/core/java/com/android/server/location/contexthub/ContextHubClientManager.java b/services/core/java/com/android/server/location/contexthub/ContextHubClientManager.java index eda89ab52c6f..0351edb8f218 100644 --- a/services/core/java/com/android/server/location/contexthub/ContextHubClientManager.java +++ b/services/core/java/com/android/server/location/contexthub/ContextHubClientManager.java @@ -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; @@ -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. @@ -138,7 +137,7 @@ import java.util.function.Consumer; } /* package */ ContextHubClientManager( - Context context, IContexthub contextHubProxy) { + Context context, IContextHubWrapper contextHubProxy) { mContext = context; mContextHubProxy = contextHubProxy; } @@ -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)); @@ -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) { @@ -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); } } 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 785e6745087f..2eafe6ad41a0 100644 --- a/services/core/java/com/android/server/location/contexthub/ContextHubService.java +++ b/services/core/java/com/android/server/location/contexthub/ContextHubService.java @@ -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; @@ -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; @@ -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 @@ -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); } } @@ -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 = " @@ -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); } @@ -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); } /** @@ -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); } /** 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 88ed1053616a..8361253dcd4a 100644 --- a/services/core/java/com/android/server/location/contexthub/ContextHubServiceUtil.java +++ b/services/core/java/com/android/server/location/contexthub/ContextHubServiceUtil.java @@ -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; @@ -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; @@ -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; + } } 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 c11e289c116b..c1d63dd2fbc9 100644 --- a/services/core/java/com/android/server/location/contexthub/IContextHubWrapper.java +++ b/services/core/java/com/android/server/location/contexthub/IContextHubWrapper.java @@ -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; /** @@ -87,6 +93,24 @@ public abstract class IContextHubWrapper { } /** + * 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. */ public abstract android.hardware.contexthub.V1_0.IContexthub getHub(); @@ -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; } @@ -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; } @@ -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; } 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 60109fe4b9f6..667fb98f8649 100644 --- a/services/core/java/com/android/server/location/contexthub/NanoAppStateManager.java +++ b/services/core/java/com/android/server/location/contexthub/NanoAppStateManager.java @@ -17,7 +17,7 @@ package com.android.server.location.contexthub; import android.annotation.Nullable; -import android.hardware.contexthub.V1_0.HubAppInfo; +import android.hardware.contexthub.V1_2.HubAppInfo; import android.hardware.location.NanoAppInstanceInfo; import android.util.Log; @@ -154,8 +154,8 @@ import java.util.function.Consumer; synchronized void updateCache(int contextHubId, List<HubAppInfo> nanoAppInfoList) { HashSet<Long> nanoAppIdSet = new HashSet<>(); for (HubAppInfo appInfo : nanoAppInfoList) { - handleQueryAppEntry(contextHubId, appInfo.appId, appInfo.version); - nanoAppIdSet.add(appInfo.appId); + handleQueryAppEntry(contextHubId, appInfo.info_1_0.appId, appInfo.info_1_0.version); + nanoAppIdSet.add(appInfo.info_1_0.appId); } Iterator<NanoAppInstanceInfo> iterator = mNanoAppHash.values().iterator(); |