From 131cf9886c4f34431598be0b1f5b7aaa915277cc Mon Sep 17 00:00:00 2001 From: Eino-Ville Talvala Date: Tue, 18 Oct 2011 13:33:25 -0700 Subject: Add hysteresis to orientation rounding. This prevents fast flickering between two orientation states, which can result in ugly UI issues, especially with the preview thumbnail. Bug: 5477483 Change-Id: I9513547207ae1918066c1a19947c974eaad72e24 --- src/com/android/camera/Camera.java | 6 +----- src/com/android/camera/Util.java | 18 ++++++++++++++++++ src/com/android/camera/VideoCamera.java | 5 +---- src/com/android/camera/panorama/PanoramaActivity.java | 6 +----- 4 files changed, 21 insertions(+), 14 deletions(-) (limited to 'src/com/android/camera') diff --git a/src/com/android/camera/Camera.java b/src/com/android/camera/Camera.java index 685319f..589a5c8 100644 --- a/src/com/android/camera/Camera.java +++ b/src/com/android/camera/Camera.java @@ -1184,10 +1184,6 @@ public class Camera extends ActivityBase implements FocusManager.Listener, if (mThumbnailView != null) mThumbnailView.setEnabled(enable); } - public static int roundOrientation(int orientation) { - return ((orientation + 45) / 90 * 90) % 360; - } - private class MyOrientationEventListener extends OrientationEventListener { public MyOrientationEventListener(Context context) { @@ -1200,7 +1196,7 @@ public class Camera extends ActivityBase implements FocusManager.Listener, // the camera then point the camera to floor or sky, we still have // the correct orientation. if (orientation == ORIENTATION_UNKNOWN) return; - mOrientation = roundOrientation(orientation); + mOrientation = Util.roundOrientation(orientation, mOrientation); // When the screen is unlocked, display rotation may change. Always // calculate the up-to-date orientationCompensation. int orientationCompensation = mOrientation diff --git a/src/com/android/camera/Util.java b/src/com/android/camera/Util.java index 768bf27..31a54d5 100644 --- a/src/com/android/camera/Util.java +++ b/src/com/android/camera/Util.java @@ -71,6 +71,9 @@ public class Util { // Use the same setting among the Camera, VideoCamera and Panorama modes. private static final float DEFAULT_CAMERA_BRIGHTNESS = 0.7f; + // Orientation hysteresis amount used in rounding, in degrees + public static final int ORIENTATION_HYSTERESIS = 5; + public static final String REVIEW_ACTION = "com.android.camera.action.REVIEW"; // Private intent extras. Test only. @@ -345,6 +348,21 @@ public class Util { return result; } + public static int roundOrientation(int orientation, int orientationHistory) { + boolean changeOrientation = false; + if (orientationHistory == OrientationEventListener.ORIENTATION_UNKNOWN) { + changeOrientation = true; + } else { + int dist = Math.abs(orientation - orientationHistory); + dist = Math.min( dist, 360 - dist ); + changeOrientation = ( dist >= 45 + ORIENTATION_HYSTERESIS ); + } + if (changeOrientation) { + return ((orientation + 45) / 90 * 90) % 360; + } + return orientationHistory; + } + public static Size getOptimalPreviewSize(Activity currentActivity, List sizes, double targetRatio) { // Use a very small tolerance because we want an exact match. diff --git a/src/com/android/camera/VideoCamera.java b/src/com/android/camera/VideoCamera.java index df8adb9..6b1ed1d 100755 --- a/src/com/android/camera/VideoCamera.java +++ b/src/com/android/camera/VideoCamera.java @@ -500,9 +500,6 @@ public class VideoCamera extends ActivityBase } } - public static int roundOrientation(int orientation) { - return ((orientation + 45) / 90 * 90) % 360; - } private class MyOrientationEventListener extends OrientationEventListener { @@ -516,7 +513,7 @@ public class VideoCamera extends ActivityBase // the camera then point the camera to floor or sky, we still have // the correct orientation. if (orientation == ORIENTATION_UNKNOWN) return; - mOrientation = roundOrientation(orientation); + mOrientation = Util.roundOrientation(orientation, mOrientation); // When the screen is unlocked, display rotation may change. Always // calculate the up-to-date orientationCompensation. int orientationCompensation = mOrientation diff --git a/src/com/android/camera/panorama/PanoramaActivity.java b/src/com/android/camera/panorama/PanoramaActivity.java index 25c565f..c28cc2e 100755 --- a/src/com/android/camera/panorama/PanoramaActivity.java +++ b/src/com/android/camera/panorama/PanoramaActivity.java @@ -190,10 +190,6 @@ public class PanoramaActivity extends ActivityBase implements public final boolean isValid; } - public static int roundOrientation(int orientation) { - return ((orientation + 45) / 90 * 90) % 360; - } - private class PanoOrientationEventListener extends OrientationEventListener { public PanoOrientationEventListener(Context context) { super(context); @@ -205,7 +201,7 @@ public class PanoramaActivity extends ActivityBase implements // the camera then point the camera to floor or sky, we still have // the correct orientation. if (orientation == ORIENTATION_UNKNOWN) return; - mDeviceOrientation = roundOrientation(orientation); + mDeviceOrientation = Util.roundOrientation(orientation, mDeviceOrientation); // When the screen is unlocked, display rotation may change. Always // calculate the up-to-date orientationCompensation. int orientationCompensation = mDeviceOrientation -- cgit v1.1