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

Commit a4023ace authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Introduce new lock to avoid lock-ordering issues." into sc-dev am: 0298091d

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

Change-Id: I868736aff2e56a14528e4ca1250d74b9af42b0f6
parents 7d77e932 0298091d
Loading
Loading
Loading
Loading
+19 −14
Original line number Diff line number Diff line
@@ -52,6 +52,7 @@ import android.view.Display;
import android.view.DisplayInfo;

import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.os.BackgroundThread;
import com.android.server.LocalServices;
@@ -2127,7 +2128,7 @@ public class DisplayModeDirector {
        }
    }

    private final class SensorObserver implements ProximityActiveListener,
    private static final class SensorObserver implements ProximityActiveListener,
            DisplayManager.DisplayListener {
        private final String mProximitySensorName = null;
        private final String mProximitySensorType = Sensor.STRING_TYPE_PROXIMITY;
@@ -2135,22 +2136,24 @@ public class DisplayModeDirector {
        private final BallotBox mBallotBox;
        private final Context mContext;
        private final Injector mInjector;
        @GuardedBy("mSensorObserverLock")
        private final SparseBooleanArray mDozeStateByDisplay = new SparseBooleanArray();
        private final Object mSensorObserverLock = new Object();

        private DisplayManager mDisplayManager;
        private DisplayManagerInternal mDisplayManagerInternal;
        @GuardedBy("mSensorObserverLock")
        private boolean mIsProxActive = false;
        private final SparseBooleanArray mDozeStateByDisplay;

        SensorObserver(Context context, BallotBox ballotBox, Injector injector) {
            mContext = context;
            mBallotBox = ballotBox;
            mInjector = injector;
            mDozeStateByDisplay = new SparseBooleanArray();
        }

        @Override
        public void onProximityActive(boolean isActive) {
            synchronized (mLock) {
            synchronized (mSensorObserverLock) {
                if (mIsProxActive != isActive) {
                    mIsProxActive = isActive;
                    recalculateVotesLocked();
@@ -2166,7 +2169,7 @@ public class DisplayModeDirector {
                    LocalServices.getService(SensorManagerInternal.class);
            sensorManager.addProximityActiveListener(BackgroundThread.getExecutor(), this);

            synchronized (mLock) {
            synchronized (mSensorObserverLock) {
                for (Display d : mDisplayManager.getDisplays()) {
                    mDozeStateByDisplay.put(d.getDisplayId(), mInjector.isDozeState(d));
                }
@@ -2196,6 +2199,7 @@ public class DisplayModeDirector {

        void dumpLocked(PrintWriter pw) {
            pw.println("  SensorObserver");
            synchronized (mSensorObserverLock) {
                pw.println("    mIsProxActive=" + mIsProxActive);
                pw.println("    mDozeStateByDisplay:");
                for (int i = 0; i < mDozeStateByDisplay.size(); i++) {
@@ -2204,11 +2208,12 @@ public class DisplayModeDirector {
                    pw.println("      " + id + " -> " + dozed);
                }
            }
        }

        @Override
        public void onDisplayAdded(int displayId) {
            boolean isDozeState = mInjector.isDozeState(mDisplayManager.getDisplay(displayId));
            synchronized (mLock) {
            synchronized (mSensorObserverLock) {
                mDozeStateByDisplay.put(displayId, isDozeState);
                recalculateVotesLocked();
            }
@@ -2217,7 +2222,7 @@ public class DisplayModeDirector {
        @Override
        public void onDisplayChanged(int displayId) {
            boolean wasDozeState = mDozeStateByDisplay.get(displayId);
            synchronized (mLock) {
            synchronized (mSensorObserverLock) {
                mDozeStateByDisplay.put(displayId,
                        mInjector.isDozeState(mDisplayManager.getDisplay(displayId)));
                if (wasDozeState != mDozeStateByDisplay.get(displayId)) {
@@ -2228,7 +2233,7 @@ public class DisplayModeDirector {

        @Override
        public void onDisplayRemoved(int displayId) {
            synchronized (mLock) {
            synchronized (mSensorObserverLock) {
                mDozeStateByDisplay.delete(displayId);
                recalculateVotesLocked();
            }