OSDN Git Service

Refactoring button class. Minor bug fixes.
authorRuben Brunk <rubenbrunk@google.com>
Wed, 19 Dec 2012 18:47:49 +0000 (10:47 -0800)
committerRuben Brunk <rubenbrunk@google.com>
Sat, 12 Jan 2013 01:52:36 +0000 (17:52 -0800)
Bug: 7875246
Bug: 7459118

Change-Id: Ic1099a7ae0feeeb16c8be3035f9726805149666e

16 files changed:
res/layout/filtericonbutton.xml [new file with mode: 0644]
res/layout/filtershow_activity.xml
res/values/iconbutton_styles.xml [new file with mode: 0644]
src/com/android/gallery3d/filtershow/FilterShowActivity.java
src/com/android/gallery3d/filtershow/PanelController.java
src/com/android/gallery3d/filtershow/filters/ImageFilter.java
src/com/android/gallery3d/filtershow/filters/ImageFilterBorder.java
src/com/android/gallery3d/filtershow/filters/ImageFilterDownsample.java
src/com/android/gallery3d/filtershow/filters/ImageFilterFx.java
src/com/android/gallery3d/filtershow/filters/ImageFilterParametricBorder.java
src/com/android/gallery3d/filtershow/imageshow/ImageBorder.java [deleted file]
src/com/android/gallery3d/filtershow/imageshow/ImageSmallBorder.java [deleted file]
src/com/android/gallery3d/filtershow/imageshow/ImageSmallFilter.java [deleted file]
src/com/android/gallery3d/filtershow/ui/FilterIconButton.java [new file with mode: 0644]
src/com/android/gallery3d/filtershow/ui/IconButton.java [new file with mode: 0644]
src/com/android/gallery3d/filtershow/ui/ImageButtonTitle.java [deleted file]

diff --git a/res/layout/filtericonbutton.xml b/res/layout/filtericonbutton.xml
new file mode 100644 (file)
index 0000000..8fc98e3
--- /dev/null
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2012 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<com.android.gallery3d.filtershow.ui.FilterIconButton
+    style="@style/FilterIconButton" />
index dfd669f..35e83bc 100644 (file)
@@ -16,6 +16,7 @@
 -->
 
 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:iconbutton="http://schemas.android.com/apk/res/com.android.gallery3d"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:id="@+id/mainView">
                 android:layerType="software"
                 android:visibility="gone" />
 
-            <com.android.gallery3d.filtershow.imageshow.ImageBorder
-                android:id="@+id/imageBorder"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:visibility="gone" />
-
             <com.android.gallery3d.filtershow.imageshow.ImageZoom
                 android:id="@+id/imageZoom"
                 android:layout_width="match_parent"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:visibility="gone" />
-            <!--
-            <ImageButton
-                android:id="@+id/showOriginalButton"
-                android:layout_width="64dip"
-                android:layout_height="64dip"
-                android:layout_gravity="bottom"
-                android:scaleType="centerInside"
-                android:src="@drawable/filtershow_button_show_original" />
-                 -->
 
             <com.android.gallery3d.filtershow.CenteredLinearLayout
               xmlns:custom="http://schemas.android.com/apk/res/com.android.gallery3d"
                     android:id="@+id/listGeometry"
                     android:layout_width="wrap_content"
                     android:layout_height="fill_parent"
-                    android:layout_gravity="center"
+                    android:layout_gravity="left"
                     android:orientation="horizontal">
 
-                    <com.android.gallery3d.filtershow.ui.ImageButtonTitle
+                    <com.android.gallery3d.filtershow.ui.IconButton
                         android:id="@+id/straightenButton"
-                        style="@style/FilterShowBottomButton"
-                        android:src="@drawable/filtershow_button_geometry_straighten"
+                        android:layout_height="match_parent"
+                        style="@style/IconButton"
+                        android:drawableTop="@drawable/filtershow_button_geometry_straighten"
                         android:text="@string/straighten" />
 
-                    <com.android.gallery3d.filtershow.ui.ImageButtonTitle
+                    <com.android.gallery3d.filtershow.ui.IconButton
                         android:id="@+id/cropButton"
-                        style="@style/FilterShowBottomButton"
-                        android:src="@drawable/filtershow_button_geometry_crop"
+                        android:layout_height="match_parent"
+                        style="@style/IconButton"
+                        android:drawableTop="@drawable/filtershow_button_geometry_crop"
                         android:text="@string/crop" />
 
-                    <com.android.gallery3d.filtershow.ui.ImageButtonTitle
+                    <com.android.gallery3d.filtershow.ui.IconButton
                         android:id="@+id/rotateButton"
-                        style="@style/FilterShowBottomButton"
-                        android:src="@drawable/filtershow_button_geometry_rotate"
+                        android:layout_height="match_parent"
+                        style="@style/IconButton"
+                        android:drawableTop="@drawable/filtershow_button_geometry_rotate"
                         android:text="@string/rotate" />
 
-                    <com.android.gallery3d.filtershow.ui.ImageButtonTitle
+                    <com.android.gallery3d.filtershow.ui.IconButton
                         android:id="@+id/flipButton"
-                        style="@style/FilterShowBottomButton"
-                        android:src="@drawable/filtershow_button_geometry_flip"
+                        android:layout_height="match_parent"
+                        style="@style/IconButton"
+                        android:drawableTop="@drawable/filtershow_button_geometry_flip"
                         android:text="@string/mirror" />
 
-                    <com.android.gallery3d.filtershow.ui.ImageButtonTitle
+                    <com.android.gallery3d.filtershow.ui.IconButton
                         android:id="@+id/redEyeButton"
-                        style="@style/FilterShowBottomButton"
-                        android:src="@drawable/photoeditor_effect_redeye"
+                        android:layout_height="match_parent"
+                        style="@style/IconButton"
+                        android:drawableTop="@drawable/photoeditor_effect_redeye"
                         android:text="@string/redeye" />
 
                 </LinearLayout>
             <HorizontalScrollView
                 android:id="@+id/colorsFxList"
                 android:layout_width="fill_parent"
-                android:layout_height="@dimen/thumbnail_size"
+                android:layout_height="wrap_content"
                 android:background="@color/background_main_toolbar"
                 android:visibility="gone"
                 android:scrollbars="none" >
                 <LinearLayout
                     android:id="@+id/listColorsFx"
                     android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
+                    android:layout_height="@dimen/thumbnail_size"
+                    android:background="@color/background_main_toolbar"
                     android:layout_marginLeft="@dimen/thumbnail_margin"
                     android:orientation="horizontal" >
 
