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

Commit a4f1117e authored by Marvin Ramin's avatar Marvin Ramin
Browse files

Prevent multiple calls to queryDisplayStatus

For each registered listener, the display status would be queried. This
is causing a <Give Device Power Status> message to be sent,
unnecessarily spamming the CEC network.

Refactor the method to only query device power status once, then
notifying all listeners with the value.

Test: lunch adt3-userdebug; make -j
Change-Id: I49923e6193df30c03f56740ffec432f50f38d900
parent 1c6f2f49
Loading
Loading
Loading
Loading
+27 −13
Original line number Diff line number Diff line
@@ -90,6 +90,7 @@ import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
@@ -2631,15 +2632,26 @@ public class HdmiControlService extends SystemService {
    private void announceHdmiControlStatusChange(boolean isEnabled) {
        assertRunOnServiceThread();
        synchronized (mLock) {
            List<IHdmiControlStatusChangeListener> listeners = new ArrayList<>(
                    mHdmiControlStatusChangeListenerRecords.size());
            for (HdmiControlStatusChangeListenerRecord record :
                    mHdmiControlStatusChangeListenerRecords) {
                invokeHdmiControlStatusChangeListenerLocked(record.mListener, isEnabled);
                listeners.add(record.mListener);
            }
            invokeHdmiControlStatusChangeListenerLocked(listeners, isEnabled);
        }
    }

    private void invokeHdmiControlStatusChangeListenerLocked(
            IHdmiControlStatusChangeListener listener, boolean isEnabled) {
        invokeHdmiControlStatusChangeListenerLocked(Collections.singletonList(listener), isEnabled);
    }

    private void invokeHdmiControlStatusChangeListenerLocked(
            Collection<IHdmiControlStatusChangeListener> listeners, boolean isEnabled) {
        if (listeners.isEmpty()) {
            return;
        }
        if (isEnabled) {
            queryDisplayStatus(new IHdmiControlCallback.Stub() {
                public void onComplete(int status) {
@@ -2649,23 +2661,25 @@ public class HdmiControlService extends SystemService {
                            || status == HdmiControlManager.RESULT_SOURCE_NOT_AVAILABLE) {
                        isAvailable = false;
                    }

                    try {
                        listener.onStatusChange(isEnabled, isAvailable);
                    } catch (RemoteException e) {
                        Slog.e(TAG, "Failed to report HdmiControlStatusChange: " + isEnabled
                                + " isAvailable: " + isAvailable, e);
                    }
                    invokeHdmiControlStatusChangeListenerLocked(listeners, isEnabled, isAvailable);
                }
            });
            return;
        }
        invokeHdmiControlStatusChangeListenerLocked(listeners, isEnabled, false);
    }

    private void invokeHdmiControlStatusChangeListenerLocked(
            Collection<IHdmiControlStatusChangeListener> listeners, boolean isEnabled,
            boolean isCecAvailable) {
        for (IHdmiControlStatusChangeListener listener : listeners) {
            try {
            listener.onStatusChange(isEnabled, false);
                listener.onStatusChange(isEnabled, isCecAvailable);
            } catch (RemoteException e) {
            Slog.e(TAG, "Failed to report HdmiControlStatusChange: " + isEnabled
                    + " isAvailable: " + false, e);
                Slog.e(TAG,
                        "Failed to report HdmiControlStatusChange: " + isEnabled + " isAvailable: "
                                + isCecAvailable, e);
            }
        }
    }