summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Kwangkyu Park <kk48.park@samsung.corp-partner.google.com> 2023-06-20 23:08:09 +0900
committer Emilian Peev <epeev@google.com> 2023-06-26 16:15:37 -0700
commit7ebffbe2c0db80e5a4191d5236ca086bbd55cc17 (patch)
tree532d0a89aab4b1765ada006c2666fd447a5c3e38
parent4694c51dd5553ae132a170ac31b05eef6cd4a0f9 (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.java13
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));
}