Merge "Added locking to ImageLoader." into gb-ub-photos-arches
diff --git a/src/com/android/gallery3d/filtershow/FilterShowActivity.java b/src/com/android/gallery3d/filtershow/FilterShowActivity.java
index ef0415f..e02a751 100644
--- a/src/com/android/gallery3d/filtershow/FilterShowActivity.java
+++ b/src/com/android/gallery3d/filtershow/FilterShowActivity.java
@@ -159,6 +159,8 @@
         // TODO: get those values from XML.
         ImageZoom.setZoomedSize(getPixelsFromDip(256));
         FramedTextButton.setTextSize((int) getPixelsFromDip(14));
+        FramedTextButton.setTrianglePadding((int) getPixelsFromDip(4));
+        FramedTextButton.setTriangleSize((int) getPixelsFromDip(10));
         ImageShow.setTextSize((int) getPixelsFromDip(12));
         ImageShow.setTextPadding((int) getPixelsFromDip(10));
         ImageShow.setOriginalTextMargin((int) getPixelsFromDip(4));
diff --git a/src/com/android/gallery3d/filtershow/filters/ImageFilterTinyPlanet.java b/src/com/android/gallery3d/filtershow/filters/ImageFilterTinyPlanet.java
index 423e558..effd89e 100644
--- a/src/com/android/gallery3d/filtershow/filters/ImageFilterTinyPlanet.java
+++ b/src/com/android/gallery3d/filtershow/filters/ImageFilterTinyPlanet.java
@@ -22,6 +22,7 @@
 
 import com.adobe.xmp.XMPException;
 import com.adobe.xmp.XMPMeta;
+import com.android.gallery3d.app.Log;
 import com.android.gallery3d.filtershow.presets.ImagePreset;
 
 /**
@@ -90,8 +91,17 @@
             }
         }
 
-        Bitmap mBitmapOut = Bitmap.createBitmap(
-                outputSize, outputSize, Bitmap.Config.ARGB_8888);
+        Bitmap mBitmapOut = null;
+        while (mBitmapOut == null) {
+            try {
+                mBitmapOut = Bitmap.createBitmap(
+                        outputSize, outputSize, Bitmap.Config.ARGB_8888);
+            } catch (java.lang.OutOfMemoryError e) {
+                System.gc();
+                outputSize /= 2;
+                Log.v(TAG, "No memory to create Full Tiny Planet create half");
+            }
+        }
         nativeApplyFilter(bitmapIn, bitmapIn.getWidth(), bitmapIn.getHeight(), mBitmapOut,
                 outputSize, mParameter / 100f, mAngle);
         return mBitmapOut;
@@ -112,10 +122,19 @@
 
             // Make sure the intermediate image has the similar size to the
             // input.
+            Bitmap paddedBitmap = null;
             float scale = intermediateWidth / (float) fullPanoWidth;
-            Bitmap paddedBitmap = Bitmap.createBitmap(
+            while (paddedBitmap == null) {
+                try {
+                    paddedBitmap = Bitmap.createBitmap(
                     (int) (fullPanoWidth * scale), (int) (fullPanoHeight * scale),
                     Bitmap.Config.ARGB_8888);
+                } catch (java.lang.OutOfMemoryError e) {
+                    System.gc();
+                    scale /= 2;
+                    Log.v(TAG, "No memory to create Full Tiny Planet create half");
+                }
+            }
             Canvas paddedCanvas = new Canvas(paddedBitmap);
 
             int right = left + croppedAreaWidth;
diff --git a/src/com/android/gallery3d/filtershow/ui/FramedTextButton.java b/src/com/android/gallery3d/filtershow/ui/FramedTextButton.java
index 17453d0..c717b6e 100644
--- a/src/com/android/gallery3d/filtershow/ui/FramedTextButton.java
+++ b/src/com/android/gallery3d/filtershow/ui/FramedTextButton.java
@@ -20,6 +20,7 @@
 import android.content.res.TypedArray;
 import android.graphics.Canvas;
 import android.graphics.Paint;
+import android.graphics.Path;
 import android.graphics.Rect;
 import android.util.AttributeSet;
 import android.widget.ImageButton;
@@ -32,6 +33,10 @@
     private static int mTextSize = 24;
     private static int mTextPadding = 20;
     private static Paint gPaint = new Paint();
+    private static Path gPath = new Path();
+    private static int mTrianglePadding = 2;
+    private static int mTriangleSize = 30;
+
     private Context mContext = null;
 
     public static void setTextSize(int value) {
@@ -42,6 +47,14 @@
         mTextPadding = value;
     }
 
+    public static void setTrianglePadding(int value) {
+        mTrianglePadding = value;
+    }
+
+    public static void setTriangleSize(int value) {
+        mTriangleSize = value;
+    }
+
     public void setText(String text) {
         mText = text;
         invalidate();
@@ -84,11 +97,25 @@
 
     @Override
     public void onDraw(Canvas canvas) {
-        gPaint.setARGB(255, 255, 255, 255);
+        gPaint.setARGB(96, 255, 255, 255);
         gPaint.setStrokeWidth(2);
         gPaint.setStyle(Paint.Style.STROKE);
-        canvas.drawRect(mTextPadding, mTextPadding, getWidth() - mTextPadding,
-                getHeight() - mTextPadding, gPaint);
+        int w = getWidth();
+        int h = getHeight();
+        canvas.drawRect(mTextPadding, mTextPadding, w - mTextPadding,
+                h - mTextPadding, gPaint);
+        gPath.reset();
+        gPath.moveTo(w - mTextPadding - mTrianglePadding - mTriangleSize,
+                     h - mTextPadding - mTrianglePadding);
+        gPath.lineTo(w - mTextPadding - mTrianglePadding,
+                     h - mTextPadding - mTrianglePadding - mTriangleSize);
+        gPath.lineTo(w - mTextPadding - mTrianglePadding,
+                     h - mTextPadding - mTrianglePadding);
+        gPath.close();
+        gPaint.setARGB(128, 255, 255, 255);
+        gPaint.setStrokeWidth(1);
+        gPaint.setStyle(Paint.Style.FILL_AND_STROKE);
+        canvas.drawPath(gPath, gPaint);
         if (mText != null) {
             gPaint.reset();
             gPaint.setARGB(255, 255, 255, 255);
@@ -96,8 +123,8 @@
             float textWidth = gPaint.measureText(mText);
             Rect bounds = new Rect();
             gPaint.getTextBounds(mText, 0, mText.length(), bounds);
-            int x = (int) ((getWidth() - textWidth) / 2);
-            int y = (getHeight() + bounds.height()) / 2;
+            int x = (int) ((w - textWidth) / 2);
+            int y = (h + bounds.height()) / 2;
 
             canvas.drawText(mText, x, y, gPaint);
         }