diff options
author | Angus Kong <shkong@google.com> | 2011-09-12 09:23:27 +0800 |
---|---|---|
committer | Angus Kong <shkong@google.com> | 2011-09-13 08:35:41 +0800 |
commit | 215f7ecf1fcc861986397fdf6724602d4775ab2c (patch) | |
tree | bf2c7bc0be619941266ec75e71e25ace98ed8077 | |
parent | c3e797c34a6d3ba04caab6b0afbaecf7027e0bae (diff) | |
download | LegacyCamera-215f7ecf1fcc861986397fdf6724602d4775ab2c.zip LegacyCamera-215f7ecf1fcc861986397fdf6724602d4775ab2c.tar.gz LegacyCamera-215f7ecf1fcc861986397fdf6724602d4775ab2c.tar.bz2 |
Saving panorama starts automatically.
1. Saving process starts right after low-res result is generated.
2. Progress bar for panning stops updating after capturing.
3. Fixed the issue that progress bar for panning will show a indicator on the left side first when
there should be nothing shown on the screen.
Change-Id: I68a60b01035939d92bebe5ee59d63a27dfccc3c6
-rw-r--r-- | res/layout/pano_capture.xml | 44 | ||||
-rw-r--r-- | res/layout/pano_review.xml | 35 | ||||
-rw-r--r-- | res/values-w1024dp/dimens.xml | 2 | ||||
-rw-r--r-- | res/values/dimens.xml | 2 | ||||
-rw-r--r-- | res/values/strings.xml | 8 | ||||
-rw-r--r-- | src/com/android/camera/panorama/PanoProgressBar.java | 11 | ||||
-rw-r--r-- | src/com/android/camera/panorama/PanoramaActivity.java | 104 |
7 files changed, 100 insertions, 106 deletions
diff --git a/res/layout/pano_capture.xml b/res/layout/pano_capture.xml index 23e20e1..00af551 100644 --- a/res/layout/pano_capture.xml +++ b/res/layout/pano_capture.xml @@ -14,20 +14,20 @@ limitations under the License. --> -<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/pano_capture_layout" android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="match_parent" + android:orientation="horizontal"> - <LinearLayout - android:layout_width="match_parent" + <RelativeLayout + android:layout_width="0dp" android:layout_height="match_parent" - android:orientation="horizontal"> + android:layout_weight="1"> <LinearLayout android:id="@+id/pano_capture_preview" - android:layout_width="0dp" + android:layout_width="match_parent" android:layout_height="match_parent" - android:layout_weight="1" android:orientation="vertical"> <ImageView style="@style/PanoViewHorizontalGrayBar"/> @@ -38,27 +38,29 @@ android:layout_width="match_parent" android:layout_height="@dimen/pano_mosaic_surface_height" /> - <RelativeLayout style="@style/PanoViewHorizontalGrayBar"> + <FrameLayout + style="@style/PanoViewHorizontalGrayBar"> <com.android.camera.panorama.PanoProgressBar - android:id="@+id/pano_capture_view" + android:id="@+id/pano_pan_progress_bar" android:visibility="gone" android:src="@drawable/ic_pan_progression" - android:layout_centerInParent="true" + android:layout_gravity="center" android:layout_width="wrap_content" android:layout_height="wrap_content" /> - </RelativeLayout> + </FrameLayout> </LinearLayout> - <include layout="@layout/camera_control" /> - </LinearLayout> + <!-- The hint for "Too fast" text view--> + <TextView android:id="@+id/pano_capture_too_fast_textview" + android:text="@string/pano_too_fast_prompt" + android:textAppearance="?android:textAppearanceMedium" + android:layout_height="@dimen/pano_capture_too_fast_text_height" + android:layout_width="wrap_content" + android:visibility="gone" + android:layout_centerInParent="true" /> + </RelativeLayout> - <TextView android:id="@+id/pano_capture_too_fast_textview" - android:text="@string/pano_too_fast_prompt" - android:textAppearance="?android:textAppearanceMedium" - android:layout_height="@dimen/pano_capture_too_fast_text_height" - android:layout_width="wrap_content" - android:visibility="gone" - android:layout_centerInParent="true" /> + <include layout="@layout/camera_control" /> -</RelativeLayout> +</LinearLayout> diff --git a/res/layout/pano_review.xml b/res/layout/pano_review.xml index 0478580..51ae880 100644 --- a/res/layout/pano_review.xml +++ b/res/layout/pano_review.xml @@ -21,14 +21,6 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - <View style="@style/PanoViewHorizontalGrayBar"/> - - <ImageView android:id="@+id/pano_reviewarea" - android:scaleType="fitCenter" - android:layout_width="match_parent" - android:layout_height="0dp" - android:layout_weight="1" /> - <LinearLayout android:id="@+id/pano_review_control" style="@style/PanoViewHorizontalGrayBar" android:gravity="right" @@ -36,19 +28,26 @@ android:layout_alignParentBottom="true" android:layout_width="match_parent"> - <Button android:id="@+id/pano_review_retake_button" - android:text="@string/review_retake" - android:onClick="onRetakeButtonClicked" + <Button android:id="@+id/pano_review_cancel_button" + android:text="@string/review_cancel" + android:onClick="onCancelButtonClicked" android:textAppearance="?android:textAppearanceMedium" android:minWidth="@dimen/pano_review_button_width" android:layout_width="wrap_content" android:layout_height="@dimen/pano_review_button_height" /> - <Button android:id="@+id/pano_review_ok_button" - android:text="@string/review_ok" - android:textAppearance="?android:textAppearanceMedium" - android:onClick="onOkButtonClicked" - android:minWidth="@dimen/pano_review_button_width" - android:layout_width="wrap_content" - android:layout_height="@dimen/pano_review_button_height" /> </LinearLayout> + + <ImageView android:id="@+id/pano_reviewarea" + android:scaleType="fitCenter" + android:layout_width="match_parent" + android:layout_height="@dimen/pano_mosaic_surface_height" /> + + <RelativeLayout style="@style/PanoViewHorizontalGrayBar"> + <com.android.camera.panorama.PanoProgressBar + android:id="@+id/pano_saving_progress_bar" + android:src="@drawable/ic_pan_progression" + android:layout_centerInParent="true" + android:layout_width="wrap_content" + android:layout_height="wrap_content" /> + </RelativeLayout> </LinearLayout> diff --git a/res/values-w1024dp/dimens.xml b/res/values-w1024dp/dimens.xml index 46e8054..d175809 100644 --- a/res/values-w1024dp/dimens.xml +++ b/res/values-w1024dp/dimens.xml @@ -30,7 +30,7 @@ <dimen name="pano_control_start_button_size">180dp</dimen> <dimen name="pano_mosaic_surface_height">480dp</dimen> <dimen name="pano_review_button_width">180dp</dimen> - <dimen name="pano_review_button_height">180dp</dimen> + <dimen name="pano_review_button_height">120dp</dimen> <dimen name="pano_capture_too_fast_text_height">160dp</dimen> <dimen name="pano_indication_width">300dp</dimen> <dimen name="pano_indication_height">150dp</dimen> diff --git a/res/values/dimens.xml b/res/values/dimens.xml index 66a374a..91920ae 100644 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -26,7 +26,7 @@ <dimen name="pano_control_start_button_size">70dp</dimen> <dimen name="pano_mosaic_surface_height">240dp</dimen> <dimen name="pano_review_button_width">70dp</dimen> - <dimen name="pano_review_button_height">70dp</dimen> + <dimen name="pano_review_button_height">45dp</dimen> <dimen name="pano_capture_too_fast_text_height">70dp</dimen> <dimen name="pano_indication_width">150dp</dimen> <dimen name="pano_indication_height">75dp</dimen> diff --git a/res/values/strings.xml b/res/values/strings.xml index 268e519..90e87c1 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -67,7 +67,7 @@ <!-- button in review mode indicating that the video just taken should be played [CHAR LIMIT=10] --> <string name="review_play">Play</string> - <!-- button in review mode indicating that the photo taking/video recording session should be canceled [CHAR LIMIT=10] --> + <!-- button in review mode indicating that the photo taking, video recording, and panorama saving session should be canceled [CHAR LIMIT=10] --> <string name="review_cancel">CANCEL</string> <!-- button in review mode indicating that the taken photo/video is OK to be attached/uploaded [CHAR LIMIT=10] --> @@ -265,18 +265,12 @@ <!-- Toast saying that there is no video to share. [CHAR LIMIT=30] --> <string name="no_video_to_share">No video to share</string> - <!-- The text shown on the button for stopping panorama capturing [CHAR LIMIT=7] --> - <string name="pano_capture_stop">Stop</string> - <!-- The text shown when the panorama panning speed is to fast [CHAR LIMIT=12] --> <string name="pano_too_fast_prompt">Too Fast</string> <!-- The text shown in the progress dialog when panorama preview is generating in the background [CHAR LIMIT=30] --> <string name="pano_dialog_prepare_preview">Preparing panorama</string> - <!-- The text shown in the progress dialog when generating the final panorama result in the background [CHAR LIMIT=30] --> - <string name="pano_dialog_generate_panorama">Generating panorama...</string> - <!-- The text shown in the dialog when panorama saving failed [CHAR LIMIT=40] --> <string name="pano_dialog_panorama_failed">Failed to save panorama</string> diff --git a/src/com/android/camera/panorama/PanoProgressBar.java b/src/com/android/camera/panorama/PanoProgressBar.java index 19a05f2..55553b8 100644 --- a/src/com/android/camera/panorama/PanoProgressBar.java +++ b/src/com/android/camera/panorama/PanoProgressBar.java @@ -94,19 +94,22 @@ class PanoProgressBar extends ImageView { mRightMostProgress = mWidth; mProgressOffset = mWidth; } + invalidate(); } public void setProgress(int progress) { + if (!isEnabled()) return; // The panning direction will be decided after user pan more than 10 degrees in one // direction. if (mDirection == DIRECTION_NONE) { if (progress > 10) { setRightIncreasing(true); - } - if (progress < -10) { + } else if (progress < -10) { setRightIncreasing(false); } - } else { + } + // mDirection might be modified by setRightIncreasing() above. Need to check again. + if (mDirection != DIRECTION_NONE) { mProgress = progress * mWidth / mMaxProgress + mProgressOffset; // value bounds. mProgress = Math.min(mWidth, Math.max(0, mProgress)); @@ -118,6 +121,7 @@ class PanoProgressBar extends ImageView { // The left most progress is adjusted. mLeftMostProgress = Math.min(mLeftMostProgress, mProgress); } + invalidate(); } } @@ -125,6 +129,7 @@ class PanoProgressBar extends ImageView { mProgress = 0; mProgressOffset = 0; mDirection = DIRECTION_NONE; + invalidate(); } @Override diff --git a/src/com/android/camera/panorama/PanoramaActivity.java b/src/com/android/camera/panorama/PanoramaActivity.java index 8b6241b..5068d3e 100644 --- a/src/com/android/camera/panorama/PanoramaActivity.java +++ b/src/com/android/camera/panorama/PanoramaActivity.java @@ -109,14 +109,15 @@ public class PanoramaActivity extends Activity implements private View mReviewLayout; private ImageView mReview; private PanoProgressBar mPanoProgressBar; + private PanoProgressBar mSavingProgressBar; private MosaicRendererSurfaceView mMosaicView; private TextView mTooFastPrompt; private ShutterButton mShutterButton; + private Object mWaitObject = new Object(); - private ProgressDialog mProgressDialog; private String mPreparePreviewString; - private String mGeneratePanoramaString; private AlertDialog mAlertDialog; + private ProgressDialog mProgressDialog; private String mDialogTitle; private String mDialogOk; @@ -221,8 +222,6 @@ public class PanoramaActivity extends Activity implements mPreparePreviewString = getResources().getString(R.string.pano_dialog_prepare_preview); - mGeneratePanoramaString = - getResources().getString(R.string.pano_dialog_generate_panorama); mDialogTitle = getResources().getString(R.string.pano_dialog_title); mDialogOk = getResources().getString(R.string.dialog_ok); @@ -233,6 +232,7 @@ public class PanoramaActivity extends Activity implements case MSG_LOW_RES_FINAL_MOSAIC_READY: onBackgroundThreadFinished(); showFinalMosaic((Bitmap) msg.obj); + saveHighResMosaic(); break; case MSG_RESET_TO_PREVIEW_WITH_THUMBNAIL: onBackgroundThreadFinished(); @@ -495,12 +495,13 @@ public class PanoramaActivity extends Activity implements mPanoProgressBar.setIndicatorWidth(20); mPanoProgressBar.setMaxProgress(DEFAULT_SWEEP_ANGLE); mPanoProgressBar.setVisibility(View.VISIBLE); - mMosaicView.setVisibility(View.VISIBLE); + mPanoProgressBar.setEnabled(true); } private void stopCapture() { mCaptureState = CAPTURE_STATE_VIEWFINDER; mTooFastPrompt.setVisibility(View.GONE); + mPanoProgressBar.setEnabled(false); mMosaicFrameProcessor.setProgressListener(null); stopCameraPreview(); @@ -508,7 +509,8 @@ public class PanoramaActivity extends Activity implements mSurfaceTexture.setOnFrameAvailableListener(null); if (!mThreadRunning) { - runBackgroundThreadAndShowDialog(mPreparePreviewString, false, new Thread() { + showDialog(mPreparePreviewString); + runBackgroundThread(new Thread() { @Override public void run() { MosaicJpeg jpeg = generateFinalMosaic(false); @@ -524,7 +526,6 @@ public class PanoramaActivity extends Activity implements } } }); - reportProgress(false); } mThumbnailViewAndModePickerIn.start(); } @@ -554,19 +555,25 @@ public class PanoramaActivity extends Activity implements Resources appRes = getResources(); mCaptureLayout = (View) findViewById(R.id.pano_capture_layout); - mPanoProgressBar = (PanoProgressBar) findViewById(R.id.pano_capture_view); + mPanoProgressBar = (PanoProgressBar) findViewById(R.id.pano_pan_progress_bar); mPanoProgressBar.setBackgroundColor(appRes.getColor(R.color.pano_progress_empty)); mPanoProgressBar.setDoneColor(appRes.getColor(R.color.pano_progress_done)); mPanoProgressBar.setIndicatorColor(appRes.getColor(R.color.pano_progress_indication)); + mPanoProgressBar.setEnabled(false); mTooFastPrompt = (TextView) findViewById(R.id.pano_capture_too_fast_textview); + mSavingProgressBar = (PanoProgressBar) findViewById(R.id.pano_saving_progress_bar); + mSavingProgressBar.setIndicatorWidth(0); + mSavingProgressBar.setMaxProgress(100); + mSavingProgressBar.setBackgroundColor(appRes.getColor(R.color.pano_progress_empty)); + mSavingProgressBar.setDoneColor(appRes.getColor(R.color.pano_progress_indication)); + mThumbnailView = (RotateImageView) findViewById(R.id.thumbnail); mReviewLayout = (View) findViewById(R.id.pano_review_layout); mReview = (ImageView) findViewById(R.id.pano_reviewarea); mMosaicView = (MosaicRendererSurfaceView) findViewById(R.id.pano_renderer); mMosaicView.getRenderer().setMosaicSurfaceCreateListener(this); - mMosaicView.setVisibility(View.VISIBLE); mModePicker = (ModePicker) findViewById(R.id.mode_picker); mModePicker.setVisibility(View.VISIBLE); @@ -600,39 +607,39 @@ public class PanoramaActivity extends Activity implements public void onShutterButtonFocus(ShutterButton b, boolean pressed) { } - public void reportProgress(final boolean highRes) { + public void reportProgress() { + mSavingProgressBar.reset(); + mSavingProgressBar.setRightIncreasing(true); + mSavingProgressBar.setEnabled(true); Thread t = new Thread() { @Override public void run() { while (mThreadRunning) { final int progress = mMosaicFrameProcessor.reportProgress( - highRes, mCancelComputation); + true, mCancelComputation); try { - Thread.sleep(50); - } catch (Exception e) { + synchronized (mWaitObject) { + mWaitObject.wait(50); + } + } catch (InterruptedException e) { throw new RuntimeException("Panorama reportProgress failed", e); } // Update the progress bar runOnUiThread(new Runnable() { public void run() { - // Check if mProgressDialog is null because the background thread - // finished. - if (mProgressDialog != null) { - mProgressDialog.setProgress(progress); - } + mSavingProgressBar.setProgress(progress); } }); } + mSavingProgressBar.setEnabled(false); } }; t.start(); } - @OnClickAttr - public void onOkButtonClicked(View v) { - if (mPausing || mThreadRunning || mSurfaceTexture == null) return; - runBackgroundThreadAndShowDialog(mGeneratePanoramaString, true, new Thread() { + public void saveHighResMosaic() { + runBackgroundThread(new Thread() { @Override public void run() { MosaicJpeg jpeg = generateFinalMosaic(true); @@ -658,47 +665,35 @@ public class PanoramaActivity extends Activity implements } } }); - reportProgress(true); + reportProgress(); + } + + private void showDialog(String str) { + mProgressDialog = new ProgressDialog(this); + mProgressDialog.setMessage(str); + mProgressDialog.show(); } - /** - * If the style is horizontal one, the maximum progress is assumed to be 100. - */ - private void runBackgroundThreadAndShowDialog( - String str, boolean showPercentageProgress, Thread thread) { + private void runBackgroundThread(Thread thread) { mThreadRunning = true; - mProgressDialog = new ProgressDialog(this); - mProgressDialog.setMessage(str); - mProgressDialog.setCancelable(false); // Don't allow back key to dismiss this dialog. - if (showPercentageProgress) { - mProgressDialog.setMax(100); - mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); - // TODO: update the UI according to specs. - - mProgressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, - int whichButton) { - mCancelComputation = true; - } - }); - } else { - mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); - } - mProgressDialog.show(); thread.start(); } private void onBackgroundThreadFinished() { mThreadRunning = false; - mProgressDialog.dismiss(); - mProgressDialog = null; + if (mProgressDialog != null ) { + mProgressDialog.dismiss(); + mProgressDialog = null; + } } @OnClickAttr - public void onRetakeButtonClicked(View v) { - if (mPausing || mThreadRunning || mSurfaceTexture == null) return; - resetToPreview(); + public void onCancelButtonClicked(View v) { + if (mPausing || mSurfaceTexture == null) return; + mCancelComputation = true; + synchronized (mWaitObject) { + mWaitObject.notify(); + } } @OnClickAttr @@ -731,8 +726,6 @@ public class PanoramaActivity extends Activity implements mSurfaceTexture.setOnFrameAvailableListener(this); if (!mPausing) startCameraPreview(); - - mMosaicView.setVisibility(View.VISIBLE); } private void showFinalMosaic(Bitmap bitmap) { @@ -775,8 +768,8 @@ public class PanoramaActivity extends Activity implements releaseCamera(); mPausing = true; mMosaicView.onPause(); - mSensorManager.unregisterListener(mListener); clearMosaicFrameProcessorIfNeeded(); + mSensorManager.unregisterListener(mListener); mOrientationEventListener.disable(); System.gc(); } @@ -795,6 +788,7 @@ public class PanoramaActivity extends Activity implements * resources. */ mSensorManager.registerListener(mListener, mSensor, SensorManager.SENSOR_DELAY_UI); + mCaptureState = CAPTURE_STATE_VIEWFINDER; setupCamera(); if (mSurfaceTexture != null) { |