summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAngus Kong <shkong@google.com>2011-09-12 09:23:27 +0800
committerAngus Kong <shkong@google.com>2011-09-13 08:35:41 +0800
commit215f7ecf1fcc861986397fdf6724602d4775ab2c (patch)
treebf2c7bc0be619941266ec75e71e25ace98ed8077
parentc3e797c34a6d3ba04caab6b0afbaecf7027e0bae (diff)
downloadLegacyCamera-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.xml44
-rw-r--r--res/layout/pano_review.xml35
-rw-r--r--res/values-w1024dp/dimens.xml2
-rw-r--r--res/values/dimens.xml2
-rw-r--r--res/values/strings.xml8
-rw-r--r--src/com/android/camera/panorama/PanoProgressBar.java11
-rw-r--r--src/com/android/camera/panorama/PanoramaActivity.java104
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) {