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

Commit 39bbc972 authored by Guojing Yuan's avatar Guojing Yuan Committed by Android (Google) Code Review
Browse files

Merge "[CDM] Fix message listener caching" into main

parents f5f71913 85d04a5d
Loading
Loading
Loading
Loading
+39 −12
Original line number Diff line number Diff line
@@ -80,9 +80,11 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.Executor;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
@@ -427,6 +429,10 @@ public final class CompanionDeviceManager {
    private final ArrayList<OnTransportsChangedListenerProxy> mTransportsChangedListeners =
            new ArrayList<>();

    @GuardedBy("mMessageReceivedListeners")
    private final SparseArray<Set<OnMessageReceivedListenerProxy>> mMessageReceivedListeners =
            new SparseArray<>();

    @GuardedBy("mTransports")
    private final SparseArray<Transport> mTransports = new SparseArray<>();

@@ -1141,6 +1147,7 @@ public final class CompanionDeviceManager {
            return;
        }

        synchronized (mMessageReceivedListeners) {
            final OnMessageReceivedListenerProxy proxy = new OnMessageReceivedListenerProxy(
                    executor, listener);
            try {
@@ -1148,6 +1155,12 @@ public final class CompanionDeviceManager {
            } catch (RemoteException e) {
                throw e.rethrowFromSystemServer();
            }

            if (!mMessageReceivedListeners.contains(messageType)) {
                mMessageReceivedListeners.put(messageType, new HashSet<>());
            }
            mMessageReceivedListeners.get(messageType).add(proxy);
        }
    }

    /**
@@ -1163,13 +1176,27 @@ public final class CompanionDeviceManager {
            return;
        }

        final OnMessageReceivedListenerProxy proxy = new OnMessageReceivedListenerProxy(
                null, listener);
        synchronized (mMessageReceivedListeners) {
            if (!mMessageReceivedListeners.contains(messageType)) {
                Log.w(TAG, "Can't remove OnMessageReceivedListener. messageType " + messageType
                        + " is not being listened.");
                return;
            }

            final Iterator<OnMessageReceivedListenerProxy> iterator =
                    mMessageReceivedListeners.get(messageType).iterator();
            while (iterator.hasNext()) {
                final OnMessageReceivedListenerProxy proxy = iterator.next();
                if (proxy.mListener == listener) {
                    try {
                        mService.removeOnMessageReceivedListener(messageType, proxy);
                    } catch (RemoteException e) {
                        throw e.rethrowFromSystemServer();
                    }
                    iterator.remove();
                }
            }
        }
    }

    /**