Merge "Improve window orientation listener."

This commit is contained in:
Jeff Brown
2014-05-23 01:26:24 +00:00
committed by Android (Google) Code Review
2 changed files with 73 additions and 1 deletions

View File

@@ -5541,8 +5541,13 @@ public class PhoneWindowManager implements WindowManagerPolicy {
pw.print(prefix); pw.print("mDemoHdmiRotation="); pw.print(mDemoHdmiRotation);
pw.print(" mDemoHdmiRotationLock="); pw.println(mDemoHdmiRotationLock);
pw.print(prefix); pw.print("mUndockedHdmiRotation="); pw.println(mUndockedHdmiRotation);
mStatusBarController.dump(pw, prefix);
mNavigationBarController.dump(pw, prefix);
PolicyControl.dump(prefix, pw);
if (mOrientationListener != null) {
mOrientationListener.dump(pw, prefix);
}
}
}

View File

@@ -26,6 +26,9 @@ import android.os.SystemProperties;
import android.util.FloatMath;
import android.util.Log;
import android.util.Slog;
import android.util.TimeUtils;
import java.io.PrintWriter;
/**
* A special helper class used by the WindowManager
@@ -181,6 +184,19 @@ public abstract class WindowOrientationListener {
*/
public abstract void onProposedRotationChanged(int rotation);
public void dump(PrintWriter pw, String prefix) {
synchronized (mLock) {
pw.println(prefix + TAG);
prefix += " ";
pw.println(prefix + "mEnabled=" + mEnabled);
pw.println(prefix + "mCurrentRotation=" + mCurrentRotation);
pw.println(prefix + "mSensor=" + mSensor);
pw.println(prefix + "mRate=" + mRate);
mSensorEventListener.dumpLocked(pw, prefix);
}
}
/**
* This class filters the raw accelerometer data and tries to detect actual changes in
* orientation. This is a very ill-defined problem so there are a lot of tweakable parameters,
@@ -342,6 +358,14 @@ public abstract class WindowOrientationListener {
/* ROTATION_270 */ { -25, 65 }
};
// The tilt angle below which we conclude that the user is holding the device
// overhead reading in bed and lock into that state.
private final int TILT_OVERHEAD_ENTER = -40;
// The tilt angle above which we conclude that the user would like a rotation
// change to occur and unlock from the overhead state.
private final int TILT_OVERHEAD_EXIT = -15;
// The gap angle in degrees between adjacent orientation angles for hysteresis.
// This creates a "dead zone" between the current orientation and a proposed
// adjacent orientation. No orientation proposal is made when the orientation
@@ -364,12 +388,18 @@ public abstract class WindowOrientationListener {
// Timestamp when the device last appeared to be flat for sure (the flat delay elapsed).
private long mFlatTimestampNanos;
private boolean mFlat;
// Timestamp when the device last appeared to be swinging.
private long mSwingTimestampNanos;
private boolean mSwinging;
// Timestamp when the device last appeared to be undergoing external acceleration.
private long mAccelerationTimestampNanos;
private boolean mAccelerating;
// Whether we are locked into an overhead usage mode.
private boolean mOverhead;
// History of observed tilt angles.
private static final int TILT_HISTORY_SIZE = 40;
@@ -381,6 +411,19 @@ public abstract class WindowOrientationListener {
return mProposedRotation;
}
public void dumpLocked(PrintWriter pw, String prefix) {
pw.println(prefix + "mProposedRotation=" + mProposedRotation);
pw.println(prefix + "mPredictedRotation=" + mPredictedRotation);
pw.println(prefix + "mLastFilteredX=" + mLastFilteredX);
pw.println(prefix + "mLastFilteredY=" + mLastFilteredY);
pw.println(prefix + "mLastFilteredZ=" + mLastFilteredZ);
pw.println(prefix + "mTiltHistory={last: " + getLastTiltLocked() + "}");
pw.println(prefix + "mFlat=" + mFlat);
pw.println(prefix + "mSwinging=" + mSwinging);
pw.println(prefix + "mAccelerating=" + mAccelerating);
pw.println(prefix + "mOverhead=" + mOverhead);
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
@@ -478,7 +521,18 @@ public abstract class WindowOrientationListener {
// If the tilt angle is too close to horizontal then we cannot determine
// the orientation angle of the screen.
if (Math.abs(tiltAngle) > MAX_TILT) {
if (tiltAngle <= TILT_OVERHEAD_ENTER) {
mOverhead = true;
} else if (tiltAngle >= TILT_OVERHEAD_EXIT) {
mOverhead = false;
}
if (mOverhead) {
if (LOG) {
Slog.v(TAG, "Ignoring sensor data, device is overhead: "
+ "tiltAngle=" + tiltAngle);
}
clearPredictedRotationLocked();
} else if (Math.abs(tiltAngle) > MAX_TILT) {
if (LOG) {
Slog.v(TAG, "Ignoring sensor data, tilt angle too high: "
+ "tiltAngle=" + tiltAngle);
@@ -526,6 +580,9 @@ public abstract class WindowOrientationListener {
}
}
}
mFlat = isFlat;
mSwinging = isSwinging;
mAccelerating = isAccelerating;
// Determine new proposed rotation.
oldProposedRotation = mProposedRotation;
@@ -543,6 +600,7 @@ public abstract class WindowOrientationListener {
+ ", isAccelerating=" + isAccelerating
+ ", isFlat=" + isFlat
+ ", isSwinging=" + isSwinging
+ ", isOverhead=" + mOverhead
+ ", timeUntilSettledMS=" + remainingMS(now,
mPredictedRotationTimestampNanos + PROPOSAL_SETTLE_TIME_NANOS)
+ ", timeUntilAccelerationDelayExpiredMS=" + remainingMS(now,
@@ -660,8 +718,12 @@ public abstract class WindowOrientationListener {
mLastFilteredTimestampNanos = Long.MIN_VALUE;
mProposedRotation = -1;
mFlatTimestampNanos = Long.MIN_VALUE;
mFlat = false;
mSwingTimestampNanos = Long.MIN_VALUE;
mSwinging = false;
mAccelerationTimestampNanos = Long.MIN_VALUE;
mAccelerating = false;
mOverhead = false;
clearPredictedRotationLocked();
clearTiltHistoryLocked();
}
@@ -726,6 +788,11 @@ public abstract class WindowOrientationListener {
return mTiltHistoryTimestampNanos[index] != Long.MIN_VALUE ? index : -1;
}
private float getLastTiltLocked() {
int index = nextTiltHistoryIndexLocked(mTiltHistoryIndex);
return index >= 0 ? mTiltHistory[index] : Float.NaN;
}
private float remainingMS(long now, long until) {
return now >= until ? 0 : (until - now) * 0.000001f;
}