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

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

Change-Id: I9968f3ab793af6c8fc7e3849be78893534bf39e0
This commit is contained in:
TreeHugger Robot
2021-08-06 23:42:03 +00:00
committed by Automerger Merge Worker

View File

@@ -52,6 +52,7 @@ import android.view.Display;
import android.view.DisplayInfo; import android.view.DisplayInfo;
import com.android.internal.R; import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.os.BackgroundThread; import com.android.internal.os.BackgroundThread;
import com.android.server.LocalServices; 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 { DisplayManager.DisplayListener {
private final String mProximitySensorName = null; private final String mProximitySensorName = null;
private final String mProximitySensorType = Sensor.STRING_TYPE_PROXIMITY; private final String mProximitySensorType = Sensor.STRING_TYPE_PROXIMITY;
@@ -2135,22 +2136,24 @@ public class DisplayModeDirector {
private final BallotBox mBallotBox; private final BallotBox mBallotBox;
private final Context mContext; private final Context mContext;
private final Injector mInjector; private final Injector mInjector;
@GuardedBy("mSensorObserverLock")
private final SparseBooleanArray mDozeStateByDisplay = new SparseBooleanArray();
private final Object mSensorObserverLock = new Object();
private DisplayManager mDisplayManager; private DisplayManager mDisplayManager;
private DisplayManagerInternal mDisplayManagerInternal; private DisplayManagerInternal mDisplayManagerInternal;
@GuardedBy("mSensorObserverLock")
private boolean mIsProxActive = false; private boolean mIsProxActive = false;
private final SparseBooleanArray mDozeStateByDisplay;
SensorObserver(Context context, BallotBox ballotBox, Injector injector) { SensorObserver(Context context, BallotBox ballotBox, Injector injector) {
mContext = context; mContext = context;
mBallotBox = ballotBox; mBallotBox = ballotBox;
mInjector = injector; mInjector = injector;
mDozeStateByDisplay = new SparseBooleanArray();
} }
@Override @Override
public void onProximityActive(boolean isActive) { public void onProximityActive(boolean isActive) {
synchronized (mLock) { synchronized (mSensorObserverLock) {
if (mIsProxActive != isActive) { if (mIsProxActive != isActive) {
mIsProxActive = isActive; mIsProxActive = isActive;
recalculateVotesLocked(); recalculateVotesLocked();
@@ -2166,7 +2169,7 @@ public class DisplayModeDirector {
LocalServices.getService(SensorManagerInternal.class); LocalServices.getService(SensorManagerInternal.class);
sensorManager.addProximityActiveListener(BackgroundThread.getExecutor(), this); sensorManager.addProximityActiveListener(BackgroundThread.getExecutor(), this);
synchronized (mLock) { synchronized (mSensorObserverLock) {
for (Display d : mDisplayManager.getDisplays()) { for (Display d : mDisplayManager.getDisplays()) {
mDozeStateByDisplay.put(d.getDisplayId(), mInjector.isDozeState(d)); mDozeStateByDisplay.put(d.getDisplayId(), mInjector.isDozeState(d));
} }
@@ -2196,6 +2199,7 @@ public class DisplayModeDirector {
void dumpLocked(PrintWriter pw) { void dumpLocked(PrintWriter pw) {
pw.println(" SensorObserver"); pw.println(" SensorObserver");
synchronized (mSensorObserverLock) {
pw.println(" mIsProxActive=" + mIsProxActive); pw.println(" mIsProxActive=" + mIsProxActive);
pw.println(" mDozeStateByDisplay:"); pw.println(" mDozeStateByDisplay:");
for (int i = 0; i < mDozeStateByDisplay.size(); i++) { for (int i = 0; i < mDozeStateByDisplay.size(); i++) {
@@ -2204,11 +2208,12 @@ public class DisplayModeDirector {
pw.println(" " + id + " -> " + dozed); pw.println(" " + id + " -> " + dozed);
} }
} }
}
@Override @Override
public void onDisplayAdded(int displayId) { public void onDisplayAdded(int displayId) {
boolean isDozeState = mInjector.isDozeState(mDisplayManager.getDisplay(displayId)); boolean isDozeState = mInjector.isDozeState(mDisplayManager.getDisplay(displayId));
synchronized (mLock) { synchronized (mSensorObserverLock) {
mDozeStateByDisplay.put(displayId, isDozeState); mDozeStateByDisplay.put(displayId, isDozeState);
recalculateVotesLocked(); recalculateVotesLocked();
} }
@@ -2217,7 +2222,7 @@ public class DisplayModeDirector {
@Override @Override
public void onDisplayChanged(int displayId) { public void onDisplayChanged(int displayId) {
boolean wasDozeState = mDozeStateByDisplay.get(displayId); boolean wasDozeState = mDozeStateByDisplay.get(displayId);
synchronized (mLock) { synchronized (mSensorObserverLock) {
mDozeStateByDisplay.put(displayId, mDozeStateByDisplay.put(displayId,
mInjector.isDozeState(mDisplayManager.getDisplay(displayId))); mInjector.isDozeState(mDisplayManager.getDisplay(displayId)));
if (wasDozeState != mDozeStateByDisplay.get(displayId)) { if (wasDozeState != mDozeStateByDisplay.get(displayId)) {
@@ -2228,7 +2233,7 @@ public class DisplayModeDirector {
@Override @Override
public void onDisplayRemoved(int displayId) { public void onDisplayRemoved(int displayId) {
synchronized (mLock) { synchronized (mSensorObserverLock) {
mDozeStateByDisplay.delete(displayId); mDozeStateByDisplay.delete(displayId);
recalculateVotesLocked(); recalculateVotesLocked();
} }