Merge "Camera: Fix instability during ZSL snapshot"
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 8152f81..daedbab 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -143,6 +143,11 @@
                 <action android:name="android.intent.action.BOOT_COMPLETED" />
             </intent-filter>
         </receiver>
+        <receiver android:name="com.android.camera.CameraButtonIntentReceiver">
+            <intent-filter>
+                <action android:name="android.intent.action.CAMERA_BUTTON"/>
+            </intent-filter>
+        </receiver>
 
         <service android:name="com.android.camera.MediaSaveService" />
     </application>
diff --git a/src/com/android/camera/CameraActivity.java b/src/com/android/camera/CameraActivity.java
index 3086fc8..df21958 100644
--- a/src/com/android/camera/CameraActivity.java
+++ b/src/com/android/camera/CameraActivity.java
@@ -305,6 +305,9 @@
                 @Override
                 public void onDataFullScreenChange(int dataID, boolean full) {
                     boolean isCameraID = isCameraPreview(dataID);
+                    if (full && isCameraID){
+                        updateStorageSpaceAndHint();
+                    }
                     if (!isCameraID) {
                         if (!full) {
                             // Always show action bar in filmstrip mode
@@ -365,6 +368,16 @@
 
                 @Override
                 public void onDataFocusChanged(final int dataID, final boolean focused) {
+                    boolean isPreview = isCameraPreview(dataID);
+                    boolean isFullScreen = mFilmStripView.inFullScreen();
+                    if (isFullScreen && isPreview){
+                        runOnUiThread(new Runnable() {
+                            @Override
+                            public void run() {
+                                updateStorageSpaceAndHint();
+                            }
+                        });
+                    }
                     // Delay hiding action bar if there is any user interaction
                     if (mMainHandler.hasMessages(HIDE_ACTION_BAR)) {
                         mMainHandler.removeMessages(HIDE_ACTION_BAR);
@@ -1151,6 +1164,7 @@
         }
         mLocalImagesObserver.setActivityPaused(false);
         mLocalVideosObserver.setActivityPaused(false);
+        updateStorageSpaceAndHint();
     }
 
     @Override
@@ -1214,6 +1228,7 @@
     public void onBackPressed() {
         if (!mFilmStripView.inCameraFullscreen()) {
             mFilmStripView.getController().goToFirstItem();
+            mCurrentModule.resizeForPreviewAspectRatio();
         } else if (!mCurrentModule.onBackPressed()) {
             super.onBackPressed();
         }
diff --git a/src/com/android/camera/CameraModule.java b/src/com/android/camera/CameraModule.java
index 55cae9f..48d7eec 100644
--- a/src/com/android/camera/CameraModule.java
+++ b/src/com/android/camera/CameraModule.java
@@ -66,4 +66,6 @@
     public void onMediaSaveServiceConnected(MediaSaveService s);
 
     public boolean arePreviewControlsVisible();
+
+    public void resizeForPreviewAspectRatio();
 }
diff --git a/src/com/android/camera/PhotoMenu.java b/src/com/android/camera/PhotoMenu.java
index cc81ab8..0f4d3b7 100644
--- a/src/com/android/camera/PhotoMenu.java
+++ b/src/com/android/camera/PhotoMenu.java
@@ -171,24 +171,6 @@
         });
         mRenderer.addItem(item3);
 
-        // camera switcher
-        // Exposure compensation.
-        if (group.findPreference(CameraSettings.KEY_EXPOSURE) != null) {
-            item = makeItem(CameraSettings.KEY_EXPOSURE);
-            item.setLabel(res.getString(R.string.pref_exposure_label));
-            mRenderer.addItem(item);
-        }
-        // More settings.
-        PieItem more = makeItem(R.drawable.ic_settings_holo_light);
-        more.setLabel(res.getString(R.string.camera_menu_more_label));
-        mRenderer.addItem(more);
-
-        // Flash.
-        if (group.findPreference(CameraSettings.KEY_FLASH_MODE) != null) {
-            item = makeItem(CameraSettings.KEY_FLASH_MODE);
-            item.setLabel(res.getString(R.string.pref_camera_flashmode_label));
-            mRenderer.addItem(item);
-        }
         // Camera switcher.
         if (group.findPreference(CameraSettings.KEY_CAMERA_ID) != null) {
             item = makeSwitchItem(CameraSettings.KEY_CAMERA_ID, false);
@@ -211,56 +193,6 @@
             });
             mRenderer.addItem(item);
         }
-        // Location.
-        if (group.findPreference(CameraSettings.KEY_RECORD_LOCATION) != null) {
-            item = makeSwitchItem(CameraSettings.KEY_RECORD_LOCATION, true);
-            more.addItem(item);
-            if (mActivity.isSecureCamera()) {
-                // Prevent location preference from getting changed in secure camera mode
-                item.setEnabled(false);
-            }
-        }
-        // Countdown timer.
-        final ListPreference ctpref = group.findPreference(CameraSettings.KEY_TIMER);
-        final ListPreference beeppref = group.findPreference(CameraSettings.KEY_TIMER_SOUND_EFFECTS);
-        item = makeItem(R.drawable.ic_timer);
-        item.setLabel(res.getString(R.string.pref_camera_timer_title).toUpperCase(locale));
-        item.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(PieItem item) {
-                CountdownTimerPopup timerPopup = (CountdownTimerPopup) mActivity.getLayoutInflater().inflate(
-                        R.layout.countdown_setting_popup, null, false);
-                timerPopup.initialize(ctpref, beeppref);
-                timerPopup.setSettingChangedListener(PhotoMenu.this);
-                mUI.dismissPopup();
-                mPopup = timerPopup;
-                mUI.showPopup(mPopup);
-            }
-        });
-        more.addItem(item);
-        // Image size.
-        item = makeItem(R.drawable.ic_imagesize);
-        final ListPreference sizePref = group.findPreference(CameraSettings.KEY_PICTURE_SIZE);
-        item.setLabel(res.getString(R.string.pref_camera_picturesize_title).toUpperCase(locale));
-        item.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(PieItem item) {
-                ListPrefSettingPopup popup = (ListPrefSettingPopup) mActivity.getLayoutInflater().inflate(
-                        R.layout.list_pref_setting_popup, null, false);
-                popup.initialize(sizePref);
-                popup.setSettingChangedListener(PhotoMenu.this);
-                mUI.dismissPopup();
-                mPopup = popup;
-                mUI.showPopup(mPopup);
-            }
-        });
-        more.addItem(item);
-        // White balance.
-        if (group.findPreference(CameraSettings.KEY_WHITE_BALANCE) != null) {
-            item = makeItem(CameraSettings.KEY_WHITE_BALANCE);
-            item.setLabel(res.getString(R.string.pref_camera_whitebalance_label));
-            more.addItem(item);
-        }
     }
 
     @Override
diff --git a/src/com/android/camera/PhotoModule.java b/src/com/android/camera/PhotoModule.java
index db25574..176885c 100644
--- a/src/com/android/camera/PhotoModule.java
+++ b/src/com/android/camera/PhotoModule.java
@@ -644,7 +644,8 @@
         }
     }
 
-    private void resizeForPreviewAspectRatio() {
+    @Override
+    public void resizeForPreviewAspectRatio() {
         setPreviewFrameLayoutCameraOrientation();
         Size size = mParameters.getPictureSize();
         Log.e(TAG,"Width = "+ size.width+ "Height = "+size.height);
@@ -756,7 +757,12 @@
             mFaceDetectionStarted = false;
             mCameraDevice.setFaceDetectionCallback(null, null);
             mCameraDevice.stopFaceDetection();
-            mUI.clearFaces();
+            mHandler.postDelayed(new Runnable() {
+                @Override
+                public void run(){
+                    mUI.clearFaces();
+                }
+            }, 100);
         }
     }
 
@@ -1285,7 +1291,9 @@
 
         mNamedImages.nameNewImage(mCaptureStartTime);
 
-        mFaceDetectionStarted = false;
+        if (mSnapshotMode != CameraInfo.CAMERA_SUPPORT_MODE_ZSL) {
+            mFaceDetectionStarted = false;
+        }
         UsageStatistics.onEvent(UsageStatistics.COMPONENT_CAMERA,
                 UsageStatistics.ACTION_CAPTURE_DONE, "Photo");
         return true;
diff --git a/src/com/android/camera/PhotoUI.java b/src/com/android/camera/PhotoUI.java
index 1d4751b..66db1d0 100644
--- a/src/com/android/camera/PhotoUI.java
+++ b/src/com/android/camera/PhotoUI.java
@@ -160,7 +160,7 @@
         protected Bitmap doInBackground(Void... params) {
             // Decode image in background.
             Bitmap bitmap = CameraUtil.downSample(mData, DOWN_SAMPLE_FACTOR);
-            if (mOrientation != 0 || mMirror) {
+            if ((mOrientation != 0 || mMirror) && (bitmap != null)) {
                 Matrix m = new Matrix();
                 m.preRotate(mOrientation);
                 if (mMirror) {
diff --git a/src/com/android/camera/VideoModule.java b/src/com/android/camera/VideoModule.java
index 36e5862..057332b 100644
--- a/src/com/android/camera/VideoModule.java
+++ b/src/com/android/camera/VideoModule.java
@@ -223,6 +223,13 @@
             return;
         }
         mParameters = mCameraDevice.getParameters();
+        String sceneMode = mParameters.getSceneMode();
+        if ((null != sceneMode) && (!sceneMode.equals(Parameters.SCENE_MODE_AUTO))){
+            if (CameraUtil.isSupported(Parameters.SCENE_MODE_AUTO,
+                                           mParameters.getSupportedSceneModes())){
+                mParameters.setSceneMode(Parameters.SCENE_MODE_AUTO);
+            }
+        }
     }
 
     //QCOM data Members Starts here
@@ -790,7 +797,8 @@
             mUI.cameraOrientationPreviewResize(false);
     }
 
-    private void resizeForPreviewAspectRatio() {
+    @Override
+    public void resizeForPreviewAspectRatio() {
         setPreviewFrameLayoutCameraOrientation();
         mUI.setAspectRatio(
                 (double) mProfile.videoFrameWidth / mProfile.videoFrameHeight);
diff --git a/src/com/android/camera/WideAnglePanoramaModule.java b/src/com/android/camera/WideAnglePanoramaModule.java
index 6f872ea..c4080df 100644
--- a/src/com/android/camera/WideAnglePanoramaModule.java
+++ b/src/com/android/camera/WideAnglePanoramaModule.java
@@ -329,6 +329,13 @@
             return false;
         }
         Parameters parameters = mCameraDevice.getParameters();
+        String sceneMode = parameters.getSceneMode();
+        if ((null != sceneMode) && (!sceneMode.equals(Parameters.SCENE_MODE_AUTO))){
+            if (CameraUtil.isSupported(Parameters.SCENE_MODE_AUTO,
+                                           parameters.getSupportedSceneModes())){
+                parameters.setSceneMode(Parameters.SCENE_MODE_AUTO);
+            }
+        }
         setupCaptureParams(parameters);
         configureCamera(parameters);
         return true;
@@ -482,9 +489,24 @@
     @Override
     public void onPreviewUILayoutChange(int l, int t, int r, int b) {
         Log.d(TAG, "layout change: " + (r - l) + "/" + (b - t));
+        boolean capturePending = false;
+        if (mCaptureState == CAPTURE_STATE_MOSAIC){
+            capturePending = true;
+        }
         mPreviewUIWidth = r - l;
         mPreviewUIHeight = b - t;
         configMosaicPreview();
+        if (capturePending == true){
+            mMainHandler.post(new Runnable() {
+                @Override
+                public void run() {
+                    if (!mPaused){
+                        mMainHandler.removeMessages(MSG_RESET_TO_PREVIEW);
+                        startCapture();
+                    }
+                }
+            });
+        }
     }
 
     @Override
@@ -852,6 +874,10 @@
     }
 
     @Override
+    public void resizeForPreviewAspectRatio() {
+    }
+
+    @Override
     public void onResumeBeforeSuper() {
         mPaused = false;
     }
diff --git a/src/com/android/camera/ui/FilmStripView.java b/src/com/android/camera/ui/FilmStripView.java
index d2695b5..9945952 100644
--- a/src/com/android/camera/ui/FilmStripView.java
+++ b/src/com/android/camera/ui/FilmStripView.java
@@ -1844,7 +1844,7 @@
         // Check the current one.
         ViewItem curr = mViewItem[mCurrentItem];
         int dataId = curr.getId();
-        if (reporter.isDataRemoved(dataId)) {
+        if (reporter.isDataRemoved(dataId) || mDataAdapter.getTotalNumber() == 1) {
             reload();
             return;
         }
@@ -1920,7 +1920,9 @@
             if (v != mCameraView) {
                 removeView(v);
             }
-            mDataAdapter.getImageData(mViewItem[i].getId()).recycle();
+            if (mDataAdapter.getImageData(mViewItem[i].getId()) != null) {
+                mDataAdapter.getImageData(mViewItem[i].getId()).recycle();
+            }
         }
 
         // Clear out the mViewItems and rebuild with camera in the center.
diff --git a/src/com/android/camera/ui/PieRenderer.java b/src/com/android/camera/ui/PieRenderer.java
index 3967f79..008bc40 100644
--- a/src/com/android/camera/ui/PieRenderer.java
+++ b/src/com/android/camera/ui/PieRenderer.java
@@ -114,7 +114,7 @@
     private int mPieCenterX;
     private int mPieCenterY;
     private int mSliceRadius;
-    private int mArcRadius;
+    private int mArcRadius, mMaxArcRadius;
     private int mArcOffset;
 
     private int mDialAngle;
@@ -221,6 +221,7 @@
         mMenuArcPaint.setStyle(Paint.Style.STROKE);
         mSliceRadius = res.getDimensionPixelSize(R.dimen.pie_item_radius);
         mArcRadius = res.getDimensionPixelSize(R.dimen.pie_arc_radius);
+        mMaxArcRadius = mArcRadius;
         mArcOffset = res.getDimensionPixelSize(R.dimen.pie_arc_offset);
         mLabel = new TextDrawable(res);
         mLabel.setDropShadow(true);
@@ -348,6 +349,12 @@
         mCenterX = (r - l) / 2;
         mCenterY = (b - t) / 2;
 
+        int layoutWidth = r - l;
+        if( (layoutWidth > 0) && ((mMaxArcRadius + mCenterX) > layoutWidth) ){
+            mArcRadius = layoutWidth - mCenterX;
+        } else {
+            mArcRadius = mMaxArcRadius;
+        }
         mFocusX = mCenterX;
         mFocusY = mCenterY;
         resetPieCenter();