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:
@@ -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,19 +2199,21 @@ public class DisplayModeDirector {
|
|||||||
|
|
||||||
void dumpLocked(PrintWriter pw) {
|
void dumpLocked(PrintWriter pw) {
|
||||||
pw.println(" SensorObserver");
|
pw.println(" SensorObserver");
|
||||||
pw.println(" mIsProxActive=" + mIsProxActive);
|
synchronized (mSensorObserverLock) {
|
||||||
pw.println(" mDozeStateByDisplay:");
|
pw.println(" mIsProxActive=" + mIsProxActive);
|
||||||
for (int i = 0; i < mDozeStateByDisplay.size(); i++) {
|
pw.println(" mDozeStateByDisplay:");
|
||||||
final int id = mDozeStateByDisplay.keyAt(i);
|
for (int i = 0; i < mDozeStateByDisplay.size(); i++) {
|
||||||
final boolean dozed = mDozeStateByDisplay.valueAt(i);
|
final int id = mDozeStateByDisplay.keyAt(i);
|
||||||
pw.println(" " + id + " -> " + dozed);
|
final boolean dozed = mDozeStateByDisplay.valueAt(i);
|
||||||
|
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();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user