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