diff options
-rw-r--r-- | proguard.flags | 2 | ||||
-rw-r--r-- | res/layout-w1024dp/preview_frame_video.xml | 1 | ||||
-rw-r--r-- | res/layout-w1024dp/review_control.xml | 3 | ||||
-rw-r--r-- | res/layout-w1024dp/review_thumbnail.xml | 29 | ||||
-rw-r--r-- | res/layout/attach_camera_control.xml | 4 | ||||
-rw-r--r-- | res/layout/review_thumbnail.xml | 7 | ||||
-rw-r--r-- | res/values-w1024dp/dimens.xml | 2 | ||||
-rw-r--r-- | res/values-w1024dp/styles.xml | 8 | ||||
-rw-r--r-- | res/values/styles.xml | 6 | ||||
-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 |
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() { |