am e0c8582e: Merge "Improve orientation sensing when waking up while flat." into gingerbread

Merge commit 'e0c8582e8a9f2b6eb5ebde667ddd1fddf4652bd4' into gingerbread-plus-aosp

* commit 'e0c8582e8a9f2b6eb5ebde667ddd1fddf4652bd4':
  Improve orientation sensing when waking up while flat.
This commit is contained in:
Steve Howard
2010-08-19 08:32:23 -07:00
committed by Android Git Automerger
2 changed files with 24 additions and 18 deletions

View File

@@ -103,11 +103,11 @@ public abstract class WindowOrientationListener {
}
}
public int getCurrentRotation() {
public int getCurrentRotation(int lastRotation) {
if (mEnabled) {
return mSensorEventListener.getCurrentRotation();
return mSensorEventListener.getCurrentRotation(lastRotation);
}
return -1;
return lastRotation;
}
/**
@@ -153,9 +153,15 @@ public abstract class WindowOrientationListener {
private static final int ROTATION_270 = 2;
// Mapping our internal aliases into actual Surface rotation values
private static final int[] SURFACE_ROTATIONS = new int[] {
private static final int[] INTERNAL_TO_SURFACE_ROTATION = new int[] {
Surface.ROTATION_0, Surface.ROTATION_90, Surface.ROTATION_270};
// Mapping Surface rotation values to internal aliases.
// We have no constant for Surface.ROTATION_180. That should never happen, but if it
// does, we'll arbitrarily choose a mapping.
private static final int[] SURFACE_TO_INTERNAL_ROTATION = new int[] {
ROTATION_0, ROTATION_90, ROTATION_90, ROTATION_270};
// Threshold ranges of orientation angle to transition into other orientation states.
// The first list is for transitions from ROTATION_0, the next for ROTATION_90, etc.
// ROTATE_TO defines the orientation each threshold range transitions to, and must be kept
@@ -243,8 +249,12 @@ public abstract class WindowOrientationListener {
return (float) SAMPLING_PERIOD_MS / (timeConstantMs + SAMPLING_PERIOD_MS);
}
int getCurrentRotation() {
return SURFACE_ROTATIONS[mRotation];
int getCurrentRotation(int lastRotation) {
if (mTiltDistrust > 0) {
// we really don't know the current orientation, so trust what's currently displayed
mRotation = SURFACE_TO_INTERNAL_ROTATION[lastRotation];
}
return INTERNAL_TO_SURFACE_ROTATION[mRotation];
}
private void calculateNewRotation(float orientation, float tiltAngle) {
@@ -267,7 +277,7 @@ public abstract class WindowOrientationListener {
if (localLOGV) Log.i(TAG, " new rotation = " + rotation);
mRotation = rotation;
mOrientationListener.onOrientationChanged(getCurrentRotation());
mOrientationListener.onOrientationChanged(INTERNAL_TO_SURFACE_ROTATION[mRotation]);
}
private float lowpassFilter(float newValue, float oldValue, float alpha) {
@@ -306,7 +316,8 @@ public abstract class WindowOrientationListener {
mTiltAngle = lowpassFilter(newTiltAngle, mTiltAngle, alpha);
float absoluteTilt = Math.abs(mTiltAngle);
if (checkFullyTilted(absoluteTilt)) {
checkFullyTilted(absoluteTilt);
if (mTiltDistrust > 0) {
return; // when fully tilted, ignore orientation entirely
}
@@ -347,11 +358,9 @@ public abstract class WindowOrientationListener {
* get un-tilted.
*
* @param absoluteTilt the absolute value of the current tilt angle
* @return true if the phone is fully tilted
*/
private boolean checkFullyTilted(float absoluteTilt) {
boolean fullyTilted = absoluteTilt > MAX_TILT;
if (fullyTilted) {
private void checkFullyTilted(float absoluteTilt) {
if (absoluteTilt > MAX_TILT) {
if (mRotation == ROTATION_0) {
mOrientationAngle = 0;
} else if (mRotation == ROTATION_90) {
@@ -366,7 +375,6 @@ public abstract class WindowOrientationListener {
} else if (mTiltDistrust > 0) {
mTiltDistrust--;
}
return fullyTilted;
}
/**
@@ -389,8 +397,8 @@ public abstract class WindowOrientationListener {
*/
private void filterOrientation(float absoluteTilt, float orientationAngle) {
float alpha = DEFAULT_LOWPASS_ALPHA;
if (mTiltDistrust > 0 || mAccelerationDistrust > 1) {
// when fully tilted, or under more than a transient acceleration, distrust heavily
if (mAccelerationDistrust > 1) {
// when under more than a transient acceleration, distrust heavily
alpha = ACCELERATING_LOWPASS_ALPHA;
} else if (absoluteTilt > PARTIAL_TILT || mAccelerationDistrust == 1) {
// when tilted partway, or under transient acceleration, distrust lightly

View File

@@ -2076,9 +2076,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
return mDeskDockRotation;
} else {
if (useSensorForOrientationLp(orientation)) {
// If the user has enabled auto rotation by default, do it.
int curRotation = mOrientationListener.getCurrentRotation();
return curRotation >= 0 ? curRotation : lastRotation;
return mOrientationListener.getCurrentRotation(lastRotation);
}
return Surface.ROTATION_0;
}