From b7639c641f2ed5d0c60546349c3aa9e90c026878 Mon Sep 17 00:00:00 2001 From: Sascha Haeberling Date: Mon, 9 Sep 2013 14:42:43 -0700 Subject: Make sure we switch to preview view when resuming. Bug: 10640328 But we need to make sure to not always switch in onResume, as some activities stared from us (like playing a video or editing) require the UI flow to stay in filmstrip. Change-Id: Id2911be4949de9fd9fc4cb3451dd34e3fae8becf --- src/com/android/camera/CameraActivity.java | 78 ++++++++++++++-------- src/com/android/camera/VideoModule.java | 3 +- src/com/android/camera/data/CameraDataAdapter.java | 5 +- .../android/camera/data/FixedFirstDataAdapter.java | 7 +- .../android/camera/data/FixedLastDataAdapter.java | 7 +- src/com/android/camera/data/LocalData.java | 4 +- src/com/android/camera/data/LocalMediaData.java | 17 ++--- src/com/android/camera/data/SimpleViewData.java | 3 +- src/com/android/camera/ui/FilmStripView.java | 5 +- src/com/android/camera/util/CameraUtil.java | 33 +++------ 10 files changed, 88 insertions(+), 74 deletions(-) diff --git a/src/com/android/camera/CameraActivity.java b/src/com/android/camera/CameraActivity.java index 4c787cc02..672801579 100644 --- a/src/com/android/camera/CameraActivity.java +++ b/src/com/android/camera/CameraActivity.java @@ -93,6 +93,19 @@ public class CameraActivity extends Activity // panorama. If the extra is not set, it is in the normal camera mode. public static final String SECURE_CAMERA_EXTRA = "secure_camera"; + /** + * Request code from an activity we started that indicated that we do not + * want to reset the view to the preview in onResume. + */ + public static final int REQ_CODE_DONT_SWITCH_TO_PREVIEW = 142; + + /** Request code for external image editor activities. */ + private static final int REQ_CODE_EDIT = 1; + + + /** Whether onResume should reset the view to the preview. */ + private boolean mResetToPreviewOnResume = true; + // Supported operations at FilmStripView. Different data has different // set of supported operations. private static final int SUPPORT_DELETE = 1 << 0; @@ -107,8 +120,6 @@ public class CameraActivity extends Activity private static final int SUPPORT_SHOW_ON_MAP = 1 << 9; private static final int SUPPORT_ALL = 0xffffffff; - private static final int EDIT_RESULT = 1; - /** This data adapter is used by FilmStripView. */ private LocalDataAdapter mDataAdapter; /** This data adapter represents the real local camera data. */ @@ -117,7 +128,6 @@ public class CameraActivity extends Activity private PanoramaStitchingManager mPanoramaManager; private int mCurrentModuleIndex; private CameraModule mCurrentModule; - private FrameLayout mLayoutRoot; private FrameLayout mAboveFilmstripControlLayout; private View mCameraModuleRootView; private FilmStripView mFilmStripView; @@ -588,7 +598,7 @@ public class CameraActivity extends Activity intent.setData(currentData.getContentUri()); // We need the file path to wrap this into a RandomAccessFile. intent.putExtra(MEDIA_ITEM_PATH, currentData.getPath()); - startActivity(intent); + startActivityForResult(intent, REQ_CODE_DONT_SWITCH_TO_PREVIEW); return true; } case R.id.action_rotate_ccw: @@ -606,8 +616,8 @@ public class CameraActivity extends Activity localData.getMimeType()) .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.putExtra("mimeType", intent.getType()); - startActivity(Intent.createChooser( - intent, getString(R.string.set_as))); + startActivityForResult(Intent.createChooser( + intent, getString(R.string.set_as)), REQ_CODE_DONT_SWITCH_TO_PREVIEW); return true; } case R.id.action_details: @@ -683,8 +693,6 @@ public class CameraActivity extends Activity registerReceiver(sScreenOffReceiver, filter); } } - mLayoutRoot = (FrameLayout) findViewById(R.id.camera_layout_root); - mAboveFilmstripControlLayout = (FrameLayout) findViewById(R.id.camera_above_filmstrip_layout); mAboveFilmstripControlLayout.setFitsSystemWindows(true); @@ -787,6 +795,30 @@ public class CameraActivity extends Activity mCurrentModule.onPauseAfterSuper(); } + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (requestCode == REQ_CODE_EDIT && resultCode == RESULT_OK) { + Uri uri = data.getData(); + ContentResolver contentResolver = getContentResolver(); + if (uri == null) { + // If we don't have a particular uri returned, then we have + // to refresh all, it is not optimal, but works best so far. + // Also don't requestLoad() when in secure camera mode. + if (!mSecureCamera) { + mDataAdapter.requestLoad(contentResolver); + } + } else { + mDataAdapter.refresh(contentResolver, uri); + } + } + + if (requestCode == REQ_CODE_DONT_SWITCH_TO_PREVIEW | requestCode == REQ_CODE_EDIT) { + mResetToPreviewOnResume = false; + } else { + super.onActivityResult(requestCode, resultCode, data); + } + } + @Override public void onResume() { // TODO: Handle this in OrientationManager. @@ -804,6 +836,15 @@ public class CameraActivity extends Activity mCurrentModule.onResumeAfterSuper(); setSwipingEnabled(true); + + if (mResetToPreviewOnResume) { + // Go to the preview on resume. + mFilmStripView.getController().goToFirstItem(); + } + // Default is showing the preview, unless disabled by explicitly + // starting an activity we want to return from to the filmstrip rather + // than the preview. + mResetToPreviewOnResume = true; } @Override @@ -991,26 +1032,7 @@ public class CameraActivity extends Activity Intent intent = new Intent(Intent.ACTION_EDIT) .setDataAndType(data.getContentUri(), data.getMimeType()) .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - startActivityForResult(Intent.createChooser(intent, null), EDIT_RESULT); - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == EDIT_RESULT && resultCode == RESULT_OK) { - Uri uri = data.getData(); - ContentResolver contentResolver = getContentResolver(); - if (uri == null) { - // If we don't have a particular uri returned, then we have - // to refresh all, it is not optimal, but works best so far. - // Also don't requestLoad() when in secure camera mode. - if (!mSecureCamera) { - mDataAdapter.requestLoad(contentResolver); - } - } else { - mDataAdapter.refresh(contentResolver, uri); - } - - } + startActivityForResult(Intent.createChooser(intent, null), REQ_CODE_EDIT); } private void openModule(CameraModule module) { diff --git a/src/com/android/camera/VideoModule.java b/src/com/android/camera/VideoModule.java index 291c74cc5..89f229abd 100644 --- a/src/com/android/camera/VideoModule.java +++ b/src/com/android/camera/VideoModule.java @@ -458,7 +458,8 @@ public class VideoModule implements CameraModule, Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(mCurrentVideoUri, convertOutputFormatToMimeType(mProfile.fileFormat)); try { - mActivity.startActivity(intent); + mActivity + .startActivityForResult(intent, CameraActivity.REQ_CODE_DONT_SWITCH_TO_PREVIEW); } catch (ActivityNotFoundException ex) { Log.e(TAG, "Couldn't view video " + mCurrentVideoUri, ex); } diff --git a/src/com/android/camera/data/CameraDataAdapter.java b/src/com/android/camera/data/CameraDataAdapter.java index af9fbb8f3..892aa1056 100644 --- a/src/com/android/camera/data/CameraDataAdapter.java +++ b/src/com/android/camera/data/CameraDataAdapter.java @@ -16,6 +16,7 @@ package com.android.camera.data; +import android.app.Activity; import android.content.ContentResolver; import android.content.Context; import android.database.Cursor; @@ -94,13 +95,13 @@ public class CameraDataAdapter implements LocalDataAdapter { } @Override - public View getView(Context c, int dataID) { + public View getView(Activity activity, int dataID) { if (dataID >= mImages.size() || dataID < 0) { return null; } return mImages.get(dataID).getView( - c, mSuggestedWidth, mSuggestedHeight, + activity, mSuggestedWidth, mSuggestedHeight, mPlaceHolder.getConstantState().newDrawable()); } diff --git a/src/com/android/camera/data/FixedFirstDataAdapter.java b/src/com/android/camera/data/FixedFirstDataAdapter.java index 53eb3bb86..05923b407 100644 --- a/src/com/android/camera/data/FixedFirstDataAdapter.java +++ b/src/com/android/camera/data/FixedFirstDataAdapter.java @@ -16,6 +16,7 @@ package com.android.camera.data; +import android.app.Activity; import android.content.Context; import android.net.Uri; import android.view.View; @@ -106,12 +107,12 @@ public class FixedFirstDataAdapter extends AbstractLocalDataAdapterWrapper } @Override - public View getView(Context context, int dataID) { + public View getView(Activity activity, int dataID) { if (dataID == 0) { return mFirstData.getView( - context, mSuggestedWidth, mSuggestedHeight, null); + activity, mSuggestedWidth, mSuggestedHeight, null); } - return mAdapter.getView(context, dataID - 1); + return mAdapter.getView(activity, dataID - 1); } @Override diff --git a/src/com/android/camera/data/FixedLastDataAdapter.java b/src/com/android/camera/data/FixedLastDataAdapter.java index a0b78aa98..a7157de19 100644 --- a/src/com/android/camera/data/FixedLastDataAdapter.java +++ b/src/com/android/camera/data/FixedLastDataAdapter.java @@ -16,6 +16,7 @@ package com.android.camera.data; +import android.app.Activity; import android.content.Context; import android.net.Uri; import android.view.View; @@ -109,13 +110,13 @@ public class FixedLastDataAdapter extends AbstractLocalDataAdapterWrapper { } @Override - public View getView(Context context, int dataID) { + public View getView(Activity activity, int dataID) { int totalNumber = mAdapter.getTotalNumber(); if (dataID < totalNumber) { - return mAdapter.getView(context, dataID); + return mAdapter.getView(activity, dataID); } else if (dataID == totalNumber) { - return mLastData.getView(context, + return mLastData.getView(activity, mSuggestedWidth, mSuggestedHeight, null); } diff --git a/src/com/android/camera/data/LocalData.java b/src/com/android/camera/data/LocalData.java index 2db4ac577..844cc5548 100644 --- a/src/com/android/camera/data/LocalData.java +++ b/src/com/android/camera/data/LocalData.java @@ -16,10 +16,10 @@ package com.android.camera.data; +import android.app.Activity; import android.content.ContentResolver; import android.content.Context; import android.graphics.drawable.Drawable; -import android.net.Uri; import android.view.View; import com.android.camera.ui.FilmStripView; @@ -68,7 +68,7 @@ public interface LocalData extends FilmStripView.ImageData { */ public static final int LOCAL_360_PHOTO_SPHERE = 6; - View getView(Context c, int width, int height, Drawable placeHolder); + View getView(Activity a, int width, int height, Drawable placeHolder); /** * Gets the date when this data is created. The returned date is also used diff --git a/src/com/android/camera/data/LocalMediaData.java b/src/com/android/camera/data/LocalMediaData.java index 53c153c0c..8e5216d17 100644 --- a/src/com/android/camera/data/LocalMediaData.java +++ b/src/com/android/camera/data/LocalMediaData.java @@ -16,6 +16,7 @@ package com.android.camera.data; +import android.app.Activity; import android.content.ContentResolver; import android.content.Context; import android.database.Cursor; @@ -205,9 +206,9 @@ public abstract class LocalMediaData implements LocalData { } @Override - public View getView(Context ctx, + public View getView(Activity activity, int decodeWidth, int decodeHeight, Drawable placeHolder) { - return fillImageView(ctx, new ImageView(ctx), + return fillImageView(activity, new ImageView(activity), decodeWidth, decodeHeight, placeHolder); } @@ -680,18 +681,18 @@ public abstract class LocalMediaData implements LocalData { } @Override - public View getView(final Context ctx, + public View getView(final Activity activity, int decodeWidth, int decodeHeight, Drawable placeHolder) { // ImageView for the bitmap. - ImageView iv = new ImageView(ctx); + ImageView iv = new ImageView(activity); iv.setLayoutParams(new FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT, Gravity.CENTER)); - fillImageView(ctx, iv, decodeWidth, decodeHeight, placeHolder); + fillImageView(activity, iv, decodeWidth, decodeHeight, placeHolder); // ImageView for the play icon. - ImageView icon = new ImageView(ctx); + ImageView icon = new ImageView(activity); icon.setImageResource(R.drawable.ic_control_play); icon.setScaleType(ImageView.ScaleType.CENTER); icon.setLayoutParams(new FrameLayout.LayoutParams( @@ -700,11 +701,11 @@ public abstract class LocalMediaData implements LocalData { icon.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - CameraUtil.playVideo(ctx, getContentUri(), mTitle); + CameraUtil.playVideo(activity, getContentUri(), mTitle); } }); - FrameLayout f = new FrameLayout(ctx); + FrameLayout f = new FrameLayout(activity); f.addView(iv); f.addView(icon); return f; diff --git a/src/com/android/camera/data/SimpleViewData.java b/src/com/android/camera/data/SimpleViewData.java index a49d3eac8..3ff17226a 100644 --- a/src/com/android/camera/data/SimpleViewData.java +++ b/src/com/android/camera/data/SimpleViewData.java @@ -16,6 +16,7 @@ package com.android.camera.data; +import android.app.Activity; import android.content.ContentResolver; import android.content.Context; import android.graphics.drawable.Drawable; @@ -114,7 +115,7 @@ public class SimpleViewData implements LocalData { } @Override - public View getView(Context c, int width, int height, Drawable placeHolder) { + public View getView(Activity activity, int width, int height, Drawable placeHolder) { return mView; } diff --git a/src/com/android/camera/ui/FilmStripView.java b/src/com/android/camera/ui/FilmStripView.java index 607dacf07..17fbc7fb8 100644 --- a/src/com/android/camera/ui/FilmStripView.java +++ b/src/com/android/camera/ui/FilmStripView.java @@ -19,6 +19,7 @@ package com.android.camera.ui; import android.animation.Animator; import android.animation.TimeInterpolator; import android.animation.ValueAnimator; +import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Rect; @@ -255,12 +256,12 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { /** * Returns the view to visually present the image data. * - * @param context The {@link Context} to create the view. + * @param activity The {@link Activity} context to create the view. * @param dataID The ID of the image data to be presented. * @return The view representing the image data. Null if unavailable or * the {@code dataID} is out of range. */ - public View getView(Context context, int dataID); + public View getView(Activity activity, int dataID); /** * Returns the {@link ImageData} specified by the ID. diff --git a/src/com/android/camera/util/CameraUtil.java b/src/com/android/camera/util/CameraUtil.java index c5dc71af3..ca0109ab3 100644 --- a/src/com/android/camera/util/CameraUtil.java +++ b/src/com/android/camera/util/CameraUtil.java @@ -63,6 +63,7 @@ import android.view.animation.AlphaAnimation; import android.view.animation.Animation; import android.widget.Toast; +import com.android.camera.CameraActivity; import com.android.camera.CameraDisabledException; import com.android.camera.CameraHardwareException; import com.android.camera.CameraHolder; @@ -638,23 +639,6 @@ public class CameraUtil { return true; } - public static void viewUri(Uri uri, Context context) { - if (!isUriValid(uri, context.getContentResolver())) { - Log.e(TAG, "Uri invalid. uri=" + uri); - return; - } - - try { - context.startActivity(new Intent(CameraUtil.REVIEW_ACTION, uri)); - } catch (ActivityNotFoundException ex) { - try { - context.startActivity(new Intent(Intent.ACTION_VIEW, uri)); - } catch (ActivityNotFoundException e) { - Log.e(TAG, "review image fail. uri=" + uri, e); - } - } - } - public static void dumpRect(RectF rect, String msg) { Log.v(TAG, msg + "=(" + rect.left + "," + rect.top + "," + rect.right + "," + rect.bottom + ")"); @@ -826,15 +810,15 @@ public class CameraUtil { } } - public static void playVideo(Context context, Uri uri, String title) { + public static void playVideo(Activity activity, Uri uri, String title) { try { Intent intent = new Intent(Intent.ACTION_VIEW) .setDataAndType(uri, "video/*") .putExtra(Intent.EXTRA_TITLE, title) .putExtra(KEY_TREAT_UP_AS_BACK, true); - context.startActivity(intent); + activity.startActivityForResult(intent, CameraActivity.REQ_CODE_DONT_SWITCH_TO_PREVIEW); } catch (ActivityNotFoundException e) { - Toast.makeText(context, context.getString(R.string.video_err), + Toast.makeText(activity, activity.getString(R.string.video_err), Toast.LENGTH_SHORT).show(); } } @@ -843,10 +827,10 @@ public class CameraUtil { * Starts GMM with the given location shown. If this fails, and GMM could * not be found, we use a geo intent as a fallback. * - * @param context the Android context to use for starting the activities. + * @param activity the activity to use for launching the Maps intent. * @param latLong a 2-element array containing {latitude/longitude}. */ - public static void showOnMap(Context context, double[] latLong) { + public static void showOnMap(Activity activity, double[] latLong) { try { // We don't use "geo:latitude,longitude" because it only centers // the MapView to the specified location, but we need a marker @@ -858,13 +842,14 @@ public class CameraUtil { MAPS_CLASS_NAME); Intent mapsIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri)).setComponent(compName); - context.startActivity(mapsIntent); + activity.startActivityForResult(mapsIntent, + CameraActivity.REQ_CODE_DONT_SWITCH_TO_PREVIEW); } catch (ActivityNotFoundException e) { // Use the "geo intent" if no GMM is installed Log.e(TAG, "GMM activity not found!", e); String url = String.format(Locale.ENGLISH, "geo:%f,%f", latLong[0], latLong[1]); Intent mapsIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); - context.startActivity(mapsIntent); + activity.startActivity(mapsIntent); } } } -- cgit v1.2.3