diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java index 2d03b76def118..5e89cafc61f82 100644 --- a/services/core/java/com/android/server/hdmi/HdmiControlService.java +++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java @@ -92,6 +92,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; @@ -2680,15 +2681,26 @@ public class HdmiControlService extends SystemService { private void announceHdmiControlStatusChange(boolean isEnabled) { assertRunOnServiceThread(); synchronized (mLock) { + List 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 listeners, boolean isEnabled) { + if (listeners.isEmpty()) { + return; + } if (isEnabled) { queryDisplayStatus(new IHdmiControlCallback.Stub() { public void onComplete(int status) { @@ -2698,23 +2710,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 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); + } } }