Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4dd1477d authored by Emilian Peev's avatar Emilian Peev Committed by Gerrit Code Review
Browse files

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

parents 84e81127 eb11b240
Loading
Loading
Loading
Loading
+24 −20
Original line number Diff line number Diff line
@@ -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,17 +141,21 @@ 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) {
@@ -169,6 +170,10 @@ public final class CameraManager {
                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);
            }
        }
    }