diff options
-rw-r--r-- | AndroidManifest.xml | 1 | ||||
-rw-r--r-- | res/layout-land/camera_controls.xml | 3 | ||||
-rw-r--r-- | res/layout-port/camera_controls.xml | 3 | ||||
-rw-r--r-- | res/values/strings.xml | 3 | ||||
-rw-r--r-- | src/com/android/camera/CameraActivity.java | 5 | ||||
-rw-r--r-- | src/com/android/camera/ui/FilmStripView.java | 110 | ||||
-rw-r--r-- | src/com/android/camera/ui/ZoomView.java | 5 |
7 files changed, 100 insertions, 30 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml index d389b3c39..757c8b3e0 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -34,7 +34,6 @@ <application android:name="com.android.camera.app.CameraApp" - android:backupAgent="com.android.camera.CameraBackupAgent" android:hardwareAccelerated="true" android:icon="@mipmap/ic_launcher_camera" android:label="@string/app_name" diff --git a/res/layout-land/camera_controls.xml b/res/layout-land/camera_controls.xml index 14953320e..cf27af192 100644 --- a/res/layout-land/camera_controls.xml +++ b/res/layout-land/camera_controls.xml @@ -65,6 +65,7 @@ android:layout_width="@dimen/capture_size" android:layout_height="@dimen/capture_size" android:scaleType="centerInside" - android:layout_gravity="top|right" /> + android:layout_gravity="top|right" + android:contentDescription="@string/switch_photo_filmstrip" /> </com.android.camera.ui.CameraControls> diff --git a/res/layout-port/camera_controls.xml b/res/layout-port/camera_controls.xml index 03e896bc0..a98ddff25 100644 --- a/res/layout-port/camera_controls.xml +++ b/res/layout-port/camera_controls.xml @@ -65,6 +65,7 @@ android:layout_width="@dimen/capture_size" android:layout_height="@dimen/capture_size" android:scaleType="centerInside" - android:layout_gravity="top|right" /> + android:layout_gravity="top|right" + android:contentDescription="@string/switch_photo_filmstrip" /> </com.android.camera.ui.CameraControls> diff --git a/res/values/strings.xml b/res/values/strings.xml index 2d8684850..7a71a8e77 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -657,4 +657,7 @@ CHAR LIMIT = NONE] --> <!-- Label for the save button in the crop activity action bar [CHAR LIMIT=20] --> <string name="crop_save">Save</string> + <!-- Label for album filmstrip button --> + <string name="switch_photo_filmstrip">Filmstrip view</string> + </resources> diff --git a/src/com/android/camera/CameraActivity.java b/src/com/android/camera/CameraActivity.java index bcc536c24..fcb24b5e7 100644 --- a/src/com/android/camera/CameraActivity.java +++ b/src/com/android/camera/CameraActivity.java @@ -552,6 +552,9 @@ public class CameraActivity extends Activity */ private void updateActionBarMenu(int dataID) { LocalData currentData = mDataAdapter.getLocalData(dataID); + if (currentData == null) { + return; + } int type = currentData.getLocalDataType(); if (mActionBarMenu == null) { @@ -716,7 +719,7 @@ public class CameraActivity extends Activity private void removeData(int dataID) { mDataAdapter.removeData(CameraActivity.this, dataID); - updateActionBarMenu(dataID); + updateActionBarMenu(mFilmStripView.getCurrentId()); if (mDataAdapter.getTotalNumber() > 1) { showUndoDeletionBar(); } else { diff --git a/src/com/android/camera/ui/FilmStripView.java b/src/com/android/camera/ui/FilmStripView.java index f04629660..93707a1d5 100644 --- a/src/com/android/camera/ui/FilmStripView.java +++ b/src/com/android/camera/ui/FilmStripView.java @@ -903,11 +903,13 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { * Check the bounds of {@code mCenterX}. Always call this function after: * 1. Any changes to {@code mCenterX}. 2. Any size change of the view * items. + * + * @return Whether clamp happened. */ - private void clampCenterX() { + private boolean clampCenterX() { ViewItem curr = mViewItem[mCurrentItem]; if (curr == null) { - return; + return false; } boolean stopScroll = false; @@ -925,11 +927,9 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { } if (stopScroll) { - if (mController.isScrolling()) { - mController.stopScrolling(true); - } mCenterX = curr.getCenterX(); } + return stopScroll; } private void adjustChildZOrder() { @@ -1685,7 +1685,9 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { } newItem.copyGeometry(item); mViewItem[itemID] = newItem; - clampCenterX(); + if (clampCenterX()) { + mController.stopScrolling(true); + } } /** Some of the data is changed. */ @@ -1829,16 +1831,17 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { private final ValueAnimator mScaleAnimator; private ValueAnimator mZoomAnimator; - private final Scroller mScroller; + private final MyScroller mScroller; private boolean mCanStopScroll; - private final DecelerateInterpolator mDecelerateInterpolator; private final MyScroller.Listener mScrollerListener = new MyScroller.Listener() { @Override public void onScrollUpdate(int currX, int currY) { mCenterX = currX; - clampCenterX(); + if (clampCenterX()) { + mController.stopScrolling(true); + } invalidate(); } @@ -1870,13 +1873,15 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { }; MyController(Context context) { + TimeInterpolator decelerateInterpolator = new DecelerateInterpolator(1.5f); mScroller = new MyScroller(mActivity, - new Handler(mActivity.getMainLooper()), mScrollerListener); + new Handler(mActivity.getMainLooper()), + mScrollerListener, decelerateInterpolator); mCanStopScroll = true; mScaleAnimator = new ValueAnimator(); mScaleAnimator.addUpdateListener(mScaleAnimatorUpdateListener); - mDecelerateInterpolator = new DecelerateInterpolator(1.5f); + mScaleAnimator.setInterpolator(decelerateInterpolator); } @Override @@ -1973,7 +1978,9 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { return; } mCenterX += deltaX; - clampCenterX(); + if (clampCenterX()) { + mController.stopScrolling(true); + } invalidate(); } @@ -2022,7 +2029,7 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { @Override public void scrollToPosition(int position, int duration, boolean interruptible) { - if (!stopScrolling(false)) { + if (mViewItem[mCurrentItem] == null) { return; } mCanStopScroll = interruptible; @@ -2053,7 +2060,6 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { stopScale(); mScaleAnimator.setDuration(duration); mScaleAnimator.setFloatValues(mScale, scale); - mScaleAnimator.setInterpolator(mDecelerateInterpolator); mScaleAnimator.start(); } @@ -2173,7 +2179,7 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { } } - private static class MyScroller extends Scroller { + private static class MyScroller { public interface Listener { public void onScrollUpdate(int currX, int currY); public void onScrollEnd(); @@ -2181,46 +2187,98 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { private Handler mHandler; private Listener mListener; + + private final Scroller mScroller; + + private final ValueAnimator mXScrollAnimator; private Runnable mScrollChecker = new Runnable() { @Override public void run() { - boolean newPosition = computeScrollOffset(); + boolean newPosition = mScroller.computeScrollOffset(); if (!newPosition) { mListener.onScrollEnd(); return; } - mListener.onScrollUpdate(getCurrX(), getCurrY()); + mListener.onScrollUpdate(mScroller.getCurrX(), mScroller.getCurrY()); mHandler.removeCallbacks(this); mHandler.post(this); } }; - public MyScroller(Context ctx, Handler handler, Listener listener) { - super(ctx); + private ValueAnimator.AnimatorUpdateListener mXScrollAnimatorUpdateListener = + new ValueAnimator.AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator animation) { + mListener.onScrollUpdate((Integer) animation.getAnimatedValue(), 0); + } + }; + + private Animator.AnimatorListener mXScrollAnimatorListener = + new Animator.AnimatorListener() { + @Override + public void onAnimationCancel(Animator animation) { + // Do nothing. + } + + @Override + public void onAnimationEnd(Animator animation) { + mListener.onScrollEnd(); + } + + @Override + public void onAnimationRepeat(Animator animation) { + // Do nothing. + } + + @Override + public void onAnimationStart(Animator animation) { + // Do nothing. + } + }; + + + public MyScroller(Context ctx, Handler handler, Listener listener, + TimeInterpolator interpolator) { mHandler = handler; mListener = listener; + mScroller = new Scroller(ctx); + mXScrollAnimator = new ValueAnimator(); + mXScrollAnimator.addUpdateListener(mXScrollAnimatorUpdateListener); + mXScrollAnimator.addListener(mXScrollAnimatorListener); + mXScrollAnimator.setInterpolator(interpolator); } - @Override public void fling( int startX, int startY, int velocityX, int velocityY, int minX, int maxX, int minY, int maxY) { - super.fling(startX, startY, velocityX, velocityY, minX, maxX, minY, maxY); + mScroller.fling(startX, startY, velocityX, velocityY, minX, maxX, minY, maxY); runChecker(); } - @Override public void startScroll(int startX, int startY, int dx, int dy) { - super.startScroll(startX, startY, dx, dy); + mScroller.startScroll(startX, startY, dx, dy); runChecker(); } - @Override + /** Only starts and updates scroll in x-axis. */ public void startScroll(int startX, int startY, int dx, int dy, int duration) { - super.startScroll(startX, startY, dx, dy, duration); - runChecker(); + mXScrollAnimator.cancel(); + mXScrollAnimator.setDuration(duration); + mXScrollAnimator.setIntValues(startX, startX + dx); + mXScrollAnimator.start(); + } + + public boolean isFinished() { + return (mScroller.isFinished() && !mXScrollAnimator.isRunning()); + } + + public void forceFinished(boolean finished) { + mScroller.forceFinished(finished); + if (finished) { + mXScrollAnimator.cancel(); + } } private void runChecker() { diff --git a/src/com/android/camera/ui/ZoomView.java b/src/com/android/camera/ui/ZoomView.java index 65c4f2e4a..ca9747b0d 100644 --- a/src/com/android/camera/ui/ZoomView.java +++ b/src/com/android/camera/ui/ZoomView.java @@ -93,6 +93,11 @@ public class ZoomView extends ImageView { // Make sure region to decode is inside the image. region.intersect(0, 0, mFullResImageWidth - 1, mFullResImageHeight - 1); + if (region.width() == 0 || region.height() == 0) { + Log.e(TAG, "Invalid size for partial region. Region: " + region.toString()); + return null; + } + if (isCancelled()) { return null; } |