Fade in/out the undo bar.
The fading out happens after 3 seconds or the user swipes away.
Bug: 6610348
Change-Id: Icd4dea7b0396f26556240adab93b9e645a9f1e58
diff --git a/src/com/android/gallery3d/app/PhotoPage.java b/src/com/android/gallery3d/app/PhotoPage.java
index 1d9344b..c944543 100644
--- a/src/com/android/gallery3d/app/PhotoPage.java
+++ b/src/com/android/gallery3d/app/PhotoPage.java
@@ -721,7 +721,7 @@
mDeletePath = path;
mDeleteIsFocus = (offset == 0);
mMediaSet.setDeletion(path, mCurrentIndex + offset);
- mPhotoView.showUndoButton(true);
+ mPhotoView.showUndoBar();
}
@Override
@@ -731,14 +731,14 @@
if (mDeleteIsFocus) mModel.setFocusHintPath(mDeletePath);
mMediaSet.setDeletion(null, 0);
mDeletePath = null;
- mPhotoView.showUndoButton(false);
+ mPhotoView.hideUndoBar();
}
@Override
public void onCommitDeleteImage() {
if (mDeletePath == null) return;
commitDeletion();
- mPhotoView.showUndoButton(false);
+ mPhotoView.hideUndoBar();
}
private void commitDeletion() {
diff --git a/src/com/android/gallery3d/ui/PhotoView.java b/src/com/android/gallery3d/ui/PhotoView.java
index 3fba261..496d34d 100644
--- a/src/com/android/gallery3d/ui/PhotoView.java
+++ b/src/com/android/gallery3d/ui/PhotoView.java
@@ -141,6 +141,7 @@
private static final int MSG_CAPTURE_ANIMATION_DONE = 4;
private static final int MSG_DELETE_ANIMATION_DONE = 5;
private static final int MSG_DELETE_DONE = 6;
+ private static final int MSG_HIDE_UNDO_BAR = 7;
private static final int MOVE_THRESHOLD = 256;
private static final float SWIPE_THRESHOLD = 300f;
@@ -221,6 +222,10 @@
// Whether the box indicated by mTouchBoxIndex is deletable. Only meaningful
// if mTouchBoxIndex is not Integer.MAX_VALUE.
private boolean mTouchBoxDeletable;
+ // This is the index of the last deleted item. This is only used as a hint
+ // to hide the undo button when we are too far away from the deleted
+ // item. The value Integer.MAX_VALUE means there is no such hint.
+ private int mUndoIndexHint = Integer.MAX_VALUE;
public PhotoView(GalleryActivity activity) {
mTileView = new TileImageView(activity);
@@ -334,6 +339,10 @@
}
break;
}
+ case MSG_HIDE_UNDO_BAR: {
+ checkHideUndoBar(UNDO_BAR_TIMEOUT);
+ break;
+ }
default: throw new AssertionError(message.what);
}
}
@@ -359,6 +368,13 @@
}
}
+ // Hide undo button if we are too far away
+ if (mUndoIndexHint != Integer.MAX_VALUE) {
+ if (Math.abs(mUndoIndexHint - mModel.getCurrentIndex()) >= 3) {
+ hideUndoBar();
+ }
+ }
+
// Update the ScreenNails.
for (int i = -SCREEN_NAIL_MAX; i <= SCREEN_NAIL_MAX; i++) {
Picture p = mPictures.get(i);
@@ -1041,6 +1057,8 @@
private void deleteAfterAnimation(int duration) {
MediaItem item = mModel.getMediaItem(mTouchBoxIndex);
if (item == null) return;
+ mListener.onCommitDeleteImage();
+ mUndoIndexHint = mModel.getCurrentIndex() + mTouchBoxIndex;
mHolding |= HOLD_DELETE;
Message m = mHandler.obtainMessage(MSG_DELETE_ANIMATION_DONE);
m.obj = item.getPath();
@@ -1136,9 +1154,10 @@
@Override
public void onDown(float x, float y) {
+ checkHideUndoBar(UNDO_BAR_TOUCHED);
+
mDeltaY = 0;
mSeenScaling = false;
- mListener.onCommitDeleteImage();
if (mIgnoreSwipingGesture) return;
@@ -1248,8 +1267,39 @@
setFilmMode(false);
}
- public void showUndoButton(boolean show) {
- mUndoBar.setVisibility(show ? GLView.VISIBLE : GLView.INVISIBLE);
+ ////////////////////////////////////////////////////////////////////////////
+ // Undo Bar
+ ////////////////////////////////////////////////////////////////////////////
+
+ private int mUndoBarState;
+ private static final int UNDO_BAR_SHOW = 1;
+ private static final int UNDO_BAR_TIMEOUT = 2;
+ private static final int UNDO_BAR_TOUCHED = 4;
+
+ public void showUndoBar() {
+ mHandler.removeMessages(MSG_HIDE_UNDO_BAR);
+ mUndoBarState = UNDO_BAR_SHOW;
+ mUndoBar.animateVisibility(GLView.VISIBLE);
+ mHandler.sendEmptyMessageDelayed(MSG_HIDE_UNDO_BAR, 3000);
+ }
+
+ public void hideUndoBar() {
+ mHandler.removeMessages(MSG_HIDE_UNDO_BAR);
+ mListener.onCommitDeleteImage();
+ mUndoBar.animateVisibility(GLView.INVISIBLE);
+ mUndoBarState = 0;
+ mUndoIndexHint = Integer.MAX_VALUE;
+ }
+
+ // Check if the all conditions for hiding the undo bar have been met. The
+ // conditions are: it has been three seconds since last showing, and the
+ // user has touched.
+ private void checkHideUndoBar(int addition) {
+ mUndoBarState |= addition;
+ if (mUndoBarState ==
+ (UNDO_BAR_SHOW | UNDO_BAR_TIMEOUT | UNDO_BAR_TOUCHED)) {
+ hideUndoBar();
+ }
}
////////////////////////////////////////////////////////////////////////////
diff --git a/src/com/android/gallery3d/ui/UndoBarView.java b/src/com/android/gallery3d/ui/UndoBarView.java
index 9ddd1d7..f5ea5d1 100644
--- a/src/com/android/gallery3d/ui/UndoBarView.java
+++ b/src/com/android/gallery3d/ui/UndoBarView.java
@@ -20,6 +20,7 @@
import android.view.MotionEvent;
import com.android.gallery3d.R;
+import com.android.gallery3d.common.Utils;
import com.android.gallery3d.util.GalleryUtils;
public class UndoBarView extends GLView {
@@ -89,6 +90,11 @@
@Override
protected void render(GLCanvas canvas) {
super.render(canvas);
+ advanceAnimation();
+
+ canvas.save(GLCanvas.SAVE_FLAG_ALPHA);
+ canvas.multiplyAlpha(mAlpha);
+
int w = getWidth();
int h = getHeight();
mPanel.draw(canvas, mBarMargin, 0, w - mBarMargin * 2, mBarHeight);
@@ -112,6 +118,8 @@
x = mBarMargin + mDeletedTextMargin;
y = (mBarHeight - mDeletedText.getHeight()) / 2;
mDeletedText.draw(canvas, x, y);
+
+ canvas.restore();
}
@Override
@@ -143,4 +151,55 @@
int h = getHeight();
return (x >= w - mClickRegion && x < w && y >= 0 && y < h);
}
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Alpha Animation
+ ////////////////////////////////////////////////////////////////////////////
+
+ private static final long NO_ANIMATION = -1;
+ private static long ANIM_TIME = 200;
+ private long mAnimationStartTime = NO_ANIMATION;
+ private float mFromAlpha, mToAlpha;
+ private float mAlpha;
+
+ private static float getTargetAlpha(int visibility) {
+ return (visibility == VISIBLE) ? 1f : 0f;
+ }
+
+ public void setVisibility(int visibility) {
+ mAlpha = getTargetAlpha(visibility);
+ mAnimationStartTime = NO_ANIMATION;
+ super.setVisibility(visibility);
+ invalidate();
+ }
+
+ public void animateVisibility(int visibility) {
+ float target = getTargetAlpha(visibility);
+ if (mAnimationStartTime == NO_ANIMATION && mAlpha == target) return;
+ if (mAnimationStartTime != NO_ANIMATION && mToAlpha == target) return;
+
+ mFromAlpha = mAlpha;
+ mToAlpha = target;
+ mAnimationStartTime = AnimationTime.startTime();
+
+ super.setVisibility(VISIBLE);
+ invalidate();
+ }
+
+ private void advanceAnimation() {
+ if (mAnimationStartTime == NO_ANIMATION) return;
+
+ float delta = (float) (AnimationTime.get() - mAnimationStartTime) /
+ ANIM_TIME;
+ mAlpha = mFromAlpha + ((mToAlpha > mFromAlpha) ? delta : -delta);
+ mAlpha = Utils.clamp(mAlpha, 0f, 1f);
+
+ if (mAlpha == mToAlpha) {
+ mAnimationStartTime = NO_ANIMATION;
+ if (mAlpha == 0) {
+ super.setVisibility(INVISIBLE);
+ }
+ }
+ invalidate();
+ }
}