Merge "Fix Fx filters" into gb-ub-photos-bryce
diff --git a/src/com/android/gallery3d/filtershow/FilterShowActivity.java b/src/com/android/gallery3d/filtershow/FilterShowActivity.java
index db8055b..d3fb7d0 100644
--- a/src/com/android/gallery3d/filtershow/FilterShowActivity.java
+++ b/src/com/android/gallery3d/filtershow/FilterShowActivity.java
@@ -704,6 +704,19 @@
             mSaveButton.setEnabled(enable);
     }
 
+    public FilterIconButton setupFilterRepresentationButton(FilterRepresentation representation, LinearLayout panel, View button) {
+        LayoutInflater inflater =
+                (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+        FilterIconButton icon = (FilterIconButton) inflater.inflate(R.layout.filtericonbutton,
+                panel, false);
+        String text = representation.getName();
+        icon.setup(text, this, panel);
+        icon.setFilterRepresentation(representation);
+        mPanelController.addComponent(button, icon);
+        panel.addView(icon);
+        return icon;
+    }
+
     public FilterIconButton setupFilterButton(ImageFilter filter, LinearLayout panel, View button) {
         LayoutInflater inflater =
                 (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
@@ -729,7 +742,7 @@
         // TODO: use listview
         // TODO: load the filters straight from the filesystem
 
-        ImageFilterFx[] fxArray = new ImageFilterFx[18];
+        FilterFxRepresentation[] fxArray = new FilterFxRepresentation[18];
         int p = 0;
 
         int[] drawid = {
@@ -764,15 +777,17 @@
 
         for (int i = 0; i < drawid.length; i++) {
             Bitmap b = BitmapFactory.decodeResource(getResources(), drawid[i], o);
-            fxArray[p++] = new ImageFilterFx(b, getString(fxNameid[i]), fxNameid[i]);
+            FilterFxRepresentation fx = new FilterFxRepresentation(getString(fxNameid[i]), drawid[i], fxNameid[i]);
+            fx.setFxBitmap(b);
+            fxArray[p++] = fx;
         }
 
-        ImageFilterFx nullFilter = new ImageFilterFx(null, getString(R.string.none), R.string.none);
-        mNullFxFilter = setupFilterButton(nullFilter, listFilters, mFxButton);
+        FilterFxRepresentation nullFx = new FilterFxRepresentation(getString(R.string.none), 0, R.string.none);
+        mNullFxFilter = setupFilterRepresentationButton(nullFx, listFilters, mFxButton);
         mNullFxFilter.setSelected(true);
 
         for (int i = 0; i < p; i++) {
-            setupFilterButton(fxArray[i], listFilters, mFxButton);
+            setupFilterRepresentationButton(fxArray[i], listFilters, mFxButton);
         }
 
         // Default preset (original)
@@ -991,6 +1006,10 @@
         if (representation == null) {
             copy.addFilter(filterRepresentation);
         } else {
+            if (filterRepresentation instanceof FilterFxRepresentation) {
+                representation.useParametersFrom(filterRepresentation);
+                copy.setHistoryName(filterRepresentation.getName());
+            }
             filterRepresentation = representation;
         }
         mMasterImage.setPreset(copy, true);
diff --git a/src/com/android/gallery3d/filtershow/PanelController.java b/src/com/android/gallery3d/filtershow/PanelController.java
index 3a24d00..0f14b9b 100644
--- a/src/com/android/gallery3d/filtershow/PanelController.java
+++ b/src/com/android/gallery3d/filtershow/PanelController.java
@@ -485,8 +485,10 @@
                     mCurrentImage = showImageView(filter.getEditingViewId());
                 }
                 mCurrentImage.setShowControls(filter.showEditingControls());
-                String ename = mCurrentImage.getContext().getString(filter.getTextId());
-                mUtilityPanel.setEffectName(ename);
+                if (filter.getTextId() != 0) {
+                    String ename = mCurrentImage.getContext().getString(filter.getTextId());
+                    mUtilityPanel.setEffectName(ename);
+                }
 
                 mUtilityPanel.setShowParameter(filter.showParameterValue());
                 mCurrentImage.select();
diff --git a/src/com/android/gallery3d/filtershow/filters/FilterBasicRepresentation.java b/src/com/android/gallery3d/filtershow/filters/FilterBasicRepresentation.java
index 9e9c57a..f6f308d 100644
--- a/src/com/android/gallery3d/filtershow/filters/FilterBasicRepresentation.java
+++ b/src/com/android/gallery3d/filtershow/filters/FilterBasicRepresentation.java
@@ -60,7 +60,7 @@
 
     @Override
     public boolean equals(FilterRepresentation representation) {
-        if (super.equals(representation)) {
+        if (!super.equals(representation)) {
             return false;
         }
         if (representation instanceof FilterBasicRepresentation) {
diff --git a/src/com/android/gallery3d/filtershow/filters/FilterFxRepresentation.java b/src/com/android/gallery3d/filtershow/filters/FilterFxRepresentation.java
new file mode 100644
index 0000000..b778c93
--- /dev/null
+++ b/src/com/android/gallery3d/filtershow/filters/FilterFxRepresentation.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2013 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.filters;
+
+import android.graphics.Bitmap;
+import com.android.gallery3d.app.Log;
+
+public class FilterFxRepresentation extends FilterRepresentation {
+    private Bitmap mFxBitmap = null;
+    private int mBitmapResource = 0;
+    private int mNameResource = 0;
+
+    public FilterFxRepresentation(String name, int bitmapResource, int nameResource) {
+        super(name);
+        mBitmapResource = bitmapResource;
+        mNameResource = nameResource;
+        setFilterClass(ImageFilterFx.class);
+    }
+
+    public String toString() {
+        return "FilterFx: " + getName();
+    }
+
+    @Override
+    public FilterRepresentation clone() throws CloneNotSupportedException {
+        FilterFxRepresentation representation = (FilterFxRepresentation) super.clone();
+        representation.setName(getName());
+        representation.setBitmapResource(getBitmapResource());
+        representation.setNameResource(getNameResource());
+        representation.setFxBitmap(getFxBitmap());
+        return representation;
+    }
+
+    public void useParametersFrom(FilterRepresentation a) {
+        if (a instanceof FilterFxRepresentation) {
+            FilterFxRepresentation representation = (FilterFxRepresentation) a;
+            setName(representation.getName());
+            setBitmapResource(representation.getBitmapResource());
+            setNameResource(representation.getNameResource());
+            setFxBitmap(representation.getFxBitmap());
+        }
+    }
+
+    @Override
+    public boolean equals(FilterRepresentation representation) {
+        if (!super.equals(representation)) {
+            return false;
+        }
+        if (representation instanceof FilterFxRepresentation) {
+            FilterFxRepresentation fx = (FilterFxRepresentation) representation;
+            if (fx.mNameResource == mNameResource
+                    && fx.mBitmapResource == mBitmapResource) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public Bitmap getFxBitmap() {
+        return mFxBitmap;
+    }
+
+    public void setFxBitmap(Bitmap fxBitmap) {
+        mFxBitmap = fxBitmap;
+    }
+
+    public int getNameResource() {
+        return mNameResource;
+    }
+
+    public void setNameResource(int nameResource) {
+        mNameResource = nameResource;
+    }
+
+    public int getBitmapResource() {
+        return mBitmapResource;
+    }
+
+    public void setBitmapResource(int bitmapResource) {
+        mBitmapResource = bitmapResource;
+    }
+}
diff --git a/src/com/android/gallery3d/filtershow/filters/FilterRepresentation.java b/src/com/android/gallery3d/filtershow/filters/FilterRepresentation.java
index afa6ad1..1415f14 100644
--- a/src/com/android/gallery3d/filtershow/filters/FilterRepresentation.java
+++ b/src/com/android/gallery3d/filtershow/filters/FilterRepresentation.java
@@ -40,6 +40,7 @@
         FilterRepresentation representation = (FilterRepresentation) super.clone();
         representation.setName(getName());
         representation.setPriority(getPriority());
+        representation.setFilterClass(getFilterClass());
         Log.v(LOGTAG, "cloning from <" + this + "> to <" + representation + ">");
         return representation;
     }
diff --git a/src/com/android/gallery3d/filtershow/filters/ImageFilterFx.java b/src/com/android/gallery3d/filtershow/filters/ImageFilterFx.java
index f5dff5e..8a50ca9 100644
--- a/src/com/android/gallery3d/filtershow/filters/ImageFilterFx.java
+++ b/src/com/android/gallery3d/filtershow/filters/ImageFilterFx.java
@@ -22,6 +22,11 @@
     private static final String TAG = "ImageFilterFx";
     Bitmap fxBitmap;
     int mNameResource = 0;
+    private FilterFxRepresentation mParameters = null;
+
+    public ImageFilterFx() {
+
+    }
 
     public ImageFilterFx(Bitmap fxBitmap, String name, int nameResource) {
         setFilterType(TYPE_FX);
@@ -30,6 +35,15 @@
         mNameResource = nameResource;
     }
 
+    public void useRepresentation(FilterRepresentation representation) {
+        FilterFxRepresentation parameters = (FilterFxRepresentation) representation;
+        mParameters = parameters;
+    }
+
+    public FilterFxRepresentation getParameters() {
+        return mParameters;
+    }
+
     @Override
     public int getTextId() {
         return mNameResource;
@@ -68,16 +82,17 @@
 
     @Override
     public Bitmap apply(Bitmap bitmap, float scaleFactor, boolean highQuality) {
-        if (fxBitmap==null)
+        if (getParameters() == null || getParameters().getFxBitmap() ==null) {
             return bitmap;
+        }
 
         int w = bitmap.getWidth();
         int h = bitmap.getHeight();
 
-        int fxw = fxBitmap.getWidth();
-        int fxh = fxBitmap.getHeight();
+        int fxw = getParameters().getFxBitmap().getWidth();
+        int fxh = getParameters().getFxBitmap().getHeight();
 
-        nativeApplyFilter(bitmap, w, h,   fxBitmap,  fxw,  fxh);
+        nativeApplyFilter(bitmap, w, h,   getParameters().getFxBitmap(),  fxw,  fxh);
         return bitmap;
     }
 }
diff --git a/src/com/android/gallery3d/filtershow/ui/FilterIconButton.java b/src/com/android/gallery3d/filtershow/ui/FilterIconButton.java
index 8dc5153..b78ab03 100644
--- a/src/com/android/gallery3d/filtershow/ui/FilterIconButton.java
+++ b/src/com/android/gallery3d/filtershow/ui/FilterIconButton.java
@@ -25,7 +25,9 @@
 import android.widget.LinearLayout;
 
 import com.android.gallery3d.filtershow.FilterShowActivity;
+import com.android.gallery3d.filtershow.cache.FilteringPipeline;
 import com.android.gallery3d.filtershow.filters.FilterRepresentation;
+import com.android.gallery3d.filtershow.filters.FiltersManager;
 import com.android.gallery3d.filtershow.filters.ImageFilter;
 
 public class FilterIconButton extends IconButton implements View.OnClickListener {
@@ -48,26 +50,36 @@
         super(context, attrs, defStyle);
     }
 
-    public void setup(String text, ImageFilter filter, FilterShowActivity controller,
-            LinearLayout parent) {
-        mImageFilter = filter;
+    public void setup(String text, FilterShowActivity controller, LinearLayout parent) {
         mController = controller;
         setText(text);
-
-        if (mImageFilter.getOverlayBitmaps() != 0) {
-            mOverlayBitmap = BitmapFactory.decodeResource(getResources(),
-                    mImageFilter.getOverlayBitmaps());
-        }
-
         mParentContainer = parent;
         super.setOnClickListener(this);
         invalidate();
     }
 
+    public void setup(String text, ImageFilter filter, FilterShowActivity controller,
+            LinearLayout parent) {
+        setup(text, controller, parent);
+        mImageFilter = filter;
+        if (mImageFilter.getOverlayBitmaps() != 0) {
+            mOverlayBitmap = BitmapFactory.decodeResource(getResources(),
+                    mImageFilter.getOverlayBitmaps());
+        }
+    }
+
     @Override
     protected Bitmap drawImage(Bitmap dst, Bitmap image, Rect destination) {
         dst = super.drawImage(dst, image, destination);
-        dst =  mImageFilter.iconApply(dst, 1.0f, false);
+        if (mImageFilter == null && mFilterRepresentation != null) {
+            mImageFilter = FiltersManager.getManager().getFilterForRepresentation(mFilterRepresentation);
+        }
+        if (mFilterRepresentation != null && mImageFilter != null) {
+            mImageFilter.useRepresentation(mFilterRepresentation);
+        }
+        if (mImageFilter != null) {
+            dst =  mImageFilter.iconApply(dst, 1.0f, false);
+        }
         if (mOverlayBitmap != null) {
             dst = super.drawImage(dst, mOverlayBitmap, destination);
         }
diff --git a/src_pd/com/android/gallery3d/filtershow/filters/FiltersManager.java b/src_pd/com/android/gallery3d/filtershow/filters/FiltersManager.java
index 3b3326c..f7e0406 100644
--- a/src_pd/com/android/gallery3d/filtershow/filters/FiltersManager.java
+++ b/src_pd/com/android/gallery3d/filtershow/filters/FiltersManager.java
@@ -30,6 +30,7 @@
     private FiltersManager() {
         Vector<ImageFilter> filters = new Vector<ImageFilter>();
         FiltersManager.addFilters(filters);
+        filters.add(new ImageFilterFx());
         for (ImageFilter filter : filters) {
             mFilters.put(filter.getClass(), filter);
         }