OSDN Git Service

(DO NOT MERGE)
authorOwen Lin <owenlin@google.com>
Tue, 13 Sep 2011 12:48:13 +0000 (20:48 +0800)
committerWei Huang <weih@google.com>
Mon, 26 Sep 2011 20:52:26 +0000 (13:52 -0700)
Add a hard limit on the size of the widget images.

There is a limit on the size of the data transfered by binder.
For now, we just add a hard limit (360 pixel) to ensure the widget's image
can be passed by binder.

Also adjust the size of widget to make it looks better.

Fix a bug in DecodeUtils which cause OOM for a image in size 12200x1920.
In that case, we should generate a screen nail of size 640x101 instead of
4066x640.

Change-Id: Ie42805d9e9e579b063fc99f5130ec433d695b8c9
fix: 5273271

gallerycommon/src/com/android/gallery3d/common/BitmapUtils.java
res/values-xlarge/dimensions.xml
res/values/dimensions.xml
res/xml/widget_info.xml
src/com/android/gallery3d/data/DecodeUtils.java
src/com/android/gallery3d/gadget/WidgetConfigure.java

index aaf4f66..060d7f3 100644 (file)
@@ -85,7 +85,7 @@ public class BitmapUtils {
     // minSideLength long. If that's not possible, return 1.
     public static int computeSampleSizeLarger(int w, int h,
             int minSideLength) {
-        int initialSize = Math.min(w / minSideLength, h / minSideLength);
+        int initialSize = Math.max(w / minSideLength, h / minSideLength);
         if (initialSize <= 1) return 1;
 
         return initialSize <= 8
index 4ead09c..cc0a76a 100644 (file)
@@ -15,9 +15,9 @@
 -->
 <resources>
     <dimen name="appwidget_width">240dp</dimen>
-    <dimen name="appwidget_height">200dp</dimen>
-    <dimen name="stack_photo_width">230dp</dimen>
-    <dimen name="stack_photo_height">190dp</dimen>
+    <dimen name="appwidget_height">240dp</dimen>
+    <dimen name="stack_photo_width">220dp</dimen>
+    <dimen name="stack_photo_height">165dp</dimen>
 
     <!-- configuration for album set page -->
     <dimen name="albumset_display_item_size">144dp</dimen>
index 90c3064..7af4f1f 100644 (file)
      limitations under the License.
 -->
 <resources>
-    <dimen name="appwidget_width">146dp</dimen>
-    <dimen name="appwidget_height">146dp</dimen>
-    <dimen name="stack_photo_width">140dp</dimen>
-    <dimen name="stack_photo_height">110dp</dimen>
+    <dimen name="appwidget_width">180dp</dimen>
+    <dimen name="appwidget_height">180dp</dimen>
+    <dimen name="stack_photo_width">160dp</dimen>
+    <dimen name="stack_photo_height">120dp</dimen>
 
     <!-- configuration for album set page -->
     <dimen name="albumset_display_item_size">80dp</dimen>
index e03124c..4aa460f 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
-        android:minWidth="180dp"
-        android:minHeight="180dp"
+        android:minWidth="@dimen/appwidget_width"
+        android:minHeight="@dimen/appwidget_height"
         android:updatePeriodMillis="86400000"
         android:previewImage="@drawable/preview"
         android:initialLayout="@layout/appwidget_main"
index d2b4ebc..afd5faa 100644 (file)
@@ -110,7 +110,7 @@ public class DecodeUtils {
      * Decodes the bitmap from the given byte array if the image size is larger than the given
      * requirement.
      *
-     * Note: The returned image may be resized down. However, both width and heigh must be
+     * Note: The returned image may be resized down. However, both width and height must be
      * larger than the <code>targetSize</code>.
      */
     public static Bitmap requestDecodeIfBigEnough(JobContext jc, byte[] data,
index 747cc3a..a871e24 100644 (file)
@@ -48,6 +48,7 @@ public class WidgetConfigure extends Activity {
     // Note: There is also a limit on the size of data that can be
     // passed in Binder's transaction.
     private static float WIDGET_SCALE_FACTOR = 1.5f;
+    private static int MAX_WIDGET_SIDE = 360;
 
     private int mAppWidgetId = -1;
     private int mWidgetType = 0;
@@ -115,10 +116,18 @@ public class WidgetConfigure extends Activity {
 
     private void setChoosenPhoto(Intent data) {
         Resources res = getResources();
-        int widgetWidth = Math.round(WIDGET_SCALE_FACTOR
-                * res.getDimension(R.dimen.appwidget_width));
-        int widgetHeight = Math.round(WIDGET_SCALE_FACTOR
-                * res.getDimension(R.dimen.appwidget_height));
+
+        float width = res.getDimension(R.dimen.appwidget_width);
+        float height = res.getDimension(R.dimen.appwidget_height);
+
+        // We try to crop a larger image (by scale factor), but there is still
+        // a bound on the binder limit.
+        float scale = Math.min(WIDGET_SCALE_FACTOR,
+                MAX_WIDGET_SIDE / Math.max(width, height));
+
+        int widgetWidth = Math.round(width * scale);
+        int widgetHeight = Math.round(height * scale);
+
         mPickedItem = data.getData();
         Intent request = new Intent(CropImage.ACTION_CROP, mPickedItem)
                 .putExtra(CropImage.KEY_OUTPUT_X, widgetWidth)