Merge "Improve window orientation listener."
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user