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: