summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAngus Kong <shkong@google.com>2011-08-22 12:27:21 +0800
committerAngus Kong <shkong@google.com>2011-08-25 11:37:03 +0800
commita907c122ccec649c6cedf3a45b1c426a5fca932e (patch)
treea9ee81ace05282d5e5661404085becd3e3393190
parent50b3c890986aadb3780b4da8c0b8dbb0f1422eba (diff)
downloadLegacyCamera-a907c122ccec649c6cedf3a45b1c426a5fca932e.zip
LegacyCamera-a907c122ccec649c6cedf3a45b1c426a5fca932e.tar.gz
LegacyCamera-a907c122ccec649c6cedf3a45b1c426a5fca932e.tar.bz2
Add thumbnail and share popup for the last result.
bug:5141665 Change-Id: Idc44d33d09c8d4a30fdcef66de2d6754daf1ea82
-rw-r--r--proguard.flags2
-rw-r--r--res/layout-w1024dp/preview_frame_video.xml1
-rw-r--r--res/layout-w1024dp/review_control.xml3
-rw-r--r--res/layout-w1024dp/review_thumbnail.xml29
-rw-r--r--res/layout/attach_camera_control.xml4
-rw-r--r--res/layout/review_thumbnail.xml7
-rw-r--r--res/values-w1024dp/dimens.xml2
-rw-r--r--res/values-w1024dp/styles.xml8
-rw-r--r--res/values/styles.xml6
-rw-r--r--src/com/android/camera/Camera.java47
-rw-r--r--src/com/android/camera/Exif.java2
-rw-r--r--src/com/android/camera/OnClickAttr.java (renamed from src/com/android/camera/panorama/OnClickAttr.java)2
-rw-r--r--src/com/android/camera/Thumbnail.java2
-rw-r--r--src/com/android/camera/VideoCamera.java57
-rw-r--r--src/com/android/camera/panorama/PanoramaActivity.java59
15 files changed, 130 insertions, 101 deletions
diff --git a/proguard.flags b/proguard.flags
index a3dc864..39948cc 100644
--- a/proguard.flags
+++ b/proguard.flags
@@ -13,5 +13,5 @@
}
-keep class * extends android.app.Activity {
- @com.android.camera.panorama.OnClickAttr <methods>;
+ @com.android.camera.OnClickAttr <methods>;
}
diff --git a/res/layout-w1024dp/preview_frame_video.xml b/res/layout-w1024dp/preview_frame_video.xml
index c860642..039a76d 100644
--- a/res/layout-w1024dp/preview_frame_video.xml
+++ b/res/layout-w1024dp/preview_frame_video.xml
@@ -50,6 +50,7 @@
android:visibility="gone">
<ImageView style="@style/ReviewControlIcon"
android:id="@+id/btn_play"
+ android:onClick="onPlayButtonClicked"
android:paddingTop="10dp"
android:paddingBottom="10dp"
android:src="@drawable/btn_ic_review_play"/>
diff --git a/res/layout-w1024dp/review_control.xml b/res/layout-w1024dp/review_control.xml
index 63415d3..659670f 100644
--- a/res/layout-w1024dp/review_control.xml
+++ b/res/layout-w1024dp/review_control.xml
@@ -28,6 +28,7 @@
android:visibility="gone">
<Button android:id="@+id/btn_done"
style="@style/ReviewControlIcon"
+ android:onClick="onDoneButtonClicked"
android:drawableLeft="@drawable/ic_menu_done_holo_light"
android:text="@string/review_ok"/>
<ImageView
@@ -41,6 +42,7 @@
style="@style/ReviewControlIcon"
android:scaleType="center"
android:clickable="true"
+ android:onClick="onRetakeButtonClicked"
android:drawableLeft="@drawable/ic_switch_camera_holo_dark"/>
<ImageView
android:layout_width="wrap_content"
@@ -49,6 +51,7 @@
</LinearLayout>
<LinearLayout style="@style/ReviewControlGroup">
<Button android:id="@+id/btn_cancel"
+ android:onClick="onCancelButtonClicked"
style="@style/ReviewControlIcon"
android:drawableLeft="@drawable/ic_menu_cancel_holo_light"
android:text="@string/review_cancel"/>
diff --git a/res/layout-w1024dp/review_thumbnail.xml b/res/layout-w1024dp/review_thumbnail.xml
deleted file mode 100644
index d206997..0000000
--- a/res/layout-w1024dp/review_thumbnail.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 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.
--->
-
-<com.android.camera.ui.RotateImageView xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/thumbnail"
- android:layout_width="86dp"
- android:layout_height="86dp"
- android:layout_alignParentTop="true"
- android:layout_alignParentRight="true"
- android:layout_marginTop="@dimen/thumbnail_margin_top"
- android:layout_marginRight="@dimen/thumbnail_margin_right"
- android:orientation="horizontal"
- android:clickable="true"
- android:focusable="false"
- android:background="@drawable/border_last_picture">
-</com.android.camera.ui.RotateImageView> \ No newline at end of file
diff --git a/res/layout/attach_camera_control.xml b/res/layout/attach_camera_control.xml
index 10fa6f7..f97b908 100644
--- a/res/layout/attach_camera_control.xml
+++ b/res/layout/attach_camera_control.xml
@@ -34,6 +34,7 @@
android:layout_marginBottom="15dp">
<ImageView style="@style/ReviewControlIcon"
android:id="@+id/btn_cancel"
+ android:onClick="onCancelButtonClicked"
android:src="@drawable/btn_ic_review_cancel"/>
<TextView style="@style/ReviewControlText"
android:text="@string/review_cancel" />
@@ -43,6 +44,7 @@
android:layout_marginBottom="15dp">
<ImageView style="@style/ReviewControlIcon"
android:id="@+id/btn_retake"
+ android:onClick="onRetakeButtonClicked"
android:src="@drawable/btn_ic_review_retake_photo"/>
<TextView style="@style/ReviewControlText"
android:text="@string/review_retake" />
@@ -52,6 +54,7 @@
android:layout_marginBottom="15dp">
<ImageView style="@style/ReviewControlIcon"
android:id="@+id/btn_play"
+ android:onClick="onPlayButtonClicked"
android:src="@drawable/btn_ic_review_play"/>
<TextView style="@style/ReviewControlText"
android:text="@string/review_play" />
@@ -71,6 +74,7 @@
android:layout_centerHorizontal="true">
<ImageView style="@style/ReviewControlIcon"
android:id="@+id/btn_done"
+ android:onClick="onDoneButtonClicked"
android:src="@drawable/btn_ic_review_done"/>
<TextView style="@style/ReviewControlText"
android:text="@string/review_ok" />
diff --git a/res/layout/review_thumbnail.xml b/res/layout/review_thumbnail.xml
index 0593307..08cf276 100644
--- a/res/layout/review_thumbnail.xml
+++ b/res/layout/review_thumbnail.xml
@@ -16,11 +16,8 @@
<com.android.camera.ui.RotateImageView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/thumbnail"
- android:layout_width="52dp"
- android:layout_height="52dp"
- android:layout_alignParentTop="true"
- android:layout_centerHorizontal="true"
- android:orientation="vertical"
+ style="@style/ReviewThumbnail"
+ android:onClick="onThumbnailClicked"
android:clickable="true"
android:focusable="false"
android:background="@drawable/border_last_picture">
diff --git a/res/values-w1024dp/dimens.xml b/res/values-w1024dp/dimens.xml
index e16173e..dcf61f3 100644
--- a/res/values-w1024dp/dimens.xml
+++ b/res/values-w1024dp/dimens.xml
@@ -18,8 +18,6 @@
*/
-->
<resources>
- <dimen name="thumbnail_margin_top">8dp</dimen>
- <dimen name="thumbnail_margin_right">28dp</dimen>
<dimen name="mode_switcher_margin_right">5dp</dimen>
<dimen name="mode_switcher_margin_bottom">21dp</dimen>
<dimen name="mode_switcher_inner_margin">10dp</dimen>
diff --git a/res/values-w1024dp/styles.xml b/res/values-w1024dp/styles.xml
index f75819b..b7e0055 100644
--- a/res/values-w1024dp/styles.xml
+++ b/res/values-w1024dp/styles.xml
@@ -33,4 +33,12 @@
<item name="android:paddingRight">15dp</item>
<item name="android:background">@drawable/btn_review_control</item>
</style>
+ <style name="ReviewThumbnail">
+ <item name="android:layout_width">86dp</item>
+ <item name="android:layout_height">86dp</item>
+ <item name="android:layout_alignParentTop">true</item>
+ <item name="android:layout_alignParentRight">true</item>
+ <item name="android:layout_marginTop">8dp</item>
+ <item name="android:layout_marginRight">28dp</item>
+ </style>
</resources>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index fdb09dd..f1dafcb 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -125,4 +125,10 @@
<item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">@dimen/pano_gray_bar_height</item>
</style>
+ <style name="ReviewThumbnail">
+ <item name="android:layout_width">52dp</item>
+ <item name="android:layout_height">52dp</item>
+ <item name="android:layout_alignParentTop">true</item>
+ <item name="android:layout_centerHorizontal">true</item>
+ </style>
</resources>
diff --git a/src/com/android/camera/Camera.java b/src/com/android/camera/Camera.java
index 1270367..6d77b2a 100644
--- a/src/com/android/camera/Camera.java
+++ b/src/com/android/camera/Camera.java
@@ -90,11 +90,10 @@ import java.util.Formatter;
import java.util.List;
/** The Camera activity which can preview and take pictures. */
-public class Camera extends ActivityBase implements View.OnClickListener,
+public class Camera extends ActivityBase implements FocusManager.Listener,
View.OnTouchListener, ShutterButton.OnShutterButtonListener,
SurfaceHolder.Callback, ModePicker.OnModeChangeListener,
- FaceDetectionListener, CameraPreference.OnPreferenceChangedListener,
- FocusManager.Listener {
+ FaceDetectionListener, CameraPreference.OnPreferenceChangedListener {
private static final String TAG = "camera";
@@ -419,7 +418,6 @@ public class Camera extends ActivityBase implements View.OnClickListener,
}
private void initThumbnailButton() {
- mThumbnailView.setOnClickListener(this);
// Load the thumbnail from the disk.
mThumbnail = Thumbnail.loadFrom(new File(getFilesDir(), LAST_THUMB_FILENAME));
updateThumbnailButton();
@@ -1038,9 +1036,6 @@ public class Camera extends ActivityBase implements View.OnClickListener,
setupCaptureParams();
findViewById(R.id.review_control).setVisibility(View.VISIBLE);
- findViewById(R.id.btn_cancel).setOnClickListener(this);
- findViewById(R.id.btn_retake).setOnClickListener(this);
- findViewById(R.id.btn_done).setOnClickListener(this);
} else {
mModePicker = (ModePicker) findViewById(R.id.mode_picker);
mModePicker.setVisibility(View.VISIBLE);
@@ -1201,27 +1196,29 @@ public class Camera extends ActivityBase implements View.OnClickListener,
updateStorageHint();
}
- @Override
- public void onClick(View v) {
- switch (v.getId()) {
- case R.id.thumbnail:
- if (isCameraIdle() && mThumbnail != null) {
- showSharePopup();
- }
- break;
- case R.id.btn_retake:
- hidePostCaptureAlert();
- startPreview();
- break;
- case R.id.btn_done:
- doAttach();
- break;
- case R.id.btn_cancel:
- doCancel();
- break;
+ @OnClickAttr
+ public void onThumbnailClicked(View v) {
+ if (isCameraIdle() && mThumbnail != null) {
+ showSharePopup();
}
}
+ @OnClickAttr
+ public void onRetakeButtonClicked(View v) {
+ hidePostCaptureAlert();
+ startPreview();
+ }
+
+ @OnClickAttr
+ public void onDoneButtonClicked(View v) {
+ doAttach();
+ }
+
+ @OnClickAttr
+ public void onCancelButtonClicked(View v) {
+ doCancel();
+ }
+
private void doAttach() {
if (mPausing) {
return;
diff --git a/src/com/android/camera/Exif.java b/src/com/android/camera/Exif.java
index d1df3e3..8dc9111 100644
--- a/src/com/android/camera/Exif.java
+++ b/src/com/android/camera/Exif.java
@@ -18,7 +18,7 @@ package com.android.camera;
import android.util.Log;
-class Exif {
+public class Exif {
private static final String TAG = "CameraExif";
public static int getOrientation(byte[] jpeg) {
diff --git a/src/com/android/camera/panorama/OnClickAttr.java b/src/com/android/camera/OnClickAttr.java
index bfc7c4e..07a1063 100644
--- a/src/com/android/camera/panorama/OnClickAttr.java
+++ b/src/com/android/camera/OnClickAttr.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.camera.panorama;
+package com.android.camera;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
diff --git a/src/com/android/camera/Thumbnail.java b/src/com/android/camera/Thumbnail.java
index d40382b..83cc0a4 100644
--- a/src/com/android/camera/Thumbnail.java
+++ b/src/com/android/camera/Thumbnail.java
@@ -40,7 +40,7 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.IllegalArgumentException;
-class Thumbnail {
+public class Thumbnail {
private static final String TAG = "Thumbnail";
private static final int BUFSIZE = 4096;
diff --git a/src/com/android/camera/VideoCamera.java b/src/com/android/camera/VideoCamera.java
index cec06c7..0af15be 100644
--- a/src/com/android/camera/VideoCamera.java
+++ b/src/com/android/camera/VideoCamera.java
@@ -81,10 +81,10 @@ import java.util.List;
* The Camcorder activity.
*/
public class VideoCamera extends ActivityBase
- implements View.OnClickListener,
+ implements CameraPreference.OnPreferenceChangedListener,
ShutterButton.OnShutterButtonListener, SurfaceHolder.Callback,
MediaRecorder.OnErrorListener, MediaRecorder.OnInfoListener,
- ModePicker.OnModeChangeListener, CameraPreference.OnPreferenceChangedListener {
+ ModePicker.OnModeChangeListener {
private static final String TAG = "videocamera";
@@ -378,11 +378,7 @@ public class VideoCamera extends ActivityBase
mReviewControl = findViewById(R.id.review_control);
mReviewControl.setVisibility(View.VISIBLE);
- findViewById(R.id.btn_cancel).setOnClickListener(this);
- findViewById(R.id.btn_done).setOnClickListener(this);
- findViewById(R.id.btn_play).setOnClickListener(this);
View retake = findViewById(R.id.btn_retake);
- retake.setOnClickListener(this);
if (retake instanceof ImageView) {
((ImageView) retake).setImageResource(R.drawable.btn_ic_review_retake_video);
} else {
@@ -539,31 +535,35 @@ public class VideoCamera extends ActivityBase
}
}
- @Override
- public void onClick(View v) {
- switch (v.getId()) {
- case R.id.thumbnail:
- if (!mMediaRecorderRecording && mThumbnail != null) {
- showSharePopup();
- }
- break;
- case R.id.btn_retake:
- deleteCurrentVideo();
- hideAlert();
- break;
- case R.id.btn_play:
- startPlayVideoActivity();
- break;
- case R.id.btn_done:
- doReturnToCaller(true);
- break;
- case R.id.btn_cancel:
- stopVideoRecording();
- doReturnToCaller(false);
- break;
+ @OnClickAttr
+ public void onThumbnailClicked(View v) {
+ if (!mMediaRecorderRecording && mThumbnail != null) {
+ showSharePopup();
}
}
+ @OnClickAttr
+ public void onRetakeButtonClicked(View v) {
+ deleteCurrentVideo();
+ hideAlert();
+ }
+
+ @OnClickAttr
+ public void onPlayButtonClicked(View v) {
+ startPlayVideoActivity();
+ }
+
+ @OnClickAttr
+ public void onDoneButtonClicked(View v) {
+ doReturnToCaller(true);
+ }
+
+ @OnClickAttr
+ public void onCancelButtonClicked(View v) {
+ stopVideoRecording();
+ doReturnToCaller(false);
+ }
+
public void onShutterButtonFocus(ShutterButton button, boolean pressed) {
// Do nothing (everything happens in onShutterButtonClick).
}
@@ -1528,7 +1528,6 @@ public class VideoCamera extends ActivityBase
private void initThumbnailButton() {
mThumbnailView = (RotateImageView) findViewById(R.id.thumbnail);
- mThumbnailView.setOnClickListener(this);
// Load the thumbnail from the disk.
mThumbnail = Thumbnail.loadFrom(new File(getFilesDir(), LAST_THUMB_FILENAME));
}
diff --git a/src/com/android/camera/panorama/PanoramaActivity.java b/src/com/android/camera/panorama/PanoramaActivity.java
index 4edccd9..c33c3e4 100644
--- a/src/com/android/camera/panorama/PanoramaActivity.java
+++ b/src/com/android/camera/panorama/PanoramaActivity.java
@@ -19,11 +19,16 @@ package com.android.camera.panorama;
import com.android.camera.CameraDisabledException;
import com.android.camera.CameraHardwareException;
import com.android.camera.CameraHolder;
+import com.android.camera.Exif;
import com.android.camera.MenuHelper;
import com.android.camera.ModePicker;
+import com.android.camera.OnClickAttr;
import com.android.camera.R;
import com.android.camera.Storage;
+import com.android.camera.Thumbnail;
import com.android.camera.Util;
+import com.android.camera.ui.RotateImageView;
+import com.android.camera.ui.SharePopup;
import android.app.Activity;
import android.app.ProgressDialog;
@@ -42,10 +47,12 @@ import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.hardware.Camera.Parameters;
import android.hardware.Camera.Size;
+import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
+import android.view.Gravity;
import android.view.View;
import android.view.WindowManager;
import android.view.animation.Animation;
@@ -70,7 +77,7 @@ public class PanoramaActivity extends Activity implements
public static final int DEFAULT_CAPTURE_PIXELS = 960 * 720;
private static final int MSG_FINAL_MOSAIC_READY = 1;
- private static final int MSG_RESET_TO_PREVIEW = 2;
+ private static final int MSG_RESET_TO_PREVIEW_WITH_THUMBNAIL = 2;
private static final String TAG = "PanoramaActivity";
private static final int PREVIEW_STOPPED = 0;
@@ -100,6 +107,10 @@ public class PanoramaActivity extends Activity implements
private String mPreparePreviewString;
private String mGeneratePanoramaString;
+ private RotateImageView mThumbnailView;
+ private Thumbnail mThumbnail;
+ private SharePopup mSharePopup;
+
private int mPreviewWidth;
private int mPreviewHeight;
private Camera mCameraDevice;
@@ -152,8 +163,13 @@ public class PanoramaActivity extends Activity implements
onBackgroundThreadFinished();
showFinalMosaic((Bitmap) msg.obj);
break;
- case MSG_RESET_TO_PREVIEW:
+ case MSG_RESET_TO_PREVIEW_WITH_THUMBNAIL:
onBackgroundThreadFinished();
+ // Set the thumbnail bitmap here because mThumbnailView must be accessed
+ // from the UI thread.
+ if (mThumbnail != null) {
+ mThumbnailView.setBitmap(mThumbnail.getBitmap());
+ }
resetToPreview();
break;
}
@@ -417,6 +433,8 @@ public class PanoramaActivity extends Activity implements
mStopCaptureButton = (Button) findViewById(R.id.pano_capture_stop_button);
mTooFastPrompt = (TextView) findViewById(R.id.pano_capture_too_fast_textview);
+ 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);
@@ -478,8 +496,17 @@ public class PanoramaActivity extends Activity implements
@Override
public void run() {
byte[] jpegData = generateFinalMosaic(true);
- savePanorama(jpegData);
- mMainHandler.sendMessage(mMainHandler.obtainMessage(MSG_RESET_TO_PREVIEW));
+ int orientation = Exif.getOrientation(jpegData);
+ Uri uri = savePanorama(jpegData, orientation);
+ if (uri != null) {
+ // Create a thumbnail whose size is smaller than 480.
+ int ratio = (int) Math.ceil((double) 480 / mPreviewHeight);
+ int inSampleSize = Util.nextPowerOf2(ratio);
+ mThumbnail = Thumbnail.createThumbnail(
+ jpegData, orientation, inSampleSize, uri);
+ }
+ mMainHandler.sendMessage(
+ mMainHandler.obtainMessage(MSG_RESET_TO_PREVIEW_WITH_THUMBNAIL));
}
});
reportProgress(true);
@@ -503,6 +530,23 @@ public class PanoramaActivity extends Activity implements
resetToPreview();
}
+ @OnClickAttr
+ public void onThumbnailClicked(View v) {
+ if (mPausing || mThreadRunning || mSurfaceTexture == null) return;
+ showSharePopup();
+ }
+
+ private void showSharePopup() {
+ if (mThumbnail == null) return;
+ Uri uri = mThumbnail.getUri();
+ if (mSharePopup == null || !uri.equals(mSharePopup.getUri())) {
+ // The orientation compensation is set to 0 here because we only support landscape.
+ mSharePopup = new SharePopup(this, uri, mThumbnail.getBitmap(), "image/jpeg",
+ 0, mThumbnailView);
+ }
+ mSharePopup.showAtLocation(mThumbnailView, Gravity.NO_GRAVITY, 0, 0);
+ }
+
private void resetToPreview() {
mCaptureState = CAPTURE_VIEWFINDER;
@@ -530,13 +574,14 @@ public class PanoramaActivity extends Activity implements
mCaptureView.setSweepAngle(0);
}
- private void savePanorama(byte[] jpegData) {
+ private Uri savePanorama(byte[] jpegData, int orientation) {
if (jpegData != null) {
String imagePath = PanoUtil.createName(
getResources().getString(R.string.pano_file_name_format), mTimeTaken);
- Storage.addImage(getContentResolver(), imagePath, mTimeTaken, null, 0,
- jpegData);
+ return Storage.addImage(getContentResolver(), imagePath, mTimeTaken, null,
+ orientation, jpegData);
}
+ return null;
}
private void clearMosaicFrameProcessorIfNeeded() {