Merge "Fix DisplayManager race condition when state is unknown" into tm-qpr-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
ee0c2b11c0
@@ -817,9 +817,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
|
|||||||
mDisplayDeviceConfig = config;
|
mDisplayDeviceConfig = config;
|
||||||
loadFromDisplayDeviceConfig(token, info);
|
loadFromDisplayDeviceConfig(token, info);
|
||||||
|
|
||||||
// Since the underlying display-device changed, we really don't know the
|
/// Since the underlying display-device changed, we really don't know the
|
||||||
// last command that was sent to change it's state. Lets assume it is off and we
|
// last command that was sent to change it's state. Lets assume it is unknown so
|
||||||
// trigger a change immediately.
|
// that we trigger a change immediately.
|
||||||
mPowerState.resetScreenState();
|
mPowerState.resetScreenState();
|
||||||
}
|
}
|
||||||
if (mIsEnabled != isEnabled || mIsInTransition != isInTransition) {
|
if (mIsEnabled != isEnabled || mIsInTransition != isInTransition) {
|
||||||
|
|||||||
@@ -340,20 +340,12 @@ final class DisplayPowerState {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Resets the screen state to {@link Display#STATE_OFF}. Even though we do not know the last
|
* Resets the screen state to unknown. Useful when the underlying display-device changes for the
|
||||||
* state that was sent to the underlying display-device, we assume it is off.
|
* LogicalDisplay and we do not know the last state that was sent to it.
|
||||||
*
|
|
||||||
* We do not set the screen state to {@link Display#STATE_UNKNOWN} to avoid getting in the state
|
|
||||||
* where PhotonicModulator holds onto the lock. This happens because we currently try to keep
|
|
||||||
* the mScreenState and mPendingState in sync, however if the screenState is set to
|
|
||||||
* {@link Display#STATE_UNKNOWN} here, mPendingState will get progressed to this, which will
|
|
||||||
* force the PhotonicModulator thread to wait onto the lock to take it out of that state.
|
|
||||||
* b/262294651 for more info.
|
|
||||||
*/
|
*/
|
||||||
void resetScreenState() {
|
void resetScreenState() {
|
||||||
mScreenState = Display.STATE_OFF;
|
mScreenState = Display.STATE_UNKNOWN;
|
||||||
mScreenReady = false;
|
mScreenReady = false;
|
||||||
scheduleScreenUpdate();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void scheduleScreenUpdate() {
|
private void scheduleScreenUpdate() {
|
||||||
@@ -514,6 +506,8 @@ final class DisplayPowerState {
|
|||||||
boolean valid = state != Display.STATE_UNKNOWN && !Float.isNaN(brightnessState);
|
boolean valid = state != Display.STATE_UNKNOWN && !Float.isNaN(brightnessState);
|
||||||
boolean changed = stateChanged || backlightChanged;
|
boolean changed = stateChanged || backlightChanged;
|
||||||
if (!valid || !changed) {
|
if (!valid || !changed) {
|
||||||
|
mStateChangeInProgress = false;
|
||||||
|
mBacklightChangeInProgress = false;
|
||||||
try {
|
try {
|
||||||
mLock.wait();
|
mLock.wait();
|
||||||
} catch (InterruptedException ex) {
|
} catch (InterruptedException ex) {
|
||||||
|
|||||||
Reference in New Issue
Block a user