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

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

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

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,17 +141,21 @@ 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) {
@@ -169,6 +170,10 @@ public final class CameraManager {
mDeviceStateListeners.removeAll(invalidListeners); 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);
} }
} }
} }