Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 72c676e3 authored by Arthur Ishiguro's avatar Arthur Ishiguro
Browse files

Reject PendingIntents owned by another client

Removes ambiguity when regenerating a ContextHubClient.

Bug: 117612105
Test: Compile only
Change-Id: Ie105366d8b46b69c332859d9b096f6e6c05ca271
parent 630630cf
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -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
+4 −0
Original line number Diff line number Diff line
@@ -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) {
+14 −1
Original line number Diff line number Diff line
@@ -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;
@@ -203,6 +202,20 @@ import java.util.function.Consumer;
        forEachClientOfHub(contextHubId, client -> client.onNanoAppAborted(nanoAppId, abortCode));
    }

    /**
     * @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.