Merge "Fix an issue that the FoldStateListener induces a memory leak"

This commit is contained in:
Emilian Peev
2022-10-20 21:41:42 +00:00
committed by Gerrit Code Review

View File

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