diff --git a/services/core/java/com/android/server/policy/WindowOrientationListener.java b/services/core/java/com/android/server/policy/WindowOrientationListener.java index 8b3c036594c65..991622398a481 100644 --- a/services/core/java/com/android/server/policy/WindowOrientationListener.java +++ b/services/core/java/com/android/server/policy/WindowOrientationListener.java @@ -217,6 +217,8 @@ public abstract class WindowOrientationListener { * It is called each time the orientation determination transitions from being * uncertain to being certain again, even if it is the same orientation as before. * + * This should only be called on the Handler thread. + * * @param rotation The new orientation of the device, one of the Surface.ROTATION_* constants. * @see android.view.Surface */ @@ -995,9 +997,13 @@ public abstract class WindowOrientationListener { @Override public void onSensorChanged(SensorEvent event) { + int newRotation; synchronized (mLock) { mDesiredRotation = (int) event.values[0]; - evaluateRotationChangeLocked(); + newRotation = evaluateRotationChangeLocked(); + } + if (newRotation >=0) { + onProposedRotationChanged(newRotation); } } @@ -1023,18 +1029,19 @@ public abstract class WindowOrientationListener { unscheduleRotationEvaluationLocked(); } - public void evaluateRotationChangeLocked() { + public int evaluateRotationChangeLocked() { unscheduleRotationEvaluationLocked(); if (mDesiredRotation == mProposedRotation) { - return; + return -1; } final long now = SystemClock.elapsedRealtimeNanos(); if (isDesiredRotationAcceptableLocked(now)) { mProposedRotation = mDesiredRotation; - onProposedRotationChanged(mProposedRotation); + return mProposedRotation; } else { scheduleRotationEvaluationIfNecessaryLocked(now); } + return -1; } private boolean isDesiredRotationAcceptableLocked(long now) { @@ -1090,9 +1097,13 @@ public abstract class WindowOrientationListener { private Runnable mRotationEvaluator = new Runnable() { @Override public void run() { + int newRotation; synchronized (mLock) { mRotationEvaluationScheduled = false; - evaluateRotationChangeLocked(); + newRotation = evaluateRotationChangeLocked(); + } + if (newRotation >= 0) { + onProposedRotationChanged(newRotation); } } };