Merge "Fix an issue that the FoldStateListener induces a memory leak" am: 4dd1477d72 am: fa87ee6feb

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/2185395

Change-Id: I01860301e34fbb4c42a6e3bedb139c17cfa911d6
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Emilian Peev
2022-10-20 23:15:46 +00:00
committed by Automerger Merge Worker

View File

@@ -133,9 +133,6 @@ public final class CameraManager {
private HandlerThread mHandlerThread;
private Handler mHandler;
private FoldStateListener mFoldStateListener;
@GuardedBy("mLock")
private ArrayList<WeakReference<DeviceStateListener>> mDeviceStateListeners = new ArrayList<>();
private boolean mFoldedDeviceState;
/**
* @hide
@@ -144,31 +141,39 @@ public final class CameraManager {
void onDeviceStateChanged(boolean folded);
}
private final class FoldStateListener implements DeviceStateManager.DeviceStateCallback {
private static final class FoldStateListener implements DeviceStateManager.DeviceStateCallback {
private final int[] mFoldedDeviceStates;
private ArrayList<WeakReference<DeviceStateListener>> mDeviceStateListeners =
new ArrayList<>();
private boolean mFoldedDeviceState;
public FoldStateListener(Context context) {
mFoldedDeviceStates = context.getResources().getIntArray(
com.android.internal.R.array.config_foldedDeviceStates);
}
private void handleStateChange(int state) {
private synchronized void handleStateChange(int state) {
boolean folded = ArrayUtils.contains(mFoldedDeviceStates, state);
synchronized (mLock) {
mFoldedDeviceState = folded;
ArrayList<WeakReference<DeviceStateListener>> invalidListeners = new ArrayList<>();
for (WeakReference<DeviceStateListener> listener : mDeviceStateListeners) {
DeviceStateListener callback = listener.get();
if (callback != null) {
callback.onDeviceStateChanged(folded);
} else {
invalidListeners.add(listener);
}
}
if (!invalidListeners.isEmpty()) {
mDeviceStateListeners.removeAll(invalidListeners);
mFoldedDeviceState = folded;
ArrayList<WeakReference<DeviceStateListener>> invalidListeners = new ArrayList<>();
for (WeakReference<DeviceStateListener> listener : mDeviceStateListeners) {
DeviceStateListener callback = listener.get();
if (callback != null) {
callback.onDeviceStateChanged(folded);
} else {
invalidListeners.add(listener);
}
}
if (!invalidListeners.isEmpty()) {
mDeviceStateListeners.removeAll(invalidListeners);
}
}
public synchronized void addDeviceStateListener(DeviceStateListener listener) {
listener.onDeviceStateChanged(mFoldedDeviceState);
mDeviceStateListeners.add(new WeakReference<>(listener));
}
@Override
@@ -192,9 +197,8 @@ public final class CameraManager {
public void registerDeviceStateListener(@NonNull CameraCharacteristics chars) {
synchronized (mLock) {
DeviceStateListener listener = chars.getDeviceStateListener();
listener.onDeviceStateChanged(mFoldedDeviceState);
if (mFoldStateListener != null) {
mDeviceStateListeners.add(new WeakReference<>(listener));
mFoldStateListener.addDeviceStateListener(listener);
}
}
}