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
This commit is contained in:
Marvin Ramin
2020-03-27 14:37:02 +01:00
parent 1c6f2f4908
commit a4f1117e76

View File

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