diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/com/android/camera/NewCameraActivity.java | 5 | ||||
-rw-r--r-- | src/com/android/camera/NewPhotoModule.java | 19 | ||||
-rw-r--r-- | src/com/android/camera/NewPhotoUI.java | 10 | ||||
-rw-r--r-- | src/com/android/camera/NewPreviewGestures.java | 11 | ||||
-rw-r--r-- | src/com/android/camera/NewVideoModule.java | 14 | ||||
-rw-r--r-- | src/com/android/camera/NewVideoUI.java | 15 | ||||
-rw-r--r-- | src/com/android/camera/Util.java | 10 | ||||
-rw-r--r-- | src/com/android/camera/data/CameraDataAdapter.java | 2 | ||||
-rw-r--r-- | src/com/android/camera/ui/FilmStripView.java | 5 | ||||
-rw-r--r-- | src/com/android/gallery3d/filtershow/FilterShowActivity.java | 15 | ||||
-rw-r--r-- | src/com/android/gallery3d/filtershow/category/Action.java | 2 | ||||
-rw-r--r-- | src/com/android/gallery3d/filtershow/crop/CropLoader.java | 56 | ||||
-rw-r--r-- | src/com/android/gallery3d/filtershow/filters/FilterRepresentation.java | 6 | ||||
-rw-r--r-- | src/com/android/gallery3d/filtershow/state/StateView.java | 1 | ||||
-rw-r--r-- | src/com/android/gallery3d/filtershow/tools/IconFactory.java | 2 | ||||
-rw-r--r-- | src/com/android/photos/drawables/MtpThumbnailDrawable.java | 61 |
16 files changed, 129 insertions, 105 deletions
diff --git a/src/com/android/camera/NewCameraActivity.java b/src/com/android/camera/NewCameraActivity.java index f26e73e5d..59b366419 100644 --- a/src/com/android/camera/NewCameraActivity.java +++ b/src/com/android/camera/NewCameraActivity.java @@ -254,6 +254,7 @@ public class NewCameraActivity extends Activity v.getDrawable().getIntrinsicHeight(), 0, 0)); } + setSwipingEnabled(true); } @Override @@ -390,6 +391,10 @@ public class NewCameraActivity extends Activity public void onShowSwitcherPopup() { } + public void setSwipingEnabled(boolean enable) { + mDataAdapter.setCameraPreviewLock(!enable); + } + // Accessor methods for getting latency times used in performance testing public long getAutoFocusTime() { return (mCurrentModule instanceof PhotoModule) ? diff --git a/src/com/android/camera/NewPhotoModule.java b/src/com/android/camera/NewPhotoModule.java index 81e9f6d16..55eb0e46f 100644 --- a/src/com/android/camera/NewPhotoModule.java +++ b/src/com/android/camera/NewPhotoModule.java @@ -542,6 +542,8 @@ public class NewPhotoModule mFocusManager.setParameters(mInitialParams); setupPreview(); + // reset zoom value index + mZoomValue = 0; openCameraCommon(); if (ApiHelper.HAS_SURFACE_TEXTURE) { @@ -752,9 +754,13 @@ public class NewPhotoModule if (mPaused) { return; } + //TODO: We should show the picture taken rather than frozen preview here + if (mIsImageCaptureIntent) { + stopPreview(); + } if (mSceneMode == Util.SCENE_MODE_HDR) { mUI.showSwitcher(); - //TODO: mActivity.setSwipingEnabled(true); + mUI.setSwipingEnabled(true); } mJpegPictureCallbackTime = System.currentTimeMillis(); @@ -1191,7 +1197,7 @@ public class NewPhotoModule if (mSceneMode == Util.SCENE_MODE_HDR) { mUI.hideSwitcher(); - //TODO: mActivity.setSwipingEnabled(false); + mUI.setSwipingEnabled(false); } // If the user wants to do a snapshot while the previous one is still // in progress, remember the fact and do it after we finish the previous @@ -1602,10 +1608,11 @@ public class NewPhotoModule private void updateCameraParametersInitialize() { // Reset preview frame rate to the maximum because it may be lowered by // video camera application. - List<Integer> frameRates = mParameters.getSupportedPreviewFrameRates(); - if (frameRates != null) { - Integer max = Collections.max(frameRates); - mParameters.setPreviewFrameRate(max); + int[] fpsRange = Util.getMaxPreviewFpsRange(mParameters); + if (fpsRange.length > 0) { + mParameters.setPreviewFpsRange( + fpsRange[Parameters.PREVIEW_FPS_MIN_INDEX], + fpsRange[Parameters.PREVIEW_FPS_MAX_INDEX]); } mParameters.set(Util.RECORDING_HINT, Util.FALSE); diff --git a/src/com/android/camera/NewPhotoUI.java b/src/com/android/camera/NewPhotoUI.java index b9bc4d31a..15b9409ed 100644 --- a/src/com/android/camera/NewPhotoUI.java +++ b/src/com/android/camera/NewPhotoUI.java @@ -296,6 +296,7 @@ public class NewPhotoUI implements PieListener, mGestures = new NewPreviewGestures(mActivity, this, mZoomRenderer, mPieRenderer); mRenderOverlay.setGestures(mGestures); } + mGestures.setZoomEnabled(params.isZoomSupported()); mGestures.setRenderOverlay(mRenderOverlay); mRenderOverlay.requestLayout(); @@ -648,8 +649,7 @@ public class NewPhotoUI implements PieListener, @Override public void onPieOpened(int centerX, int centerY) { - //TODO: mActivity.cancelActivityTouchHandling(); - //TODO: mActivity.setSwipingEnabled(false); + setSwipingEnabled(false); dismissPopup(); if (mFaceView != null) { mFaceView.setBlockDraw(true); @@ -658,12 +658,16 @@ public class NewPhotoUI implements PieListener, @Override public void onPieClosed() { - //TODO: mActivity.setSwipingEnabled(true); + setSwipingEnabled(true); if (mFaceView != null) { mFaceView.setBlockDraw(false); } } + public void setSwipingEnabled(boolean enable) { + mActivity.setSwipingEnabled(enable); + } + public Object getSurfaceTexture() { synchronized (mLock) { if (mSurfaceTexture == null) { diff --git a/src/com/android/camera/NewPreviewGestures.java b/src/com/android/camera/NewPreviewGestures.java index 39c4be664..339c4b33f 100644 --- a/src/com/android/camera/NewPreviewGestures.java +++ b/src/com/android/camera/NewPreviewGestures.java @@ -69,6 +69,7 @@ public class NewPreviewGestures private int mMode; private int mSlop; private int mTapTimeout; + private boolean mZoomEnabled; private boolean mEnabled; private boolean mZoomOnly; private int mOrientation; @@ -148,6 +149,10 @@ public class NewPreviewGestures mEnabled = enabled; } + public void setZoomEnabled(boolean enable) { + mZoomEnabled = enable; + } + public void setZoomOnly(boolean zoom) { mZoomOnly = zoom; } @@ -178,7 +183,10 @@ public class NewPreviewGestures mScale.onTouchEvent(m); if (MotionEvent.ACTION_POINTER_DOWN == m.getActionMasked()) { mMode = MODE_ZOOM; - mZoom.onScaleBegin(mScale); + if (mZoomEnabled) { + // Start showing zoom UI as soon as there is a second finger down + mZoom.onScaleBegin(mScale); + } } else if (MotionEvent.ACTION_POINTER_UP == m.getActionMasked()) { mZoom.onScaleEnd(mScale); } @@ -241,6 +249,7 @@ public class NewPreviewGestures if (mPie == null || !mPie.isOpen()) { mMode = MODE_ZOOM; mGestureDetector.onTouchEvent(makeCancelEvent(mCurrent)); + if (!mZoomEnabled) return false; return mZoom.onScaleBegin(detector); } return false; diff --git a/src/com/android/camera/NewVideoModule.java b/src/com/android/camera/NewVideoModule.java index 3649dcbd1..87899a249 100644 --- a/src/com/android/camera/NewVideoModule.java +++ b/src/com/android/camera/NewVideoModule.java @@ -1454,7 +1454,7 @@ public class NewVideoModule implements NewCameraModule, private void startVideoRecording() { Log.v(TAG, "startVideoRecording"); mUI.enablePreviewThumb(false); - // TODO: mActivity.setSwipingEnabled(false); + mUI.setSwipingEnabled(false); mActivity.updateStorageSpaceAndHint(); if (mActivity.getStorageSpace() <= Storage.LOW_STORAGE_THRESHOLD) { @@ -1563,7 +1563,7 @@ public class NewVideoModule implements NewCameraModule, private boolean stopVideoRecording() { Log.v(TAG, "stopVideoRecording"); - //TODO: mUI.setSwipingEnabled(true); + mUI.setSwipingEnabled(true); mUI.showSwitcher(); boolean fail = false; @@ -1772,7 +1772,14 @@ public class NewVideoModule implements NewCameraModule, @SuppressWarnings("deprecation") private void setCameraParameters() { mParameters.setPreviewSize(mDesiredPreviewWidth, mDesiredPreviewHeight); - mParameters.setPreviewFrameRate(mProfile.videoFrameRate); + int[] fpsRange = Util.getMaxPreviewFpsRange(mParameters); + if (fpsRange.length > 0) { + mParameters.setPreviewFpsRange( + fpsRange[Parameters.PREVIEW_FPS_MIN_INDEX], + fpsRange[Parameters.PREVIEW_FPS_MAX_INDEX]); + } else { + mParameters.setPreviewFrameRate(mProfile.videoFrameRate); + } // Set flash mode. String flashMode; @@ -2016,6 +2023,7 @@ public class NewVideoModule implements NewCameraModule, initializeVideoControl(); // From onResume + mZoomValue = 0; mUI.initializeZoom(mParameters); mUI.setOrientationIndicator(0, false); diff --git a/src/com/android/camera/NewVideoUI.java b/src/com/android/camera/NewVideoUI.java index 3abda228e..35676aff5 100644 --- a/src/com/android/camera/NewVideoUI.java +++ b/src/com/android/camera/NewVideoUI.java @@ -479,14 +479,17 @@ public class NewVideoUI implements PieRenderer.PieListener, // PieListener @Override public void onPieOpened(int centerX, int centerY) { - // TODO: mActivity.cancelActivityTouchHandling(); - // mActivity.setSwipingEnabled(false); + setSwipingEnabled(false); dismissPopup(false, true); } @Override public void onPieClosed() { - // TODO: mActivity.setSwipingEnabled(true); + setSwipingEnabled(true); + } + + public void setSwipingEnabled(boolean enable) { + mActivity.setSwipingEnabled(enable); } public void showPreviewBorder(boolean enable) { @@ -582,7 +585,11 @@ public class NewVideoUI implements PieRenderer.PieListener, } public void initializeZoom(Parameters param) { - if (param == null || !param.isZoomSupported()) return; + if (param == null || !param.isZoomSupported()) { + mGestures.setZoomEnabled(false); + return; + } + mGestures.setZoomEnabled(true); mZoomMax = param.getMaxZoom(); mZoomRatios = param.getZoomRatios(); // Currently we use immediate zoom for fast zooming to get better UX and diff --git a/src/com/android/camera/Util.java b/src/com/android/camera/Util.java index 6c3b3640b..3a0b61967 100644 --- a/src/com/android/camera/Util.java +++ b/src/com/android/camera/Util.java @@ -746,6 +746,16 @@ public class Util { } } + + public static int[] getMaxPreviewFpsRange(Parameters params) { + List<int[]> frameRates = params.getSupportedPreviewFpsRange(); + if (frameRates != null && frameRates.size() > 0) { + // The list is sorted. Return the last element. + return frameRates.get(frameRates.size() - 1); + } + return new int[0]; + } + private static class ImageFileNamer { private SimpleDateFormat mFormat; diff --git a/src/com/android/camera/data/CameraDataAdapter.java b/src/com/android/camera/data/CameraDataAdapter.java index fbe9af61f..609e812fc 100644 --- a/src/com/android/camera/data/CameraDataAdapter.java +++ b/src/com/android/camera/data/CameraDataAdapter.java @@ -128,7 +128,7 @@ public class CameraDataAdapter implements FilmStripView.DataAdapter { public boolean canSwipeInFullScreen(int id) { if (mImages.get(id).getType() == ImageData.TYPE_CAMERA_PREVIEW) { - return mCameraPreviewLocked; + return !mCameraPreviewLocked; } return false; } diff --git a/src/com/android/camera/ui/FilmStripView.java b/src/com/android/camera/ui/FilmStripView.java index d8ab27d1f..fb8fd2e31 100644 --- a/src/com/android/camera/ui/FilmStripView.java +++ b/src/com/android/camera/ui/FilmStripView.java @@ -769,6 +769,11 @@ public class FilmStripView extends ViewGroup { if (ev.getActionMasked() == MotionEvent.ACTION_DOWN) { mCheckToIntercept = true; mDown = MotionEvent.obtain(ev); + ViewInfo viewInfo = mViewInfo[mCurrentInfo]; + // Do not intercept touch if swipe is not enabled + if (viewInfo != null && !mDataAdapter.canSwipeInFullScreen(viewInfo.getID())) { + mCheckToIntercept = false; + } return false; } else if (ev.getActionMasked() == MotionEvent.ACTION_POINTER_DOWN) { // Do not intercept touch once child is in zoom mode diff --git a/src/com/android/gallery3d/filtershow/FilterShowActivity.java b/src/com/android/gallery3d/filtershow/FilterShowActivity.java index 1cef27170..2d745968b 100644 --- a/src/com/android/gallery3d/filtershow/FilterShowActivity.java +++ b/src/com/android/gallery3d/filtershow/FilterShowActivity.java @@ -31,16 +31,19 @@ import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; +import android.os.Handler; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentTransaction; import android.util.DisplayMetrics; import android.util.TypedValue; +import android.util.Log; import android.view.Display; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; +import android.view.ViewPropertyAnimator; import android.view.WindowManager; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; @@ -209,7 +212,10 @@ public class FilterShowActivity extends FragmentActivity implements OnItemClickL View container = mainPanel.getView().findViewById(R.id.category_panel_container); View bottom = mainPanel.getView().findViewById(R.id.bottom_panel); int panelHeight = container.getHeight() + bottom.getHeight(); - mainPanel.getView().animate().translationY(panelHeight).withEndAction(showEditor).start(); + ViewPropertyAnimator anim = mainPanel.getView().animate(); + anim.translationY(panelHeight).start(); + final Handler handler = new Handler(); + handler.postDelayed(showEditor, anim.getDuration()); } else { showEditor.run(); } @@ -506,6 +512,10 @@ public class FilterShowActivity extends FragmentActivity implements OnItemClickL cannotLoadImage(); } + if (null == CachingPipeline.getRenderScriptContext()){ + Log.v(LOGTAG,"RenderScript context destroyed during load"); + return; + } final View loading = findViewById(R.id.loading); loading.setVisibility(View.GONE); final View imageShow = findViewById(R.id.imageShow); @@ -973,6 +983,9 @@ public class FilterShowActivity extends FragmentActivity implements OnItemClickL public void done() { hideSavingProgress(); + if (mLoadBitmapTask != null) { + mLoadBitmapTask.cancel(false); + } finish(); } diff --git a/src/com/android/gallery3d/filtershow/category/Action.java b/src/com/android/gallery3d/filtershow/category/Action.java index 506b2bf0f..b46147961 100644 --- a/src/com/android/gallery3d/filtershow/category/Action.java +++ b/src/com/android/gallery3d/filtershow/category/Action.java @@ -134,7 +134,7 @@ public class Action implements RenderingRequestCaller { m.mapRect(image); m.setRectToRect(image, frame, Matrix.ScaleToFit.FILL); Canvas canvas = new Canvas(destination); - canvas.drawBitmap(source, m, new Paint()); + canvas.drawBitmap(source, m, new Paint(Paint.FILTER_BITMAP_FLAG)); } @Override diff --git a/src/com/android/gallery3d/filtershow/crop/CropLoader.java b/src/com/android/gallery3d/filtershow/crop/CropLoader.java index fc461f5d0..53a9ebc14 100644 --- a/src/com/android/gallery3d/filtershow/crop/CropLoader.java +++ b/src/com/android/gallery3d/filtershow/crop/CropLoader.java @@ -30,6 +30,7 @@ import android.provider.MediaStore; import android.provider.MediaStore.Images; import android.provider.MediaStore.Images.ImageColumns; import android.util.Log; +import android.webkit.MimeTypeMap; import com.android.gallery3d.common.Utils; import com.android.gallery3d.exif.ExifInterface; @@ -64,39 +65,45 @@ public abstract class CropLoader { if (uri == null || context == null) { throw new IllegalArgumentException("bad argument to getScaledBitmap"); } - if (ContentResolver.SCHEME_FILE.equals(uri.getScheme())) { - String mimeType = context.getContentResolver().getType(uri); - if (mimeType != JPEG_MIME_TYPE) { - return 0; - } - String path = uri.getPath(); - int orientation = 0; - ExifInterface exif = new ExifInterface(); - try { - exif.readExif(path); - orientation = ExifInterface.getRotationForOrientationValue( - exif.getTagIntValue(ExifInterface.TAG_ORIENTATION).shortValue()); - } catch (IOException e) { - Log.w(LOGTAG, "Failed to read EXIF orientation", e); - } - return orientation; - } + + // First try to find orientation data in Gallery's ContentProvider. Cursor cursor = null; try { cursor = context.getContentResolver().query(uri, new String[] { MediaStore.Images.ImageColumns.ORIENTATION }, null, null, null); - if (cursor.moveToNext()) { + if (cursor != null && cursor.moveToNext()) { int ori = cursor.getInt(0); return (ori < 0) ? 0 : ori; } } catch (SQLiteException e) { - return 0; + // Do nothing } catch (IllegalArgumentException e) { - return 0; + // Do nothing } finally { Utils.closeSilently(cursor); } + + // Fall back to checking EXIF tags in file. + if (ContentResolver.SCHEME_FILE.equals(uri.getScheme())) { + String mimeType = getMimeType(uri); + if (!JPEG_MIME_TYPE.equals(mimeType)) { + return 0; + } + String path = uri.getPath(); + int orientation = 0; + ExifInterface exif = new ExifInterface(); + try { + exif.readExif(path); + Integer tagval = exif.getTagIntValue(ExifInterface.TAG_ORIENTATION); + if (tagval != null) { + orientation = ExifInterface.getRotationForOrientationValue(tagval.shortValue()); + } + } catch (IOException e) { + Log.w(LOGTAG, "Failed to read EXIF orientation", e); + } + return orientation; + } return 0; } @@ -252,6 +259,15 @@ public abstract class CropLoader { return dir[0]; } + private static String getMimeType(Uri src) { + String postfix = MimeTypeMap.getFileExtensionFromUrl(src.toString()); + String ret = null; + if (postfix != null) { + ret = MimeTypeMap.getSingleton().getMimeTypeFromExtension(postfix); + } + return ret; + } + public static Uri insertContent(Context context, Uri sourceUri, File file, String saveFileName, long time) { time /= 1000; diff --git a/src/com/android/gallery3d/filtershow/filters/FilterRepresentation.java b/src/com/android/gallery3d/filtershow/filters/FilterRepresentation.java index 701fabba7..c95a15a99 100644 --- a/src/com/android/gallery3d/filtershow/filters/FilterRepresentation.java +++ b/src/com/android/gallery3d/filtershow/filters/FilterRepresentation.java @@ -24,7 +24,7 @@ public class FilterRepresentation implements Cloneable { private static final boolean DEBUG = false; private String mName; private int mPriority = TYPE_NORMAL; - private Class mFilterClass; + private Class<?> mFilterClass; private boolean mSupportsPartialRendering = false; private int mTextId = 0; private int mEditorId = BasicEditor.ID; @@ -157,11 +157,11 @@ public class FilterRepresentation implements Cloneable { return false; } - public Class getFilterClass() { + public Class<?> getFilterClass() { return mFilterClass; } - public void setFilterClass(Class filterClass) { + public void setFilterClass(Class<?> filterClass) { mFilterClass = filterClass; } diff --git a/src/com/android/gallery3d/filtershow/state/StateView.java b/src/com/android/gallery3d/filtershow/state/StateView.java index 9353a430a..73d57846a 100644 --- a/src/com/android/gallery3d/filtershow/state/StateView.java +++ b/src/com/android/gallery3d/filtershow/state/StateView.java @@ -78,6 +78,7 @@ public class StateView extends View { mTextColor = res.getColor(R.color.filtershow_stateview_text); mSelectedBackgroundColor = res.getColor(R.color.filtershow_stateview_selected_background); mSelectedTextColor = res.getColor(R.color.filtershow_stateview_selected_text); + mTextSize = res.getDimensionPixelSize(R.dimen.state_panel_text_size); } public String getText() { diff --git a/src/com/android/gallery3d/filtershow/tools/IconFactory.java b/src/com/android/gallery3d/filtershow/tools/IconFactory.java index ccc49e13d..9e39f27fc 100644 --- a/src/com/android/gallery3d/filtershow/tools/IconFactory.java +++ b/src/com/android/gallery3d/filtershow/tools/IconFactory.java @@ -103,6 +103,6 @@ public class IconFactory { rec.roundOut(srcRect); } - canvas.drawBitmap(sourceImage, srcRect, destRect, new Paint()); + canvas.drawBitmap(sourceImage, srcRect, destRect, new Paint(Paint.FILTER_BITMAP_FLAG)); } } diff --git a/src/com/android/photos/drawables/MtpThumbnailDrawable.java b/src/com/android/photos/drawables/MtpThumbnailDrawable.java deleted file mode 100644 index e35e06943..000000000 --- a/src/com/android/photos/drawables/MtpThumbnailDrawable.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.photos.drawables; - -import android.mtp.MtpDevice; -import android.mtp.MtpObjectInfo; - -import com.android.gallery3d.ingest.MtpDeviceIndex; - -import java.io.InputStream; - -public class MtpThumbnailDrawable extends AutoThumbnailDrawable<MtpObjectInfo> { - public void setImage(MtpObjectInfo data) { - if (data == null) { - setImage(null, 0, 0); - } else { - setImage(data, data.getImagePixWidth(), data.getImagePixHeight()); - } - } - - @Override - protected byte[] getPreferredImageBytes(MtpObjectInfo data) { - if (data == null) { - return null; - } - MtpDevice device = MtpDeviceIndex.getInstance().getDevice(); - if (device != null) { - return device.getThumbnail(data.getObjectHandle()); - } else { - return null; - } - } - - @Override - protected InputStream getFallbackImageStream(MtpObjectInfo data) { - // No fallback - return null; - } - - @Override - protected boolean dataChangedLocked(MtpObjectInfo data) { - // We only fetch the MtpObjectInfo once when creating - // the index so checking the reference is enough - return mData == data; - } - -} |