Commit 82220026 authored by Wei Huang's avatar Wei Huang Committed by Android (Google) Code Review
Browse files

Merge "Fade in/out the undo bar." into jb-dev

parents 705d8085 517e1bd2
......@@ -721,7 +721,7 @@ public class PhotoPage extends ActivityState implements
mDeletePath = path;
mDeleteIsFocus = (offset == 0);
mMediaSet.setDeletion(path, mCurrentIndex + offset);
mPhotoView.showUndoButton(true);
mPhotoView.showUndoBar();
}
@Override
......@@ -731,14 +731,14 @@ public class PhotoPage extends ActivityState implements
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() {
......
......@@ -141,6 +141,7 @@ public class PhotoView extends GLView {
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 @@ public class PhotoView extends GLView {
// 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 @@ public class PhotoView extends GLView {
}
break;
}
case MSG_HIDE_UNDO_BAR: {
checkHideUndoBar(UNDO_BAR_TIMEOUT);
break;
}
default: throw new AssertionError(message.what);
}
}
......@@ -359,6 +368,13 @@ public class PhotoView extends GLView {
}
}
// 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 @@ public class PhotoView extends GLView {
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 @@ public class PhotoView extends GLView {
@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 @@ public class PhotoView extends GLView {
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();
}
}
////////////////////////////////////////////////////////////////////////////
......
......@@ -20,6 +20,7 @@ import android.content.Context;
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 @@ public class UndoBarView extends GLView {
@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 @@ public class UndoBarView extends GLView {
x = mBarMargin + mDeletedTextMargin;
y = (mBarHeight - mDeletedText.getHeight()) / 2;
mDeletedText.draw(canvas, x, y);
canvas.restore();
}
@Override
......@@ -143,4 +151,55 @@ public class UndoBarView extends GLView {
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();
}
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment