diff options
| author | 2023-06-20 23:08:09 +0900 | |
|---|---|---|
| committer | 2023-06-26 16:15:37 -0700 | |
| commit | 7ebffbe2c0db80e5a4191d5236ca086bbd55cc17 (patch) | |
| tree | 532d0a89aab4b1765ada006c2666fd447a5c3e38 | |
| parent | 4694c51dd5553ae132a170ac31b05eef6cd4a0f9 (diff) | |
Camera: Address device state listener delay
For the long running process with the frequent camera characteristic
acquiring, the size of mDeviceStateListeners could increase
significantly. This could cause a delay when removeAll() is invoked from
handleStateChange().
This change will address this by removing old listeners when we add a new one.
Bug: 288070122
Test: Manual test with a foldable device with frequent camera characteristic
acquiring
Change-Id: I84c807f00c876734df06d244675e39e9cfc868a2
| -rw-r--r-- | core/java/android/hardware/camera2/CameraManager.java | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/core/java/android/hardware/camera2/CameraManager.java b/core/java/android/hardware/camera2/CameraManager.java index 85f8ca66715b..a098362f16aa 100644 --- a/core/java/android/hardware/camera2/CameraManager.java +++ b/core/java/android/hardware/camera2/CameraManager.java @@ -67,6 +67,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; +import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.concurrent.Executor; @@ -178,22 +179,20 @@ public final class CameraManager { boolean folded = ArrayUtils.contains(mFoldedDeviceStates, state); mFoldedDeviceState = folded; - ArrayList<WeakReference<DeviceStateListener>> invalidListeners = new ArrayList<>(); - for (WeakReference<DeviceStateListener> listener : mDeviceStateListeners) { - DeviceStateListener callback = listener.get(); + Iterator<WeakReference<DeviceStateListener>> it = mDeviceStateListeners.iterator(); + while(it.hasNext()) { + DeviceStateListener callback = it.next().get(); if (callback != null) { callback.onDeviceStateChanged(folded); } else { - invalidListeners.add(listener); + it.remove(); } } - if (!invalidListeners.isEmpty()) { - mDeviceStateListeners.removeAll(invalidListeners); - } } public synchronized void addDeviceStateListener(DeviceStateListener listener) { listener.onDeviceStateChanged(mFoldedDeviceState); + mDeviceStateListeners.removeIf(l -> l.get() == null); mDeviceStateListeners.add(new WeakReference<>(listener)); } |