diff --git a/res/values/iconbutton_styles.xml b/res/values/iconbutton_styles.xml
new file mode 100644 (file)
index 0000000..e33460a
--- /dev/null
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2012 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources>
+    <style name="IconButton">
+        <item name="android:layout_width">96dp</item>
+        <item name="android:layout_height">match_parent</item>
+        <item name="android:background">@drawable/filtershow_button_background</item>
+        <item name="android:textColor">@android:color/white</item>
+        <item name="android:textSize">14dp</item>
+        <item name="android:scaleType">centerInside</item>
+        <item name="android:gravity">center</item>
+        <item name="android:padding">6dp</item>
+        <item name="android:drawablePadding">6dp</item>
+        <item name="android:ellipsize">marquee</item>
+        <item name="android:marqueeRepeatLimit">marquee_forever</item>
+        <item name="android:singleLine">true</item>
+    </style>
+
+    <style name="FilterIconButton">
+        <item name="android:layout_width">70dp</item>
+        <item name="android:layout_height">match_parent</item>
+        <item name="android:background">@drawable/filtershow_button_background</item>
+        <item name="android:textColor">@android:color/white</item>
+        <item name="android:textSize">13dp</item>
+        <item name="android:scaleType">centerInside</item>
+        <item name="android:gravity">center</item>
+        <item name="android:paddingLeft">3dp</item>
+        <item name="android:paddingRight">3dp</item>
+        <item name="android:paddingTop">6dp</item>
+        <item name="android:paddingBottom">6dp</item>
+        <item name="android:ellipsize">marquee</item>
+        <item name="android:marqueeRepeatLimit">marquee_forever</item>
+        <item name="android:singleLine">true</item>
+    </style>
+</resources>
index 8ac6f82..b89ab81 100644 (file)
@@ -22,6 +22,7 @@ import android.app.Activity;
 import android.app.ProgressDialog;
 import android.app.WallpaperManager;
 import android.content.ContentValues;
+import android.content.Context;
 import android.content.Intent;
 import android.content.res.Configuration;
 import android.content.res.Resources;
@@ -38,6 +39,7 @@ import android.util.DisplayMetrics;
 import android.util.Log;
 import android.util.TypedValue;
 import android.view.Display;
+import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.View;
@@ -52,6 +54,7 @@ import android.widget.SeekBar;
 import android.widget.ShareActionProvider;
 import android.widget.ShareActionProvider.OnShareTargetSelectedListener;
 import android.widget.Toast;
+import android.text.TextUtils;
 
 import com.android.gallery3d.R;
 import com.android.gallery3d.data.LocalAlbum;
@@ -63,23 +66,21 @@ import com.android.gallery3d.filtershow.filters.ImageFilterFx;
 import com.android.gallery3d.filtershow.filters.ImageFilterParametricBorder;
 import com.android.gallery3d.filtershow.filters.ImageFilterRS;
 import com.android.gallery3d.filtershow.filters.ImageFilterRedEye;
-import com.android.gallery3d.filtershow.imageshow.ImageBorder;
 import com.android.gallery3d.filtershow.imageshow.ImageCrop;
 import com.android.gallery3d.filtershow.imageshow.ImageDraw;
 import com.android.gallery3d.filtershow.imageshow.ImageFlip;
 import com.android.gallery3d.filtershow.imageshow.ImageRedEyes;
 import com.android.gallery3d.filtershow.imageshow.ImageRotate;
 import com.android.gallery3d.filtershow.imageshow.ImageShow;
-import com.android.gallery3d.filtershow.imageshow.ImageSmallBorder;
-import com.android.gallery3d.filtershow.imageshow.ImageSmallFilter;
 import com.android.gallery3d.filtershow.imageshow.ImageStraighten;
 import com.android.gallery3d.filtershow.imageshow.ImageTinyPlanet;
 import com.android.gallery3d.filtershow.imageshow.ImageZoom;
 import com.android.gallery3d.filtershow.presets.ImagePreset;
 import com.android.gallery3d.filtershow.provider.SharedImageProvider;
 import com.android.gallery3d.filtershow.tools.SaveCopyTask;
+import com.android.gallery3d.filtershow.ui.FilterIconButton;
+import com.android.gallery3d.filtershow.ui.IconButton;
 import com.android.gallery3d.filtershow.ui.FramedTextButton;
-import com.android.gallery3d.filtershow.ui.ImageButtonTitle;
 import com.android.gallery3d.filtershow.ui.ImageCurves;
 import com.android.gallery3d.filtershow.ui.Spline;
 import com.android.gallery3d.util.GalleryUtils;
@@ -104,7 +105,6 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
     private ImageLoader mImageLoader = null;
     private ImageShow mImageShow = null;
     private ImageCurves mImageCurves = null;
-    private ImageBorder mImageBorders = null;
     private ImageRedEyes mImageRedEyes = null;
     private ImageDraw mImageDraw = null;
     private ImageStraighten mImageStraighten = null;
@@ -126,7 +126,12 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
     private ImageButton mGeometryButton = null;
     private ImageButton mColorsButton = null;
 
-    private ImageSmallFilter mCurrentImageSmallFilter = null;
+    private LinearLayout listColors = null;
+    private LinearLayout listFilters = null;
+    private LinearLayout listBorders = null;
+
+    private ImageFilter mCurrentFilter = null;
+
     private static final int SELECT_PICTURE = 1;
     private static final String LOGTAG = "FilterShowActivity";
     protected static final boolean ANIMATE_PANELS = true;
@@ -148,8 +153,9 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
     private static final int SEEK_BAR_MAX = 600;
 
     private LoadBitmapTask mLoadBitmapTask;
-    private ImageSmallFilter mNullFxFilter;
-    private ImageSmallFilter mNullBorderFilter;
+    private FilterIconButton mNullFxFilter;
+    private FilterIconButton mNullBorderFilter;
+    private int mIconSeedSize = 140;
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -158,8 +164,6 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
         ImageFilterRS.setRenderScriptContext(this);
 
         ImageShow.setDefaultBackgroundColor(getResources().getColor(R.color.background_screen));
-        ImageSmallFilter.setDefaultBackgroundColor(getResources().getColor(
-                R.color.background_main_toolbar));
         // TODO: get those values from XML.
         ImageZoom.setZoomedSize(getPixelsFromDip(256));
         FramedTextButton.setTextSize((int) getPixelsFromDip(14));
@@ -170,10 +174,8 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
         ImageShow.setOriginalTextMargin((int) getPixelsFromDip(4));
         ImageShow.setOriginalTextSize((int) getPixelsFromDip(18));
         ImageShow.setOriginalText(getResources().getString(R.string.original_picture_text));
-        ImageButtonTitle.setTextSize((int) getPixelsFromDip(12));
-        ImageButtonTitle.setTextPadding((int) getPixelsFromDip(10));
-        ImageSmallFilter.setMargin((int) getPixelsFromDip(3));
-        ImageSmallFilter.setTextMargin((int) getPixelsFromDip(4));
+        mIconSeedSize = getResources().getDimensionPixelSize(R.dimen.thumbnail_size);
+
         Drawable curveHandle = getResources().getDrawable(R.drawable.camera_crop);
         int curveHandleSize = (int) getResources().getDimension(R.dimen.crop_indicator_size);
         Spline.setCurveHandle(curveHandle, curveHandleSize);
@@ -194,13 +196,12 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
 
         mImageLoader = new ImageLoader(this, getApplicationContext());
 
-        LinearLayout listFilters = (LinearLayout) findViewById(R.id.listFilters);
-        LinearLayout listBorders = (LinearLayout) findViewById(R.id.listBorders);
-        LinearLayout listColors = (LinearLayout) findViewById(R.id.listColorsFx);
+        listFilters = (LinearLayout) findViewById(R.id.listFilters);
+        listBorders = (LinearLayout) findViewById(R.id.listBorders);
+        listColors = (LinearLayout) findViewById(R.id.listColorsFx);
 
         mImageShow = (ImageShow) findViewById(R.id.imageShow);
         mImageCurves = (ImageCurves) findViewById(R.id.imageCurves);
-        mImageBorders = (ImageBorder) findViewById(R.id.imageBorder);
         mImageStraighten = (ImageStraighten) findViewById(R.id.imageStraighten);
         mImageZoom = (ImageZoom) findViewById(R.id.imageZoom);
         mImageCrop = (ImageCrop) findViewById(R.id.imageCrop);
@@ -215,7 +216,6 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
         ImageCrop.setMinCropSize((int) getPixelsFromDip(55));
         mImageViews.add(mImageShow);
         mImageViews.add(mImageCurves);
-        mImageViews.add(mImageBorders);
         mImageViews.add(mImageStraighten);
         mImageViews.add(mImageZoom);
         mImageViews.add(mImageCrop);
@@ -251,8 +251,6 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
         mImageShow.setImageLoader(mImageLoader);
         mImageCurves.setImageLoader(mImageLoader);
         mImageCurves.setMaster(mImageShow);
-        mImageBorders.setImageLoader(mImageLoader);
-        mImageBorders.setMaster(mImageShow);
         mImageStraighten.setImageLoader(mImageLoader);
         mImageStraighten.setMaster(mImageShow);
         mImageZoom.setImageLoader(mImageLoader);
@@ -275,7 +273,6 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
 
         mPanelController.addImageView(findViewById(R.id.imageShow));
         mPanelController.addImageView(findViewById(R.id.imageCurves));
-        mPanelController.addImageView(findViewById(R.id.imageBorder));
         mPanelController.addImageView(findViewById(R.id.imageStraighten));
         mPanelController.addImageView(findViewById(R.id.imageCrop));
         mPanelController.addImageView(findViewById(R.id.imageRotate));
@@ -301,21 +298,9 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
         FiltersManager.addFilters(filters, mImageLoader);
 
         for (ImageFilter filter : filters) {
-            ImageSmallFilter fView = new ImageSmallFilter(this);
-            filter.setParameter(filter.getPreviewParameter());
+            filter.setParameter(filter.getDefaultParameter());
             filter.setName(getString(filter.getTextId()));
-            fView.setImageFilter(filter);
-            fView.setController(this);
-            fView.setImageLoader(mImageLoader);
-            fView.setId(filter.getButtonId());
-            if (filter.getOverlayBitmaps() != 0) {
-                Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
-                        filter.getOverlayBitmaps());
-                fView.setOverlayBitmap(bitmap);
-            }
-            mPanelController.addComponent(mColorsButton, fView);
-            mPanelController.addFilter(filter);
-            listColors.addView(fView);
+            setupFilterButton(filter, listColors, mColorsButton);
         }
         mPanelController.addFilter(new ImageFilterRedEye());
 
@@ -448,6 +433,36 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
                 cannotLoadImage();
             }
 
+            mImageShow.requestFilteredImages();
+            Bitmap bmap = mImageShow.getFilteredImage();
+            if (bmap != null && bmap.getWidth() > 0 && bmap.getHeight() > 0) {
+                float w = bmap.getWidth();
+                float h = bmap.getHeight();
+                float f = mIconSeedSize / Math.min(w, h);
+                w = w * f;
+                h = h * f;
+                bmap = Bitmap.createScaledBitmap(bmap, (int) w, (int) h, true);
+
+                int num_colors_buttons = listColors.getChildCount();
+                for (int i = 0; i < num_colors_buttons; i++) {
+                    FilterIconButton b = (FilterIconButton) listColors.getChildAt(i);
+
+                    b.setIcon(bmap);
+                }
+                int num_filters_buttons = listFilters.getChildCount();
+                for (int i = 0; i < num_filters_buttons; i++) {
+                    FilterIconButton b = (FilterIconButton) listFilters.getChildAt(i);
+
+                    b.setIcon(bmap);
+                }
+                int num_borders_buttons = listBorders.getChildCount();
+                for (int i = 0; i < num_borders_buttons; i++) {
+                    FilterIconButton b = (FilterIconButton) listBorders.getChildAt(i);
+
+                    b.setIcon(bmap);
+                }
+
+            }
             mLoadBitmapTask = null;
             super.onPostExecute(result);
         }
@@ -648,6 +663,23 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
             mSaveButton.setEnabled(enable);
     }
 
+    public FilterIconButton setupFilterButton(ImageFilter filter, LinearLayout panel, View button) {
+        LayoutInflater inflater =
+                (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+        FilterIconButton icon = (FilterIconButton) inflater.inflate(R.layout.filtericonbutton,
+                panel, false);
+        String text = filter.getName();
+        if (filter instanceof ImageFilterBorder || filter instanceof ImageFilterParametricBorder) {
+            text = "";
+        }
+        icon.setup(text, filter, this, panel);
+        icon.setId(filter.getButtonId());
+        mPanelController.addComponent(button, icon);
+        mPanelController.addFilter(filter);
+        panel.addView(icon);
+        return icon;
+    }
+
     private void fillListImages(LinearLayout listFilters) {
         // TODO: use listview
         // TODO: load the filters straight from the filesystem
@@ -681,34 +713,21 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
 
         ImagePreset preset = new ImagePreset(getString(R.string.history_original)); // empty
         preset.setImageLoader(mImageLoader);
-        mNullFxFilter = new ImageSmallFilter(this);
-
-        mNullFxFilter.setSelected(true);
-        mCurrentImageSmallFilter = mNullFxFilter;
-
-        mNullFxFilter.setImageFilter(new ImageFilterFx(null, getString(R.string.none)));
-
-        mNullFxFilter.setController(this);
-        mNullFxFilter.setImageLoader(mImageLoader);
-        listFilters.addView(mNullFxFilter);
-        ImageSmallFilter previousFilter = mNullFxFilter;
 
         BitmapFactory.Options o = new BitmapFactory.Options();
         o.inScaled = false;
 
         for (int i = 0; i < drawid.length; i++) {
             Bitmap b = BitmapFactory.decodeResource(getResources(), drawid[i], o);
-            fxArray[p++] = new ImageFilterFx(b, getString(fxNameid[i]));
+            fxArray[p++] = new ImageFilterFx(b, getString(fxNameid[i]), fxNameid[i]);
         }
-        ImageSmallFilter filter;
+
+        ImageFilterFx nullFilter = new ImageFilterFx(null, getString(R.string.none), R.string.none);
+        mNullFxFilter = setupFilterButton(nullFilter, listFilters, mFxButton);
+        mNullFxFilter.setSelected(true);
+
         for (int i = 0; i < p; i++) {
-            filter = new ImageSmallFilter(this);
-            filter.setImageFilter(fxArray[i]);
-            filter.setController(this);
-            filter.setNulfilter(mNullFxFilter);
-            filter.setImageLoader(mImageLoader);
-            listFilters.addView(filter);
-            previousFilter = filter;
+            setupFilterButton(fxArray[i], listFilters, mFxButton);
         }
 
         // Default preset (original)
@@ -743,22 +762,13 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
         borders[p++] = new ImageFilterParametricBorder(creamColor, mImageBorderSize,
                 mImageBorderSize);
 
-        ImageSmallFilter previousFilter = null;
         for (int i = 0; i < p; i++) {
-            ImageSmallBorder filter = new ImageSmallBorder(this);
-            if (i == 0) { // save the first to reset it
-                mNullBorderFilter = filter;
-            } else {
-                filter.setNulfilter(mNullBorderFilter);
-            }
             borders[i].setName(getString(R.string.borders));
-            filter.setImageFilter(borders[i]);
-            filter.setController(this);
-            filter.setBorder(true);
-            filter.setImageLoader(mImageLoader);
-            filter.setShowTitle(false);
-            listBorders.addView(filter);
-            previousFilter = filter;
+            FilterIconButton b = setupFilterButton(borders[i], listBorders, mBorderButton);
+            if (i == 0) {
+                mNullBorderFilter = b;
+                mNullBorderFilter.setSelected(true);
+            }
         }
     }
 
@@ -901,10 +911,13 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
         invalidateOptionsMenu();
     }
 
