Merge "Prevent lock screen appearing during active slideshow" into gb-ub-photos-bryce
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 1cae7bc..f40c6ef 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -154,6 +154,7 @@
 
     <!-- Camera Preferences Picture size dialog box entries -->
     <string-array name="pref_camera_picturesize_entries" translatable="false">
+        <item>@string/pref_camera_picturesize_entry_13mp</item>
         <item>@string/pref_camera_picturesize_entry_8mp</item>
         <item>@string/pref_camera_picturesize_entry_5mp</item>
         <item>@string/pref_camera_picturesize_entry_5mp</item>
@@ -170,6 +171,7 @@
          size to the first one in the list that is also supported by the
          driver -->
     <string-array name="pref_camera_picturesize_entryvalues" translatable="false">
+        <item>4128x3096</item>
         <item>3264x2448</item>
         <item>2592x1944</item>
         <item>2592x1936</item>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index a1c2e31..0ec4da6 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -672,6 +672,8 @@
     <!-- Settings screen, Picture size title -->
     <string name="pref_camera_picturesize_title">Picture size</string>
 
+    <!-- Settings screen, dialog choice for 13 megapixels picture size [CHAR LIMIT=15] -->
+    <string name="pref_camera_picturesize_entry_13mp">13M pixels</string>
     <!-- Settings screen, dialog choice for 8 megapixels picture size [CHAR LIMIT=15] -->
     <string name="pref_camera_picturesize_entry_8mp">8M pixels</string>
     <!-- Settings screen, dialog choice for 5 megapixels picture size [CHAR LIMIT=15] -->
diff --git a/src/com/android/camera/ActivityBase.java b/src/com/android/camera/ActivityBase.java
index c3cde8b..59bd82c 100644
--- a/src/com/android/camera/ActivityBase.java
+++ b/src/com/android/camera/ActivityBase.java
@@ -353,7 +353,7 @@
         }
     }
 
-    protected void gotoGallery() {
+    public void gotoGallery() {
         // Move the next picture with capture animation. "1" means next.
         mAppBridge.switchWithCaptureAnimation(1);
     }
diff --git a/src/com/android/camera/VideoModule.java b/src/com/android/camera/VideoModule.java
index f7830a3..2c654fc 100644
--- a/src/com/android/camera/VideoModule.java
+++ b/src/com/android/camera/VideoModule.java
@@ -91,6 +91,7 @@
     private static final int SWITCH_CAMERA = 8;
     private static final int SWITCH_CAMERA_START_ANIMATION = 9;
     private static final int HIDE_SURFACE_VIEW = 10;
+    private static final int CAPTURE_ANIMATION_DONE = 11;
 
     private static final int SCREEN_DELAY = 2 * 60 * 1000;
 
@@ -296,6 +297,11 @@
                     break;
                 }
 
+                case CAPTURE_ANIMATION_DONE: {
+                    mUI.enablePreviewThumb(false);
+                    break;
+                }
+
                 default:
                     Log.v(TAG, "Unhandled message: " + msg.what);
                     break;
@@ -578,6 +584,14 @@
                 // the preview. This will cause the preview flicker since the preview
                 // will not be continuous for a short period of time.
                 ((CameraScreenNail) mActivity.mCameraScreenNail).animateCapture(mDisplayRotation);
+
+                mUI.enablePreviewThumb(true);
+
+                // Make sure to disable the thumbnail preview after the
+                // animation is done to disable the click target.
+                mHandler.removeMessages(CAPTURE_ANIMATION_DONE);
+                mHandler.sendEmptyMessageDelayed(CAPTURE_ANIMATION_DONE,
+                        CaptureAnimManager.getAnimationDuration());
             }
         }
     }
@@ -1457,6 +1471,7 @@
 
     private void startVideoRecording() {
         Log.v(TAG, "startVideoRecording");
+        mUI.enablePreviewThumb(false);
         mActivity.setSwipingEnabled(false);
 
         mActivity.updateStorageSpaceAndHint();
diff --git a/src/com/android/camera/VideoUI.java b/src/com/android/camera/VideoUI.java
index 0c94572..dc23ec8 100644
--- a/src/com/android/camera/VideoUI.java
+++ b/src/com/android/camera/VideoUI.java
@@ -76,6 +76,7 @@
     private VideoController mController;
     private int mZoomMax;
     private List<Integer> mZoomRatios;
+    private View mPreviewThumb;
 
     public VideoUI(CameraActivity activity, VideoController controller, View parent) {
         mActivity = activity;
@@ -227,6 +228,14 @@
                 mGestures.addTouchReceiver(mReviewPlayButton);
             }
         }
+
+        mPreviewThumb = mActivity.findViewById(R.id.preview_thumb);
+        mPreviewThumb.setOnClickListener(new OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                mActivity.gotoGallery();
+            }
+        });
     }
 
     public void setPrefChangedListener(OnPreferenceChangedListener listener) {
@@ -520,4 +529,16 @@
         }
     }
 
+    /**
+     * Enable or disable the preview thumbnail for click events.
+     */
+    public void enablePreviewThumb(boolean enabled) {
+        if (enabled) {
+            mGestures.addTouchReceiver(mPreviewThumb);
+            mPreviewThumb.setVisibility(View.VISIBLE);
+        } else {
+            mGestures.removeTouchReceiver(mPreviewThumb);
+            mPreviewThumb.setVisibility(View.GONE);
+        }
+    }
 }
diff --git a/src/com/android/gallery3d/filtershow/FilterShowActivity.java b/src/com/android/gallery3d/filtershow/FilterShowActivity.java
index e5ddbf5..67ae3b5 100644
--- a/src/com/android/gallery3d/filtershow/FilterShowActivity.java
+++ b/src/com/android/gallery3d/filtershow/FilterShowActivity.java
@@ -721,6 +721,7 @@
                 int position = adapter.undo();
                 mMasterImage.onHistoryItemClick(position);
                 mImageShow.showToast("Undo");
+                backToMain();
                 invalidateViews();
                 return true;
             }
diff --git a/src/com/android/gallery3d/filtershow/category/CategoryAdapter.java b/src/com/android/gallery3d/filtershow/category/CategoryAdapter.java
index 0a65cd9..cfa64bc 100644
--- a/src/com/android/gallery3d/filtershow/category/CategoryAdapter.java
+++ b/src/com/android/gallery3d/filtershow/category/CategoryAdapter.java
@@ -34,7 +34,7 @@
 public class CategoryAdapter extends ArrayAdapter<Action> {
 
     private static final String LOGTAG = "CategoryAdapter";
-    private int mItemHeight = 200;
+    private int mItemHeight;
     private View mContainer;
     private int mItemWidth = ListView.LayoutParams.MATCH_PARENT;
     private boolean mUseFilterIconButton = false;
@@ -43,6 +43,7 @@
 
     public CategoryAdapter(Context context, int textViewResourceId) {
         super(context, textViewResourceId);
+        mItemHeight = (int) (context.getResources().getDisplayMetrics().density * 100);
     }
 
     public CategoryAdapter(Context context) {
@@ -95,7 +96,7 @@
                     new ListView.LayoutParams(mItemWidth, mItemHeight));
             view.setTag(position);
             if (mCategory == MainPanel.LOOKS || mCategory == MainPanel.BORDERS) {
-                view.setBackground(null);
+                view.setBackgroundResource(0);
             }
             return view;
         }
diff --git a/src/com/android/gallery3d/filtershow/category/CategoryView.java b/src/com/android/gallery3d/filtershow/category/CategoryView.java
index 84a973b..059eb10 100644
--- a/src/com/android/gallery3d/filtershow/category/CategoryView.java
+++ b/src/com/android/gallery3d/filtershow/category/CategoryView.java
@@ -44,6 +44,8 @@
     private Paint mSelectPaint;
     CategoryAdapter mAdapter;
     private int mSelectionStroke;
+    private Paint mBorderPaint;
+    private int mBorderStroke;
 
     public static void setTextSize(int size) {
         sTextSize = size;
@@ -63,6 +65,9 @@
         mSelectPaint = new Paint();
         mSelectPaint.setStyle(Paint.Style.FILL);
         mSelectPaint.setColor(res.getColor(R.color.filtershow_category_selection));
+        mBorderPaint = new Paint(mSelectPaint);
+        mBorderPaint.setColor(Color.BLACK);
+        mBorderStroke = mSelectionStroke / 3;
     }
 
     public void drawText(Canvas canvas, String text) {
@@ -91,8 +96,10 @@
                 Bitmap bitmap = mAction.getImage();
                 canvas.drawBitmap(bitmap, 0, 0, mPaint);
                 if (mAdapter.isSelected(this)) {
-                    SelectionRenderer.drawSelection(canvas, 0, 0, bitmap.getWidth(),
-                            bitmap.getHeight(), mSelectionStroke, mSelectPaint);
+                    SelectionRenderer.drawSelection(canvas, 0, 0,
+                            Math.min(bitmap.getWidth(), getWidth()),
+                            Math.min(bitmap.getHeight(), getHeight()),
+                            mSelectionStroke, mSelectPaint, mBorderStroke, mBorderPaint);
                 }
             }
             mPaint.setColor(mBackgroundColor);
