From a19529b701c6d74b91657441cdb7c3463fa7e8c6 Mon Sep 17 00:00:00 2001 From: Byunghun Jeon Date: Mon, 13 Oct 2014 18:34:37 -0700 Subject: SnapdragonCamera: Add preview thumbnail button Add preview thumbnail button and touch it to go to gallery Change-Id: Ib80ef94c677c204d7f0826356792aba2aa11d4d1 --- src/com/android/camera/CameraActivity.java | 111 ++++++++++++++++++++- src/com/android/camera/CustomPhotoMenu.java | 7 -- src/com/android/camera/PhotoModule.java | 4 + src/com/android/camera/PhotoUI.java | 24 ++++- src/com/android/camera/VideoModule.java | 4 + src/com/android/camera/VideoUI.java | 25 ++++- .../android/camera/WideAnglePanoramaModule.java | 4 + src/com/android/camera/WideAnglePanoramaUI.java | 32 ++++++ .../android/camera/data/FixedFirstDataAdapter.java | 1 + src/com/android/camera/ui/CameraControls.java | 80 ++++++--------- src/com/android/camera/ui/FilmStripView.java | 12 ++- 11 files changed, 236 insertions(+), 68 deletions(-) (limited to 'src/com') diff --git a/src/com/android/camera/CameraActivity.java b/src/com/android/camera/CameraActivity.java index bc8e2f152..b5fc0a676 100644 --- a/src/com/android/camera/CameraActivity.java +++ b/src/com/android/camera/CameraActivity.java @@ -33,8 +33,12 @@ import android.content.ServiceConnection; import android.content.SharedPreferences; import android.content.pm.ActivityInfo; import android.content.res.Configuration; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.graphics.drawable.ColorDrawable; import android.net.Uri; +import android.media.ThumbnailUtils; import android.nfc.NfcAdapter; import android.nfc.NfcAdapter.CreateBeamUrisCallback; import android.nfc.NfcEvent; @@ -83,6 +87,7 @@ import com.android.camera.tinyplanet.TinyPlanetFragment; import com.android.camera.ui.ModuleSwitcher; import com.android.camera.ui.DetailsDialog; import com.android.camera.ui.FilmStripView; +import com.android.camera.ui.FilmStripView.ImageData; import com.android.camera.util.ApiHelper; import com.android.camera.util.CameraUtil; import com.android.camera.util.GcamHelper; @@ -183,6 +188,8 @@ public class CameraActivity extends Activity private boolean mIsUndoingDeletion = false; private boolean mIsEditActivityInProgress = false; protected boolean mIsModuleSwitchInProgress = false; + private View mPreviewCover; + private FrameLayout mPreviewContentLayout; private Uri[] mNfcPushUris = new Uri[1]; @@ -201,6 +208,7 @@ public class CameraActivity extends Activity private Intent mImageShareIntent; public static int SETTING_LIST_WIDTH_1 = 250; public static int SETTING_LIST_WIDTH_2 = 250; + private Bitmap mPreviewThumbnailBitmap; private class MyOrientationEventListener extends OrientationEventListener { @@ -511,10 +519,13 @@ public class CameraActivity extends Activity }; public void gotoGallery() { - UsageStatistics.onEvent(UsageStatistics.COMPONENT_CAMERA, UsageStatistics.ACTION_FILMSTRIP, - "thumbnailTap"); - - mFilmStripView.getController().goToNextItem(); + LocalDataAdapter adapter = getDataAdapter(); + ImageData img = adapter.getImageData(1); + if (img == null) + return; + Uri uri = img.getContentUri(); + Intent intent = new Intent(Intent.ACTION_VIEW, uri); + startActivity(intent); } /** @@ -598,6 +609,98 @@ public class CameraActivity extends Activity mNfcPushUris[0] = uri; } + public LocalDataAdapter getDataAdapter() { + return mDataAdapter; + } + + private String getPathFromUri(Uri uri) { + String[] projection = { + MediaStore.Images.Media.DATA + }; + Cursor cursor = getContentResolver().query(uri, projection, null, null, null); + if (cursor == null) + return null; + int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); + cursor.moveToFirst(); + String s = cursor.getString(column_index); + cursor.close(); + return s; + } + + public void setPreviewThumbnailBitmap(Bitmap bitmap) { + mPreviewThumbnailBitmap = bitmap; + } + + public Bitmap getPreviewThumbBitmap() { + return mPreviewThumbnailBitmap; + } + + public void updatePreviewThumbnail() { + if (mCurrentModule != null) { + if (mCurrentModule instanceof VideoModule) { + ((VideoModule) mCurrentModule).updatePreviewThumbnail(); + } + else if (mCurrentModule instanceof WideAnglePanoramaModule) { + ((WideAnglePanoramaModule) mCurrentModule).updatePreviewThumbnail(); + } + else if (mCurrentModule instanceof PhotoModule) { + ((PhotoModule) mCurrentModule).updatePreviewThumbnail(); + } + } + } + + public void updatePreviewThumbnailForVideo() { + if (mCurrentModule != null) { + if (mCurrentModule instanceof VideoModule) { + ((VideoModule) mCurrentModule).updatePreviewThumbnail(); + } + } + } + + public class UpdatePreviewThumbnail extends AsyncTask { + private ImageView imgView; + private Bitmap imgBitmap = null; + + public UpdatePreviewThumbnail(ImageView view) { + imgView = view; + } + + @Override + protected Bitmap doInBackground(Void... params) { + if (imgBitmap != null) + return imgBitmap; + + LocalDataAdapter adapter = getDataAdapter(); + ImageData img = adapter.getImageData(1); + if (img == null) { + return null; + } + Uri uri = img.getContentUri(); + String path = getPathFromUri(uri); + if (path == null) { + return null; + } + else { + if (img.isPhoto()) { + BitmapFactory.Options opt = new BitmapFactory.Options(); + opt.inSampleSize = 4; + return BitmapFactory.decodeFile(path, opt); + } else { + return ThumbnailUtils + .createVideoThumbnail(path, MediaStore.Video.Thumbnails.MICRO_KIND); + } + } + } + + @Override + protected void onPostExecute(Bitmap bitmap) { + if (imgView == null) + return; + imgView.setImageBitmap(bitmap); + setPreviewThumbnailBitmap(bitmap); + } + } + private void setStandardShareIntent(Uri contentUri, String mimeType) { mStandardShareIntent = getShareIntentFromType(mimeType); if (mStandardShareIntent != null) { diff --git a/src/com/android/camera/CustomPhotoMenu.java b/src/com/android/camera/CustomPhotoMenu.java index f8230c0c2..551412a27 100644 --- a/src/com/android/camera/CustomPhotoMenu.java +++ b/src/com/android/camera/CustomPhotoMenu.java @@ -81,7 +81,6 @@ public class CustomPhotoMenu extends MenuController private static final int MODE_FILTER = 1; private static final int DEVELOPER_MENU_TOUCH_COUNT = 10; private int mSceneStatus; - private View mFlashSwitcher; private View mHdrSwitcher; private View mFrontBackSwitcher; private View mSceneModeSwitcher; @@ -103,7 +102,6 @@ public class CustomPhotoMenu extends MenuController mSettingOff = activity.getString(R.string.setting_off_value); mActivity = activity; mFrontBackSwitcher = ui.getRootView().findViewById(R.id.front_back_switcher); - mFlashSwitcher = ui.getRootView().findViewById(R.id.flash_switcher); mHdrSwitcher = ui.getRootView().findViewById(R.id.hdr_switcher); mSceneModeSwitcher = ui.getRootView().findViewById(R.id.scene_mode_switcher); mFilterModeSwitcher = ui.getRootView().findViewById(R.id.filter_mode_switcher); @@ -122,7 +120,6 @@ public class CustomPhotoMenu extends MenuController initSceneModeButton(mSceneModeSwitcher); initFilterModeButton(mFilterModeSwitcher); mHdrSwitcher.setVisibility(View.INVISIBLE); - mFlashSwitcher.setVisibility(View.INVISIBLE); mFrontBackSwitcher.setVisibility(View.INVISIBLE); // HDR. @@ -179,7 +176,6 @@ public class CustomPhotoMenu extends MenuController }; initSwitchItem(CameraSettings.KEY_CAMERA_ID, mFrontBackSwitcher); - initSwitchItem(CameraSettings.KEY_FLASH_MODE, mFlashSwitcher); } @Override @@ -457,9 +453,6 @@ public class CustomPhotoMenu extends MenuController @Override public void overrideSettings(final String... keyvalues) { for (int i = 0; i < keyvalues.length; i += 2) { - if (keyvalues[i].equals(CameraSettings.KEY_FLASH_MODE)) { - buttonSetEnabled(mFlashSwitcher, keyvalues[i + 1] == null); - } if (keyvalues[i].equals(CameraSettings.KEY_SCENE_MODE)) { buttonSetEnabled(mSceneModeSwitcher, keyvalues[i + 1] == null); } diff --git a/src/com/android/camera/PhotoModule.java b/src/com/android/camera/PhotoModule.java index 81b9f695d..5fb7ac726 100644 --- a/src/com/android/camera/PhotoModule.java +++ b/src/com/android/camera/PhotoModule.java @@ -2557,6 +2557,10 @@ public class PhotoModule } } + public void updatePreviewThumbnail() { + mUI.updatePreviewThumbnail(); + } + private void setDisplayOrientation() { mDisplayRotation = CameraUtil.getDisplayRotation(mActivity); mDisplayOrientation = CameraUtil.getDisplayOrientation(mDisplayRotation, mCameraId); diff --git a/src/com/android/camera/PhotoUI.java b/src/com/android/camera/PhotoUI.java index 803c2b19b..40672547a 100644 --- a/src/com/android/camera/PhotoUI.java +++ b/src/com/android/camera/PhotoUI.java @@ -53,6 +53,7 @@ import android.widget.PopupWindow; import android.widget.Toast; import android.graphics.drawable.AnimationDrawable; +import com.android.camera.CameraActivity.UpdatePreviewThumbnail; import com.android.camera.CameraPreference.OnPreferenceChangedListener; import com.android.camera.FocusOverlayManager.FocusUI; import com.android.camera.ui.AbstractSettingPopup; @@ -229,7 +230,7 @@ public class PhotoUI implements PieListener, @Override protected void onPostExecute(Bitmap bitmap) { mPreviewThumb.setImageBitmap(bitmap); - mAnimationManager.startCaptureAnimation(mPreviewThumb); + updatePreviewThumbnail(bitmap); } } @@ -286,6 +287,24 @@ public class PhotoUI implements PieListener, mPrevOrientationResize = false; } + public void updatePreviewThumbnail() { + mPreviewThumb.setVisibility(View.VISIBLE); + Bitmap bitmap = mActivity.getPreviewThumbBitmap(); + if (bitmap != null) { + mPreviewThumb.setImageBitmap(bitmap); + } + else { + UpdatePreviewThumbnail task = mActivity.new UpdatePreviewThumbnail(mPreviewThumb); + task.execute(); + } + } + + public void updatePreviewThumbnail(Bitmap bitmap) { + mPreviewThumb.setVisibility(View.VISIBLE); + mPreviewThumb.setImageBitmap(bitmap); + mActivity.setPreviewThumbnailBitmap(bitmap); + } + public void setDownFactor(int factor) { mDownSampleFactor = factor; } @@ -382,6 +401,7 @@ public class PhotoUI implements PieListener, // Re-apply transform matrix for new surface texture setTransformMatrix(mPreviewWidth, mPreviewHeight); } + updatePreviewThumbnail(); } @Override @@ -537,7 +557,7 @@ public class PhotoUI implements PieListener, mSwitcher.setVisibility(View.VISIBLE); } // called from onResume but only the first time - public void initializeFirstTime() { + public void initializeFirstTime() { // Initialize shutter button. mShutterButton.setImageBitmap(null); mShutterButton.setBackgroundResource(R.drawable.shutter_button_anim); diff --git a/src/com/android/camera/VideoModule.java b/src/com/android/camera/VideoModule.java index 876905f93..5bec8ef14 100644 --- a/src/com/android/camera/VideoModule.java +++ b/src/com/android/camera/VideoModule.java @@ -1524,6 +1524,10 @@ public class VideoModule implements CameraModule, mCurrentVideoValues = null; } + public void updatePreviewThumbnail() { + mUI.updateWithNewPreviewThumbnail(); + } + private void deleteVideoFile(String fileName) { Log.v(TAG, "Deleting video " + fileName); File f = new File(fileName); diff --git a/src/com/android/camera/VideoUI.java b/src/com/android/camera/VideoUI.java index 66a9d6b99..6d0e12548 100644 --- a/src/com/android/camera/VideoUI.java +++ b/src/com/android/camera/VideoUI.java @@ -45,6 +45,7 @@ import android.widget.ListView; import android.widget.PopupWindow; import android.widget.TextView; +import com.android.camera.CameraActivity.UpdatePreviewThumbnail; import com.android.camera.CameraPreference.OnPreferenceChangedListener; import com.android.camera.ui.AbstractSettingPopup; import com.android.camera.ui.CameraControls; @@ -94,7 +95,7 @@ public class VideoUI implements PieRenderer.PieListener, private VideoController mController; private int mZoomMax; private List mZoomRatios; - private View mPreviewThumb; + private ImageView mPreviewThumb; private View mFlashOverlay; private boolean mOrientationResize; private boolean mPrevOrientationResize; @@ -240,6 +241,23 @@ public class VideoUI implements PieRenderer.PieListener, mPrevOrientationResize = false; } + public void updatePreviewThumbnail() { + mPreviewThumb.setVisibility(View.VISIBLE); + Bitmap bitmap = mActivity.getPreviewThumbBitmap(); + if (bitmap != null) + mPreviewThumb.setImageBitmap(bitmap); + else { + UpdatePreviewThumbnail task = mActivity.new UpdatePreviewThumbnail(mPreviewThumb); + task.execute(); + } + } + + public void updateWithNewPreviewThumbnail() { + mPreviewThumb.setVisibility(View.VISIBLE); + UpdatePreviewThumbnail task = mActivity.new UpdatePreviewThumbnail(mPreviewThumb); + task.execute(); + } + public void cameraOrientationPreviewResize(boolean orientation){ mPrevOrientationResize = mOrientationResize; mOrientationResize = orientation; @@ -388,7 +406,7 @@ public class VideoUI implements PieRenderer.PieListener, Log.e(TAG, "No valid bitmap for capture animation."); return; } - ((ImageView) mPreviewThumb).setImageBitmap(bitmap); + mPreviewThumb.setImageBitmap(bitmap); mAnimationManager.startCaptureAnimation(mPreviewThumb); } @@ -532,7 +550,7 @@ public class VideoUI implements PieRenderer.PieListener, mGestures.setRenderOverlay(mRenderOverlay); - mPreviewThumb = mRootView.findViewById(R.id.preview_thumb); + mPreviewThumb = (ImageView) mRootView.findViewById(R.id.preview_thumb); mPreviewThumb.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { @@ -964,6 +982,7 @@ public class VideoUI implements PieRenderer.PieListener, // Re-apply transform matrix for new surface texture setTransformMatrix(mPreviewWidth, mPreviewHeight); } + updatePreviewThumbnail(); } @Override diff --git a/src/com/android/camera/WideAnglePanoramaModule.java b/src/com/android/camera/WideAnglePanoramaModule.java index d9f0032bb..40878581e 100644 --- a/src/com/android/camera/WideAnglePanoramaModule.java +++ b/src/com/android/camera/WideAnglePanoramaModule.java @@ -736,6 +736,10 @@ public class WideAnglePanoramaModule } } + public void updatePreviewThumbnail() { + mUI.updatePreviewThumbnail(); + } + // This function will be called upon the first camera frame is available. private void reset() { mCaptureState = CAPTURE_STATE_VIEWFINDER; diff --git a/src/com/android/camera/WideAnglePanoramaUI.java b/src/com/android/camera/WideAnglePanoramaUI.java index 97c7d43ec..8f9643971 100644 --- a/src/com/android/camera/WideAnglePanoramaUI.java +++ b/src/com/android/camera/WideAnglePanoramaUI.java @@ -34,12 +34,14 @@ import android.util.Log; import android.view.LayoutInflater; import android.view.TextureView; import android.view.View; +import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; +import com.android.camera.CameraActivity.UpdatePreviewThumbnail; import com.android.camera.ui.CameraControls; import com.android.camera.ui.CameraRootView; import com.android.camera.ui.ModuleSwitcher; @@ -78,6 +80,7 @@ public class WideAnglePanoramaUI implements private TextureView mTextureView; private ShutterButton mShutterButton; private CameraControls mCameraControls; + private ImageView mPreviewThumb; private Matrix mProgressDirectionMatrix = new Matrix(); private float[] mProgressAngle = new float[2]; @@ -104,6 +107,14 @@ public class WideAnglePanoramaUI implements mSwitcher = (ModuleSwitcher) mRootView.findViewById(R.id.camera_switcher); mSwitcher.setCurrentIndex(ModuleSwitcher.WIDE_ANGLE_PANO_MODULE_INDEX); mSwitcher.setSwitchListener(mActivity); + mPreviewThumb = (ImageView) mRootView.findViewById(R.id.preview_thumb); + mPreviewThumb.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + if (!CameraControls.isAnimating()) + mActivity.gotoGallery(); + } + }); } public void onStartCapture() { @@ -202,6 +213,23 @@ public class WideAnglePanoramaUI implements mProgressDirectionMatrix.postRotate(orientation); } + public void updatePreviewThumbnail(Bitmap bitmap) { + mPreviewThumb.setVisibility(View.VISIBLE); + mPreviewThumb.setImageBitmap(bitmap); + mActivity.setPreviewThumbnailBitmap(bitmap); + } + + public void updatePreviewThumbnail() { + mPreviewThumb.setVisibility(View.VISIBLE); + Bitmap bitmap = mActivity.getPreviewThumbBitmap(); + if (bitmap != null) + mPreviewThumb.setImageBitmap(bitmap); + else { + UpdatePreviewThumbnail task = mActivity.new UpdatePreviewThumbnail(mPreviewThumb); + task.execute(); + } + } + public void showDirectionIndicators(int direction) { switch (direction) { case PanoProgressBar.DIRECTION_NONE: @@ -227,6 +255,7 @@ public class WideAnglePanoramaUI implements public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int i, int i2) { mSurfaceTexture = surfaceTexture; mController.onPreviewUIReady(); + updatePreviewThumbnail(); } @Override @@ -282,6 +311,9 @@ public class WideAnglePanoramaUI implements // is sometimes not shown due to wrong layout result. It's likely to be // a framework bug. Call requestLayout() as a workaround. mSavingProgressBar.requestLayout(); + + updatePreviewThumbnail(Bitmap.createScaledBitmap(bitmap, + bitmap.getWidth() / 2, bitmap.getHeight() / 2, false)); } public void onConfigurationChanged( diff --git a/src/com/android/camera/data/FixedFirstDataAdapter.java b/src/com/android/camera/data/FixedFirstDataAdapter.java index e26ec2785..03402da43 100644 --- a/src/com/android/camera/data/FixedFirstDataAdapter.java +++ b/src/com/android/camera/data/FixedFirstDataAdapter.java @@ -158,6 +158,7 @@ public class FixedFirstDataAdapter extends AbstractLocalDataAdapterWrapper return (dataID != 0); } }); + mListener.onDataLoaded(); } @Override diff --git a/src/com/android/camera/ui/CameraControls.java b/src/com/android/camera/ui/CameraControls.java index aeaa0d4e7..1c9419569 100644 --- a/src/com/android/camera/ui/CameraControls.java +++ b/src/com/android/camera/ui/CameraControls.java @@ -41,7 +41,6 @@ public class CameraControls extends RotatableLayout { private View mSwitcher; private View mMenu; private View mFrontBackSwitcher; - private View mFlashSwitcher; private View mHdrSwitcher; private View mIndicators; private View mPreview; @@ -53,13 +52,13 @@ public class CameraControls extends RotatableLayout { private static boolean isAnimating = false; private ArrayList mViewList; private static final int FRONT_BACK_INDEX = 0; - private static final int FLASH_INDEX = 1; - private static final int HDR_INDEX = 2; - private static final int SCENE_MODE_INDEX = 3; - private static final int FILTER_MODE_INDEX = 4; + private static final int HDR_INDEX = 1; + private static final int SCENE_MODE_INDEX = 2; + private static final int FILTER_MODE_INDEX = 3; + private static final int MENU_INDEX = 4; private static final int SWITCHER_INDEX = 5; private static final int SHUTTER_INDEX = 6; - private static final int MENU_INDEX = 7; + private static final int PREVIEW_INDEX = 7; private static final int INDICATOR_INDEX = 8; private static final int ANIME_DURATION = 300; private float[][] mLocX = new float[4][9]; @@ -82,7 +81,6 @@ public class CameraControls extends RotatableLayout { resetLocation(0, 0); mFrontBackSwitcher.setVisibility(View.INVISIBLE); - mFlashSwitcher.setVisibility(View.INVISIBLE); mHdrSwitcher.setVisibility(View.INVISIBLE); mSceneModeSwitcher.setVisibility(View.INVISIBLE); mFilterModeSwitcher.setVisibility(View.INVISIBLE); @@ -101,7 +99,6 @@ public class CameraControls extends RotatableLayout { resetLocation(0, 0); mFrontBackSwitcher.setVisibility(View.INVISIBLE); - mFlashSwitcher.setVisibility(View.INVISIBLE); mHdrSwitcher.setVisibility(View.INVISIBLE); mSceneModeSwitcher.setVisibility(View.INVISIBLE); mFilterModeSwitcher.setVisibility(View.INVISIBLE); @@ -161,21 +158,19 @@ public class CameraControls extends RotatableLayout { mSwitcher.setPressed(false); mMenu.setPressed(false); mFrontBackSwitcher.setPressed(false); - mFlashSwitcher.setPressed(false); mHdrSwitcher.setPressed(false); mSceneModeSwitcher.setPressed(false); mFilterModeSwitcher.setPressed(false); } else { - mTempEnabled[FLASH_INDEX] = mFlashSwitcher.isEnabled(); mTempEnabled[FILTER_MODE_INDEX] = mFilterModeSwitcher.isEnabled(); } ((ShutterButton) mShutter).enableTouch(enable); ((ModuleSwitcher) mSwitcher).enableTouch(enable); mMenu.setEnabled(enable); mFrontBackSwitcher.setEnabled(enable); - mFlashSwitcher.setEnabled(enable && mTempEnabled[FLASH_INDEX]); mHdrSwitcher.setEnabled(enable); mSceneModeSwitcher.setEnabled(enable); + mPreview.setEnabled(enable); mFilterModeSwitcher.setEnabled(enable && mTempEnabled[FILTER_MODE_INDEX]); } @@ -183,8 +178,6 @@ public class CameraControls extends RotatableLayout { mViewList = new ArrayList(); if (mFrontBackSwitcher.getVisibility() == View.VISIBLE) mViewList.add(mFrontBackSwitcher); - if (mFlashSwitcher.getVisibility() == View.VISIBLE) - mViewList.add(mFlashSwitcher); if (mHdrSwitcher.getVisibility() == View.VISIBLE) mViewList.add(mHdrSwitcher); if (mSceneModeSwitcher.getVisibility() == View.VISIBLE) @@ -206,7 +199,6 @@ public class CameraControls extends RotatableLayout { mSwitcher = findViewById(R.id.camera_switcher); mShutter = findViewById(R.id.shutter_button); mFrontBackSwitcher = findViewById(R.id.front_back_switcher); - mFlashSwitcher = findViewById(R.id.flash_switcher); mHdrSwitcher = findViewById(R.id.hdr_switcher); mMenu = findViewById(R.id.menu); mIndicators = findViewById(R.id.on_screen_indicators); @@ -232,7 +224,6 @@ public class CameraControls extends RotatableLayout { v.layout(l, t, r, b); } Rect shutter = new Rect(); - topRight(mPreview, l, t, r, b); center(mShutter, l, t, r, b, orientation, rotation, shutter, SHUTTER_INDEX); mSize = (int) (Math.max(shutter.right - shutter.left, shutter.bottom - shutter.top) * 1.2f); center(mBackgroundView, l, t, r, b, orientation, rotation, new Rect(), -1); @@ -252,11 +243,11 @@ public class CameraControls extends RotatableLayout { private void setLocation(int w, int h) { int rotation = getUnifiedRotation(); toIndex(mSwitcher, w, h, rotation, 4, 6, SWITCHER_INDEX); - toIndex(mMenu, w, h, rotation, 0, 6, MENU_INDEX); + toIndex(mMenu, w, h, rotation, 4, 0, MENU_INDEX); toIndex(mIndicators, w, h, rotation, 0, 6, INDICATOR_INDEX); toIndex(mFrontBackSwitcher, w, h, rotation, 2, 0, FRONT_BACK_INDEX); - toIndex(mFlashSwitcher, w, h, rotation, 3, 0, FLASH_INDEX); - toIndex(mHdrSwitcher, w, h, rotation, 4, 0, HDR_INDEX); + toIndex(mPreview, w, h, rotation, 0, 6, PREVIEW_INDEX); + toIndex(mHdrSwitcher, w, h, rotation, 3, 0, HDR_INDEX); toIndex(mFilterModeSwitcher, w, h, rotation, 1, 0, FILTER_MODE_INDEX); toIndex(mSceneModeSwitcher, w, h, rotation, 0, 0, SCENE_MODE_INDEX); } @@ -310,24 +301,24 @@ public class CameraControls extends RotatableLayout { int idx1 = rotation / 90; mFrontBackSwitcher.setX(mLocX[idx1][FRONT_BACK_INDEX] + x); - mFlashSwitcher.setX(mLocX[idx1][FLASH_INDEX] + x); mHdrSwitcher.setX(mLocX[idx1][HDR_INDEX] + x); mSceneModeSwitcher.setX(mLocX[idx1][SCENE_MODE_INDEX] + x); mFilterModeSwitcher.setX(mLocX[idx1][FILTER_MODE_INDEX] + x); + mMenu.setX(mLocX[idx1][MENU_INDEX] + x); mSwitcher.setX(mLocX[idx1][SWITCHER_INDEX] - x); mShutter.setX(mLocX[idx1][SHUTTER_INDEX] - x); - mMenu.setX(mLocX[idx1][MENU_INDEX] - x); mIndicators.setX(mLocX[idx1][INDICATOR_INDEX] - x); + mPreview.setX(mLocX[idx1][PREVIEW_INDEX] - x); mFrontBackSwitcher.setY(mLocY[idx1][FRONT_BACK_INDEX] + y); - mFlashSwitcher.setY(mLocY[idx1][FLASH_INDEX] + y); mHdrSwitcher.setY(mLocY[idx1][HDR_INDEX] + y); mSceneModeSwitcher.setY(mLocY[idx1][SCENE_MODE_INDEX] + y); mFilterModeSwitcher.setY(mLocY[idx1][FILTER_MODE_INDEX] + y); + mMenu.setY(mLocY[idx1][MENU_INDEX] + y); mSwitcher.setY(mLocY[idx1][SWITCHER_INDEX] - y); mShutter.setY(mLocY[idx1][SHUTTER_INDEX] - y); - mMenu.setY(mLocY[idx1][MENU_INDEX] - y); mIndicators.setY(mLocY[idx1][INDICATOR_INDEX] - y); + mPreview.setY(mLocY[idx1][PREVIEW_INDEX] - y); } public void hideUI() { @@ -335,7 +326,6 @@ public class CameraControls extends RotatableLayout { enableTouch(false); int rotation = getUnifiedRotation(); mFrontBackSwitcher.animate().cancel(); - mFlashSwitcher.animate().cancel(); mHdrSwitcher.animate().cancel(); mSceneModeSwitcher.animate().cancel(); mFilterModeSwitcher.animate().cancel(); @@ -343,6 +333,7 @@ public class CameraControls extends RotatableLayout { mShutter.animate().cancel(); mMenu.animate().cancel(); mIndicators.animate().cancel(); + mPreview.animate().cancel(); mFrontBackSwitcher.animate().setListener(outlistener); ((ModuleSwitcher) mSwitcher).removePopup(); resetLocation(0, 0); @@ -350,51 +341,51 @@ public class CameraControls extends RotatableLayout { switch (rotation) { case 0: mFrontBackSwitcher.animate().translationYBy(-mSize).setDuration(ANIME_DURATION); - mFlashSwitcher.animate().translationYBy(-mSize).setDuration(ANIME_DURATION); mHdrSwitcher.animate().translationYBy(-mSize).setDuration(ANIME_DURATION); mSceneModeSwitcher.animate().translationYBy(-mSize).setDuration(ANIME_DURATION); mFilterModeSwitcher.animate().translationYBy(-mSize).setDuration(ANIME_DURATION); + mMenu.animate().translationYBy(-mSize).setDuration(ANIME_DURATION); mSwitcher.animate().translationYBy(mSize).setDuration(ANIME_DURATION); mShutter.animate().translationYBy(mSize).setDuration(ANIME_DURATION); - mMenu.animate().translationYBy(mSize).setDuration(ANIME_DURATION); mIndicators.animate().translationYBy(mSize).setDuration(ANIME_DURATION); + mPreview.animate().translationYBy(mSize).setDuration(ANIME_DURATION); break; case 90: mFrontBackSwitcher.animate().translationXBy(-mSize).setDuration(ANIME_DURATION); - mFlashSwitcher.animate().translationXBy(-mSize).setDuration(ANIME_DURATION); mHdrSwitcher.animate().translationXBy(-mSize).setDuration(ANIME_DURATION); mSceneModeSwitcher.animate().translationXBy(-mSize).setDuration(ANIME_DURATION); mFilterModeSwitcher.animate().translationXBy(-mSize).setDuration(ANIME_DURATION); + mMenu.animate().translationXBy(-mSize).setDuration(ANIME_DURATION); mSwitcher.animate().translationXBy(mSize).setDuration(ANIME_DURATION); mShutter.animate().translationXBy(mSize).setDuration(ANIME_DURATION); - mMenu.animate().translationXBy(mSize).setDuration(ANIME_DURATION); mIndicators.animate().translationXBy(mSize).setDuration(ANIME_DURATION); + mPreview.animate().translationXBy(mSize).setDuration(ANIME_DURATION); break; case 180: mFrontBackSwitcher.animate().translationYBy(mSize).setDuration(ANIME_DURATION); - mFlashSwitcher.animate().translationYBy(mSize).setDuration(ANIME_DURATION); mHdrSwitcher.animate().translationYBy(mSize).setDuration(ANIME_DURATION); mSceneModeSwitcher.animate().translationYBy(mSize).setDuration(ANIME_DURATION); mFilterModeSwitcher.animate().translationYBy(mSize).setDuration(ANIME_DURATION); + mMenu.animate().translationYBy(mSize).setDuration(ANIME_DURATION); mSwitcher.animate().translationYBy(-mSize).setDuration(ANIME_DURATION); mShutter.animate().translationYBy(-mSize).setDuration(ANIME_DURATION); - mMenu.animate().translationYBy(-mSize).setDuration(ANIME_DURATION); mIndicators.animate().translationYBy(-mSize).setDuration(ANIME_DURATION); + mPreview.animate().translationYBy(-mSize).setDuration(ANIME_DURATION); break; case 270: mFrontBackSwitcher.animate().translationXBy(mSize).setDuration(ANIME_DURATION); - mFlashSwitcher.animate().translationXBy(mSize).setDuration(ANIME_DURATION); mHdrSwitcher.animate().translationXBy(mSize).setDuration(ANIME_DURATION); mSceneModeSwitcher.animate().translationXBy(mSize).setDuration(ANIME_DURATION); mFilterModeSwitcher.animate().translationXBy(mSize).setDuration(ANIME_DURATION); + mMenu.animate().translationXBy(mSize).setDuration(ANIME_DURATION); mSwitcher.animate().translationXBy(-mSize).setDuration(ANIME_DURATION); mShutter.animate().translationXBy(-mSize).setDuration(ANIME_DURATION); - mMenu.animate().translationXBy(-mSize).setDuration(ANIME_DURATION); mIndicators.animate().translationXBy(-mSize).setDuration(ANIME_DURATION); + mPreview.animate().translationXBy(-mSize).setDuration(ANIME_DURATION); break; } } @@ -404,7 +395,6 @@ public class CameraControls extends RotatableLayout { enableTouch(false); int rotation = getUnifiedRotation(); mFrontBackSwitcher.animate().cancel(); - mFlashSwitcher.animate().cancel(); mHdrSwitcher.animate().cancel(); mSceneModeSwitcher.animate().cancel(); mFilterModeSwitcher.animate().cancel(); @@ -412,6 +402,7 @@ public class CameraControls extends RotatableLayout { mShutter.animate().cancel(); mMenu.animate().cancel(); mIndicators.animate().cancel(); + mPreview.animate().cancel(); if (mViewList != null) for (View v : mViewList) { v.setVisibility(View.VISIBLE); @@ -423,6 +414,7 @@ public class CameraControls extends RotatableLayout { mMenu.setVisibility(View.VISIBLE); mIndicators.setVisibility(View.VISIBLE); + mPreview.setVisibility(View.VISIBLE); mFrontBackSwitcher.animate().setListener(inlistener); switch (rotation) { @@ -430,57 +422,57 @@ public class CameraControls extends RotatableLayout { resetLocation(0, -mSize); mFrontBackSwitcher.animate().translationYBy(mSize).setDuration(ANIME_DURATION); - mFlashSwitcher.animate().translationYBy(mSize).setDuration(ANIME_DURATION); mHdrSwitcher.animate().translationYBy(mSize).setDuration(ANIME_DURATION); mSceneModeSwitcher.animate().translationYBy(mSize).setDuration(ANIME_DURATION); mFilterModeSwitcher.animate().translationYBy(mSize).setDuration(ANIME_DURATION); + mMenu.animate().translationYBy(mSize).setDuration(ANIME_DURATION); mSwitcher.animate().translationYBy(-mSize).setDuration(ANIME_DURATION); mShutter.animate().translationYBy(-mSize).setDuration(ANIME_DURATION); - mMenu.animate().translationYBy(-mSize).setDuration(ANIME_DURATION); mIndicators.animate().translationYBy(-mSize).setDuration(ANIME_DURATION); + mPreview.animate().translationYBy(-mSize).setDuration(ANIME_DURATION); break; case 90: resetLocation(-mSize, 0); mFrontBackSwitcher.animate().translationXBy(mSize).setDuration(ANIME_DURATION); - mFlashSwitcher.animate().translationXBy(mSize).setDuration(ANIME_DURATION); mHdrSwitcher.animate().translationXBy(mSize).setDuration(ANIME_DURATION); mSceneModeSwitcher.animate().translationXBy(mSize).setDuration(ANIME_DURATION); mFilterModeSwitcher.animate().translationXBy(mSize).setDuration(ANIME_DURATION); + mMenu.animate().translationXBy(mSize).setDuration(ANIME_DURATION); mSwitcher.animate().translationXBy(-mSize).setDuration(ANIME_DURATION); mShutter.animate().translationXBy(-mSize).setDuration(ANIME_DURATION); - mMenu.animate().translationXBy(-mSize).setDuration(ANIME_DURATION); mIndicators.animate().translationXBy(-mSize).setDuration(ANIME_DURATION); + mPreview.animate().translationXBy(-mSize).setDuration(ANIME_DURATION); break; case 180: resetLocation(0, mSize); mFrontBackSwitcher.animate().translationYBy(-mSize).setDuration(ANIME_DURATION); - mFlashSwitcher.animate().translationYBy(-mSize).setDuration(ANIME_DURATION); mHdrSwitcher.animate().translationYBy(-mSize).setDuration(ANIME_DURATION); mSceneModeSwitcher.animate().translationYBy(-mSize).setDuration(ANIME_DURATION); mFilterModeSwitcher.animate().translationYBy(-mSize).setDuration(ANIME_DURATION); + mMenu.animate().translationYBy(-mSize).setDuration(ANIME_DURATION); mSwitcher.animate().translationYBy(mSize).setDuration(ANIME_DURATION); mShutter.animate().translationYBy(mSize).setDuration(ANIME_DURATION); - mMenu.animate().translationYBy(mSize).setDuration(ANIME_DURATION); mIndicators.animate().translationYBy(mSize).setDuration(ANIME_DURATION); + mPreview.animate().translationYBy(mSize).setDuration(ANIME_DURATION); break; case 270: resetLocation(mSize, 0); mFrontBackSwitcher.animate().translationXBy(-mSize).setDuration(ANIME_DURATION); - mFlashSwitcher.animate().translationXBy(-mSize).setDuration(ANIME_DURATION); mHdrSwitcher.animate().translationXBy(-mSize).setDuration(ANIME_DURATION); mSceneModeSwitcher.animate().translationXBy(-mSize).setDuration(ANIME_DURATION); mFilterModeSwitcher.animate().translationXBy(-mSize).setDuration(ANIME_DURATION); + mMenu.animate().translationXBy(-mSize).setDuration(ANIME_DURATION); mSwitcher.animate().translationXBy(mSize).setDuration(ANIME_DURATION); mShutter.animate().translationXBy(mSize).setDuration(ANIME_DURATION); - mMenu.animate().translationXBy(mSize).setDuration(ANIME_DURATION); mIndicators.animate().translationXBy(mSize).setDuration(ANIME_DURATION); + mPreview.animate().translationXBy(mSize).setDuration(ANIME_DURATION); break; } } @@ -632,14 +624,6 @@ public class CameraControls extends RotatableLayout { v.layout(l, t, r, b); } - private void topRight(View v, int l, int t, int r, int b) { - // layout using the specific margins; the rotation code messes up the - // others - int mt = getContext().getResources().getDimensionPixelSize(R.dimen.capture_margin_top); - int mr = getContext().getResources().getDimensionPixelSize(R.dimen.capture_margin_right); - v.layout(r - v.getMeasuredWidth() - mr, t + mt, r - mr, t + mt + v.getMeasuredHeight()); - } - private void adjustBackground() { int rotation = getUnifiedRotation(); // remove current drawable and reset rotation diff --git a/src/com/android/camera/ui/FilmStripView.java b/src/com/android/camera/ui/FilmStripView.java index 8da49a10a..7f197caf4 100644 --- a/src/com/android/camera/ui/FilmStripView.java +++ b/src/com/android/camera/ui/FilmStripView.java @@ -106,6 +106,8 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { private boolean mSendToPreviewMenu; private boolean mSendToMenu; private boolean mReset; + private boolean mIsLoaded = false; + /** * Common interface for all images in the filmstrip. */ @@ -1733,7 +1735,10 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { mDataAdapter.setListener(new DataAdapter.Listener() { @Override public void onDataLoaded() { - reload(); + mActivity.updatePreviewThumbnail(); + if (!mIsLoaded) + reload(); + mIsLoaded = true; } @Override @@ -1749,6 +1754,7 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { return; } updateInsertion(dataID); + mActivity.updatePreviewThumbnailForVideo(); } @Override @@ -1807,9 +1813,7 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { && deltaX < mSlop * (-1)) { // intercept left swipe if (Math.abs(deltaX) >= Math.abs(deltaY) * 2) { - UsageStatistics.onEvent(UsageStatistics.COMPONENT_CAMERA, - UsageStatistics.ACTION_FILMSTRIP, null); - return true; + return false; } } } -- cgit v1.2.3