-    void resetHistory() {
+    public void dispatchNullFilterClick() {
         mNullFxFilter.onClick(mNullFxFilter);
         mNullBorderFilter.onClick(mNullBorderFilter);
+    }
 
+    void resetHistory() {
+        dispatchNullFilterClick();
         HistoryAdapter adapter = mImageShow.getHistory();
         adapter.reset();
         ImagePreset original = new ImagePreset(adapter.getItem(0));
@@ -946,43 +959,16 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
                 r.getDisplayMetrics());
     }
 
-    public void useImagePreset(ImageSmallFilter imageSmallFilter, ImagePreset preset) {
-        if (preset == null) {
-            return;
-        }
-
-        if (mCurrentImageSmallFilter != null) {
-            mCurrentImageSmallFilter.setSelected(false);
-        }
-        mCurrentImageSmallFilter = imageSmallFilter;
-        mCurrentImageSmallFilter.setSelected(true);
-
-        ImagePreset copy = new ImagePreset(preset);
-        mImageShow.setImagePreset(copy);
-        if (preset.isFx()) {
-            // if it's an FX we rest the curve adjustment too
-            mImageCurves.resetCurve();
-        }
-        invalidateViews();
-    }
-
-    public void useImageFilter(ImageSmallFilter imageSmallFilter, ImageFilter imageFilter,
-            boolean setBorder) {
-        if (imageFilter == null) {
+    public void useFilter(ImageFilter filter) {
+        if (mCurrentFilter == filter) {
             return;
         }
-
-        if (mCurrentImageSmallFilter != null) {
-            mCurrentImageSmallFilter.setSelected(false);
-        }
-        mCurrentImageSmallFilter = imageSmallFilter;
-        mCurrentImageSmallFilter.setSelected(true);
-
+        mCurrentFilter = filter;
         ImagePreset oldPreset = mImageShow.getImagePreset();
         ImagePreset copy = new ImagePreset(oldPreset);
         // TODO: use a numerical constant instead.
 
-        copy.add(imageFilter);
+        copy.add(filter);
 
         mImageShow.setImagePreset(copy);
         invalidateViews();
@@ -1020,7 +1006,6 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
     private boolean outputted = false;
 
     public void saveImage() {
-        // boolean outputted = false;
         if (mCropExtras != null) {
             if (mCropExtras.getExtraOutput() != null) {
                 mSaveToExtraUri = true;
index c7b294e..12fe5fa 100644 (file)
@@ -29,8 +29,9 @@ import com.android.gallery3d.filtershow.filters.ImageFilter;
 import com.android.gallery3d.filtershow.filters.ImageFilterTinyPlanet;
 import com.android.gallery3d.filtershow.imageshow.ImageCrop;
 import com.android.gallery3d.filtershow.imageshow.ImageShow;
-import com.android.gallery3d.filtershow.imageshow.ImageSmallFilter;
 import com.android.gallery3d.filtershow.presets.ImagePreset;
+import com.android.gallery3d.filtershow.ui.FilterIconButton;
+import com.android.gallery3d.filtershow.ui.FramedTextButton;
 
 import java.util.HashMap;
 import java.util.Vector;
@@ -403,6 +404,7 @@ public class PanelController implements OnClickListener {
         return filter;
     }
 
+    // TODO: remove this.
     public void ensureFilter(String name) {
         ImagePreset preset = getImagePreset();
         ImageFilter filter = preset.getFilter(name);
@@ -433,7 +435,14 @@ public class PanelController implements OnClickListener {
     }
 
     public void showComponent(View view) {
-        if (mUtilityPanel != null && !mUtilityPanel.selected()) {
+
+        boolean doPanelTransition = true;
+        if (view instanceof FilterIconButton) {
+            ImageFilter f = ((FilterIconButton) view).getImageFilter();
+            doPanelTransition = f.showUtilityPanel();
+        }
+
+        if (mUtilityPanel != null && !mUtilityPanel.selected() && doPanelTransition ) {
             Panel current = mPanels.get(mCurrentPanel);
             ViewPropertyAnimator anim1 = current.unselect(-1, VERTICAL_MOVE);
             anim1.start();
@@ -448,8 +457,8 @@ public class PanelController implements OnClickListener {
         }
         mUtilityPanel.hideAccessoryViews();
 
-        if (view instanceof ImageSmallFilter) {
-            ImageSmallFilter component = (ImageSmallFilter) view;
+        if (view instanceof FilterIconButton) {
+            FilterIconButton component = (FilterIconButton) view;
             ImageFilter filter = component.getImageFilter();
             if (filter.getEditingViewId() != 0) {
                 mCurrentImage = showImageView(filter.getEditingViewId());
@@ -460,7 +469,9 @@ public class PanelController implements OnClickListener {
                     mCurrentImage.openUtilityPanel(mUtilityPanel.mAccessoryViewList);
                 }
                 mUtilityPanel.setShowParameter(filter.showParameterValue());
-                ensureFilter(ename);
+                if (filter != null) {
+                    mMasterImage.setCurrentFilter(filter);
+                }
                 mCurrentImage.select();
             }
             return;
index b8f0cf8..46e159a 100644 (file)
@@ -76,6 +76,10 @@ public class ImageFilter implements Cloneable {
         return true;
     }
 
+    public boolean showUtilityPanel() {
+        return true;
+    }
+
     @Override
     public ImageFilter clone() throws CloneNotSupportedException {
         ImageFilter filter = (ImageFilter) super.clone();
@@ -114,6 +118,18 @@ public class ImageFilter implements Cloneable {
         return bitmap;
     }
 
+    /**
+     * Called on small bitmaps to create button icons for each filter.
+     * Override this to provide filter-specific button icons.
+     */
+    public Bitmap iconApply(Bitmap bitmap, float scaleFactor, boolean highQuality) {
+        int param = getParameter();
+        setParameter(getPreviewParameter());
+        bitmap = apply(bitmap, scaleFactor, highQuality);
+        setParameter(param);
+        return bitmap;
+    }
+
     public int getParameter() {
         return mParameter;
     }
index 1d198e4..4fe3082 100644 (file)
@@ -21,7 +21,11 @@ import android.graphics.Canvas;
 import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
 
+import com.android.gallery3d.R;
+
 public class ImageFilterBorder extends ImageFilter {
+    private static final float NINEPATCH_ICON_SCALING = 10;
+    private static final float BITMAP_ICON_SCALING = 1 / 3.0f;
     Drawable mNinePatch = null;
 
     @Override
@@ -40,12 +44,32 @@ public class ImageFilterBorder extends ImageFilter {
     @Override
     public boolean isNil() {
         if (mNinePatch == null) {
-            return  true;
+            return true;
         }
         return false;
     }
 
     @Override
+    public int getTextId() {
+        return R.string.borders;
+    }
+
+    @Override
+    public boolean showParameterValue() {
+        return false;
+    }
+
+    @Override
+    public boolean showEditingControls() {
+        return false;
+    }
+
+    @Override
+    public boolean showUtilityPanel() {
+        return false;
+    }
+
+    @Override
     public boolean same(ImageFilter filter) {
         boolean isBorderFilter = super.same(filter);
         if (!isBorderFilter) {
@@ -66,21 +90,34 @@ public class ImageFilterBorder extends ImageFilter {
         mNinePatch = ninePatch;
     }
 
-    @Override
-    public Bitmap apply(Bitmap bitmap, float scaleFactor, boolean highQuality) {
-        if (mNinePatch == null) {
-            return bitmap;
-        }
-
+    public Bitmap applyHelper(Bitmap bitmap, float scale1, float scale2 ) {
         int w = bitmap.getWidth();
         int h = bitmap.getHeight();
-
-        float scale = scaleFactor * 2.0f;
-        Rect bounds = new Rect(0, 0, (int) (w / scale), (int) (h / scale));
+        Rect bounds = new Rect(0, 0, (int) (w * scale1), (int) (h * scale1));
         Canvas canvas = new Canvas(bitmap);
-        canvas.scale(scale, scale);
+        canvas.scale(scale2, scale2);
         mNinePatch.setBounds(bounds);
         mNinePatch.draw(canvas);
         return bitmap;
     }
+
+    @Override
+    public Bitmap apply(Bitmap bitmap, float scaleFactor, boolean highQuality) {
+        if (mNinePatch == null) {
+            return bitmap;
+        }
+        float scale2 = scaleFactor * 2.0f;
+        float scale1 = 1 / scale2;
+        return applyHelper(bitmap, scale1, scale2);
+    }
+
+    @Override
+    public Bitmap iconApply(Bitmap bitmap, float scaleFactor, boolean highQuality) {
+        if (mNinePatch == null) {
+            return bitmap;
+        }
+        float scale1 = NINEPATCH_ICON_SCALING;
+        float scale2 = BITMAP_ICON_SCALING;
+        return applyHelper(bitmap, scale1, scale2);
+    }
 }
index 60a18b7..784028a 100644 (file)
 package com.android.gallery3d.filtershow.filters;
 
 import android.graphics.Bitmap;
+import android.graphics.Canvas;
 import android.graphics.Rect;
 
 import com.android.gallery3d.R;
 import com.android.gallery3d.filtershow.cache.ImageLoader;
 
 public class ImageFilterDownsample extends ImageFilter {
+    private static final int ICON_DOWNSAMPLE_FRACTION = 8;
     private ImageLoader mImageLoader;
 
     public ImageFilterDownsample(ImageLoader loader) {
@@ -63,7 +65,7 @@ public class ImageFilterDownsample extends ImageFilter {
 
         if (p > 0 && p < 100) {
             // scale preview to same size as the resulting bitmap from a "save"
-            int newWidth =  orig_w * p / 100;
+            int newWidth = orig_w * p / 100;
             int newHeight = orig_h * p / 100;
 
             // only scale preview if preview isn't already scaled enough
@@ -78,4 +80,17 @@ public class ImageFilterDownsample extends ImageFilter {
         }
         return bitmap;
     }
+
+    @Override
+    public Bitmap iconApply(Bitmap bitmap, float scaleFactor, boolean highQuality) {
+        int w = bitmap.getWidth();
+        int h = bitmap.getHeight();
+        Bitmap ret = Bitmap.createScaledBitmap(bitmap, w / ICON_DOWNSAMPLE_FRACTION, h
+                / ICON_DOWNSAMPLE_FRACTION, false);
+        Rect dst = new Rect(0, 0, w, h);
+        Rect src = new Rect(0, 0, w / ICON_DOWNSAMPLE_FRACTION, h / ICON_DOWNSAMPLE_FRACTION);
+        Canvas c = new Canvas(bitmap);
+        c.drawBitmap(ret, src, dst, null);
+        return bitmap;
+    }
 }
index 04d7641..345202f 100644 (file)
@@ -21,10 +21,18 @@ import android.graphics.Bitmap;
 public class ImageFilterFx extends ImageFilter {
     private static final String TAG = "ImageFilterFx";
     Bitmap fxBitmap;
-    public ImageFilterFx(Bitmap fxBitmap,String name) {
+    int mNameResource = 0;
+
+    public ImageFilterFx(Bitmap fxBitmap, String name, int nameResource) {
         setFilterType(TYPE_FX);
         mName = name;
         this.fxBitmap = fxBitmap;
+        mNameResource = nameResource;
+    }
+
+    @Override
+    public int getTextId() {
+        return mNameResource;
     }
 
     @Override
@@ -42,6 +50,21 @@ public class ImageFilterFx extends ImageFilter {
         return true;
     }
 
+    @Override
+    public boolean showParameterValue() {
+        return false;
+    }
+
+    @Override
+    public boolean showEditingControls() {
+        return false;
+    }
+
+    @Override
+    public boolean showUtilityPanel() {
+        return false;
+    }
+
     native protected void nativeApplyFilter(Bitmap bitmap, int w, int h,Bitmap  fxBitmap, int fxw, int fxh);
 
     @Override
index ade3cb2..681eb12 100644 (file)
@@ -23,6 +23,8 @@ import android.graphics.Paint;
 import android.graphics.Path;
 import android.graphics.RectF;
 
+import com.android.gallery3d.R;
+
 public class ImageFilterParametricBorder extends ImageFilter {
     private int mBorderColor = Color.WHITE;
     private int mBorderSize = 10;
@@ -33,6 +35,26 @@ public class ImageFilterParametricBorder extends ImageFilter {
         mName = "Border";
     }
 
+    @Override
+    public int getTextId() {
+        return R.string.borders;
+    }
+
+    @Override
+    public boolean showParameterValue() {
+        return false;
+    }
+
+    @Override
+    public boolean showEditingControls() {
+        return false;
+    }
+
+    @Override
+    public boolean showUtilityPanel() {
+        return false;
+    }
+
     public ImageFilterParametricBorder(int color, int size, int radius) {
         setBorder(color, size, radius);
         setFilterType(TYPE_BORDER);
@@ -78,15 +100,11 @@ public class ImageFilterParametricBorder extends ImageFilter {
         mBorderCornerRadius = radius;
     }
 
-    @Override
-    public Bitmap apply(Bitmap bitmap, float scaleFactor, boolean highQuality) {
-        Canvas canvas = new Canvas(bitmap);
+    private void applyHelper(Canvas canvas, int w, int h) {
         Path border = new Path();
         border.moveTo(0, 0);
-        int w = bitmap.getWidth();
-        int h = bitmap.getHeight();
-        float bs = mBorderSize / 100.0f * bitmap.getWidth();
-        float r = mBorderCornerRadius / 100.0f * bitmap.getWidth();
+        float bs = mBorderSize / 100.0f * w;
+        float r = mBorderCornerRadius / 100.0f * w;
         border.lineTo(0, h);
         border.lineTo(w, h);
         border.lineTo(w, 0);
@@ -98,6 +116,19 @@ public class ImageFilterParametricBorder extends ImageFilter {
         paint.setAntiAlias(true);
         paint.setColor(mBorderColor);
         canvas.drawPath(border, paint);
+    }
+
+    @Override
+    public Bitmap apply(Bitmap bitmap, float scaleFactor, boolean highQuality) {
+       Canvas canvas = new Canvas(bitmap);
+       applyHelper(canvas, bitmap.getWidth(), bitmap.getHeight());
+       return bitmap;
+    }
+
+    @Override
+    public Bitmap iconApply(Bitmap bitmap, float scaleFactor, boolean highQuality) {
+        Canvas canvas = new Canvas(bitmap);
+        applyHelper(canvas, bitmap.getWidth() * 4, bitmap.getHeight() * 4);
         return bitmap;
     }
 
diff --git a/src/com/android/gallery3d/filtershow/imageshow/ImageBorder.java b/src/com/android/gallery3d/filtershow/imageshow/ImageBorder.java
deleted file mode 100644 (file)
index 0977d7d..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.gallery3d.filtershow.imageshow;
-
-import android.content.Context;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.util.AttributeSet;
-
-public class ImageBorder extends ImageSlave {
-    Paint gPaint = new Paint();
-
-    public ImageBorder(Context context) {
-        super(context);
-    }
-
-    public ImageBorder(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    @Override
-    public boolean showTitle() {
-        return false;
-    }
-
-    @Override
-    public void onDraw(Canvas canvas) {
-        super.onDraw(canvas);
-
-        /*
-         * gPaint.setAntiAlias(true); gPaint.setFilterBitmap(true);
-         * gPaint.setDither(true); // Bitmap bmp =
-         * BitmapFactory.decodeResource(getResources(), //
-         * R.drawable.border_scratch); // canvas.drawBitmap(bmp, new Rect(0, 0,
-         * bmp.getWidth(), // bmp.getHeight()), mImageBounds, new Paint()); if
-         * (mImageBounds != null) { NinePatchDrawable npd = (NinePatchDrawable)
-         * getContext() .getResources().getDrawable(R.drawable.border_scratch2);
-         * npd.setBounds(mImageBounds); npd.draw(canvas); }
-         */
-    }
-}
diff --git a/src/com/android/gallery3d/filtershow/imageshow/ImageSmallBorder.java b/src/com/android/gallery3d/filtershow/imageshow/ImageSmallBorder.java
deleted file mode 100644 (file)
index d6d3c86..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.gallery3d.filtershow.imageshow;
-
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Paint;
-import android.graphics.Path;
-import android.graphics.Rect;
-import android.graphics.RectF;
-import android.graphics.Region;
-import android.util.AttributeSet;
-
-public class ImageSmallBorder extends ImageSmallFilter {
-
-    // TODO: move this to xml.
-    protected final int mSelectedBackgroundColor = Color.WHITE;
-    protected final int mInnerBorderColor = Color.BLACK;
-    protected final int mInnerBorderWidth = 2;
-    protected final float mImageScaleFactor = 3.5f;
-
-    public ImageSmallBorder(Context context) {
-        super(context);
-    }
-
-    public ImageSmallBorder(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    @Override
-    public void onDraw(Canvas canvas) {
-        requestFilteredImages();
-        canvas.drawColor(mBackgroundColor);
-        // TODO: simplify & make faster...
-        RectF border = new RectF(mMargin, 2*mMargin, getWidth() - mMargin - 1, getWidth());
-
-        if (mIsSelected) {
-            mPaint.setColor(mSelectedBackgroundColor);
-            canvas.drawRect(0, mMargin, getWidth(), getWidth() + mMargin, mPaint);
-        }
-
-        mPaint.setColor(mInnerBorderColor);
-        mPaint.setStrokeWidth(mInnerBorderWidth);
-        Path path = new Path();
-        path.addRect(border, Path.Direction.CCW);
-        mPaint.setStyle(Paint.Style.STROKE);
-        canvas.drawPath(path, mPaint);
-        mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
-        canvas.save();
-        canvas.clipRect(mMargin + 1, 2*mMargin, getWidth() - mMargin - 2, getWidth() - 1,
-                Region.Op.INTERSECT);
-        canvas.translate(mMargin + 1, 2*mMargin + 1);
-        canvas.scale(mImageScaleFactor, mImageScaleFactor);
-        Rect d = new Rect(0, 0, getWidth(), getWidth());
-        drawImage(canvas, getFilteredImage(), d);
-        canvas.restore();
-    }
-
-    @Override
-    public void drawImage(Canvas canvas, Bitmap image, Rect d) {
-        if (image != null) {
-            int iw = image.getWidth();
-            int ih = image.getHeight();
-            Rect s = new Rect(0, 0, iw, iw);
-            canvas.drawBitmap(image, s, d, mPaint);
-        }
-    }
-}
diff --git a/src/com/android/gallery3d/filtershow/imageshow/ImageSmallFilter.java b/src/com/android/gallery3d/filtershow/imageshow/ImageSmallFilter.java
deleted file mode 100644 (file)
index 2a3ee28..0000000
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.gallery3d.filtershow.imageshow;
-
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Paint;
-import android.graphics.Rect;
-import android.util.AttributeSet;
-import android.view.View;
-
-import com.android.gallery3d.filtershow.FilterShowActivity;
-import com.android.gallery3d.filtershow.filters.ImageFilter;
-import com.android.gallery3d.filtershow.presets.ImagePreset;
-
-public class ImageSmallFilter extends ImageShow implements View.OnClickListener {
-
-    private static final String LOGTAG = "ImageSmallFilter";
-    private FilterShowActivity mController = null;
-    protected ImageFilter mImageFilter = null;
-    private boolean mShowTitle = true;
-    private boolean mSetBorder = false;
-    protected final Paint mPaint = new Paint();
-    protected boolean mIsSelected = false;
-
-    // TODO: move this to xml.
-    protected static int mMargin = 12;
-    protected static int mTextMargin = 8;
-    protected static int mBackgroundColor = Color.BLUE;
-    protected final int mSelectedBackgroundColor = Color.WHITE;
-    protected final int mTextColor = Color.WHITE;
-    private ImageSmallFilter mNullFilter;
-
-    private Bitmap mOverlayBitmap = null;
-    private final int mOverlayTint = Color.argb(100, 0, 0, 0);
-
-    public void setOverlayBitmap(Bitmap bitmap){
-        mOverlayBitmap = bitmap;
-    }
-
-    public static void setMargin(int value) {
-        mMargin = value;
-    }
-
-    public static void setTextMargin(int value) {
-        mTextMargin = value;
-    }
-
-    public static void setDefaultBackgroundColor(int value) {
-        mBackgroundColor = value;
-    }
-
-    public ImageSmallFilter(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        setOnClickListener(this);
-    }
-
-    public ImageSmallFilter(Context context) {
-        super(context);
-        setOnClickListener(this);
-    }
-
-    public void setImageFilter(ImageFilter filter) {
-        mImageFilter = filter;
-        mImagePreset = new ImagePreset();
-        mImagePreset.setName(filter.getName());
-        filter.setImagePreset(mImagePreset);
-        mImagePreset.add(mImageFilter);
-    }
-
-    public ImageFilter getImageFilter() {
-        return mImageFilter;
-    }
-
-    @Override
-    public void setSelected(boolean value) {
-        if (mIsSelected != value) {
-            invalidate();
-        }
-        mIsSelected = value;
-    }
-
-    public void setBorder(boolean value) {
-        mSetBorder = value;
-    }
-
-    public void setController(FilterShowActivity activity) {
-        mController = activity;
-    }
-
-    @Override
-    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
-        int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
-        int h = mTextSize + mTextPadding;
-        setMeasuredDimension(parentHeight - h, parentHeight);
-    }
-
-    /**
-     * Setting the nullFilter implies that the behavior of the button is toggle
-     *
-     * @param nullFilter
-     */
-    public void setNulfilter(ImageSmallFilter nullFilter) {
-        mNullFilter = nullFilter;
-    }
-
-    @Override
-    public void onClick(View v) {
-        if (mController != null) {
-            if (mImageFilter != null) {
-                if (mIsSelected && mNullFilter != null) {
-                    mNullFilter.onClick(v);
-                }
-                else {
-                    mController.useImageFilter(this, mImageFilter, mSetBorder);
-                }
-            } else if (mImagePreset != null) {
-                if (mIsSelected && mNullFilter != null) {
-                    mNullFilter.onClick(v);
-                }
-                else {
-                    mController.useImagePreset(this, mImagePreset);
-                }
-            }
-        }
-    }
-
-    @Override
-    public boolean updateGeometryFlags() {
-        // We don't want to warn listeners here that the image size has changed, because
-        // we'll be working with the small image...
-        return false;
-    }
-
-    public void setShowTitle(boolean value) {
-        mShowTitle = value;
-        invalidate();
-    }
-
-    @Override
-    public boolean showTitle() {
-        return mShowTitle;
-    }
-
-    @Override
-    public boolean showControls() {
-        return false;
-    }
-
-    @Override
-    public boolean showHires() {
-        return false;
-    }
-
-    @Override
-    public ImagePreset getImagePreset() {
-        return mImagePreset;
-    }
-
-    @Override
-    public void updateImagePresets(boolean force) {
-        ImagePreset preset = getImagePreset();
-        if (preset == null) {
-            return;
-        }
-    }
-
-    @Override
-    public void onDraw(Canvas canvas) {
-        requestFilteredImages();
-        canvas.drawColor(mBackgroundColor);
-        float textWidth = mPaint.measureText(mImageFilter.getName());
-        int h = mTextSize + 2 * mTextPadding;
-        int x = (int) ((getWidth() - textWidth) / 2);
-        int y = getHeight();
-        if (mIsSelected) {
-            mPaint.setColor(mSelectedBackgroundColor);
-            canvas.drawRect(0, mMargin, getWidth(), getWidth() + mMargin, mPaint);
-        }
-        Rect destination = new Rect(mMargin, 2*mMargin, getWidth() - mMargin, getWidth());
-        drawImage(canvas, getFilteredImage(), destination);
-        mPaint.setTextSize(mTextSize);
-        mPaint.setColor(mTextColor);
-        canvas.drawText(mImageFilter.getName(), x, y - mTextMargin, mPaint);
-        if (mOverlayBitmap != null) {
-            mPaint.setColor(mOverlayTint);
-            canvas.drawRect(0, mMargin, getWidth(), getWidth() + mMargin, mPaint);
-            Rect d = new Rect(0, mMargin, getWidth() - mMargin, getWidth());
-            mPaint.setColor(Color.BLACK);
-            drawImage(canvas, mOverlayBitmap, d);
-        }
-    }
-
-    public void drawImage(Canvas canvas, Bitmap image, Rect destination) {
-        if (image != null) {
-            int iw = image.getWidth();
-            int ih = image.getHeight();
-            int x = 0;
-            int y = 0;
-            int size = 0;
-            Rect source = null;
-            if (iw > ih) {
-                size = ih;
-                x = (int) ((iw - size) / 2.0f);
-                y = 0;
-            } else {
-                size = iw;
-                x = 0;
-                y = (int) ((ih - size) / 2.0f);
-            }
-            source = new Rect(x, y, x + size, y + size);
-            canvas.drawBitmap(image, source, destination, mPaint);
-        }
-    }
-
-}
diff --git a/src/com/android/gallery3d/filtershow/ui/FilterIconButton.java b/src/com/android/gallery3d/filtershow/ui/FilterIconButton.java
new file mode 100644 (file)
index 0000000..c2be858
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.gallery3d.filtershow.ui;
+
+import android.app.Activity;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.View;
+import android.widget.LinearLayout;
+
+import com.android.gallery3d.R;
+import com.android.gallery3d.filtershow.FilterShowActivity;
+import com.android.gallery3d.filtershow.filters.ImageFilter;
+import com.android.gallery3d.filtershow.filters.ImageFilterBorder;
+import com.android.gallery3d.filtershow.filters.ImageFilterDownsample;
+import com.android.gallery3d.filtershow.filters.ImageFilterParametricBorder;
+
+public class FilterIconButton extends IconButton implements View.OnClickListener {
+    private Bitmap mOverlayBitmap = null;
+    private FilterShowActivity mController = null;
+    private ImageFilter mImageFilter = null;
+    private LinearLayout mParentContainer = null;
+    private View.OnClickListener mListener = null;
+
+    public FilterIconButton(Context context) {
+        super(context);
+    }
+
+    public FilterIconButton(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public FilterIconButton(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+    }
+
+    public void setup(String text, ImageFilter filter, FilterShowActivity controller,
+            LinearLayout parent) {
+        mImageFilter = filter;
+        mController = controller;
+        setText(text);
+
+        if (mImageFilter.getOverlayBitmaps() != 0) {
+            mOverlayBitmap = BitmapFactory.decodeResource(getResources(),
+                    mImageFilter.getOverlayBitmaps());
+        }
+
+        mParentContainer = parent;
+        super.setOnClickListener(this);
+        invalidate();
+    }
+
+    @Override
+    protected Bitmap drawImage(Bitmap dst, Bitmap image, Rect destination) {
+        dst = super.drawImage(dst, image, destination);
+        dst =  mImageFilter.iconApply(dst, 1.0f, false);
+        if (mOverlayBitmap != null) {
+            dst = super.drawImage(dst, mOverlayBitmap, destination);
+        }
+        return dst;
+    }
+
+    @Override
+    public void setOnClickListener(View.OnClickListener listener) {
+        mListener = listener;
+    }
+
+    @Override
+    public void onClick(View v) {
+        if (mController != null && mImageFilter != null) {
+            if (!isSelected()) {
+                mController.useFilter(mImageFilter);
+                mParentContainer.dispatchSetSelected(false);
+                setSelected(true);
+            }
+        }
+        if (mListener != null && mListener != this) {
+            mListener.onClick(v);
+        }
+    }
+
+    public ImageFilter getImageFilter() {
+        return mImageFilter;
+    }
+}
diff --git a/src/com/android/gallery3d/filtershow/ui/IconButton.java b/src/com/android/gallery3d/filtershow/ui/IconButton.java
new file mode 100644 (file)
index 0000000..1ebc1ab
--- /dev/null
@@ -0,0 +1,172 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.gallery3d.filtershow.ui;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Rect;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.widget.Button;
+
+import com.android.gallery3d.R;
+
+/**
+ * Class of buttons with both an image icon and text.
+ */
+public class IconButton extends Button {
+
+    protected Bitmap mImageMirror = null;
+    protected Bitmap mIcon = null;
+
+    private boolean stale_icon = true;
+
+    public IconButton(Context context) {
+        this(context, null);
+    }
+
+    public IconButton(Context context, AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public IconButton(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+        BitmapDrawable ic = (BitmapDrawable) getCompoundDrawables()[1];
+
+        if (ic != null) {
+            mImageMirror = ic.getBitmap();
+        }
+    }
+
+    /**
+     * Set the image that the button icon will use.
+     *
+     * @param image image that icon will be set to before next draw.
+     */
+    public void setIcon(Bitmap image) {
+        mImageMirror = image;
+        stale_icon = true;
+    }
+
+    /**
+     * Creates and sets button icon. Only call after layout.
+     *
+     * @param image bitmap to use as icon
+     */
+    protected boolean makeAndSetIcon(Bitmap image) {
+        int size = getGoodIconSideSize();
+        if (size > 0) {
+            return setImageIcon(makeImageIcon(image, size, size));
+        }
+        return false;
+    }
+
+    /**
+     * Sets icon.
+     *
+     * @param image bitmap to set the icon to.
+     */
+    protected boolean setImageIcon(Bitmap image) {
+        if (image == null) {
+            return false;
+        }
+        mIcon = image;
+        this.setCompoundDrawablesWithIntrinsicBounds(null,
+                new BitmapDrawable(getResources(), mIcon), null, null);
+        return true;
+    }
+
+    /**
+     * Generate an icon bitmap from a given bitmap.
+     *
+     * @param image bitmap to use as button icon
+     * @param width icon width
+     * @param height icon height
+     * @return the scaled/cropped icon bitmap
+     */
+    protected Bitmap makeImageIcon(Bitmap image, int width, int height) {
+        Rect destination = new Rect(0, 0, width, height);
+        Bitmap bmap = Bitmap.createBitmap(width, height,
+                Bitmap.Config.ARGB_8888);
+        bmap = drawImage(bmap, image, destination);
+        return bmap;
+    }
+
+    /**
+     * Finds a side length for the (square) icon that fits within the button.
+     * Only call after layout.
+     *
+     * @return icon side length
+     */
+    protected int getGoodIconSideSize() {
+        Paint p = getPaint();
+        Rect bounds = new Rect();
+        String s = getText().toString();
+        p.getTextBounds(s, 0, s.length(), bounds);
+        int inner_padding = 2 * getCompoundDrawablePadding();
+        int vert = getHeight() - getPaddingTop() - getPaddingBottom() - bounds.height()
+                - inner_padding;
+        int horiz = getWidth() - getPaddingLeft() - getPaddingRight() - inner_padding;
+        return Math.min(vert, horiz);
+    }
+
+    @Override
+    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+        super.onSizeChanged(w, h, oldw, oldh);
+        stale_icon = true;
+    }
+
+    @Override
+    protected void onDraw(Canvas canvas) {
+        if (stale_icon && mImageMirror != null && mImageMirror.getHeight() > 0
+                && mImageMirror.getWidth() > 0) {
+            stale_icon = !makeAndSetIcon(mImageMirror);
+        }
+        super.onDraw(canvas);
+    }
+
+    // Override this for custom icon generation
+    protected Bitmap drawImage(Bitmap dst, Bitmap image, Rect destination) {
+        if (image != null) {
+            Canvas canvas = new Canvas(dst);
+            int iw = image.getWidth();
+            int ih = image.getHeight();
+            int x = 0;
+            int y = 0;
+            int size = 0;
+            Rect source = null;
+            if (iw > ih) {
+                size = ih;
+                x = (int) ((iw - size) / 2.0f);
+                y = 0;
+            } else {
+                size = iw;
+                x = 0;
+                y = (int) ((ih - size) / 2.0f);
+            }
+            source = new Rect(x, y, x + size, y + size);
+            canvas.drawBitmap(image, source, destination, new Paint());
+        }
+        return dst;
+    }
+
+}
diff --git a/src/com/android/gallery3d/filtershow/ui/ImageButtonTitle.java b/src/com/android/gallery3d/filtershow/ui/ImageButtonTitle.java
deleted file mode 100644 (file)
index bb37751..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.gallery3d.filtershow.ui;
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.util.AttributeSet;
-import android.widget.ImageButton;
-
-import com.android.gallery3d.R;
-
-public class ImageButtonTitle extends ImageButton {
-    private static final String LOGTAG = "ImageButtonTitle";
-    private String mText = null;
-    private static int mTextSize = 24;
-    private static int mTextPadding = 20;
-    private static Paint gPaint = new Paint();
-
-    public static void setTextSize(int value) {
-        mTextSize = value;
-    }
-
-    public static void setTextPadding(int value) {
-        mTextPadding = value;
-    }
-
-    public void setText(String text) {
-        mText = text;
-    }
-
-    public ImageButtonTitle(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        TypedArray a = getContext().obtainStyledAttributes(
-                attrs, R.styleable.ImageButtonTitle);
-
-        mText = a.getString(R.styleable.ImageButtonTitle_android_text);
-    }
-
-    public String getText(){
-        return mText;
-    }
-
-    @Override
-    public void onDraw(Canvas canvas) {
-        super.onDraw(canvas);
-        if (mText != null) {
-            gPaint.setARGB(255, 255, 255, 255);
-            gPaint.setTextSize(mTextSize);
-            float textWidth = gPaint.measureText(mText);
-            int x = (int) ((getWidth() - textWidth) / 2);
-            int y = getHeight() - mTextPadding;
-
-            canvas.drawText(mText, x, y, gPaint);
-        }
-    }
-
-}