summaryrefslogtreecommitdiffstats
path: root/src/com/android/camera/ui
diff options
context:
space:
mode:
authorSteve Kondik <steve@cyngn.com>2016-11-07 16:50:48 -0800
committerMichael Bestas <mikeioannina@gmail.com>2017-01-04 22:00:39 +0200
commitd6162483d308b8d796d8fcec975437376c3bb868 (patch)
treea59496db1af01971f83b66e98659a5027c555162 /src/com/android/camera/ui
parentd1351bbb3e79ebbfe82e9e596ab76cf839a5fd1b (diff)
downloadandroid_packages_apps_Snap-d6162483d308b8d796d8fcec975437376c3bb868.tar.gz
android_packages_apps_Snap-d6162483d308b8d796d8fcec975437376c3bb868.tar.bz2
android_packages_apps_Snap-d6162483d308b8d796d8fcec975437376c3bb868.zip
Reenable left swipe for Filmstrip
* These commits are from the CameraNext application in COS. * Credits: Ed Carrigan, Ed Mancebo, Wilhelm Fitzpatrick Revert "SnapdragonCamera: Fix preview broken when coming back from gallery" This reverts commit 5b8948f83a65e8f9bd1b419bd11511e48dc34887. Revert "SnapdragonCamera: fix crash after photo deletion" This reverts commit 171d2b253a752ca104ccf4a58f4e9d6d82bd7b28. CameraNext: Fix camera crash on device unlock This patch from the plugin branch also fixes CYNGNOS-1878 Due to the bug below, when the camera is fore-grounded when device is unlocked, the SurfaceView is getting recreated, which caused it to be in a weird state when we were trying to reattach the preview to it. ----- Fixed Black Screen On Back. The issue was that mCameraView was not being populated when it should have been (after it had been added to the view hierarchy). The problem was the SurfaceView was being removed from the hierarchy when it shouldn't have been. Issue-Id: CP-129 (cherry picked from commit 4010462fe0b4cf1c15624cfca7d6a3d4d380613a) CameraNext: avoid scaling camera preview in filmstrip (cherry picked from commit 823ed983c4dccac3959635f1a14fcfe47cd7b120) CameraNext: fade camera preview to black during film strip transition Instead of scaling and translating the camera preview to make room for film strip images, we leave the preview in place and cover it gradually with the black preview cover. CameraNext : Add offset calculation for left navbar Also prevent preview from translating while hidden - was causing occasional glimpses of it in filmstrip. CameraNext : Ensure vertical/horizontal swipes don't conflict Ensure that the user can't swipe horizontally while trying to delete the image. Avoids all sorts of synching issues between mViewItem and the data adapter since the buffer is trying to constantly keep its center to be the current visible item CYNGNOS-1069 CameraNext: fix crash on entering filmstrip via thumbnail tap mVerticalViewId was getting initialized in onUp, but if filmstrip was entered without a swipe, no onUp occurred. Fixed by directly initializing the field on object creation. CameraNext: Fix ZoomView in the filmstrip The ZoomView was getting covered in the Z axis while scrolling. issue-id: SAMBAR-862 Revert "SnapdragonCamera: fix camera preview broken when resume from gallery" This reverts commit 0acc1f027637c4f0126883be68f97817d7306032. Change-Id: If4dd591c5c752a7fa33c669c15875c0077446a37
Diffstat (limited to 'src/com/android/camera/ui')
-rw-r--r--src/com/android/camera/ui/FilmStripView.java167
1 files changed, 118 insertions, 49 deletions
diff --git a/src/com/android/camera/ui/FilmStripView.java b/src/com/android/camera/ui/FilmStripView.java
index e6e00ad56..3ac0bf6d9 100644
--- a/src/com/android/camera/ui/FilmStripView.java
+++ b/src/com/android/camera/ui/FilmStripView.java
@@ -87,6 +87,7 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener {
private MotionEvent mDown;
private boolean mCheckToIntercept = true;
private View mCameraView;
+ private ViewItem mCameraViewItem;
private int mSlop;
private TimeInterpolator mViewAnimInterpolator;
@@ -106,8 +107,6 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener {
private boolean mSendToPreviewMenu;
private boolean mSendToMenu;
private boolean mReset;
- private boolean mIsLoaded = false;
- private boolean initialClampX = false;
/**
* Common interface for all images in the filmstrip.
@@ -393,6 +392,12 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener {
* @param visible The visibility of the system decors
*/
public void setSystemDecorsVisibility(boolean visible);
+
+ /**
+ * Called when film strip is scrolled
+ * @param offset positive distance scrolled from initial offset in pixels
+ */
+ public void onFilmStripScroll(int offset);
}
/**
@@ -435,6 +440,8 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener {
private ValueAnimator mTranslationXAnimator;
+ private boolean mIsPreview;
+
/**
* Constructor.
*
@@ -442,7 +449,7 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener {
* @param v The {@code View} representing the data.
*/
public ViewItem(
- int id, View v, ValueAnimator.AnimatorUpdateListener listener) {
+ int id, View v, ValueAnimator.AnimatorUpdateListener listener, boolean isPreview) {
v.setPivotX(0f);
v.setPivotY(0f);
mDataId = id;
@@ -451,6 +458,12 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener {
mViewArea = new RectF();
mTranslationXAnimator = new ValueAnimator();
mTranslationXAnimator.addUpdateListener(listener);
+ mIsPreview = isPreview;
+
+ // Ordering of the children in the filmstrip can get shuffled around so we
+ // set the Z order explicity to make sure the film strip images are drawn on
+ // top of the camera
+ mView.setZ(mIsPreview ? 0 : 100);
}
/** Returns the data id from {@link DataAdapter}. */
@@ -508,11 +521,13 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener {
/** Sets the translation of Y regarding the view scale. */
public void setTranslationY(float transY, float scale) {
+ if(mIsPreview) return; // keep preview pinned in place
mView.setTranslationY(transY * scale);
}
/** Sets the translation of X regarding the view scale. */
public void setTranslationX(float transX, float scale) {
+ if(mIsPreview) return; // keep preview pinned in place
mView.setTranslationX(transX * scale);
}
@@ -583,20 +598,28 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener {
* @param scale The current scale of the filmstrip.
*/
public void layoutIn(Rect drawArea, int refCenter, float scale) {
- final float translationX = (mTranslationXAnimator.isRunning() ?
- (Float) mTranslationXAnimator.getAnimatedValue() : 0f);
- int left = (int) (drawArea.centerX() + (mLeftPosition - refCenter + translationX) * scale);
- int top = (int) (drawArea.centerY() - (mView.getMeasuredHeight() / 2) * scale);
+ final float adjustedScale = mIsPreview ? 1.0f : scale;
+ int left = 0;
+ int top = 0;
+
+ if (!mIsPreview) {
+ final float translationX = (mTranslationXAnimator.isRunning() ?
+ (Float) mTranslationXAnimator.getAnimatedValue() : 0f);
+ left = (int) (drawArea.centerX() + (mLeftPosition - refCenter + translationX)
+ * adjustedScale);
+ top = (int) (drawArea.centerY() - (mView.getMeasuredHeight() / 2) * scale);
+ }
+
layoutAt(left, top);
- mView.setScaleX(scale);
- mView.setScaleY(scale);
+ mView.setScaleX(adjustedScale);
+ mView.setScaleY(adjustedScale);
// update mViewArea for touch detection.
int l = mView.getLeft();
int t = mView.getTop();
mViewArea.set(l, t,
- l + mView.getMeasuredWidth() * scale,
- t + mView.getMeasuredHeight() * scale);
+ l + mView.getMeasuredWidth() * adjustedScale,
+ t + mView.getMeasuredHeight() * adjustedScale);
}
/** Returns true if the point is in the view. */
@@ -904,10 +927,23 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener {
if (v == null) {
return null;
}
- ViewItem item = new ViewItem(dataID, v, mViewItemUpdateListener);
+
+ boolean isCameraView = false;
+ if (data instanceof LocalData) {
+ isCameraView = ((LocalData)data).getLocalDataType()
+ == LocalData.LOCAL_CAMERA_PREVIEW;
+ }
+ ViewItem item = new ViewItem(dataID, v, mViewItemUpdateListener, isCameraView);
+ if (isCameraView) {
+ mCameraViewItem = item;
+ }
+
v = item.getView();
if (v != mCameraView) {
addView(item.getView());
+ if (data.getViewType() == ImageData.VIEW_TYPE_STICKY) {
+ mCameraView = v;
+ }
} else {
v.setVisibility(View.VISIBLE);
v.setAlpha(1f);
@@ -999,7 +1035,7 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener {
}
boolean stopScroll = false;
- if (curr.getId() == 0 && (mCenterX < curr.getCenterX() || initialClampX)
+ if (curr.getId() == 0 && mCenterX < curr.getCenterX()
&& mDataIdOnUserScrolling <= 1) {
// Stop at the first ViewItem.
stopScroll = true;
@@ -1048,6 +1084,7 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener {
}
// ZoomView is a special case to always be in the front.
bringChildToFront(mZoomView);
+ mZoomView.setElevation(Float.MAX_VALUE);
}
/**
@@ -1277,8 +1314,12 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener {
return;
}
- mViewItem[mCurrentItem].setLeftPosition(
- mCenterX - mViewItem[mCurrentItem].getView().getMeasuredWidth() / 2);
+ // If the layout changed, we need to adjust the current position so
+ // that if an item is centered before the change, it's still centered.
+ if (layoutChanged) {
+ mViewItem[mCurrentItem].setLeftPosition(
+ mCenterX - mViewItem[mCurrentItem].getView().getMeasuredWidth() / 2);
+ }
if (mController.isZoomStarted()) {
return;
@@ -1424,6 +1465,15 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener {
stepIfNeeded();
updateBottomControls(false /* no forced update */);
mLastItemId = getCurrentId();
+
+ if (mCameraViewItem != null && mListener != null) {
+ // mCenterX and the left position of each item are defined relative to each other.
+ // In order to figure out how much the user has scrolled, we need to subtract the
+ // two values and compare that to a fixed reference point. Since we know that
+ // the camera preview always starts at (0,0) we can use it as a reference point.
+ int offset = -1 * (mDrawArea.centerX() + mCameraViewItem.getLeftPosition() - mCenterX);
+ mListener.onFilmStripScroll(offset);
+ }
}
@Override
@@ -1485,8 +1535,11 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener {
removeView(v);
data.recycle();
} else {
- v.setVisibility(View.INVISIBLE);
if (mCameraView != null && mCameraView != v) {
+ // Not sure if this code is complete... logging a warning in case
+ // we encounter strange behavior related to this - EM
+ Log.w(TAG, "Encountered new camera view, removing old one");
+ v.setVisibility(View.INVISIBLE);
removeView(mCameraView);
}
mCameraView = v;
@@ -1737,9 +1790,7 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener {
@Override
public void onDataLoaded() {
mActivity.updateThumbnail(false);
- if (!mIsLoaded)
- reload();
- mIsLoaded = true;
+ reload();
}
@Override
@@ -1755,12 +1806,17 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener {
return;
}
updateInsertion(dataID);
- mActivity.updateThumbnail(true);
+ if (dataID == 1) {
+ mActivity.updateThumbnail(true);
+ }
}
@Override
public void onDataRemoved(int dataID, ImageData data) {
animateItemRemoval(dataID, data);
+ if (dataID == 1) {
+ mActivity.updateThumbnail(false);
+ }
}
});
}
@@ -1787,7 +1843,7 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener {
if (!inFullScreen() || mController.isScrolling()) {
return true;
}
- initialClampX = false;
+
if (ev.getActionMasked() == MotionEvent.ACTION_DOWN) {
mCheckToIntercept = true;
mDown = MotionEvent.obtain(ev);
@@ -1814,7 +1870,7 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener {
&& deltaX < mSlop * (-1)) {
// intercept left swipe
if (Math.abs(deltaX) >= Math.abs(deltaY) * 2) {
- return false;
+ return true;
}
}
}
@@ -1823,6 +1879,7 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener {
@Override
public boolean onTouchEvent(MotionEvent ev) {
+ mGestureRecognizer.onTouchEvent(ev);
return true;
}
@@ -2040,18 +2097,17 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener {
}
// Remove all views from the mViewItem buffer, except the camera view.
- for (final ViewItem item : mViewItem) {
- if (item != null) {
- ImageData imageData = mDataAdapter.getImageData(item.getId());
- if (imageData != null) {
- imageData.recycle();
- View v = item.getView();
- if (imageData.getViewType() != ImageData.VIEW_TYPE_STICKY) {
- removeView(v);
- } else {
- mCameraView = v;
- }
- }
+ for (int i = 0; i < mViewItem.length; i++) {
+ if (mViewItem[i] == null) {
+ continue;
+ }
+ View v = mViewItem[i].getView();
+ if (v != mCameraView) {
+ removeView(v);
+ }
+ ImageData imageData = mDataAdapter.getImageData(mViewItem[i].getId());
+ if (imageData != null) {
+ imageData.recycle();
}
}
@@ -2078,7 +2134,7 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener {
// center of the display upon a reload.
mCenterX = -1;
mScale = FULL_SCREEN_SCALE;
- initialClampX = true;
+
adjustChildZOrder();
invalidate();
@@ -2490,7 +2546,7 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener {
// TODO: Need to find a better way to toggle the visibility of views around
// the current view.
for (int i = 0; i < mCurrentItem; i++) {
- if (i == mCurrentItem || mViewItem[i] == null) {
+ if (i == mCurrentItem || mViewItem[i] == null || mViewItem[i].mIsPreview) {
continue;
}
mViewItem[i].getView().setVisibility(visible ? VISIBLE : INVISIBLE);
@@ -2698,6 +2754,9 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener {
// Indicating the current trend of scaling is up (>1) or down (<1).
private float mScaleTrend;
private float mMaxScale;
+ private boolean mVerticalSwipe;
+ private boolean mHorizontalSwipe;
+ private int mVerticalViewId = -1;
@Override
public boolean onSingleTapUp(float x, float y) {
@@ -2750,6 +2809,9 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener {
@Override
public boolean onUp(float x, float y) {
+ mHorizontalSwipe = false;
+ mVerticalSwipe = false;
+ mVerticalViewId = -1;
final ViewItem currItem = mViewItem[mCurrentItem];
if (currItem == null) {
return false;
@@ -2834,6 +2896,7 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener {
if (!mDataAdapter.canSwipeInFullScreen(currItem.getId())) {
return false;
}
+
hideZoomView();
// When image is zoomed in to be bigger than the screen
if (mController.isZoomStarted()) {
@@ -2852,25 +2915,31 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener {
mDataIdOnUserScrolling = mViewItem[mCurrentItem].getId();
}
if (inFilmStrip()) {
- if (Math.abs(dx) > Math.abs(dy)) {
+ if (Math.abs(dx) > Math.abs(dy) && !mVerticalSwipe) {
mController.scroll(deltaX);
- } else {
+ mHorizontalSwipe = true;
+ } else if (!mHorizontalSwipe) {
+ mVerticalSwipe = true;
// Vertical part. Promote or demote.
int hit = 0;
- Rect hitRect = new Rect();
- for (; hit < BUFFER_SIZE; hit++) {
- if (mViewItem[hit] == null) {
- continue;
+ if (mVerticalViewId == -1) {
+ Rect hitRect = new Rect();
+ for (; hit < BUFFER_SIZE; hit++) {
+ if (mViewItem[hit] == null || mViewItem[hit].mIsPreview) {
+ continue;
+ }
+ mViewItem[hit].getView().getHitRect(hitRect);
+ if (hitRect.contains((int) x, (int) y)) {
+ break;
+ }
}
- mViewItem[hit].getView().getHitRect(hitRect);
- if (hitRect.contains((int) x, (int) y)) {
- break;
+ if (hit == BUFFER_SIZE) {
+ return false;
}
+ mVerticalViewId = hit;
+ } else {
+ hit = mVerticalViewId;
}
- if (hit == BUFFER_SIZE) {
- return false;
- }
-
ImageData data = mDataAdapter.getImageData(mViewItem[hit].getId());
float transY = mViewItem[hit].getScaledTranslationY(mScale) - dy / mScale;
if (!data.isUIActionSupported(ImageData.ACTION_DEMOTE) && transY > 0f) {