summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/hardware/location/ContextHubClient.java7
-rw-r--r--services/core/java/com/android/server/location/ContextHubClientBroker.java4
-rw-r--r--services/core/java/com/android/server/location/ContextHubClientManager.java15
3 files changed, 22 insertions, 4 deletions
diff --git a/core/java/android/hardware/location/ContextHubClient.java b/core/java/android/hardware/location/ContextHubClient.java
index 9f11246d7372..2717c4ee5313 100644
--- a/core/java/android/hardware/location/ContextHubClient.java
+++ b/core/java/android/hardware/location/ContextHubClient.java
@@ -107,9 +107,10 @@ public class ContextHubClient implements Closeable {
* This method should be used if the caller wants to receive notifications even after the
* process exits. The client must have an open connection with the Context Hub Service (i.e. it
* cannot have been closed through the {@link #close()} method). Only one PendingIntent can be
- * registered at a time for a single ContextHubClient. If registered successfully, intents will
- * be delivered regarding events for the specified nanoapp from the attached Context Hub. Any
- * unicast messages for this client will also be delivered. The intent will have an extra
+ * registered at a time for a single ContextHubClient, and the PendingIntent cannot be
+ * registered if already registered by a ContextHubClient. If registered successfully, intents
+ * will be delivered regarding events for the specified nanoapp from the attached Context Hub.
+ * Any unicast messages for this client will also be delivered. The intent will have an extra
* {@link ContextHubManager.EXTRA_CONTEXT_HUB_INFO} of type {@link ContextHubInfo}, which
* describes the Context Hub the intent event was for. The intent will also have an extra
* {@link ContextHubManager.EXTRA_EVENT_TYPE} of type {@link ContextHubManager.Event}, which
diff --git a/services/core/java/com/android/server/location/ContextHubClientBroker.java b/services/core/java/com/android/server/location/ContextHubClientBroker.java
index 642347021201..002d4e1049fb 100644
--- a/services/core/java/com/android/server/location/ContextHubClientBroker.java
+++ b/services/core/java/com/android/server/location/ContextHubClientBroker.java
@@ -211,6 +211,10 @@ public class ContextHubClientBroker extends IContextHubClient.Stub
@Override
public boolean registerIntent(PendingIntent pendingIntent, long nanoAppId) {
ContextHubServiceUtil.checkPermissions(mContext);
+ if (mClientManager.isPendingIntentRegistered(pendingIntent)) {
+ Log.e(TAG, "Failed to register PendingIntent: already registered");
+ return false;
+ }
boolean success = false;
synchronized (this) {
diff --git a/services/core/java/com/android/server/location/ContextHubClientManager.java b/services/core/java/com/android/server/location/ContextHubClientManager.java
index 72879ddc2018..fe93a1a0f613 100644
--- a/services/core/java/com/android/server/location/ContextHubClientManager.java
+++ b/services/core/java/com/android/server/location/ContextHubClientManager.java
@@ -24,7 +24,6 @@ import android.hardware.location.ContextHubInfo;
import android.hardware.location.IContextHubClient;
import android.hardware.location.IContextHubClientCallback;
import android.hardware.location.NanoAppMessage;
-import android.os.RemoteException;
import android.util.Log;
import java.util.concurrent.ConcurrentHashMap;
@@ -204,6 +203,20 @@ import java.util.function.Consumer;
}
/**
+ * @param pendingIntent the PendingIntent to check
+ * @return true if the given PendingIntent is registered by a client, false otherwise
+ */
+ /* package */ boolean isPendingIntentRegistered(PendingIntent pendingIntent) {
+ for (ContextHubClientBroker broker : mHostEndPointIdToClientMap.values()) {
+ if (broker.hasPendingIntent(pendingIntent)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
* Creates a new ContextHubClientBroker object for a client and registers it with the client
* manager.
*