diff --git a/src/com/android/gallery3d/filtershow/imageshow/EclipseControl.java b/src/com/android/gallery3d/filtershow/imageshow/EclipseControl.java
index e334fc9..8ceb375 100644
--- a/src/com/android/gallery3d/filtershow/imageshow/EclipseControl.java
+++ b/src/com/android/gallery3d/filtershow/imageshow/EclipseControl.java
@@ -118,6 +118,13 @@
         mScrToImg.mapPoints(point);
         x = point[0];
         y = point[1];
+
+        // Test if the matrix is swapping x and y
+        point[0] = 0;
+        point[1] = 1;
+        mScrToImg.mapVectors(point);
+        boolean swapxy = (point[0] > 0.0f);
+
         int sign = 1;
         switch (handle) {
             case HAN_CENTER:
@@ -129,14 +136,24 @@
             case HAN_NORTH:
                 sign = -1;
             case HAN_SOUTH:
-                float raddy = mDownRadiusY - Math.abs(mDownY - mDownCenterY);
-                oval.setRadiusY(Math.abs(y - oval.getCenterY() + sign * raddy));
+                if (swapxy) {
+                    float raddx = mDownRadiusY - Math.abs(mDownX - mDownCenterY);
+                    oval.setRadiusY(Math.abs(x - oval.getCenterY() + sign * raddx));
+                } else {
+                    float raddy = mDownRadiusY - Math.abs(mDownY - mDownCenterY);
+                    oval.setRadiusY(Math.abs(y - oval.getCenterY() + sign * raddy));
+                }
                 break;
             case HAN_EAST:
                 sign = -1;
             case HAN_WEST:
-                float raddx = mDownRadiusX - Math.abs(mDownX - mDownCenterX);
-                oval.setRadiusX(Math.abs(x - oval.getCenterX() - sign * raddx));
+                if (swapxy) {
+                    float raddy = mDownRadiusX - Math.abs(mDownY - mDownCenterX);
+                    oval.setRadiusX(Math.abs(y - oval.getCenterX() + sign * raddy));
+                } else {
+                    float raddx = mDownRadiusX - Math.abs(mDownX - mDownCenterX);
+                    oval.setRadiusX(Math.abs(x - oval.getCenterX() - sign * raddx));
+                }
                 break;
             case HAN_SE:
             case HAN_NE:
diff --git a/src/com/android/gallery3d/filtershow/ui/SelectionRenderer.java b/src/com/android/gallery3d/filtershow/ui/SelectionRenderer.java
index 1b108bd..ef40c5e 100644
--- a/src/com/android/gallery3d/filtershow/ui/SelectionRenderer.java
+++ b/src/com/android/gallery3d/filtershow/ui/SelectionRenderer.java
@@ -29,4 +29,20 @@
         canvas.drawRect(right - stroke, top, right, bottom, paint);
     }
 
+    public static void drawSelection(Canvas canvas, int left, int top, int right, int bottom,
+            int stroke, Paint selectPaint, int border, Paint borderPaint) {
+        canvas.drawRect(left, top, right, top + stroke, selectPaint);
+        canvas.drawRect(left, bottom - stroke, right, bottom, selectPaint);
+        canvas.drawRect(left, top, left + stroke, bottom, selectPaint);
+        canvas.drawRect(right - stroke, top, right, bottom, selectPaint);
+        canvas.drawRect(left + stroke, top + stroke, right - stroke,
+                top + stroke + border, borderPaint);
+        canvas.drawRect(left + stroke, bottom - stroke - border, right - stroke,
+                bottom - stroke, borderPaint);
+        canvas.drawRect(left + stroke, top + stroke, left + stroke + border,
+                bottom - stroke, borderPaint);
+        canvas.drawRect(right - stroke - border, top + stroke, right - stroke,
+                bottom - stroke, borderPaint);
+    }
+
 }
diff --git a/src/com/android/photos/data/GalleryBitmapPool.java b/src/com/android/photos/data/GalleryBitmapPool.java
index a5a17ed..aca3e4b 100644
--- a/src/com/android/photos/data/GalleryBitmapPool.java
+++ b/src/com/android/photos/data/GalleryBitmapPool.java
@@ -19,7 +19,7 @@
 import android.graphics.Bitmap;
 import android.graphics.Point;
 import android.util.Pools.Pool;
-import android.util.Pools.SimplePool;
+import android.util.Pools.SynchronizedPool;
 
 import com.android.photos.data.SparseArrayBitmapPool.Node;
 
@@ -36,7 +36,7 @@
 
     private int mCapacityBytes;
     private SparseArrayBitmapPool [] mPools;
-    private Pool<Node> mSharedNodePool = new SimplePool<Node>(128);
+    private Pool<Node> mSharedNodePool = new SynchronizedPool<Node>(128);
 
     private GalleryBitmapPool(int capacityBytes) {
         mPools = new SparseArrayBitmapPool[3];