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:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user