diff options
author | Angus Kong <shkong@google.com> | 2011-08-22 12:27:21 +0800 |
---|---|---|
committer | Angus Kong <shkong@google.com> | 2011-08-25 11:37:03 +0800 |
commit | a907c122ccec649c6cedf3a45b1c426a5fca932e (patch) | |
tree | a9ee81ace05282d5e5661404085becd3e3393190 /src/com/android/camera | |
parent | 50b3c890986aadb3780b4da8c0b8dbb0f1422eba (diff) | |
download | LegacyCamera-a907c122ccec649c6cedf3a45b1c426a5fca932e.zip LegacyCamera-a907c122ccec649c6cedf3a45b1c426a5fca932e.tar.gz LegacyCamera-a907c122ccec649c6cedf3a45b1c426a5fca932e.tar.bz2 |
Add thumbnail and share popup for the last result.
bug:5141665
Change-Id: Idc44d33d09c8d4a30fdcef66de2d6754daf1ea82
Diffstat (limited to 'src/com/android/camera')
-rw-r--r-- | src/com/android/camera/Camera.java | 47 | ||||
-rw-r--r-- | src/com/android/camera/Exif.java | 2 | ||||
-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.java | 2 | ||||
-rw-r--r-- | src/com/android/camera/VideoCamera.java | 57 | ||||
-rw-r--r-- | src/com/android/camera/panorama/PanoramaActivity.java | 59 |
6 files changed, 105 insertions, 64 deletions
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() { |