diff options
author | Wu-cheng Li <wuchengli@google.com> | 2011-02-18 15:12:47 +0800 |
---|---|---|
committer | Wu-cheng Li <wuchengli@google.com> | 2011-02-18 16:02:25 +0800 |
commit | 232700d54651dcaefb378dc22bdb008a9815d1cd (patch) | |
tree | 5156271a4bb4607542dd9e70c5b230e87240b4d0 /src/com/android/camera/Camera.java | |
parent | 56178dab31ef40c6465312466981778f39c1f355 (diff) | |
download | LegacyCamera-232700d54651dcaefb378dc22bdb008a9815d1cd.zip LegacyCamera-232700d54651dcaefb378dc22bdb008a9815d1cd.tar.gz LegacyCamera-232700d54651dcaefb378dc22bdb008a9815d1cd.tar.bz2 |
Fix wrong preview orientation when device is held upside down.
Suppose a user opens camera app and press home to exit.
The user holds the device upside down and opens camera again.
The animation takes some time so camera app will get the old
rotation value in onResume and surfaceChanged. Besides, framework
does not have a callback for it. The solution is to poll the
rotation value for 5 seconds. If it changes, restart the preview.
bug:3362860
Change-Id: I065e8601e321361d8db405f9c587ec2a5bce050c
Diffstat (limited to 'src/com/android/camera/Camera.java')
-rw-r--r-- | src/com/android/camera/Camera.java | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/src/com/android/camera/Camera.java b/src/com/android/camera/Camera.java index 12f1b3b..cb082a0 100644 --- a/src/com/android/camera/Camera.java +++ b/src/com/android/camera/Camera.java @@ -55,6 +55,7 @@ import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.MessageQueue; +import android.os.SystemClock; import android.provider.MediaStore; import android.provider.Settings; import android.provider.MediaStore.Images.ImageColumns; @@ -105,6 +106,7 @@ public class Camera extends NoSearchActivity implements View.OnClickListener, private static final int RESTART_PREVIEW = 3; private static final int CLEAR_SCREEN_DELAY = 4; private static final int SET_CAMERA_PARAMETERS_WHEN_IDLE = 5; + private static final int CHECK_DISPLAY_ROTATION = 6; // The subset of parameters we need to update in setCameraParameters(). private static final int UPDATE_PARAM_INITIALIZE = 1; @@ -229,6 +231,7 @@ public class Camera extends NoSearchActivity implements View.OnClickListener, private long mPostViewPictureCallbackTime; private long mRawPictureCallbackTime; private long mJpegPictureCallbackTime; + private long mOnResumeTime; private long mPicturesRemaining; private byte[] mJpegImageData; @@ -293,6 +296,22 @@ public class Camera extends NoSearchActivity implements View.OnClickListener, setCameraParametersWhenIdle(0); break; } + + case CHECK_DISPLAY_ROTATION: { + // Restart the preview if display rotation has changed. + // Sometimes this happens when the device is held upside + // down and camera app is opened. Rotation animation will + // take some time and the rotation value we have got may be + // wrong. Framework does not have a callback for this now. + if (Util.getDisplayRotation(Camera.this) != mDisplayRotation + && isCameraIdle()) { + restartPreview(); + } + if (SystemClock.uptimeMillis() - mOnResumeTime < 5000) { + mHandler.sendEmptyMessageDelayed(CHECK_DISPLAY_ROTATION, 100); + } + break; + } } } } @@ -1428,6 +1447,11 @@ public class Camera extends NoSearchActivity implements View.OnClickListener, } } keepScreenOnAwhile(); + + if (mPreviewing) { + mOnResumeTime = SystemClock.uptimeMillis(); + mHandler.sendEmptyMessageDelayed(CHECK_DISPLAY_ROTATION, 100); + } } @Override @@ -1479,6 +1503,7 @@ public class Camera extends NoSearchActivity implements View.OnClickListener, // Remove the messages in the event queue. mHandler.removeMessages(RESTART_PREVIEW); mHandler.removeMessages(FIRST_TIME_INIT); + mHandler.removeMessages(CHECK_DISPLAY_ROTATION); super.onPause(); } |