summaryrefslogtreecommitdiffstats
path: root/policy
diff options
context:
space:
mode:
authorJeff Brown <jeffbrown@google.com>2011-01-23 13:16:01 -0800
committerJeff Brown <jeffbrown@google.com>2011-01-24 13:46:57 -0800
commit4519f07e9c6b993fbe7a3d3df24d71d9450a54f1 (patch)
tree3c642e9c740a54941ab46d80ebc5668ce9ab4cc3 /policy
parenta6ce081970a78233ba6b9792149ee5f1390cba7b (diff)
downloadframeworks_base-4519f07e9c6b993fbe7a3d3df24d71d9450a54f1.zip
frameworks_base-4519f07e9c6b993fbe7a3d3df24d71d9450a54f1.tar.gz
frameworks_base-4519f07e9c6b993fbe7a3d3df24d71d9450a54f1.tar.bz2
New orientation listener.
The objective in this listener is to be more careful about the signal processing to prevent spurious orientation changes and to make all of the tweakable factors physically meaningful. The calibration is defined in terms of time constants and does not assume a particular discrete sampling rate. This is useful because it allows us to change the accelerometer sampling interval if desired without having to change the calibration. Moreover, the accelerometer sampling interval can vary +/- 20ms from one sample to the next even in normal circumstances. Proposed orientation changes are weighted by confidence factors that vary exponentially in relation to how close the device is to the ideal orientation change posture (screen is vertical, angle is exactly at the midpoint of the orientation quadrant, and no external acceleration beside gravity). When not in an ideal posture, the device takes proportionally longer to settle into a new orientation state. Added a little tool to plot the log output of the WindowOrientationListener. Check the README for more information about how to use it. Change-Id: I787f02d03582ff26367df65eda8d9ce85c5cb343
Diffstat (limited to 'policy')
-rwxr-xr-xpolicy/src/com/android/internal/policy/impl/PhoneWindowManager.java23
1 files changed, 15 insertions, 8 deletions
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index 67e0e67..9b5c42e 100755
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -389,6 +389,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
resolver.registerContentObserver(Settings.System.getUriFor(
Settings.System.SCREEN_OFF_TIMEOUT), false, this);
resolver.registerContentObserver(Settings.System.getUriFor(
+ Settings.System.WINDOW_ORIENTATION_LISTENER_LOG), false, this);
+ resolver.registerContentObserver(Settings.System.getUriFor(
Settings.System.POINTER_LOCATION), false, this);
resolver.registerContentObserver(Settings.Secure.getUriFor(
Settings.Secure.DEFAULT_INPUT_METHOD), false, this);
@@ -759,6 +761,10 @@ public class PhoneWindowManager implements WindowManagerPolicy {
updateOrientationListenerLp();
}
+ mOrientationListener.setLogEnabled(
+ Settings.System.getInt(resolver,
+ Settings.System.WINDOW_ORIENTATION_LISTENER_LOG, 0) != 0);
+
if (mSystemReady) {
int pointerLocation = Settings.System.getInt(resolver,
Settings.System.POINTER_LOCATION, 0);
@@ -2492,18 +2498,11 @@ public class PhoneWindowManager implements WindowManagerPolicy {
return mSeascapeRotation;
case ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE:
//return either landscape rotation based on the sensor
- mOrientationListener.setAllow180Rotation(
- isLandscapeOrSeascape(Surface.ROTATION_180));
return getCurrentLandscapeRotation(lastRotation);
case ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT:
- mOrientationListener.setAllow180Rotation(
- !isLandscapeOrSeascape(Surface.ROTATION_180));
return getCurrentPortraitRotation(lastRotation);
}
- mOrientationListener.setAllow180Rotation(mAllowAllRotations ||
- orientation == ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
-
// case for nosensor meaning ignore sensor and consider only lid
// or orientation sensor disabled
//or case.unspecified
@@ -2519,7 +2518,15 @@ public class PhoneWindowManager implements WindowManagerPolicy {
return mUserRotation;
} else {
if (useSensorForOrientationLp(orientation)) {
- return mOrientationListener.getCurrentRotation(lastRotation);
+ // Disable 180 degree rotation unless allowed by default for the device
+ // or explicitly requested by the application.
+ int rotation = mOrientationListener.getCurrentRotation(lastRotation);
+ if (rotation == Surface.ROTATION_180
+ && !mAllowAllRotations
+ && orientation != ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR) {
+ return lastRotation;
+ }
+ return rotation;
}
return Surface.ROTATION_0;
}