From 377456cde5b0c385ea6635a989df68b6f84cc6cb Mon Sep 17 00:00:00 2001 From: Jay Wang Date: Tue, 3 May 2016 11:59:46 -0700 Subject: SnapdragonCamera: Support rotation for image review layout Currently, image review layout is fixed to portrait mode. Changing the resources to use RotateImageView and update the scaling function in RotateImageView to support both up and down scaling of the image CRs-Fixed: 1004669 Change-Id: I6940227c634b7654bce5de5efe032aaa8da80e72 --- src/com/android/camera/PhotoUI.java | 4 ++++ src/com/android/camera/ui/CameraControls.java | 28 +++++++++++++++------- src/com/android/camera/ui/ModuleSwitcher.java | 2 ++ src/com/android/camera/ui/RotateImageView.java | 32 ++++++++++++++++++++++---- 4 files changed, 54 insertions(+), 12 deletions(-) (limited to 'src/com/android/camera') diff --git a/src/com/android/camera/PhotoUI.java b/src/com/android/camera/PhotoUI.java index c8e01fea0..e774ac536 100644 --- a/src/com/android/camera/PhotoUI.java +++ b/src/com/android/camera/PhotoUI.java @@ -1400,6 +1400,10 @@ public class PhotoUI implements PieListener, if (mZoomRenderer != null) { mZoomRenderer.setOrientation(orientation); } + if (mReviewImage != null) { + RotateImageView v = (RotateImageView) mReviewImage; + v.setOrientation(orientation, animation); + } } public void tryToCloseSubList() { diff --git a/src/com/android/camera/ui/CameraControls.java b/src/com/android/camera/ui/CameraControls.java index 989568953..9f2a5ebb8 100644 --- a/src/com/android/camera/ui/CameraControls.java +++ b/src/com/android/camera/ui/CameraControls.java @@ -61,6 +61,9 @@ public class CameraControls extends RotatableLayout { private View mPreview; private View mSceneModeSwitcher; private View mFilterModeSwitcher; + private View mReviewDoneButton; + private View mReviewCancelButton; + private View mReviewRetakeButton; private ArrowTextView mRefocusToast; private int mSize; @@ -314,13 +317,18 @@ public class CameraControls extends RotatableLayout { View retake = findViewById(R.id.btn_retake); if (retake != null) { - center(retake, shutter, rotation); - View cancel = findViewById(R.id.btn_cancel); - toLeft(cancel, shutter, rotation); - View done = findViewById(R.id.btn_done); - toRight(done, shutter, rotation); - } + mReviewRetakeButton = retake; + mReviewCancelButton = findViewById(R.id.btn_cancel); + mReviewDoneButton = findViewById(R.id.btn_done); + center(mReviewRetakeButton, shutter, rotation); + toLeft(mReviewCancelButton, shutter, rotation); + toRight(mReviewDoneButton, shutter, rotation); + } else { + mReviewRetakeButton = null; + mReviewCancelButton = null; + mReviewDoneButton = null; + } layoutRemaingPhotos(); } @@ -972,10 +980,14 @@ public class CameraControls extends RotatableLayout { View[] views = { mSceneModeSwitcher, mFilterModeSwitcher, mFrontBackSwitcher, TsMakeupManager.HAS_TS_MAKEUP ? mTsMakeupSwitcher : mHdrSwitcher, - mMenu, mShutter, mPreview, mSwitcher, mMute + mMenu, mShutter, mPreview, mSwitcher, mMute, mReviewRetakeButton, + mReviewCancelButton, mReviewDoneButton }; for (View v : views) { - ((RotateImageView) v).setOrientation(orientation, animation); + if (v != null) { + ((RotateImageView) v).setOrientation(orientation, + animation); + } } layoutRemaingPhotos(); } diff --git a/src/com/android/camera/ui/ModuleSwitcher.java b/src/com/android/camera/ui/ModuleSwitcher.java index 189342a1b..603f81d4d 100644 --- a/src/com/android/camera/ui/ModuleSwitcher.java +++ b/src/com/android/camera/ui/ModuleSwitcher.java @@ -33,6 +33,7 @@ import android.view.View.OnTouchListener; import android.view.ViewGroup; import android.widget.FrameLayout.LayoutParams; import android.widget.LinearLayout; +import android.widget.ImageView; import com.android.camera.util.CameraUtil; import com.android.camera.util.GcamHelper; @@ -203,6 +204,7 @@ public class ModuleSwitcher extends RotateImageView for (int i = mDrawIds.length - 1; i >= 0; i--) { RotateImageView item = new RotateImageView(getContext()); item.setImageResource(mDrawIds[i]); + item.setScaleType(ImageView.ScaleType.CENTER); item.setBackgroundResource(R.drawable.bg_pressed); final int index = i; item.setOnClickListener(new OnClickListener() { diff --git a/src/com/android/camera/ui/RotateImageView.java b/src/com/android/camera/ui/RotateImageView.java index 05e1a7c5b..a8065c0a3 100644 --- a/src/com/android/camera/ui/RotateImageView.java +++ b/src/com/android/camera/ui/RotateImageView.java @@ -16,6 +16,7 @@ package com.android.camera.ui; +import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; @@ -28,6 +29,7 @@ import android.util.AttributeSet; import android.view.ViewGroup.LayoutParams; import android.view.animation.AnimationUtils; import android.widget.ImageView; +import com.android.camera.util.CameraUtil; /** * A @{code ImageView} which can rotate it's content. @@ -47,6 +49,8 @@ public class RotateImageView extends TwoStateImageView implements Rotatable { private long mAnimationStartTime = 0; private long mAnimationEndTime = 0; + private boolean mNaturalPortrait = CameraUtil.isDefaultToPortrait( + (Activity) getContext()); public RotateImageView(Context context, AttributeSet attrs) { super(context, attrs); @@ -60,6 +64,19 @@ public class RotateImageView extends TwoStateImageView implements Rotatable { return mTargetDegree; } + private boolean isOrientationPortrait() { + int mapTo180Degree = (mCurrentDegree % 180); + + // Assumging the devic's natural orientation is portrait and + // check if the current orienataion is within the landscape range + boolean isLandscape = ((mapTo180Degree > 45) && + (mapTo180Degree < 135)); + if (mNaturalPortrait) + return !isLandscape; + else + return isLandscape; + } + // Rotate the view counter-clockwise @Override public void setOrientation(int degree, boolean animation) { @@ -124,10 +141,17 @@ public class RotateImageView extends TwoStateImageView implements Rotatable { int saveCount = canvas.getSaveCount(); - // Scale down the image first if required. - if ((getScaleType() == ImageView.ScaleType.FIT_CENTER) && - ((width < w) || (height < h))) { - float ratio = Math.min((float) width / w, (float) height / h); + // Scale down or up the image first if required. + if (getScaleType() == ImageView.ScaleType.FIT_CENTER) { + float ratio; + + // As camera layout is fixed to portrait, we need to + // swap canvas width and height when calculating the + // ratio for landscape mode. + if (isOrientationPortrait()) + ratio = Math.min((float) width / w, (float) height / h); + else + ratio = Math.min((float) height / w, (float) width / h); canvas.scale(ratio, ratio, width / 2.0f, height / 2.0f); } canvas.translate(left + width / 2, top + height / 2); -- cgit v1.2.3