diff --git a/services/core/java/com/android/server/display/DisplayModeDirector.java b/services/core/java/com/android/server/display/DisplayModeDirector.java index 186986e17c142..0d1b3d6f0ffd4 100644 --- a/services/core/java/com/android/server/display/DisplayModeDirector.java +++ b/services/core/java/com/android/server/display/DisplayModeDirector.java @@ -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,19 +2199,21 @@ public class DisplayModeDirector { void dumpLocked(PrintWriter pw) { pw.println(" SensorObserver"); - pw.println(" mIsProxActive=" + mIsProxActive); - pw.println(" mDozeStateByDisplay:"); - for (int i = 0; i < mDozeStateByDisplay.size(); i++) { - final int id = mDozeStateByDisplay.keyAt(i); - final boolean dozed = mDozeStateByDisplay.valueAt(i); - pw.println(" " + id + " -> " + dozed); + synchronized (mSensorObserverLock) { + pw.println(" mIsProxActive=" + mIsProxActive); + pw.println(" mDozeStateByDisplay:"); + for (int i = 0; i < mDozeStateByDisplay.size(); i++) { + final int id = mDozeStateByDisplay.keyAt(i); + final boolean dozed = mDozeStateByDisplay.valueAt(i); + 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(); }