Reconcile with ics-factoryrom-2-release
Change-Id: Ib5a550f4261b0810187d95e9a7844144641b322b
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 6ecc783..4f3f5cc 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -24,11 +24,11 @@
<string name="gallery_camera_bucket_name" msgid="2924618424339240831">"תמונות מצלמה"</string>
<string name="gallery_camera_videos_bucket_name" msgid="3369151581398551623">" סרטוני וידאו של המצלמה"</string>
<string name="wait" msgid="8600187532323801552">"המתן..."</string>
- <string name="no_storage" product="nosdcard" msgid="5876548364041592119">"טען אמצעי אחסון מסוג USB לפני השימוש במצלמה."</string>
+ <string name="no_storage" product="nosdcard" msgid="5876548364041592119">"טען אחסון USB לפני השימוש במצלמה."</string>
<string name="no_storage" product="default" msgid="820691042667338625">"הכנס כרטיס SD לפני שתשתמש במצלמה."</string>
<string name="not_enough_space" product="nosdcard" msgid="6452370395538050134">"אמצעי האחסון מסוג USB מלא."</string>
<string name="not_enough_space" product="default" msgid="6655334407957844653">"כרטיס SD מלא."</string>
- <string name="preparing_sd" product="nosdcard" msgid="6104019983528341353">"מכין אמצעי אחסון מסוג USB..."</string>
+ <string name="preparing_sd" product="nosdcard" msgid="6104019983528341353">"מכין אחסון USB..."</string>
<string name="preparing_sd" product="default" msgid="2914969119574812666">"מכין כרטיס SD..."</string>
<string name="access_sd_fail" product="nosdcard" msgid="8147993984037859354">"לא ניתן לגשת לאחסון ה-USB."</string>
<string name="access_sd_fail" product="default" msgid="1584968646870054352">"לא ניתן לגשת לכרטיס ה-SD."</string>
diff --git a/src/com/android/camera/Camera.java b/src/com/android/camera/Camera.java
index 1bedb4f..8898510 100644
--- a/src/com/android/camera/Camera.java
+++ b/src/com/android/camera/Camera.java
@@ -82,7 +82,7 @@
View.OnTouchListener, ShutterButton.OnShutterButtonListener,
SurfaceHolder.Callback, ModePicker.OnModeChangeListener,
FaceDetectionListener, CameraPreference.OnPreferenceChangedListener,
- LocationManager.Listener, ShutterButton.OnShutterButtonLongPressListener {
+ LocationManager.Listener {
private static final String TAG = "camera";
@@ -370,7 +370,6 @@
// Initialize shutter button.
mShutterButton = (ShutterButton) findViewById(R.id.shutter_button);
mShutterButton.setOnShutterButtonListener(this);
- mShutterButton.setOnShutterButtonLongPressListener(this);
mShutterButton.setVisibility(View.VISIBLE);
// Initialize focus UI.
@@ -1393,15 +1392,6 @@
mFocusManager.doSnap();
}
- @Override
- public void onShutterButtonLongPressed() {
- if (mPausing || mCameraState == SNAPSHOT_IN_PROGRESS
- || mCameraDevice == null || mPicturesRemaining <= 0) return;
-
- Log.v(TAG, "onShutterButtonLongPressed");
- mFocusManager.shutterLongPressed();
- }
-
private OnScreenHint mStorageHint;
private void updateStorageHint() {
diff --git a/src/com/android/camera/FocusManager.java b/src/com/android/camera/FocusManager.java
index 86b92c2..72ea8b5 100644
--- a/src/com/android/camera/FocusManager.java
+++ b/src/com/android/camera/FocusManager.java
@@ -56,7 +56,6 @@
private boolean mInitialized;
private boolean mFocusAreaSupported;
- private boolean mInLongPress;
private boolean mLockAeAwbNeeded;
private boolean mAeAwbLock;
private Matrix mMatrix;
@@ -174,22 +173,6 @@
}
}
- public void shutterLongPressed() {
- if (Parameters.FOCUS_MODE_CONTINUOUS_PICTURE.equals(mFocusMode)
- && isSupported(Parameters.FOCUS_MODE_AUTO, mParameters.getSupportedFocusModes())) {
- if (mState == STATE_IDLE || mState == STATE_FOCUSING_SNAP_ON_FINISH) {
- Log.e(TAG, "Invalid focus state=" + mState);
- }
- mInLongPress = true;
- // Cancel any outstanding Auto focus requests. The auto focus mode
- // will be changed from CAF to auto in cancelAutoFocus.
- onShutterUp();
- // Call Autofocus
- onShutterDown();
- mInLongPress = false;
- }
- }
-
public void doSnap() {
if (!mInitialized) return;
@@ -379,11 +362,7 @@
public String getFocusMode() {
if (mOverrideFocusMode != null) return mOverrideFocusMode;
- if (mInLongPress) {
- // Users long-press the shutter button in CAF. Change it to auto
- // mode, so it will do a full scan.
- mFocusMode = Parameters.FOCUS_MODE_AUTO;
- } else if (mFocusAreaSupported && mFocusArea != null) {
+ if (mFocusAreaSupported && mFocusArea != null) {
// Always use autofocus in tap-to-focus.
mFocusMode = Parameters.FOCUS_MODE_AUTO;
} else {
diff --git a/src/com/android/camera/ShutterButton.java b/src/com/android/camera/ShutterButton.java
index ace154e..c7f792a 100755
--- a/src/com/android/camera/ShutterButton.java
+++ b/src/com/android/camera/ShutterButton.java
@@ -26,7 +26,7 @@
* It's currently an {@code ImageView} that can call a delegate when the
* pressed state changes.
*/
-public class ShutterButton extends ImageView implements View.OnLongClickListener {
+public class ShutterButton extends ImageView {
/**
* A callback to be invoked when a ShutterButton's pressed state changes.
*/
@@ -40,30 +40,17 @@
void onShutterButtonClick();
}
- /**
- * A callback to be invoked when a ShutterButton's long pressed.
- */
- public interface OnShutterButtonLongPressListener {
- void onShutterButtonLongPressed();
- }
-
private OnShutterButtonListener mListener;
- private OnShutterButtonLongPressListener mLongPressListener;
private boolean mOldPressed;
public ShutterButton(Context context, AttributeSet attrs) {
super(context, attrs);
- setOnLongClickListener(this);
}
public void setOnShutterButtonListener(OnShutterButtonListener listener) {
mListener = listener;
}
- public void setOnShutterButtonLongPressListener(OnShutterButtonLongPressListener listener) {
- mLongPressListener = listener;
- }
-
/**
* Hook into the drawable state changing to get changes to isPressed -- the
* onPressed listener doesn't always get called when the pressed state
@@ -122,12 +109,4 @@
}
return result;
}
-
- @Override
- public boolean onLongClick(View v) {
- if (mLongPressListener != null) {
- mLongPressListener.onShutterButtonLongPressed();
- }
- return false;
- }
}
diff --git a/src/com/android/camera/Util.java b/src/com/android/camera/Util.java
index 4c28e56..21bad6f 100644
--- a/src/com/android/camera/Util.java
+++ b/src/com/android/camera/Util.java
@@ -413,6 +413,37 @@
return optimalSize;
}
+ // Returns the largest picture size which matches the given aspect ratio.
+ public static Size getOptimalVideoSnapshotPictureSize(
+ List<Size> sizes, double targetRatio) {
+ // Use a very small tolerance because we want an exact match.
+ final double ASPECT_TOLERANCE = 0.001;
+ if (sizes == null) return null;
+
+ Size optimalSize = null;
+
+ // Try to find a size matches aspect ratio and has the largest width
+ for (Size size : sizes) {
+ double ratio = (double) size.width / size.height;
+ if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
+ if (optimalSize == null || size.width > optimalSize.width) {
+ optimalSize = size;
+ }
+ }
+
+ // Cannot find one that matches the aspect ratio. This should not happen.
+ // Ignore the requirement.
+ if (optimalSize == null) {
+ Log.w(TAG, "No picture size match the aspect ratio");
+ for (Size size : sizes) {
+ if (optimalSize == null || size.width > optimalSize.width) {
+ optimalSize = size;
+ }
+ }
+ }
+ return optimalSize;
+ }
+
public static void dumpParameters(Parameters parameters) {
String flattened = parameters.flatten();
StringTokenizer tokenizer = new StringTokenizer(flattened, ";");
diff --git a/src/com/android/camera/VideoCamera.java b/src/com/android/camera/VideoCamera.java
index 9f47d5c..6de5a81 100755
--- a/src/com/android/camera/VideoCamera.java
+++ b/src/com/android/camera/VideoCamera.java
@@ -178,6 +178,7 @@
private MediaRecorder mMediaRecorder;
private EffectsRecorder mEffectsRecorder;
+ private boolean mEffectsDisplayResult;
private int mEffectType = EffectsRecorder.EFFECT_NONE;
private Object mEffectParameter = null;
@@ -602,14 +603,15 @@
}
private void onStopVideoRecording(boolean valid) {
+ mEffectsDisplayResult = true;
stopVideoRecording();
if (mIsVideoCaptureIntent) {
if (mQuickCapture) {
doReturnToCaller(valid);
- } else {
+ } else if (!effectsActive()) {
showAlert();
}
- } else {
+ } else if (!effectsActive()) {
getThumbnail();
}
}
@@ -926,12 +928,13 @@
// This is similar to what mShutterButton.performClick() does,
// but not quite the same.
if (mMediaRecorderRecording) {
+ mEffectsDisplayResult = true;
if (mIsVideoCaptureIntent) {
stopVideoRecording();
- showAlert();
+ if (!effectsActive()) showAlert();
} else {
stopVideoRecording();
- getThumbnail();
+ if (!effectsActive()) getThumbnail();
}
} else {
stopVideoRecording();
@@ -1237,6 +1240,7 @@
CameraInfo info = CameraHolder.instance().getCameraInfo()[mCameraId];
+ mEffectsDisplayResult = false;
mEffectsRecorder = new EffectsRecorder(this);
// TODO: Confirm none of the foll need to go to initializeEffectsRecording()
@@ -1882,15 +1886,18 @@
}
// Set picture size.
- String pictureSize = mPreferences.getString(
- CameraSettings.KEY_PICTURE_SIZE, null);
- if (pictureSize == null) {
- CameraSettings.initialCameraPictureSize(this, mParameters);
- } else {
- List<Size> supported = mParameters.getSupportedPictureSizes();
- CameraSettings.setCameraPictureSize(
- pictureSize, supported, mParameters);
+ // The logic here is different from the logic in still-mode camera.
+ // There we determine the preview size based on the picture size, but
+ // here we determine the picture size based on the preview size.
+ List<Size> supported = mParameters.getSupportedPictureSizes();
+ Size optimalSize = Util.getOptimalVideoSnapshotPictureSize(supported,
+ (double) mDesiredPreviewWidth / mDesiredPreviewHeight);
+ Size original = mParameters.getPictureSize();
+ if (!original.equals(optimalSize)) {
+ mParameters.setPictureSize(optimalSize.width, optimalSize.height);
}
+ Log.v(TAG, "Video snapshot size is " + optimalSize.width + "x" +
+ optimalSize.height);
// Set JPEG quality.
int jpegQuality = CameraProfile.getJpegEncodingQualityParameter(mCameraId,
@@ -1947,8 +1954,20 @@
mBgLearningMessageFrame.setVisibility(View.GONE);
checkQualityAndStartPreview();
} else if (effectMsg == EffectsRecorder.EFFECT_MSG_RECORDING_DONE) {
- addVideoToMediaStore();
- getThumbnail();
+ // TODO: This assumes the codepath from onStopVideoRecording. It
+ // does not appear to cause problems for the other codepaths, but
+ // should be properly thought through.
+ if (mEffectsDisplayResult) {
+ addVideoToMediaStore();
+ if (mIsVideoCaptureIntent) {
+ if (!mQuickCapture) {
+ showAlert();
+ }
+ } else {
+ getThumbnail();
+ }
+ }
+ mEffectsDisplayResult = false;
} else if (effectId == EffectsRecorder.EFFECT_BACKDROPPER) {
switch (effectMsg) {
case EffectsRecorder.EFFECT_MSG_STARTED_LEARNING: