Revert "SnapdragonCamera: Add preview thumbnail button"

This reverts commit 71b2bfc91e157d8ee922fca6985251f37415d343.
diff --git a/res/layout-land/camera_controls.xml b/res/layout-land/camera_controls.xml
index 65a17ca..1d911ba 100644
--- a/res/layout-land/camera_controls.xml
+++ b/res/layout-land/camera_controls.xml
@@ -64,14 +64,14 @@
         android:scaleType="center"
         android:src="@drawable/btn_new_shutter" />
 
-    <com.android.camera.ui.RotateImageView
+    <ImageView
         android:id="@+id/preview_thumb"
         android:layout_width="@dimen/capture_size"
         android:layout_height="@dimen/capture_size"
         android:layout_gravity="top|right"
-        android:background="@android:color/black"
         android:contentDescription="@string/switch_photo_filmstrip"
-        android:scaleType="fitCenter" />
+        android:scaleType="centerInside"
+        android:visibility="invisible" />
 
     <com.android.camera.ui.RotatableLayout
         android:id="@+id/front_back_switcher"
@@ -83,6 +83,15 @@
     </com.android.camera.ui.RotatableLayout>
 
     <com.android.camera.ui.RotatableLayout
+        android:id="@+id/flash_switcher"
+        style="@style/ToggleButtonOuter" >
+
+        <com.android.camera.ui.RotateImageView
+            style="@style/ToggleButton"
+            android:layout_gravity="center" />
+    </com.android.camera.ui.RotatableLayout>
+
+    <com.android.camera.ui.RotatableLayout
         android:id="@+id/hdr_switcher"
         style="@style/ToggleButtonOuter" >
 
diff --git a/res/layout-port/camera_controls.xml b/res/layout-port/camera_controls.xml
index bf3cda0..130efc7 100644
--- a/res/layout-port/camera_controls.xml
+++ b/res/layout-port/camera_controls.xml
@@ -64,14 +64,14 @@
         android:scaleType="center"
         android:src="@drawable/btn_new_shutter" />
 
-    <com.android.camera.ui.RotateImageView
+    <ImageView
         android:id="@+id/preview_thumb"
         android:layout_width="@dimen/capture_size"
         android:layout_height="@dimen/capture_size"
         android:layout_gravity="top|right"
-        android:background="@android:color/black"
         android:contentDescription="@string/switch_photo_filmstrip"
-        android:scaleType="fitCenter" />
+        android:scaleType="centerInside"
+        android:visibility="invisible" />
 
     <com.android.camera.ui.RotatableLayout
         android:id="@+id/front_back_switcher"
@@ -83,6 +83,15 @@
     </com.android.camera.ui.RotatableLayout>
 
     <com.android.camera.ui.RotatableLayout
+        android:id="@+id/flash_switcher"
+        style="@style/ToggleButtonOuter" >
+
+        <com.android.camera.ui.RotateImageView
+            style="@style/ToggleButton"
+            android:layout_gravity="center" />
+    </com.android.camera.ui.RotatableLayout>
+
+    <com.android.camera.ui.RotatableLayout
         android:id="@+id/hdr_switcher"
         style="@style/ToggleButtonOuter" >
 
diff --git a/res/values/qcomstrings.xml b/res/values/qcomstrings.xml
index c76f5c6..c72f9bb 100644
--- a/res/values/qcomstrings.xml
+++ b/res/values/qcomstrings.xml
@@ -283,7 +283,7 @@
     <string name="pref_camera_video_tnr_default" translatable="false">off</string>
 
     <!-- Default face  detection setting. -->
-    <string name="pref_camera_facedetection_default" translatable="false">off</string>
+    <string name="pref_camera_facedetection_default" translatable="false">on</string>
 
     <!-- Settings screen, Select Face Detection -->
     <string name="pref_camera_facedetection_title">Face Detection</string>
diff --git a/src/com/android/camera/CameraActivity.java b/src/com/android/camera/CameraActivity.java
index b5fc0a6..bc8e2f1 100644
--- a/src/com/android/camera/CameraActivity.java
+++ b/src/com/android/camera/CameraActivity.java
@@ -33,12 +33,8 @@
 import android.content.SharedPreferences;
 import android.content.pm.ActivityInfo;
 import android.content.res.Configuration;
-import android.database.Cursor;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
 import android.graphics.drawable.ColorDrawable;
 import android.net.Uri;
-import android.media.ThumbnailUtils;
 import android.nfc.NfcAdapter;
 import android.nfc.NfcAdapter.CreateBeamUrisCallback;
 import android.nfc.NfcEvent;
@@ -87,7 +83,6 @@
 import com.android.camera.ui.ModuleSwitcher;
 import com.android.camera.ui.DetailsDialog;
 import com.android.camera.ui.FilmStripView;
-import com.android.camera.ui.FilmStripView.ImageData;
 import com.android.camera.util.ApiHelper;
 import com.android.camera.util.CameraUtil;
 import com.android.camera.util.GcamHelper;
@@ -188,8 +183,6 @@
     private boolean mIsUndoingDeletion = false;
     private boolean mIsEditActivityInProgress = false;
     protected boolean mIsModuleSwitchInProgress = false;
-    private View mPreviewCover;
-    private FrameLayout mPreviewContentLayout;
 
     private Uri[] mNfcPushUris = new Uri[1];
 
@@ -208,7 +201,6 @@
     private Intent mImageShareIntent;
     public static int SETTING_LIST_WIDTH_1 = 250;
     public static int SETTING_LIST_WIDTH_2 = 250;
-    private Bitmap mPreviewThumbnailBitmap;
 
     private class MyOrientationEventListener
             extends OrientationEventListener {
@@ -519,13 +511,10 @@
             };
 
     public void gotoGallery() {
-        LocalDataAdapter adapter = getDataAdapter();
-        ImageData img = adapter.getImageData(1);
-        if (img == null)
-            return;
-        Uri uri = img.getContentUri();
-        Intent intent = new Intent(Intent.ACTION_VIEW, uri);
-        startActivity(intent);
+        UsageStatistics.onEvent(UsageStatistics.COMPONENT_CAMERA, UsageStatistics.ACTION_FILMSTRIP,
+                "thumbnailTap");
+
+        mFilmStripView.getController().goToNextItem();
     }
 
     /**
@@ -609,98 +598,6 @@
         mNfcPushUris[0] = uri;
     }
 
-    public LocalDataAdapter getDataAdapter() {
-        return mDataAdapter;
-    }
-
-    private String getPathFromUri(Uri uri) {
-        String[] projection = {
-                MediaStore.Images.Media.DATA
-        };
-        Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
-        if (cursor == null)
-            return null;
-        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
-        cursor.moveToFirst();
-        String s = cursor.getString(column_index);
-        cursor.close();
-        return s;
-    }
-
-    public void setPreviewThumbnailBitmap(Bitmap bitmap) {
-        mPreviewThumbnailBitmap = bitmap;
-    }
-
-    public Bitmap getPreviewThumbBitmap() {
-        return mPreviewThumbnailBitmap;
-    }
-
-    public void updatePreviewThumbnail() {
-        if (mCurrentModule != null) {
-            if (mCurrentModule instanceof VideoModule) {
-                ((VideoModule) mCurrentModule).updatePreviewThumbnail();
-            }
-            else if (mCurrentModule instanceof WideAnglePanoramaModule) {
-                ((WideAnglePanoramaModule) mCurrentModule).updatePreviewThumbnail();
-            }
-            else if (mCurrentModule instanceof PhotoModule) {
-                ((PhotoModule) mCurrentModule).updatePreviewThumbnail();
-            }
-        }
-    }
-
-    public void updatePreviewThumbnailForVideo() {
-        if (mCurrentModule != null) {
-            if (mCurrentModule instanceof VideoModule) {
-                ((VideoModule) mCurrentModule).updatePreviewThumbnail();
-            }
-        }
-    }
-
-    public class UpdatePreviewThumbnail extends AsyncTask<Void, Void, Bitmap> {
-        private ImageView imgView;
-        private Bitmap imgBitmap = null;
-
-        public UpdatePreviewThumbnail(ImageView view) {
-            imgView = view;
-        }
-
-        @Override
-        protected Bitmap doInBackground(Void... params) {
-            if (imgBitmap != null)
-                return imgBitmap;
-
-            LocalDataAdapter adapter = getDataAdapter();
-            ImageData img = adapter.getImageData(1);
-            if (img == null) {
-                return null;
-            }
-            Uri uri = img.getContentUri();
-            String path = getPathFromUri(uri);
-            if (path == null) {
-                return null;
-            }
-            else {
-                if (img.isPhoto()) {
-                    BitmapFactory.Options opt = new BitmapFactory.Options();
-                    opt.inSampleSize = 4;
-                    return BitmapFactory.decodeFile(path, opt);
-                } else {
-                    return ThumbnailUtils
-                            .createVideoThumbnail(path, MediaStore.Video.Thumbnails.MICRO_KIND);
-                }
-            }
-        }
-
-        @Override
-        protected void onPostExecute(Bitmap bitmap) {
-            if (imgView == null)
-                return;
-            imgView.setImageBitmap(bitmap);
-            setPreviewThumbnailBitmap(bitmap);
-        }
-    }
-
     private void setStandardShareIntent(Uri contentUri, String mimeType) {
         mStandardShareIntent = getShareIntentFromType(mimeType);
         if (mStandardShareIntent != null) {
diff --git a/src/com/android/camera/CustomPhotoMenu.java b/src/com/android/camera/CustomPhotoMenu.java
index 551412a..f8230c0 100644
--- a/src/com/android/camera/CustomPhotoMenu.java
+++ b/src/com/android/camera/CustomPhotoMenu.java
@@ -81,6 +81,7 @@
     private static final int MODE_FILTER = 1;
     private static final int DEVELOPER_MENU_TOUCH_COUNT = 10;
     private int mSceneStatus;
+    private View mFlashSwitcher;
     private View mHdrSwitcher;
     private View mFrontBackSwitcher;
     private View mSceneModeSwitcher;
@@ -102,6 +103,7 @@
         mSettingOff = activity.getString(R.string.setting_off_value);
         mActivity = activity;
         mFrontBackSwitcher = ui.getRootView().findViewById(R.id.front_back_switcher);
+        mFlashSwitcher = ui.getRootView().findViewById(R.id.flash_switcher);
         mHdrSwitcher = ui.getRootView().findViewById(R.id.hdr_switcher);
         mSceneModeSwitcher = ui.getRootView().findViewById(R.id.scene_mode_switcher);
         mFilterModeSwitcher = ui.getRootView().findViewById(R.id.filter_mode_switcher);
@@ -120,6 +122,7 @@
         initSceneModeButton(mSceneModeSwitcher);
         initFilterModeButton(mFilterModeSwitcher);
         mHdrSwitcher.setVisibility(View.INVISIBLE);
+        mFlashSwitcher.setVisibility(View.INVISIBLE);
 
         mFrontBackSwitcher.setVisibility(View.INVISIBLE);
         // HDR.
@@ -176,6 +179,7 @@
         };
 
         initSwitchItem(CameraSettings.KEY_CAMERA_ID, mFrontBackSwitcher);
+        initSwitchItem(CameraSettings.KEY_FLASH_MODE, mFlashSwitcher);
     }
 
     @Override
@@ -453,6 +457,9 @@
     @Override
     public void overrideSettings(final String... keyvalues) {
         for (int i = 0; i < keyvalues.length; i += 2) {
+            if (keyvalues[i].equals(CameraSettings.KEY_FLASH_MODE)) {
+                buttonSetEnabled(mFlashSwitcher, keyvalues[i + 1] == null);
+            }
             if (keyvalues[i].equals(CameraSettings.KEY_SCENE_MODE)) {
                 buttonSetEnabled(mSceneModeSwitcher, keyvalues[i + 1] == null);
             }
diff --git a/src/com/android/camera/PhotoModule.java b/src/com/android/camera/PhotoModule.java
index 5fb7ac7..81b9f69 100644
--- a/src/com/android/camera/PhotoModule.java
+++ b/src/com/android/camera/PhotoModule.java
@@ -2557,10 +2557,6 @@
         }
     }
 
-    public void updatePreviewThumbnail() {
-        mUI.updatePreviewThumbnail();
-    }
-
     private void setDisplayOrientation() {
         mDisplayRotation = CameraUtil.getDisplayRotation(mActivity);
         mDisplayOrientation = CameraUtil.getDisplayOrientation(mDisplayRotation, mCameraId);
diff --git a/src/com/android/camera/PhotoUI.java b/src/com/android/camera/PhotoUI.java
index 4067254..803c2b1 100644
--- a/src/com/android/camera/PhotoUI.java
+++ b/src/com/android/camera/PhotoUI.java
@@ -53,7 +53,6 @@
 import android.widget.Toast;
 import android.graphics.drawable.AnimationDrawable;
 
-import com.android.camera.CameraActivity.UpdatePreviewThumbnail;
 import com.android.camera.CameraPreference.OnPreferenceChangedListener;
 import com.android.camera.FocusOverlayManager.FocusUI;
 import com.android.camera.ui.AbstractSettingPopup;
@@ -230,7 +229,7 @@
         @Override
         protected void onPostExecute(Bitmap bitmap) {
             mPreviewThumb.setImageBitmap(bitmap);
-            updatePreviewThumbnail(bitmap);
+            mAnimationManager.startCaptureAnimation(mPreviewThumb);
         }
     }
 
@@ -287,24 +286,6 @@
         mPrevOrientationResize = false;
     }
 
-    public void updatePreviewThumbnail() {
-        mPreviewThumb.setVisibility(View.VISIBLE);
-        Bitmap bitmap = mActivity.getPreviewThumbBitmap();
-        if (bitmap != null) {
-            mPreviewThumb.setImageBitmap(bitmap);
-        }
-        else {
-            UpdatePreviewThumbnail task = mActivity.new UpdatePreviewThumbnail(mPreviewThumb);
-            task.execute();
-        }
-    }
-
-    public void updatePreviewThumbnail(Bitmap bitmap) {
-        mPreviewThumb.setVisibility(View.VISIBLE);
-        mPreviewThumb.setImageBitmap(bitmap);
-        mActivity.setPreviewThumbnailBitmap(bitmap);
-    }
-
     public void setDownFactor(int factor) {
         mDownSampleFactor = factor;
     }
@@ -401,7 +382,6 @@
             // Re-apply transform matrix for new surface texture
             setTransformMatrix(mPreviewWidth, mPreviewHeight);
         }
-        updatePreviewThumbnail();
     }
 
     @Override
@@ -557,7 +537,7 @@
         mSwitcher.setVisibility(View.VISIBLE);
     }
     // called from onResume but only the first time
-    public void initializeFirstTime() {
+    public  void initializeFirstTime() {
         // Initialize shutter button.
         mShutterButton.setImageBitmap(null);
         mShutterButton.setBackgroundResource(R.drawable.shutter_button_anim);
diff --git a/src/com/android/camera/VideoModule.java b/src/com/android/camera/VideoModule.java
index 8259b82..b38b9d6 100644
--- a/src/com/android/camera/VideoModule.java
+++ b/src/com/android/camera/VideoModule.java
@@ -1520,10 +1520,6 @@
         mCurrentVideoValues = null;
     }
 
-    public void updatePreviewThumbnail() {
-        mUI.updateWithNewPreviewThumbnail();
-    }
-
     private void deleteVideoFile(String fileName) {
         Log.v(TAG, "Deleting video " + fileName);
         File f = new File(fileName);
diff --git a/src/com/android/camera/VideoUI.java b/src/com/android/camera/VideoUI.java
index 6dd793d..2167b61 100644
--- a/src/com/android/camera/VideoUI.java
+++ b/src/com/android/camera/VideoUI.java
@@ -45,7 +45,6 @@
 import android.widget.PopupWindow;
 import android.widget.TextView;
 
-import com.android.camera.CameraActivity.UpdatePreviewThumbnail;
 import com.android.camera.CameraPreference.OnPreferenceChangedListener;
 import com.android.camera.ui.AbstractSettingPopup;
 import com.android.camera.ui.CameraControls;
@@ -95,7 +94,7 @@
     private VideoController mController;
     private int mZoomMax;
     private List<Integer> mZoomRatios;
-    private ImageView mPreviewThumb;
+    private View mPreviewThumb;
     private View mFlashOverlay;
     private boolean mOrientationResize;
     private boolean mPrevOrientationResize;
@@ -241,23 +240,6 @@
         mPrevOrientationResize = false;
     }
 
-    public void updatePreviewThumbnail() {
-        mPreviewThumb.setVisibility(View.VISIBLE);
-        Bitmap bitmap = mActivity.getPreviewThumbBitmap();
-        if (bitmap != null)
-            mPreviewThumb.setImageBitmap(bitmap);
-        else {
-            UpdatePreviewThumbnail task = mActivity.new UpdatePreviewThumbnail(mPreviewThumb);
-            task.execute();
-        }
-    }
-
-    public void updateWithNewPreviewThumbnail() {
-        mPreviewThumb.setVisibility(View.VISIBLE);
-        UpdatePreviewThumbnail task = mActivity.new UpdatePreviewThumbnail(mPreviewThumb);
-        task.execute();
-    }
-
     public void cameraOrientationPreviewResize(boolean orientation){
        mPrevOrientationResize = mOrientationResize;
        mOrientationResize = orientation;
@@ -406,7 +388,7 @@
             Log.e(TAG, "No valid bitmap for capture animation.");
             return;
         }
-        mPreviewThumb.setImageBitmap(bitmap);
+        ((ImageView) mPreviewThumb).setImageBitmap(bitmap);
         mAnimationManager.startCaptureAnimation(mPreviewThumb);
     }
 
@@ -550,7 +532,7 @@
 
         mGestures.setRenderOverlay(mRenderOverlay);
 
-        mPreviewThumb = (ImageView) mRootView.findViewById(R.id.preview_thumb);
+        mPreviewThumb = mRootView.findViewById(R.id.preview_thumb);
         mPreviewThumb.setOnClickListener(new OnClickListener() {
             @Override
             public void onClick(View v) {
@@ -987,7 +969,6 @@
             // Re-apply transform matrix for new surface texture
             setTransformMatrix(mPreviewWidth, mPreviewHeight);
         }
-        updatePreviewThumbnail();
     }
 
     @Override
diff --git a/src/com/android/camera/WideAnglePanoramaModule.java b/src/com/android/camera/WideAnglePanoramaModule.java
index 4087858..d9f0032 100644
--- a/src/com/android/camera/WideAnglePanoramaModule.java
+++ b/src/com/android/camera/WideAnglePanoramaModule.java
@@ -736,10 +736,6 @@
         }
     }
 
-    public void updatePreviewThumbnail() {
-        mUI.updatePreviewThumbnail();
-    }
-
     // This function will be called upon the first camera frame is available.
     private void reset() {
         mCaptureState = CAPTURE_STATE_VIEWFINDER;
diff --git a/src/com/android/camera/WideAnglePanoramaUI.java b/src/com/android/camera/WideAnglePanoramaUI.java
index 8f96439..97c7d43 100644
--- a/src/com/android/camera/WideAnglePanoramaUI.java
+++ b/src/com/android/camera/WideAnglePanoramaUI.java
@@ -34,14 +34,12 @@
 import android.view.LayoutInflater;
 import android.view.TextureView;
 import android.view.View;
-import android.view.View.OnClickListener;
 import android.view.ViewGroup;
 import android.widget.FrameLayout;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
-import com.android.camera.CameraActivity.UpdatePreviewThumbnail;
 import com.android.camera.ui.CameraControls;
 import com.android.camera.ui.CameraRootView;
 import com.android.camera.ui.ModuleSwitcher;
@@ -80,7 +78,6 @@
     private TextureView mTextureView;
     private ShutterButton mShutterButton;
     private CameraControls mCameraControls;
-    private ImageView mPreviewThumb;
 
     private Matrix mProgressDirectionMatrix = new Matrix();
     private float[] mProgressAngle = new float[2];
@@ -107,14 +104,6 @@
         mSwitcher = (ModuleSwitcher) mRootView.findViewById(R.id.camera_switcher);
         mSwitcher.setCurrentIndex(ModuleSwitcher.WIDE_ANGLE_PANO_MODULE_INDEX);
         mSwitcher.setSwitchListener(mActivity);
-        mPreviewThumb = (ImageView) mRootView.findViewById(R.id.preview_thumb);
-        mPreviewThumb.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                if (!CameraControls.isAnimating())
-                    mActivity.gotoGallery();
-            }
-        });
     }
 
     public void onStartCapture() {
@@ -213,23 +202,6 @@
         mProgressDirectionMatrix.postRotate(orientation);
     }
 
-    public void updatePreviewThumbnail(Bitmap bitmap) {
-        mPreviewThumb.setVisibility(View.VISIBLE);
-        mPreviewThumb.setImageBitmap(bitmap);
-        mActivity.setPreviewThumbnailBitmap(bitmap);
-    }
-
-    public void updatePreviewThumbnail() {
-        mPreviewThumb.setVisibility(View.VISIBLE);
-        Bitmap bitmap = mActivity.getPreviewThumbBitmap();
-        if (bitmap != null)
-            mPreviewThumb.setImageBitmap(bitmap);
-        else {
-            UpdatePreviewThumbnail task = mActivity.new UpdatePreviewThumbnail(mPreviewThumb);
-            task.execute();
-        }
-    }
-
     public void showDirectionIndicators(int direction) {
         switch (direction) {
             case PanoProgressBar.DIRECTION_NONE:
@@ -255,7 +227,6 @@
     public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int i, int i2) {
         mSurfaceTexture = surfaceTexture;
         mController.onPreviewUIReady();
-        updatePreviewThumbnail();
     }
 
     @Override
@@ -311,9 +282,6 @@
         // is sometimes not shown due to wrong layout result. It's likely to be
         // a framework bug. Call requestLayout() as a workaround.
         mSavingProgressBar.requestLayout();
-
-        updatePreviewThumbnail(Bitmap.createScaledBitmap(bitmap,
-                bitmap.getWidth() / 2, bitmap.getHeight() / 2, false));
     }
 
     public void onConfigurationChanged(
diff --git a/src/com/android/camera/data/FixedFirstDataAdapter.java b/src/com/android/camera/data/FixedFirstDataAdapter.java
index 03402da..e26ec27 100644
--- a/src/com/android/camera/data/FixedFirstDataAdapter.java
+++ b/src/com/android/camera/data/FixedFirstDataAdapter.java
@@ -158,7 +158,6 @@
                 return (dataID != 0);
             }
         });
-        mListener.onDataLoaded();
     }
 
     @Override
diff --git a/src/com/android/camera/ui/CameraControls.java b/src/com/android/camera/ui/CameraControls.java
index 1c94195..aeaa0d4 100644
--- a/src/com/android/camera/ui/CameraControls.java
+++ b/src/com/android/camera/ui/CameraControls.java
@@ -41,6 +41,7 @@
     private View mSwitcher;
     private View mMenu;
     private View mFrontBackSwitcher;
+    private View mFlashSwitcher;
     private View mHdrSwitcher;
     private View mIndicators;
     private View mPreview;
@@ -52,13 +53,13 @@
     private static boolean isAnimating = false;
     private ArrayList<View> mViewList;
     private static final int FRONT_BACK_INDEX = 0;
-    private static final int HDR_INDEX = 1;
-    private static final int SCENE_MODE_INDEX = 2;
-    private static final int FILTER_MODE_INDEX = 3;
-    private static final int MENU_INDEX = 4;
+    private static final int FLASH_INDEX = 1;
+    private static final int HDR_INDEX = 2;
+    private static final int SCENE_MODE_INDEX = 3;
+    private static final int FILTER_MODE_INDEX = 4;
     private static final int SWITCHER_INDEX = 5;
     private static final int SHUTTER_INDEX = 6;
-    private static final int PREVIEW_INDEX = 7;
+    private static final int MENU_INDEX = 7;
     private static final int INDICATOR_INDEX = 8;
     private static final int ANIME_DURATION = 300;
     private float[][] mLocX = new float[4][9];
@@ -81,6 +82,7 @@
             resetLocation(0, 0);
 
             mFrontBackSwitcher.setVisibility(View.INVISIBLE);
+            mFlashSwitcher.setVisibility(View.INVISIBLE);
             mHdrSwitcher.setVisibility(View.INVISIBLE);
             mSceneModeSwitcher.setVisibility(View.INVISIBLE);
             mFilterModeSwitcher.setVisibility(View.INVISIBLE);
@@ -99,6 +101,7 @@
             resetLocation(0, 0);
 
             mFrontBackSwitcher.setVisibility(View.INVISIBLE);
+            mFlashSwitcher.setVisibility(View.INVISIBLE);
             mHdrSwitcher.setVisibility(View.INVISIBLE);
             mSceneModeSwitcher.setVisibility(View.INVISIBLE);
             mFilterModeSwitcher.setVisibility(View.INVISIBLE);
@@ -158,19 +161,21 @@
             mSwitcher.setPressed(false);
             mMenu.setPressed(false);
             mFrontBackSwitcher.setPressed(false);
+            mFlashSwitcher.setPressed(false);
             mHdrSwitcher.setPressed(false);
             mSceneModeSwitcher.setPressed(false);
             mFilterModeSwitcher.setPressed(false);
         } else {
+            mTempEnabled[FLASH_INDEX] = mFlashSwitcher.isEnabled();
             mTempEnabled[FILTER_MODE_INDEX] = mFilterModeSwitcher.isEnabled();
         }
         ((ShutterButton) mShutter).enableTouch(enable);
         ((ModuleSwitcher) mSwitcher).enableTouch(enable);
         mMenu.setEnabled(enable);
         mFrontBackSwitcher.setEnabled(enable);
+        mFlashSwitcher.setEnabled(enable && mTempEnabled[FLASH_INDEX]);
         mHdrSwitcher.setEnabled(enable);
         mSceneModeSwitcher.setEnabled(enable);
-        mPreview.setEnabled(enable);
         mFilterModeSwitcher.setEnabled(enable && mTempEnabled[FILTER_MODE_INDEX]);
     }
 
@@ -178,6 +183,8 @@
         mViewList = new ArrayList<View>();
         if (mFrontBackSwitcher.getVisibility() == View.VISIBLE)
             mViewList.add(mFrontBackSwitcher);
+        if (mFlashSwitcher.getVisibility() == View.VISIBLE)
+            mViewList.add(mFlashSwitcher);
         if (mHdrSwitcher.getVisibility() == View.VISIBLE)
             mViewList.add(mHdrSwitcher);
         if (mSceneModeSwitcher.getVisibility() == View.VISIBLE)
@@ -199,6 +206,7 @@
         mSwitcher = findViewById(R.id.camera_switcher);
         mShutter = findViewById(R.id.shutter_button);
         mFrontBackSwitcher = findViewById(R.id.front_back_switcher);
+        mFlashSwitcher = findViewById(R.id.flash_switcher);
         mHdrSwitcher = findViewById(R.id.hdr_switcher);
         mMenu = findViewById(R.id.menu);
         mIndicators = findViewById(R.id.on_screen_indicators);
@@ -224,6 +232,7 @@
             v.layout(l, t, r, b);
         }
         Rect shutter = new Rect();
+        topRight(mPreview, l, t, r, b);
         center(mShutter, l, t, r, b, orientation, rotation, shutter, SHUTTER_INDEX);
         mSize = (int) (Math.max(shutter.right - shutter.left, shutter.bottom - shutter.top) * 1.2f);
         center(mBackgroundView, l, t, r, b, orientation, rotation, new Rect(), -1);
@@ -243,11 +252,11 @@
     private void setLocation(int w, int h) {
         int rotation = getUnifiedRotation();
         toIndex(mSwitcher, w, h, rotation, 4, 6, SWITCHER_INDEX);
-        toIndex(mMenu, w, h, rotation, 4, 0, MENU_INDEX);
+        toIndex(mMenu, w, h, rotation, 0, 6, MENU_INDEX);
         toIndex(mIndicators, w, h, rotation, 0, 6, INDICATOR_INDEX);
         toIndex(mFrontBackSwitcher, w, h, rotation, 2, 0, FRONT_BACK_INDEX);
-        toIndex(mPreview, w, h, rotation, 0, 6, PREVIEW_INDEX);
-        toIndex(mHdrSwitcher, w, h, rotation, 3, 0, HDR_INDEX);
+        toIndex(mFlashSwitcher, w, h, rotation, 3, 0, FLASH_INDEX);
+        toIndex(mHdrSwitcher, w, h, rotation, 4, 0, HDR_INDEX);
         toIndex(mFilterModeSwitcher, w, h, rotation, 1, 0, FILTER_MODE_INDEX);
         toIndex(mSceneModeSwitcher, w, h, rotation, 0, 0, SCENE_MODE_INDEX);
     }
@@ -301,24 +310,24 @@
         int idx1 = rotation / 90;
 
         mFrontBackSwitcher.setX(mLocX[idx1][FRONT_BACK_INDEX] + x);
+        mFlashSwitcher.setX(mLocX[idx1][FLASH_INDEX] + x);
         mHdrSwitcher.setX(mLocX[idx1][HDR_INDEX] + x);
         mSceneModeSwitcher.setX(mLocX[idx1][SCENE_MODE_INDEX] + x);
         mFilterModeSwitcher.setX(mLocX[idx1][FILTER_MODE_INDEX] + x);
-        mMenu.setX(mLocX[idx1][MENU_INDEX] + x);
         mSwitcher.setX(mLocX[idx1][SWITCHER_INDEX] - x);
         mShutter.setX(mLocX[idx1][SHUTTER_INDEX] - x);
+        mMenu.setX(mLocX[idx1][MENU_INDEX] - x);
         mIndicators.setX(mLocX[idx1][INDICATOR_INDEX] - x);
-        mPreview.setX(mLocX[idx1][PREVIEW_INDEX] - x);
 
         mFrontBackSwitcher.setY(mLocY[idx1][FRONT_BACK_INDEX] + y);
+        mFlashSwitcher.setY(mLocY[idx1][FLASH_INDEX] + y);
         mHdrSwitcher.setY(mLocY[idx1][HDR_INDEX] + y);
         mSceneModeSwitcher.setY(mLocY[idx1][SCENE_MODE_INDEX] + y);
         mFilterModeSwitcher.setY(mLocY[idx1][FILTER_MODE_INDEX] + y);
-        mMenu.setY(mLocY[idx1][MENU_INDEX] + y);
         mSwitcher.setY(mLocY[idx1][SWITCHER_INDEX] - y);
         mShutter.setY(mLocY[idx1][SHUTTER_INDEX] - y);
+        mMenu.setY(mLocY[idx1][MENU_INDEX] - y);
         mIndicators.setY(mLocY[idx1][INDICATOR_INDEX] - y);
-        mPreview.setY(mLocY[idx1][PREVIEW_INDEX] - y);
     }
 
     public void hideUI() {
@@ -326,6 +335,7 @@
         enableTouch(false);
         int rotation = getUnifiedRotation();
         mFrontBackSwitcher.animate().cancel();
+        mFlashSwitcher.animate().cancel();
         mHdrSwitcher.animate().cancel();
         mSceneModeSwitcher.animate().cancel();
         mFilterModeSwitcher.animate().cancel();
@@ -333,7 +343,6 @@
         mShutter.animate().cancel();
         mMenu.animate().cancel();
         mIndicators.animate().cancel();
-        mPreview.animate().cancel();
         mFrontBackSwitcher.animate().setListener(outlistener);
         ((ModuleSwitcher) mSwitcher).removePopup();
         resetLocation(0, 0);
@@ -341,51 +350,51 @@
         switch (rotation) {
             case 0:
                 mFrontBackSwitcher.animate().translationYBy(-mSize).setDuration(ANIME_DURATION);
+                mFlashSwitcher.animate().translationYBy(-mSize).setDuration(ANIME_DURATION);
                 mHdrSwitcher.animate().translationYBy(-mSize).setDuration(ANIME_DURATION);
                 mSceneModeSwitcher.animate().translationYBy(-mSize).setDuration(ANIME_DURATION);
                 mFilterModeSwitcher.animate().translationYBy(-mSize).setDuration(ANIME_DURATION);
-                mMenu.animate().translationYBy(-mSize).setDuration(ANIME_DURATION);
 
                 mSwitcher.animate().translationYBy(mSize).setDuration(ANIME_DURATION);
                 mShutter.animate().translationYBy(mSize).setDuration(ANIME_DURATION);
+                mMenu.animate().translationYBy(mSize).setDuration(ANIME_DURATION);
                 mIndicators.animate().translationYBy(mSize).setDuration(ANIME_DURATION);
-                mPreview.animate().translationYBy(mSize).setDuration(ANIME_DURATION);
                 break;
             case 90:
                 mFrontBackSwitcher.animate().translationXBy(-mSize).setDuration(ANIME_DURATION);
+                mFlashSwitcher.animate().translationXBy(-mSize).setDuration(ANIME_DURATION);
                 mHdrSwitcher.animate().translationXBy(-mSize).setDuration(ANIME_DURATION);
                 mSceneModeSwitcher.animate().translationXBy(-mSize).setDuration(ANIME_DURATION);
                 mFilterModeSwitcher.animate().translationXBy(-mSize).setDuration(ANIME_DURATION);
-                mMenu.animate().translationXBy(-mSize).setDuration(ANIME_DURATION);
 
                 mSwitcher.animate().translationXBy(mSize).setDuration(ANIME_DURATION);
                 mShutter.animate().translationXBy(mSize).setDuration(ANIME_DURATION);
+                mMenu.animate().translationXBy(mSize).setDuration(ANIME_DURATION);
                 mIndicators.animate().translationXBy(mSize).setDuration(ANIME_DURATION);
-                mPreview.animate().translationXBy(mSize).setDuration(ANIME_DURATION);
                 break;
             case 180:
                 mFrontBackSwitcher.animate().translationYBy(mSize).setDuration(ANIME_DURATION);
+                mFlashSwitcher.animate().translationYBy(mSize).setDuration(ANIME_DURATION);
                 mHdrSwitcher.animate().translationYBy(mSize).setDuration(ANIME_DURATION);
                 mSceneModeSwitcher.animate().translationYBy(mSize).setDuration(ANIME_DURATION);
                 mFilterModeSwitcher.animate().translationYBy(mSize).setDuration(ANIME_DURATION);
-                mMenu.animate().translationYBy(mSize).setDuration(ANIME_DURATION);
 
                 mSwitcher.animate().translationYBy(-mSize).setDuration(ANIME_DURATION);
                 mShutter.animate().translationYBy(-mSize).setDuration(ANIME_DURATION);
+                mMenu.animate().translationYBy(-mSize).setDuration(ANIME_DURATION);
                 mIndicators.animate().translationYBy(-mSize).setDuration(ANIME_DURATION);
-                mPreview.animate().translationYBy(-mSize).setDuration(ANIME_DURATION);
                 break;
             case 270:
                 mFrontBackSwitcher.animate().translationXBy(mSize).setDuration(ANIME_DURATION);
+                mFlashSwitcher.animate().translationXBy(mSize).setDuration(ANIME_DURATION);
                 mHdrSwitcher.animate().translationXBy(mSize).setDuration(ANIME_DURATION);
                 mSceneModeSwitcher.animate().translationXBy(mSize).setDuration(ANIME_DURATION);
                 mFilterModeSwitcher.animate().translationXBy(mSize).setDuration(ANIME_DURATION);
-                mMenu.animate().translationXBy(mSize).setDuration(ANIME_DURATION);
 
                 mSwitcher.animate().translationXBy(-mSize).setDuration(ANIME_DURATION);
                 mShutter.animate().translationXBy(-mSize).setDuration(ANIME_DURATION);
+                mMenu.animate().translationXBy(-mSize).setDuration(ANIME_DURATION);
                 mIndicators.animate().translationXBy(-mSize).setDuration(ANIME_DURATION);
-                mPreview.animate().translationXBy(-mSize).setDuration(ANIME_DURATION);
                 break;
         }
     }
@@ -395,6 +404,7 @@
         enableTouch(false);
         int rotation = getUnifiedRotation();
         mFrontBackSwitcher.animate().cancel();
+        mFlashSwitcher.animate().cancel();
         mHdrSwitcher.animate().cancel();
         mSceneModeSwitcher.animate().cancel();
         mFilterModeSwitcher.animate().cancel();
@@ -402,7 +412,6 @@
         mShutter.animate().cancel();
         mMenu.animate().cancel();
         mIndicators.animate().cancel();
-        mPreview.animate().cancel();
         if (mViewList != null)
             for (View v : mViewList) {
                 v.setVisibility(View.VISIBLE);
@@ -414,7 +423,6 @@
 
         mMenu.setVisibility(View.VISIBLE);
         mIndicators.setVisibility(View.VISIBLE);
-        mPreview.setVisibility(View.VISIBLE);
 
         mFrontBackSwitcher.animate().setListener(inlistener);
         switch (rotation) {
@@ -422,57 +430,57 @@
                 resetLocation(0, -mSize);
 
                 mFrontBackSwitcher.animate().translationYBy(mSize).setDuration(ANIME_DURATION);
+                mFlashSwitcher.animate().translationYBy(mSize).setDuration(ANIME_DURATION);
                 mHdrSwitcher.animate().translationYBy(mSize).setDuration(ANIME_DURATION);
                 mSceneModeSwitcher.animate().translationYBy(mSize).setDuration(ANIME_DURATION);
                 mFilterModeSwitcher.animate().translationYBy(mSize).setDuration(ANIME_DURATION);
-                mMenu.animate().translationYBy(mSize).setDuration(ANIME_DURATION);
 
                 mSwitcher.animate().translationYBy(-mSize).setDuration(ANIME_DURATION);
                 mShutter.animate().translationYBy(-mSize).setDuration(ANIME_DURATION);
+                mMenu.animate().translationYBy(-mSize).setDuration(ANIME_DURATION);
                 mIndicators.animate().translationYBy(-mSize).setDuration(ANIME_DURATION);
-                mPreview.animate().translationYBy(-mSize).setDuration(ANIME_DURATION);
                 break;
             case 90:
                 resetLocation(-mSize, 0);
 
                 mFrontBackSwitcher.animate().translationXBy(mSize).setDuration(ANIME_DURATION);
+                mFlashSwitcher.animate().translationXBy(mSize).setDuration(ANIME_DURATION);
                 mHdrSwitcher.animate().translationXBy(mSize).setDuration(ANIME_DURATION);
                 mSceneModeSwitcher.animate().translationXBy(mSize).setDuration(ANIME_DURATION);
                 mFilterModeSwitcher.animate().translationXBy(mSize).setDuration(ANIME_DURATION);
-                mMenu.animate().translationXBy(mSize).setDuration(ANIME_DURATION);
 
                 mSwitcher.animate().translationXBy(-mSize).setDuration(ANIME_DURATION);
                 mShutter.animate().translationXBy(-mSize).setDuration(ANIME_DURATION);
+                mMenu.animate().translationXBy(-mSize).setDuration(ANIME_DURATION);
                 mIndicators.animate().translationXBy(-mSize).setDuration(ANIME_DURATION);
-                mPreview.animate().translationXBy(-mSize).setDuration(ANIME_DURATION);
                 break;
             case 180:
                 resetLocation(0, mSize);
 
                 mFrontBackSwitcher.animate().translationYBy(-mSize).setDuration(ANIME_DURATION);
+                mFlashSwitcher.animate().translationYBy(-mSize).setDuration(ANIME_DURATION);
                 mHdrSwitcher.animate().translationYBy(-mSize).setDuration(ANIME_DURATION);
                 mSceneModeSwitcher.animate().translationYBy(-mSize).setDuration(ANIME_DURATION);
                 mFilterModeSwitcher.animate().translationYBy(-mSize).setDuration(ANIME_DURATION);
-                mMenu.animate().translationYBy(-mSize).setDuration(ANIME_DURATION);
 
                 mSwitcher.animate().translationYBy(mSize).setDuration(ANIME_DURATION);
                 mShutter.animate().translationYBy(mSize).setDuration(ANIME_DURATION);
+                mMenu.animate().translationYBy(mSize).setDuration(ANIME_DURATION);
                 mIndicators.animate().translationYBy(mSize).setDuration(ANIME_DURATION);
-                mPreview.animate().translationYBy(mSize).setDuration(ANIME_DURATION);
                 break;
             case 270:
                 resetLocation(mSize, 0);
 
                 mFrontBackSwitcher.animate().translationXBy(-mSize).setDuration(ANIME_DURATION);
+                mFlashSwitcher.animate().translationXBy(-mSize).setDuration(ANIME_DURATION);
                 mHdrSwitcher.animate().translationXBy(-mSize).setDuration(ANIME_DURATION);
                 mSceneModeSwitcher.animate().translationXBy(-mSize).setDuration(ANIME_DURATION);
                 mFilterModeSwitcher.animate().translationXBy(-mSize).setDuration(ANIME_DURATION);
-                mMenu.animate().translationXBy(-mSize).setDuration(ANIME_DURATION);
 
                 mSwitcher.animate().translationXBy(mSize).setDuration(ANIME_DURATION);
                 mShutter.animate().translationXBy(mSize).setDuration(ANIME_DURATION);
+                mMenu.animate().translationXBy(mSize).setDuration(ANIME_DURATION);
                 mIndicators.animate().translationXBy(mSize).setDuration(ANIME_DURATION);
-                mPreview.animate().translationXBy(mSize).setDuration(ANIME_DURATION);
                 break;
         }
     }
@@ -624,6 +632,14 @@
         v.layout(l, t, r, b);
     }
 
+    private void topRight(View v, int l, int t, int r, int b) {
+        // layout using the specific margins; the rotation code messes up the
+        // others
+        int mt = getContext().getResources().getDimensionPixelSize(R.dimen.capture_margin_top);
+        int mr = getContext().getResources().getDimensionPixelSize(R.dimen.capture_margin_right);
+        v.layout(r - v.getMeasuredWidth() - mr, t + mt, r - mr, t + mt + v.getMeasuredHeight());
+    }
+
     private void adjustBackground() {
         int rotation = getUnifiedRotation();
         // remove current drawable and reset rotation
diff --git a/src/com/android/camera/ui/FilmStripView.java b/src/com/android/camera/ui/FilmStripView.java
index 7f197ca..8da49a1 100644
--- a/src/com/android/camera/ui/FilmStripView.java
+++ b/src/com/android/camera/ui/FilmStripView.java
@@ -106,8 +106,6 @@
     private boolean mSendToPreviewMenu;
     private boolean mSendToMenu;
     private boolean mReset;
-    private boolean mIsLoaded = false;
-
     /**
      * Common interface for all images in the filmstrip.
      */
@@ -1735,10 +1733,7 @@
         mDataAdapter.setListener(new DataAdapter.Listener() {
             @Override
             public void onDataLoaded() {
-                mActivity.updatePreviewThumbnail();
-                if (!mIsLoaded)
-                    reload();
-                mIsLoaded = true;
+                reload();
             }
 
             @Override
@@ -1754,7 +1749,6 @@
                     return;
                 }
                 updateInsertion(dataID);
-                mActivity.updatePreviewThumbnailForVideo();
             }
 
             @Override
@@ -1813,7 +1807,9 @@
                     && deltaX < mSlop * (-1)) {
                 // intercept left swipe
                 if (Math.abs(deltaX) >= Math.abs(deltaY) * 2) {
-                    return false;
+                    UsageStatistics.onEvent(UsageStatistics.COMPONENT_CAMERA,
+                            UsageStatistics.ACTION_FILMSTRIP, null);
+                    return true;
                 }
             }
         }