OSDN Git Service

New UI...
authornicolasroard <nicolasroard@google.com>
Fri, 5 Oct 2012 10:48:34 +0000 (03:48 -0700)
committerThe Android Automerger <android-build@android.com>
Fri, 5 Oct 2012 22:16:37 +0000 (15:16 -0700)
bug:7289525
bug:7289361

Change-Id: Ifde15d57f0d307417a1c7a7ae9b1122be873558f

res/layout/filtershow_activity.xml
res/values/filtershow_strings.xml
res/values/filtershow_styles.xml
src/com/android/gallery3d/filtershow/FilterShowActivity.java
src/com/android/gallery3d/filtershow/PanelController.java [new file with mode: 0644]
src/com/android/gallery3d/filtershow/imageshow/ImageShow.java
src/com/android/gallery3d/filtershow/imageshow/ImageSlave.java
src/com/android/gallery3d/filtershow/imageshow/ImageStraighten.java
src/com/android/gallery3d/filtershow/presets/ImagePreset.java
src/com/android/gallery3d/filtershow/ui/ImageCurves.java
src/com/android/gallery3d/filtershow/ui/SliderController.java

index 1449f16..3cf0c82 100644 (file)
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2012 The Android Open Source Project
+<!--
+     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.
@@ -22,9 +23,9 @@
         android:id="@+id/imageStatePanel"
         android:layout_width="200dip"
         android:layout_height="match_parent"
+        android:layout_gravity="right"
         android:orientation="vertical"
-        android:visibility="invisible"
-        android:layout_gravity="right">
+        android:visibility="invisible" >
 
         <TextView
             android:layout_width="match_parent"
@@ -49,9 +50,9 @@
         android:id="@+id/historyPanel"
         android:layout_width="200dip"
         android:layout_height="match_parent"
+        android:layout_gravity="right"
         android:orientation="vertical"
-        android:visibility="invisible"
-        android:layout_gravity="right">
+        android:visibility="invisible" >
 
         <TextView
             android:layout_width="match_parent"
             android:orientation="horizontal" >
 
             <Button
-                android:gravity="center"
                 android:id="@+id/resetOperationsButton"
                 style="@style/FilterShowHistoryButton"
+                android:gravity="center"
                 android:text="@string/reset" />
 
             <Button
                 android:id="@+id/saveOperationsButton"
                 style="@style/FilterShowHistoryButton"
-                android:visibility="gone"
-                android:text="@string/save" />
+                android:text="@string/save"
+                android:visibility="gone" />
         </LinearLayout>
     </LinearLayout>
 
                 android:layout_height="wrap_content"
                 android:visibility="gone" />
 
+            <!--
             <ImageButton
                 android:id="@+id/showOriginalButton"
                 android:layout_width="64dip"
                 android:layout_gravity="bottom"
                 android:scaleType="centerInside"
                 android:src="@drawable/filtershow_button_show_original" />
+                 -->
+            <SeekBar
+                android:id="@+id/filterSeekBar"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_gravity="bottom"
+                android:padding="16dip"
+                android:visibility="gone" />
         </FrameLayout>
 
-        <HorizontalScrollView
-            android:id="@+id/fxList"
-            android:layout_width="match_parent"
-            android:layout_height="96dip" >
-
-            <LinearLayout
-                android:id="@+id/listFilters"
-                android:layout_width="wrap_content"
-                android:layout_height="match_parent"
-                android:orientation="horizontal" >
-            </LinearLayout>
-        </HorizontalScrollView>
-
-        <HorizontalScrollView
-            android:id="@+id/bordersList"
-            android:layout_width="match_parent"
-            android:layout_height="96dip"
-            android:visibility="gone" >
-
-            <LinearLayout
-                android:id="@+id/listBorders"
-                android:layout_width="wrap_content"
-                android:layout_height="match_parent"
-                android:orientation="horizontal" >
-            </LinearLayout>
-        </HorizontalScrollView>
-
-        <HorizontalScrollView
-            android:id="@+id/gemoetryList"
+        <FrameLayout
+            android:id="@+id/secondRowPanel"
             android:layout_width="fill_parent"
-            android:layout_height="96dip"
-            android:background="@color/background_toolbar"
-            android:visibility="gone" >
+            android:layout_height="wrap_content" >
 
             <LinearLayout
-                android:id="@+id/listGeometry"
-                android:layout_width="wrap_content"
-                android:layout_height="fill_parent"
-                android:orientation="horizontal" >
+                android:id="@+id/filterButtonsList"
+                android:layout_width="fill_parent"
+                android:layout_height="96dip"
+                android:background="@color/background_toolbar"
+                android:orientation="horizontal"
+                android:visibility="gone" >
 
                 <com.android.gallery3d.filtershow.ui.ImageButtonTitle
-                    android:id="@+id/straightenButton"
+                    android:id="@+id/compareWithOriginalImage"
                     style="@style/FilterShowBottomButton"
+                    android:layout_gravity="left"
+                    android:layout_weight="0"
                     android:src="@drawable/filtershow_button_geometry_straighten"
-                    android:text="@string/straighten" />
-
-                <com.android.gallery3d.filtershow.ui.ImageButtonTitle
-                    android:id="@+id/cropButton"
-                    style="@style/FilterShowBottomButton"
-                    android:src="@drawable/filtershow_button_geometry_crop"
-                    android:text="@string/crop" />
+                    android:text="@string/compare_original" />
+
+                <Button
+                    android:id="@+id/applyEffect"
+                    android:layout_height="94dip"
+                    android:layout_gravity="center"
+                    android:layout_weight="1"
+                    android:background="@android:color/transparent"
+                    android:gravity="center"
+                    android:text="@string/apply_effect"
+                    android:textSize="24dip" />
 
                 <com.android.gallery3d.filtershow.ui.ImageButtonTitle
-                    android:id="@+id/rotateButton"
+                    android:id="@+id/resetEffect"
                     style="@style/FilterShowBottomButton"
-                    android:src="@drawable/filtershow_button_geometry_rotate"
-                    android:text="@string/rotate" />
-
-                <com.android.gallery3d.filtershow.ui.ImageButtonTitle
-                    android:id="@+id/flipButton"
-                    style="@style/FilterShowBottomButton"
-                    android:src="@drawable/filtershow_button_geometry_flip"
-                    android:text="@string/flip" />
+                    android:layout_gravity="right"
+                    android:layout_weight="0"
+                    android:src="@drawable/filtershow_button_geometry_straighten"
+                    android:text="@string/reset_effect" />
             </LinearLayout>
-        </HorizontalScrollView>
 
-        <HorizontalScrollView
-            android:id="@+id/colorsFxList"
-            android:layout_width="fill_parent"
-            android:layout_height="96dip"
-            android:background="@color/background_toolbar"
-            android:visibility="gone" >
-
-            <LinearLayout
-                android:id="@+id/listColorsFx"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:orientation="horizontal" >
-
-                <com.android.gallery3d.filtershow.ui.ImageButtonTitle
-                    android:id="@+id/vignetteButton"
-                    style="@style/FilterShowBottomButton"
-                    android:src="@drawable/filtershow_button_colors_vignette"
-                    android:text="@string/vignette" />
-
-                <com.android.gallery3d.filtershow.ui.ImageButtonTitle
-                    android:id="@+id/exposureButton"
-                    style="@style/FilterShowBottomButton"
-                    android:src="@drawable/filtershow_button_colors_contrast"
-                    android:text="@string/exposure" />
-
-                <com.android.gallery3d.filtershow.ui.ImageButtonTitle
-                    android:id="@+id/contrastButton"
-                    style="@style/FilterShowBottomButton"
-                    android:src="@drawable/filtershow_button_colors_contrast"
-                    android:text="@string/contrast" />
-
-                <com.android.gallery3d.filtershow.ui.ImageButtonTitle
-                    android:id="@+id/saturationButton"
-                    style="@style/FilterShowBottomButton"
-                    android:src="@drawable/filtershow_button_colors_contrast"
-                    android:text="@string/saturation" />
-
-                <com.android.gallery3d.filtershow.ui.ImageButtonTitle
-                    android:id="@+id/tintButton"
-                    style="@style/FilterShowBottomButton"
-                    android:src="@drawable/filtershow_button_colors_contrast"
-                    android:text="@string/tint" />
-
-                <com.android.gallery3d.filtershow.ui.ImageButtonTitle
-                    android:id="@+id/curvesButtonRGB"
-                    style="@style/FilterShowBottomButton"
-                    android:src="@drawable/filtershow_button_colors_curve"
-                    android:text="@string/curvesRGB" />
-
-                <com.android.gallery3d.filtershow.ui.ImageButtonTitle
-                    android:id="@+id/vibranceButton"
-                    style="@style/FilterShowBottomButton"
-                    android:src="@drawable/filtershow_button_colors_contrast"
-                    android:text="@string/vibrance" />
-
-                <com.android.gallery3d.filtershow.ui.ImageButtonTitle
-                    android:id="@+id/sharpenButton"
-                    style="@style/FilterShowBottomButton"
-                    android:src="@drawable/filtershow_button_colors_sharpen"
-                    android:text="@string/sharpen" />
-
-                <com.android.gallery3d.filtershow.ui.ImageButtonTitle
-                    android:id="@+id/shadowRecoveryButton"
-                    style="@style/FilterShowBottomButton"
-                    android:src="@drawable/filtershow_button_colors_contrast"
-                    android:text="@string/shadow_recovery" />
-
-            </LinearLayout>
-        </HorizontalScrollView>
+            <HorizontalScrollView
+                android:id="@+id/fxList"
+                android:layout_width="match_parent"
+                android:layout_height="96dip">
+
+                <LinearLayout
+                    android:id="@+id/listFilters"
+                    android:layout_width="wrap_content"
+                    android:layout_height="match_parent"
+                    android:orientation="horizontal" >
+                </LinearLayout>
+            </HorizontalScrollView>
+
+            <HorizontalScrollView
+                android:id="@+id/bordersList"
+                android:layout_width="match_parent"
+                android:layout_height="96dip"
+                android:visibility="gone" >
+
+                <LinearLayout
+                    android:id="@+id/listBorders"
+                    android:layout_width="wrap_content"
+                    android:layout_height="match_parent"
+                    android:orientation="horizontal" >
+                </LinearLayout>
+            </HorizontalScrollView>
+
+            <HorizontalScrollView
+                android:id="@+id/geometryList"
+                android:layout_width="fill_parent"
+                android:layout_height="96dip"
+                android:background="@color/background_toolbar"
+                android:visibility="gone" >
+
+                <LinearLayout
+                    android:id="@+id/listGeometry"
+                    android:layout_width="wrap_content"
+                    android:layout_height="fill_parent"
+                    android:orientation="horizontal" >
+
+                    <com.android.gallery3d.filtershow.ui.ImageButtonTitle
+                        android:id="@+id/straightenButton"
+                        style="@style/FilterShowBottomButton"
+                        android:src="@drawable/filtershow_button_geometry_straighten"
+                        android:text="@string/straighten" />
+
+                    <com.android.gallery3d.filtershow.ui.ImageButtonTitle
+                        android:id="@+id/cropButton"
+                        style="@style/FilterShowBottomButton"
+                        android:src="@drawable/filtershow_button_geometry_crop"
+                        android:text="@string/crop" />
+
+                    <com.android.gallery3d.filtershow.ui.ImageButtonTitle
+                        android:id="@+id/rotateButton"
+                        style="@style/FilterShowBottomButton"
+                        android:src="@drawable/filtershow_button_geometry_rotate"
+                        android:text="@string/rotate" />
+
+                    <com.android.gallery3d.filtershow.ui.ImageButtonTitle
+                        android:id="@+id/flipButton"
+                        style="@style/FilterShowBottomButton"
+                        android:src="@drawable/filtershow_button_geometry_flip"
+                        android:text="@string/flip" />
+                </LinearLayout>
+            </HorizontalScrollView>
+
+            <HorizontalScrollView
+                android:id="@+id/colorsFxList"
+                android:layout_width="fill_parent"
+                android:layout_height="96dip"
+                android:background="@color/background_toolbar"
+                android:visibility="gone" >
+
+                <LinearLayout
+                    android:id="@+id/listColorsFx"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:orientation="horizontal" >
+
+                    <com.android.gallery3d.filtershow.ui.ImageButtonTitle
+                        android:id="@+id/exposureButton"
+                        style="@style/FilterShowBottomButton"
+                        android:src="@drawable/filtershow_button_colors_contrast"
+                        android:text="@string/exposure" />
+
+                    <com.android.gallery3d.filtershow.ui.ImageButtonTitle
+                        android:id="@+id/vibranceButton"
+                        style="@style/FilterShowBottomButton"
+                        android:src="@drawable/filtershow_button_colors_contrast"
+                        android:text="@string/vibrance" />
+
+                    <com.android.gallery3d.filtershow.ui.ImageButtonTitle
+                        android:id="@+id/saturationButton"
+                        style="@style/FilterShowBottomButton"
+                        android:src="@drawable/filtershow_button_colors_contrast"
+                        android:text="@string/saturation" />
+
+                    <com.android.gallery3d.filtershow.ui.ImageButtonTitle
+                        android:id="@+id/contrastButton"
+                        style="@style/FilterShowBottomButton"
+                        android:src="@drawable/filtershow_button_colors_contrast"
+                        android:text="@string/contrast" />
+
+                    <com.android.gallery3d.filtershow.ui.ImageButtonTitle
+                        android:id="@+id/shadowRecoveryButton"
+                        style="@style/FilterShowBottomButton"
+                        android:src="@drawable/filtershow_button_colors_contrast"
+                        android:text="@string/shadow_recovery" />
+
+                    <com.android.gallery3d.filtershow.ui.ImageButtonTitle
+                        android:id="@+id/vignetteButton"
+                        style="@style/FilterShowBottomButton"
+                        android:src="@drawable/filtershow_button_colors_vignette"
+                        android:text="@string/vignette" />
+
+                    <com.android.gallery3d.filtershow.ui.ImageButtonTitle
+                        android:id="@+id/sharpenButton"
+                        style="@style/FilterShowBottomButton"
+                        android:src="@drawable/filtershow_button_colors_sharpen"
+                        android:text="@string/sharpen" />
+
+                    <com.android.gallery3d.filtershow.ui.ImageButtonTitle
+                        android:id="@+id/tintButton"
+                        style="@style/FilterShowBottomButton"
+                        android:src="@drawable/filtershow_button_colors_contrast"
+                        android:text="@string/tint" />
+
+                    <com.android.gallery3d.filtershow.ui.ImageButtonTitle
+                        android:id="@+id/curvesButtonRGB"
+                        style="@style/FilterShowBottomButton"
+                        android:src="@drawable/filtershow_button_colors_curve"
+                        android:text="@string/curvesRGB" />
+
+                </LinearLayout>
+            </HorizontalScrollView>
+        </FrameLayout>
 
         <LinearLayout
             android:layout_width="match_parent"
                 android:layout_weight="1"
                 android:background="@drawable/filtershow_button_background"
                 android:scaleType="centerInside"
-                android:src="@drawable/filtershow_button_fx" />
+                android:src="@drawable/ic_photoeditor_effects" />
 
             <ImageButton
                 android:id="@+id/borderButton"
                 android:background="@drawable/filtershow_button_background"
                 android:padding="2dip"
                 android:scaleType="centerInside"
-                android:src="@drawable/filtershow_button_border" />
+                android:src="@drawable/ic_photoeditor_border" />
 
             <ImageButton
                 android:id="@+id/geometryButton"
                 android:background="@drawable/filtershow_button_background"
                 android:padding="2dip"
                 android:scaleType="centerInside"
-                android:src="@drawable/filtershow_button_geometry" />
+                android:src="@drawable/ic_photoeditor_fix" />
 
             <ImageButton
                 android:id="@+id/colorsButton"
                 android:background="@drawable/filtershow_button_background"
                 android:padding="2dip"
                 android:scaleType="centerInside"
-                android:src="@drawable/filtershow_button_colors" />
+                android:src="@drawable/ic_photoeditor_color" />
         </LinearLayout>
     </LinearLayout>
 
index 7d86138..9fd5b92 100644 (file)
     <!--  Text for the image state panel title [CHAR LIMIT=50] -->
     <string name="imageState">Current Image State</string>
 
+    <!--  Additional filters buttons  -->
+
+    <!--  Label for the compare original image filter button [CHAR LIMIT=15] -->
+    <string name="compare_original">Compare</string>
+    <!--  Label for the apply effect button [CHAR LIMIT=15] -->
+    <string name="apply_effect">Apply</string>
+    <!--  Label for the reset effect button [CHAR LIMIT=15] -->
+    <string name="reset_effect">Reset</string>
+
     <!--  Filters buttons -->
 
     <!--  Label for the exposure filter button [CHAR LIMIT=15] -->
index 14d0d94..4600eeb 100644 (file)
@@ -41,7 +41,7 @@
     </style>
 
     <style name="FilterShowBottomButton">
-        <item name="android:layout_width">wrap_content</item>
+        <item name="android:layout_width">96dip</item>
         <item name="android:layout_height">wrap_content</item>
         <item name="android:background">@drawable/filtershow_button_background</item>
         <item name="android:gravity">center</item>
index 964c950..641259a 100644 (file)
@@ -1,26 +1,6 @@
 
 package com.android.gallery3d.filtershow;
 
-import java.io.File;
-import java.io.IOException;
-import java.util.Vector;
-
-import com.android.gallery3d.filtershow.cache.ImageLoader;
-import com.android.gallery3d.filtershow.filters.*;
-import com.android.gallery3d.filtershow.imageshow.ImageBorder;
-import com.android.gallery3d.filtershow.imageshow.ImageShow;
-import com.android.gallery3d.filtershow.imageshow.ImageSmallFilter;
-import com.android.gallery3d.filtershow.imageshow.ImageStraighten;
-import com.android.gallery3d.filtershow.imageshow.ImageZoom;
-import com.android.gallery3d.filtershow.presets.*;
-import com.android.gallery3d.filtershow.provider.SharedImageProvider;
-import com.android.gallery3d.filtershow.tools.SaveCopyTask;
-import com.android.gallery3d.filtershow.ui.ImageCurves;
-import com.android.gallery3d.R;
-
-import android.net.Uri;
-import android.os.Bundle;
-import android.renderscript.RenderScript;
 import android.annotation.TargetApi;
 import android.app.ActionBar;
 import android.app.Activity;
@@ -28,7 +8,8 @@ import android.content.ContentValues;
 import android.content.Intent;
 import android.content.res.Resources;
 import android.graphics.drawable.Drawable;
-import android.graphics.drawable.NinePatchDrawable;
+import android.net.Uri;
+import android.os.Bundle;
 import android.util.Log;
 import android.util.TypedValue;
 import android.view.Gravity;
@@ -40,20 +21,44 @@ import android.view.View.OnClickListener;
 import android.view.View.OnTouchListener;
 import android.widget.AdapterView;
 import android.widget.AdapterView.OnItemClickListener;
-import android.widget.Button;
-import android.widget.FrameLayout;
-import android.widget.FrameLayout.LayoutParams;
 import android.widget.ImageButton;
 import android.widget.LinearLayout;
 import android.widget.ListView;
+import android.widget.SeekBar;
 import android.widget.ShareActionProvider;
 import android.widget.ShareActionProvider.OnShareTargetSelectedListener;
 import android.widget.Toast;
 
+import com.android.gallery3d.R;
+import com.android.gallery3d.filtershow.cache.ImageLoader;
+import com.android.gallery3d.filtershow.filters.ImageFilter;
+import com.android.gallery3d.filtershow.filters.ImageFilterBorder;
+import com.android.gallery3d.filtershow.filters.ImageFilterRS;
+import com.android.gallery3d.filtershow.imageshow.ImageBorder;
+import com.android.gallery3d.filtershow.imageshow.ImageShow;
+import com.android.gallery3d.filtershow.imageshow.ImageSmallFilter;
+import com.android.gallery3d.filtershow.imageshow.ImageStraighten;
+import com.android.gallery3d.filtershow.imageshow.ImageZoom;
+import com.android.gallery3d.filtershow.presets.ImagePreset;
+import com.android.gallery3d.filtershow.presets.ImagePresetBW;
+import com.android.gallery3d.filtershow.presets.ImagePresetBWBlue;
+import com.android.gallery3d.filtershow.presets.ImagePresetBWGreen;
+import com.android.gallery3d.filtershow.presets.ImagePresetBWRed;
+import com.android.gallery3d.filtershow.presets.ImagePresetOld;
+import com.android.gallery3d.filtershow.presets.ImagePresetSaturated;
+import com.android.gallery3d.filtershow.presets.ImagePresetXProcessing;
+import com.android.gallery3d.filtershow.provider.SharedImageProvider;
+import com.android.gallery3d.filtershow.tools.SaveCopyTask;
+import com.android.gallery3d.filtershow.ui.ImageCurves;
+
+import java.io.File;
+import java.util.Vector;
+
 @TargetApi(16)
 public class FilterShowActivity extends Activity implements OnItemClickListener,
         OnShareTargetSelectedListener {
 
+    private final PanelController mPanelController = new PanelController();
     private ImageLoader mImageLoader = null;
     private ImageShow mImageShow = null;
     private ImageCurves mImageCurves = null;
@@ -65,34 +70,23 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
     private View mListBorders = null;
     private View mListGeometry = null;
     private View mListColors = null;
+    private View mListFilterButtons = null;
 
     private ImageButton mFxButton = null;
     private ImageButton mBorderButton = null;
     private ImageButton mGeometryButton = null;
     private ImageButton mColorsButton = null;
 
-    private ImageButton mVignetteButton = null;
-    private ImageButton mCurvesButtonRGB = null;
-    private ImageButton mSharpenButton = null;
-
-    private ImageButton mContrastButton = null;
-    private ImageButton mSaturationButton = null;
-    private ImageButton mTintButton = null;
-    private ImageButton mVibranceButton = null;
-    private ImageButton mExposureButton = null;
-    private ImageButton mShadowRecoveryButton = null;
-
     private static final int SELECT_PICTURE = 1;
     private static final String LOGTAG = "FilterShowActivity";
-    protected static final boolean ANIMATE_PANELS = false;
+    protected static final boolean ANIMATE_PANELS = true;
 
     private boolean mShowingHistoryPanel = false;
     private boolean mShowingImageStatePanel = false;
 
-    private Vector<ImageShow> mImageViews = new Vector<ImageShow>();
-    private Vector<View> mListViews = new Vector<View>();
-    private Vector<ImageButton> mBottomPanelButtons = new Vector<ImageButton>();
-    private Vector<ImageButton> mColorsPanelButtons = new Vector<ImageButton>();
+    private final Vector<ImageShow> mImageViews = new Vector<ImageShow>();
+    private final Vector<View> mListViews = new Vector<View>();
+    private final Vector<ImageButton> mBottomPanelButtons = new Vector<ImageButton>();
 
     private ShareActionProvider mShareActionProvider;
     private File mSharedOutputFile = null;
@@ -136,67 +130,60 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
 
         mListFx = findViewById(R.id.fxList);
         mListBorders = findViewById(R.id.bordersList);
-        mListGeometry = findViewById(R.id.gemoetryList);
+        mListGeometry = findViewById(R.id.geometryList);
+        mListFilterButtons = findViewById(R.id.filterButtonsList);
         mListColors = findViewById(R.id.colorsFxList);
         mListViews.add(mListFx);
         mListViews.add(mListBorders);
         mListViews.add(mListGeometry);
+        mListViews.add(mListFilterButtons);
         mListViews.add(mListColors);
 
         mFxButton = (ImageButton) findViewById(R.id.fxButton);
         mBorderButton = (ImageButton) findViewById(R.id.borderButton);
         mGeometryButton = (ImageButton) findViewById(R.id.geometryButton);
         mColorsButton = (ImageButton) findViewById(R.id.colorsButton);
-        mBottomPanelButtons.add(mFxButton);
-        mBottomPanelButtons.add(mBorderButton);
-        mBottomPanelButtons.add(mGeometryButton);
-        mBottomPanelButtons.add(mColorsButton);
-        mFxButton.setSelected(true);
-
-        mVignetteButton = (ImageButton) findViewById(R.id.vignetteButton);
-        mCurvesButtonRGB = (ImageButton) findViewById(R.id.curvesButtonRGB);
-        mSharpenButton = (ImageButton) findViewById(R.id.sharpenButton);
-        mVibranceButton = (ImageButton) findViewById(R.id.vibranceButton);
-        mContrastButton = (ImageButton) findViewById(R.id.contrastButton);
-        mSaturationButton = (ImageButton) findViewById(R.id.saturationButton);
-        mTintButton = (ImageButton) findViewById(R.id.tintButton);
-        mExposureButton = (ImageButton) findViewById(R.id.exposureButton);
-        mShadowRecoveryButton = (ImageButton) findViewById(R.id.shadowRecoveryButton);
-
-        mColorsPanelButtons.add(mVignetteButton);
-        mColorsPanelButtons.add(mCurvesButtonRGB);
-        mColorsPanelButtons.add(mSharpenButton);
-        mColorsPanelButtons.add(mContrastButton);
-        mColorsPanelButtons.add(mSaturationButton);
-        mColorsPanelButtons.add(mTintButton);
-        mColorsPanelButtons.add(mVibranceButton);
-        mColorsPanelButtons.add(mExposureButton);
-        mColorsPanelButtons.add(mShadowRecoveryButton);
-
-        // TODO: instead of click listeners, make the activity the single
-        // listener and do a dispatch in the listener callback method.
-        findViewById(R.id.showOriginalButton).setOnTouchListener(createOnTouchShowOriginalButton());
-        findViewById(R.id.straightenButton).setOnClickListener(createOnClickStraightenButton());
-        findViewById(R.id.cropButton).setOnClickListener(createOnClickCropButton());
-        findViewById(R.id.rotateButton).setOnClickListener(createOnClickRotateButton());
-        findViewById(R.id.flipButton).setOnClickListener(createOnClickFlipButton());
-
-        mVignetteButton.setOnClickListener(createOnClickVignetteButton());
-        mCurvesButtonRGB.setOnClickListener(createOnClickCurvesRGBButton());
-
-        mSharpenButton.setOnClickListener(createOnClickSharpenButton());
-        mContrastButton.setOnClickListener(createOnClickContrastButton());
-        mSaturationButton.setOnClickListener(createOnClickSaturationButton());
-
-        mTintButton.setOnClickListener(createOnClickTintButton());
-        mVibranceButton.setOnClickListener(createOnClickVibranceButton());
-        mExposureButton.setOnClickListener(createOnClickExposureButton());
-        mShadowRecoveryButton.setOnClickListener(createOnClickShadowRecoveryButton());
-
-        mFxButton.setOnClickListener(createOnClickFxButton());
-        mBorderButton.setOnClickListener(createOnClickBorderButton());
-        mGeometryButton.setOnClickListener(createOnClickGeometryButton());
-        mColorsButton.setOnClickListener(createOnClickColorsButton());
+
+        mImageShow.setImageLoader(mImageLoader);
+        mImageCurves.setImageLoader(mImageLoader);
+        mImageCurves.setMaster(mImageShow);
+        mImageBorders.setImageLoader(mImageLoader);
+        mImageBorders.setMaster(mImageShow);
+        mImageStraighten.setImageLoader(mImageLoader);
+        mImageStraighten.setMaster(mImageShow);
+        mImageZoom.setImageLoader(mImageLoader);
+        mImageZoom.setMaster(mImageShow);
+
+        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.imageZoom));
+
+        mPanelController.addPanel(mFxButton, mListFx, 0);
+        mPanelController.addPanel(mBorderButton, mListBorders, 1);
+
+        mPanelController.addPanel(mGeometryButton, mListGeometry, 2);
+        mPanelController.addComponent(mGeometryButton, findViewById(R.id.straightenButton));
+        mPanelController.addComponent(mGeometryButton, findViewById(R.id.cropButton));
+        mPanelController.addComponent(mGeometryButton, findViewById(R.id.rotateButton));
+        mPanelController.addComponent(mGeometryButton, findViewById(R.id.flipButton));
+
+        mPanelController.addPanel(mColorsButton, mListColors, 3);
+        mPanelController.addComponent(mColorsButton, findViewById(R.id.vignetteButton));
+        mPanelController.addComponent(mColorsButton, findViewById(R.id.curvesButtonRGB));
+        mPanelController.addComponent(mColorsButton, findViewById(R.id.sharpenButton));
+        mPanelController.addComponent(mColorsButton, findViewById(R.id.vibranceButton));
+        mPanelController.addComponent(mColorsButton, findViewById(R.id.contrastButton));
+        mPanelController.addComponent(mColorsButton, findViewById(R.id.saturationButton));
+        mPanelController.addComponent(mColorsButton, findViewById(R.id.tintButton));
+        mPanelController.addComponent(mColorsButton, findViewById(R.id.exposureButton));
+        mPanelController.addComponent(mColorsButton, findViewById(R.id.shadowRecoveryButton));
+
+        mPanelController.addView(findViewById(R.id.resetEffect));
+        mPanelController.addView(findViewById(R.id.applyEffect));
+
+        findViewById(R.id.compareWithOriginalImage).setOnTouchListener(createOnTouchShowOriginalButton());
 
         findViewById(R.id.resetOperationsButton).setOnClickListener(
                 createOnClickResetOperationsButton());
@@ -211,15 +198,15 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
         fillListImages(listFilters);
         fillListBorders(listBorders);
 
-        mImageShow.setImageLoader(mImageLoader);
-        mImageCurves.setImageLoader(mImageLoader);
-        mImageCurves.setMaster(mImageShow);
-        mImageBorders.setImageLoader(mImageLoader);
-        mImageBorders.setMaster(mImageShow);
-        mImageStraighten.setImageLoader(mImageLoader);
-        mImageStraighten.setMaster(mImageShow);
-        mImageZoom.setImageLoader(mImageLoader);
-        mImageZoom.setMaster(mImageShow);
+        SeekBar seekBar = (SeekBar) findViewById(R.id.filterSeekBar);
+        seekBar.setMax(200);
+        mImageShow.setSeekBar(seekBar);
+        mPanelController.setRowPanel(findViewById(R.id.secondRowPanel));
+        mPanelController.setUtilityPanel(findViewById(R.id.filterButtonsList),
+                findViewById(R.id.compareWithOriginalImage),
+                findViewById(R.id.applyEffect));
+        mPanelController.setMasterImage(mImageShow);
+        mPanelController.setCurrentPanel(mFxButton);
 
         Intent intent = getIntent();
         String data = intent.getDataString();
@@ -246,7 +233,8 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
 
     @Override
     public boolean onShareTargetSelected(ShareActionProvider arg0, Intent arg1) {
-        // First, let's tell the SharedImageProvider that it will need to wait for the image
+        // First, let's tell the SharedImageProvider that it will need to wait
+        // for the image
         Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI,
                 Uri.encode(mSharedOutputFile.getAbsolutePath()));
         ContentValues values = new ContentValues();
@@ -293,6 +281,7 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
         return true;
     }
 
+    @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId()) {
             case R.id.undoButton: {
@@ -395,6 +384,7 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
 
     // //////////////////////////////////////////////////////////////////////////////
     // Some utility functions
+    // TODO: finish the cleanup.
 
     public void showOriginalViews(boolean value) {
         for (ImageShow views : mImageViews) {
@@ -467,6 +457,7 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
             mShowingImageStatePanel = true;
             view.animate().setDuration(200).x(-viewList.getWidth())
                     .withLayer().withEndAction(new Runnable() {
+                        @Override
                         public void run() {
                             viewList.setAlpha(0);
                             viewList.setVisibility(View.VISIBLE);
@@ -499,6 +490,7 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
             mShowingHistoryPanel = true;
             view.animate().setDuration(200).x(-viewList.getWidth())
                     .withLayer().withEndAction(new Runnable() {
+                        @Override
                         public void run() {
                             viewList.setAlpha(0);
                             viewList.setVisibility(View.VISIBLE);
@@ -535,350 +527,6 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
     }
 
     // //////////////////////////////////////////////////////////////////////////////
-    // Now, let's deal with the bottom panel.
-
-    private OnClickListener createOnClickFxButton() {
-        return new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                hideImageViews();
-                hideListViews();
-                unselectBottomPanelButtons();
-                mImageShow.setVisibility(View.VISIBLE);
-                mListFx.setVisibility(View.VISIBLE);
-                mFxButton.setSelected(true);
-            }
-        };
-    }
-
-    private OnClickListener createOnClickBorderButton() {
-        return new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                hideImageViews();
-                hideListViews();
-                unselectBottomPanelButtons();
-                mImageBorders.setVisibility(View.VISIBLE);
-                mListBorders.setVisibility(View.VISIBLE);
-                mBorderButton.setSelected(true);
-            }
-        };
-    }
-
-    private OnClickListener createOnClickGeometryButton() {
-        return new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                hideImageViews();
-                hideListViews();
-                unselectBottomPanelButtons();
-                mImageStraighten.setVisibility(View.VISIBLE);
-                mListGeometry.setVisibility(View.VISIBLE);
-                mGeometryButton.setSelected(true);
-
-                if (ANIMATE_PANELS) {
-                    mListGeometry.setX(mListGeometry.getWidth());
-                    mListGeometry.animate().setDuration(200).x(0).withLayer().start();
-                }
-            }
-        };
-    }
-
-    private OnClickListener createOnClickColorsButton() {
-        return new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                hideImageViews();
-                hideListViews();
-                unselectBottomPanelButtons();
-                mListColors.setVisibility(View.VISIBLE);
-                mImageShow.setVisibility(View.VISIBLE);
-                mColorsButton.setSelected(true);
-
-                if (ANIMATE_PANELS) {
-                    View view = findViewById(R.id.listColorsFx);
-                    view.setX(mListColors.getWidth());
-                    view.animate().setDuration(200).x(0).withLayer().start();
-                }
-            }
-        };
-    }
-
-    // //////////////////////////////////////////////////////////////////////////////
-    // Geometry sub-panel
-
-    private OnClickListener createOnClickStraightenButton() {
-        return new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                hideImageViews();
-                mImageStraighten.setVisibility(View.VISIBLE);
-                mImageStraighten.showToast("Straighten", true);
-            }
-        };
-    }
-
-    private OnClickListener createOnClickCropButton() {
-        return new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                hideImageViews();
-                mImageShow.setVisibility(View.VISIBLE);
-                mImageShow.showToast("Crop", true);
-            }
-        };
-    }
-
-    private OnClickListener createOnClickRotateButton() {
-        return new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                hideImageViews();
-                mImageShow.setVisibility(View.VISIBLE);
-                mImageShow.showToast("Rotate", true);
-            }
-        };
-    }
-
-    private OnClickListener createOnClickFlipButton() {
-        return new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                hideImageViews();
-                mImageShow.setVisibility(View.VISIBLE);
-                mImageShow.showToast("Flip", true);
-            }
-        };
-    }
-
-    // //////////////////////////////////////////////////////////////////////////////
-    // Filters sub-panel
-
-    private OnClickListener createOnClickVignetteButton() {
-        return new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                hideImageViews();
-                mImageShow.setVisibility(View.VISIBLE);
-                mImageShow.setShowControls(true);
-                ImagePreset preset = mImageShow.getImagePreset();
-                ImageFilter filter = preset.getFilter("Vignette");
-                if (filter == null) {
-                    ImageFilterVignette vignette = new ImageFilterVignette();
-                    ImagePreset copy = new ImagePreset(preset);
-                    copy.add(vignette);
-                    copy.setHistoryName(vignette.getName());
-                    copy.setIsFx(false);
-                    filter = copy.getFilter("Vignette");
-                    mImageShow.setImagePreset(copy);
-                }
-                mImageShow.setCurrentFilter(filter);
-                unselectPanelButtons(mColorsPanelButtons);
-                mVignetteButton.setSelected(true);
-                invalidateViews();
-            }
-        };
-    }
-
-    private OnClickListener createOnClickCurvesRGBButton() {
-        return new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                hideImageViews();
-                mImageCurves.setVisibility(View.VISIBLE);
-                unselectPanelButtons(mColorsPanelButtons);
-                mCurvesButtonRGB.setSelected(true);
-                mImageCurves.setUseRed(true);
-                mImageCurves.setUseGreen(true);
-                mImageCurves.setUseBlue(true);
-                mImageCurves.reloadCurve();
-            }
-        };
-    }
-
-    private OnClickListener createOnClickSharpenButton() {
-        return new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                hideImageViews();
-                mImageZoom.setVisibility(View.VISIBLE);
-                mImageZoom.setShowControls(true);
-                ImagePreset preset = mImageZoom.getImagePreset();
-                ImageFilter filter = preset.getFilter("Sharpen");
-                if (filter == null) {
-                    ImageFilterSharpen sharpen = new ImageFilterSharpen();
-                    ImagePreset copy = new ImagePreset(preset);
-                    copy.add(sharpen);
-                    copy.setHistoryName(sharpen.getName());
-                    copy.setIsFx(false);
-                    filter = copy.getFilter("Sharpen");
-                    mImageZoom.setImagePreset(copy);
-                }
-                mImageZoom.setCurrentFilter(filter);
-                unselectPanelButtons(mColorsPanelButtons);
-                mSharpenButton.setSelected(true);
-                invalidateViews();
-            }
-        };
-    }
-
-    private OnClickListener createOnClickContrastButton() {
-        return new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                hideImageViews();
-                mImageShow.setVisibility(View.VISIBLE);
-                mImageShow.setShowControls(true);
-                ImagePreset preset = mImageShow.getImagePreset();
-                ImageFilter filter = preset.getFilter("Contrast");
-                if (filter == null) {
-                    ImageFilterContrast contrast = new ImageFilterContrast();
-                    ImagePreset copy = new ImagePreset(preset);
-                    copy.add(contrast);
-                    copy.setHistoryName(contrast.getName());
-                    copy.setIsFx(false);
-                    filter = copy.getFilter("Contrast");
-                    mImageShow.setImagePreset(copy);
-                }
-                mImageShow.setCurrentFilter(filter);
-                unselectPanelButtons(mColorsPanelButtons);
-                mContrastButton.setSelected(true);
-                invalidateViews();
-            }
-        };
-    }
-
-    private OnClickListener createOnClickSaturationButton() {
-        return new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                hideImageViews();
-                mImageShow.setVisibility(View.VISIBLE);
-                mImageShow.setShowControls(true);
-                ImagePreset preset = mImageShow.getImagePreset();
-                ImageFilter filter = preset.getFilter("Saturated");
-                if (filter == null) {
-                    ImageFilterSaturated sat = new ImageFilterSaturated();
-                    ImagePreset copy = new ImagePreset(preset);
-                    copy.add(sat);
-                    copy.setHistoryName(sat.getName());
-                    copy.setIsFx(false);
-                    filter = copy.getFilter("Saturated");
-                    mImageShow.setImagePreset(copy);
-                }
-                mImageShow.setCurrentFilter(filter);
-                unselectPanelButtons(mColorsPanelButtons);
-                mSaturationButton.setSelected(true);
-                invalidateViews();
-            }
-        };
-    }
-
-    private OnClickListener createOnClickTintButton() {
-        return new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                hideImageViews();
-                mImageShow.setVisibility(View.VISIBLE);
-                mImageShow.setShowControls(true);
-                ImagePreset preset = mImageShow.getImagePreset();
-                ImageFilter filter = preset.getFilter("Hue");
-                if (filter == null) {
-                    ImageFilterHue contrast = new ImageFilterHue();
-                    ImagePreset copy = new ImagePreset(preset);
-                    copy.add(contrast);
-                    copy.setHistoryName(contrast.getName());
-                    copy.setIsFx(false);
-                    filter = copy.getFilter("Hue");
-                    mImageShow.setImagePreset(copy);
-                }
-                mImageShow.setCurrentFilter(filter);
-                unselectPanelButtons(mColorsPanelButtons);
-                mTintButton.setSelected(true);
-                invalidateViews();
-            }
-        };
-    }
-
-    private OnClickListener createOnClickVibranceButton() {
-        return new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                hideImageViews();
-                mImageShow.setVisibility(View.VISIBLE);
-                mImageShow.setShowControls(true);
-                ImagePreset preset = mImageShow.getImagePreset();
-                ImageFilter filter = preset.getFilter("Vibrance");
-                if (filter == null) {
-                    ImageFilterVibrance contrast = new ImageFilterVibrance();
-                    ImagePreset copy = new ImagePreset(preset);
-                    copy.add(contrast);
-                    copy.setHistoryName(contrast.getName());
-                    copy.setIsFx(false);
-                    filter = copy.getFilter("Vibrance");
-                    mImageShow.setImagePreset(copy);
-                }
-                mImageShow.setCurrentFilter(filter);
-                unselectPanelButtons(mColorsPanelButtons);
-                mVibranceButton.setSelected(true);
-                invalidateViews();
-            }
-        };
-    }
-
-    private OnClickListener createOnClickExposureButton() {
-        return new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                hideImageViews();
-                mImageShow.setVisibility(View.VISIBLE);
-                mImageShow.setShowControls(true);
-                ImagePreset preset = mImageShow.getImagePreset();
-                ImageFilter filter = preset.getFilter("Exposure");
-                if (filter == null) {
-                    ImageFilterExposure bright = new ImageFilterExposure();
-                    ImagePreset copy = new ImagePreset(preset);
-                    copy.add(bright);
-                    copy.setHistoryName(bright.getName());
-                    copy.setIsFx(false);
-                    filter = copy.getFilter("Exposure");
-                    mImageShow.setImagePreset(copy);
-                }
-                mImageShow.setCurrentFilter(filter);
-                unselectPanelButtons(mColorsPanelButtons);
-                mExposureButton.setSelected(true);
-                invalidateViews();
-            }
-        };
-    }
-
-    private OnClickListener createOnClickShadowRecoveryButton() {
-        return new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                hideImageViews();
-                mImageShow.setVisibility(View.VISIBLE);
-                mImageShow.setShowControls(true);
-                ImagePreset preset = mImageShow.getImagePreset();
-                ImageFilter filter = preset.getFilter("Shadows");
-                if (filter == null) {
-                    ImageFilterShadows contrast = new ImageFilterShadows();
-                    ImagePreset copy = new ImagePreset(preset);
-                    copy.add(contrast);
-                    copy.setHistoryName(contrast.getName());
-                    copy.setIsFx(false);
-                    filter = copy.getFilter("Shadows");
-                    mImageShow.setImagePreset(copy);
-                }
-                mImageShow.setCurrentFilter(filter);
-                unselectPanelButtons(mColorsPanelButtons);
-                mShadowRecoveryButton.setSelected(true);
-                invalidateViews();
-            }
-        };
-    }
-
-    // //////////////////////////////////////////////////////////////////////////////
 
     public float getPixelsFromDip(float value) {
         Resources r = getResources();
@@ -930,6 +578,7 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
                 SELECT_PICTURE);
     }
 
+    @Override
     public void onActivityResult(int requestCode, int resultCode, Intent data) {
         Log.v(LOGTAG, "onActivityResult");
         if (resultCode == RESULT_OK) {
diff --git a/src/com/android/gallery3d/filtershow/PanelController.java b/src/com/android/gallery3d/filtershow/PanelController.java
new file mode 100644 (file)
index 0000000..f9a1f1d
--- /dev/null
@@ -0,0 +1,474 @@
+
+package com.android.gallery3d.filtershow;
+
+import android.text.Html;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewPropertyAnimator;
+import android.widget.TextView;
+
+import com.android.gallery3d.R;
+import com.android.gallery3d.filtershow.filters.ImageFilter;
+import com.android.gallery3d.filtershow.filters.ImageFilterContrast;
+import com.android.gallery3d.filtershow.filters.ImageFilterExposure;
+import com.android.gallery3d.filtershow.filters.ImageFilterHue;
+import com.android.gallery3d.filtershow.filters.ImageFilterSaturated;
+import com.android.gallery3d.filtershow.filters.ImageFilterShadows;
+import com.android.gallery3d.filtershow.filters.ImageFilterSharpen;
+import com.android.gallery3d.filtershow.filters.ImageFilterVibrance;
+import com.android.gallery3d.filtershow.filters.ImageFilterVignette;
+import com.android.gallery3d.filtershow.imageshow.ImageShow;
+import com.android.gallery3d.filtershow.presets.ImagePreset;
+import com.android.gallery3d.filtershow.ui.ImageCurves;
+
+import java.util.HashMap;
+import java.util.Vector;
+
+public class PanelController implements OnClickListener {
+    private static int PANEL = 0;
+    private static int COMPONENT = 1;
+    private static int VERTICAL_MOVE = 0;
+    private static int HORIZONTAL_MOVE = 1;
+    private static final int ANIM_DURATION = 200;
+
+    class Panel {
+        private final View mView;
+        private final View mContainer;
+        private int mPosition = 0;
+        private final Vector<View> mSubviews = new Vector<View>();
+
+        public Panel(View view, View container, int position) {
+            mView = view;
+            mContainer = container;
+            mPosition = position;
+        }
+
+        public void addView(View view) {
+            mSubviews.add(view);
+        }
+
+        public int getPosition() {
+            return mPosition;
+        }
+
+        public ViewPropertyAnimator unselect(int newPos, int move) {
+            ViewPropertyAnimator anim = mContainer.animate();
+            mView.setSelected(false);
+            mContainer.setX(0);
+            mContainer.setY(0);
+            int delta = 0;
+            int w = mRowPanel.getWidth();
+            int h = mRowPanel.getHeight();
+            if (move == HORIZONTAL_MOVE) {
+                if (newPos > mPosition) {
+                    delta = -w;
+                } else {
+                    delta = w;
+                }
+                anim.x(delta);
+            } else if (move == VERTICAL_MOVE) {
+                anim.y(h);
+            }
+            anim.setDuration(ANIM_DURATION).withLayer().withEndAction(new Runnable() {
+                @Override
+                public void run() {
+                    mContainer.setVisibility(View.GONE);
+                }
+            });
+            return anim;
+        }
+
+        public ViewPropertyAnimator select(int oldPos, int move) {
+            mView.setSelected(true);
+            mContainer.setVisibility(View.VISIBLE);
+            mContainer.setX(0);
+            mContainer.setY(0);
+            ViewPropertyAnimator anim = mContainer.animate();
+            int w = mRowPanel.getWidth();
+            int h = mRowPanel.getHeight();
+            if (move == HORIZONTAL_MOVE) {
+                if (oldPos < mPosition) {
+                    mContainer.setX(w);
+                } else {
+                    mContainer.setX(-w);
+                }
+                anim.x(0);
+            } else if (move == VERTICAL_MOVE) {
+                mContainer.setY(h);
+                anim.y(0);
+            }
+            anim.setDuration(ANIM_DURATION).withLayer();
+            return anim;
+        }
+    }
+
+    class UtilityPanel {
+        private final View mView;
+        private final View mCompareView;
+        private final TextView mTextView;
+        private boolean mSelected = false;
+        private String mEffectName = null;
+        private int mParameterValue = 0;
+
+        public UtilityPanel(View view, View compareView, View textView) {
+            mView = view;
+            mCompareView = compareView;
+            mTextView = (TextView) textView;
+        }
+
+        public boolean selected() {
+            return mSelected;
+        }
+
+        public void onNewValue(int value) {
+            mParameterValue = value;
+            updateText();
+        }
+
+        public void setGeometryEffect(boolean isGeometryEffect) {
+            if (isGeometryEffect) {
+                mCompareView.setVisibility(View.INVISIBLE);
+            } else {
+                mCompareView.setVisibility(View.VISIBLE);
+            }
+        }
+
+        public void setEffectName(String effectName) {
+            mEffectName = effectName;
+            updateText();
+        }
+
+        public void updateText() {
+            mTextView.setText(Html.fromHtml("Apply" + "<br/><small>" + mEffectName + "<br/>"
+                    + mParameterValue + "</small>"));
+        }
+
+        public ViewPropertyAnimator unselect() {
+            ViewPropertyAnimator anim = mView.animate();
+            mView.setX(0);
+            mView.setY(0);
+            int h = mRowPanel.getHeight();
+            anim.y(-h);
+            anim.setDuration(ANIM_DURATION).withLayer().withEndAction(new Runnable() {
+                @Override
+                public void run() {
+                    mView.setVisibility(View.GONE);
+                }
+            });
+            mSelected = false;
+            return anim;
+        }
+
+        public ViewPropertyAnimator select() {
+            mView.setVisibility(View.VISIBLE);
+            int h = mRowPanel.getHeight();
+            mView.setX(0);
+            mView.setY(-h);
+            updateText();
+            ViewPropertyAnimator anim = mView.animate();
+            anim.y(0);
+            anim.setDuration(ANIM_DURATION).withLayer();
+            mSelected = true;
+            return anim;
+        }
+    }
+
+    class ViewType {
+        private final int mType;
+        private final View mView;
+
+        public ViewType(View view, int type) {
+            mView = view;
+            mType = type;
+        }
+
+        public int type() {
+            return mType;
+        }
+    }
+
+    private final HashMap<View, Panel> mPanels = new HashMap<View, Panel>();
+    private final HashMap<View, ViewType> mViews = new HashMap<View, ViewType>();
+    private final Vector<View> mImageViews = new Vector<View>();
+    private View mCurrentPanel = null;
+    private View mRowPanel = null;
+    private UtilityPanel mUtilityPanel = null;
+    private ImageShow mMasterImage = null;
+    private ImageShow mCurrentImage = null;
+
+    public void addView(View view) {
+        view.setOnClickListener(this);
+        mViews.put(view, new ViewType(view, COMPONENT));
+    }
+
+    public void addPanel(View view, View container, int position) {
+        mPanels.put(view, new Panel(view, container, position));
+        view.setOnClickListener(this);
+        mViews.put(view, new ViewType(view, PANEL));
+    }
+
+    public void addComponent(View aPanel, View component) {
+        Panel panel = mPanels.get(aPanel);
+        if (panel == null) {
+            return;
+        }
+        panel.addView(component);
+        component.setOnClickListener(this);
+        mViews.put(component, new ViewType(component, COMPONENT));
+    }
+
+    public void addImageView(View view) {
+        mImageViews.add(view);
+        ImageShow imageShow = (ImageShow) view;
+        imageShow.setPanelController(this);
+    }
+
+    public void onNewValue(int value) {
+        mUtilityPanel.onNewValue(value);
+    }
+
+    public void setCurrentPanel(View panel) {
+        showPanel(panel);
+    }
+
+    public void setRowPanel(View rowPanel) {
+        mRowPanel = rowPanel;
+    }
+
+    public void setUtilityPanel(View utilityPanel, View compareView, View textView) {
+        mUtilityPanel = new UtilityPanel(utilityPanel, compareView, textView);
+    }
+
+    public void setMasterImage(ImageShow imageShow) {
+        mMasterImage = imageShow;
+    }
+
+    @Override
+    public void onClick(View view) {
+        ViewType type = mViews.get(view);
+        if (type.type() == PANEL) {
+            showPanel(view);
+        } else if (type.type() == COMPONENT) {
+            showComponent(view);
+        }
+    }
+
+    public ImageShow showImageView(int id) {
+        ImageShow image = null;
+        for (View view : mImageViews) {
+            if (view.getId() == id) {
+                view.setVisibility(View.VISIBLE);
+                image = (ImageShow) view;
+            } else {
+                view.setVisibility(View.GONE);
+            }
+        }
+        return image;
+    }
+
+    public void showDefaultImageView() {
+        showImageView(R.id.imageShow).setShowControls(false);
+        mMasterImage.setCurrentFilter(null);
+    }
+
+    public void showPanel(View view) {
+        view.setVisibility(View.VISIBLE);
+        boolean removedUtilityPanel = false;
+        Panel current = mPanels.get(mCurrentPanel);
+        if (mUtilityPanel != null && mUtilityPanel.selected()) {
+            ViewPropertyAnimator anim1 = mUtilityPanel.unselect();
+            removedUtilityPanel = true;
+            anim1.start();
+            if (mCurrentPanel == view) {
+                ViewPropertyAnimator anim2 = current.select(-1, VERTICAL_MOVE);
+                anim2.start();
+                showDefaultImageView();
+            }
+        }
+
+        if (mCurrentPanel == view) {
+            return;
+        }
+
+        Panel panel = mPanels.get(view);
+        if (!removedUtilityPanel) {
+            int currentPos = -1;
+            if (current != null) {
+                currentPos = current.getPosition();
+            }
+            ViewPropertyAnimator anim1 = panel.select(currentPos, HORIZONTAL_MOVE);
+            anim1.start();
+            if (current != null) {
+                ViewPropertyAnimator anim2 = current.unselect(panel.getPosition(), HORIZONTAL_MOVE);
+                anim2.start();
+            }
+        } else {
+            ViewPropertyAnimator anim = panel.select(-1, VERTICAL_MOVE);
+            anim.start();
+        }
+        showDefaultImageView();
+        mCurrentPanel = view;
+    }
+
+    public ImagePreset getImagePreset() {
+        return mMasterImage.getImagePreset();
+    }
+
+    public ImageFilter setImagePreset(ImageFilter filter, String name) {
+        ImagePreset copy = new ImagePreset(getImagePreset());
+        copy.add(filter);
+        copy.setHistoryName(filter.getName());
+        copy.setIsFx(false);
+        mMasterImage.setImagePreset(copy);
+        return filter;
+    }
+
+    public void ensureFilter(String name) {
+        ImagePreset preset = getImagePreset();
+        ImageFilter filter = preset.getFilter(name);
+        if (filter == null && name.equalsIgnoreCase("Vignette")) {
+            filter = setImagePreset(new ImageFilterVignette(), name);
+        }
+        if (filter == null && name.equalsIgnoreCase("Sharpen")) {
+            filter = setImagePreset(new ImageFilterSharpen(), name);
+        }
+        if (filter == null && name.equalsIgnoreCase("Contrast")) {
+            filter = setImagePreset(new ImageFilterContrast(), name);
+        }
+        if (filter == null && name.equalsIgnoreCase("Saturated")) {
+            filter = setImagePreset(new ImageFilterSaturated(), name);
+        }
+        if (filter == null && name.equalsIgnoreCase("Hue")) {
+            filter = setImagePreset(new ImageFilterHue(), name);
+        }
+        if (filter == null && name.equalsIgnoreCase("Exposure")) {
+            filter = setImagePreset(new ImageFilterExposure(), name);
+        }
+        if (filter == null && name.equalsIgnoreCase("Vibrance")) {
+            filter = setImagePreset(new ImageFilterVibrance(), name);
+        }
+        if (filter == null && name.equalsIgnoreCase("Shadows")) {
+            filter = setImagePreset(new ImageFilterShadows(), name);
+        }
+        mMasterImage.setCurrentFilter(filter);
+    }
+
+    public void showComponent(View view) {
+        if (mUtilityPanel != null && !mUtilityPanel.selected()) {
+            Panel current = mPanels.get(mCurrentPanel);
+            ViewPropertyAnimator anim1 = current.unselect(-1, VERTICAL_MOVE);
+            anim1.start();
+            if (mUtilityPanel != null) {
+                ViewPropertyAnimator anim2 = mUtilityPanel.select();
+                anim2.start();
+            }
+        }
+
+        if (mCurrentImage != null) {
+            mCurrentImage.unselect();
+        }
+
+        switch (view.getId()) {
+            case R.id.straightenButton: {
+                mCurrentImage = showImageView(R.id.imageStraighten);
+                mUtilityPanel.setEffectName("Straighten");
+                mUtilityPanel.setGeometryEffect(true);
+                break;
+            }
+            case R.id.cropButton: {
+                mCurrentImage = showImageView(R.id.imageShow);
+                mUtilityPanel.setEffectName("Crop");
+                mUtilityPanel.setGeometryEffect(true);
+                break;
+            }
+            case R.id.rotateButton: {
+                mCurrentImage = showImageView(R.id.imageShow);
+                mUtilityPanel.setEffectName("Rotate");
+                mUtilityPanel.setGeometryEffect(true);
+                break;
+            }
+            case R.id.flipButton: {
+                mCurrentImage = showImageView(R.id.imageShow);
+                mUtilityPanel.setEffectName("Flip");
+                mUtilityPanel.setGeometryEffect(true);
+                break;
+            }
+            case R.id.vignetteButton: {
+                mCurrentImage = showImageView(R.id.imageShow).setShowControls(true);
+                mUtilityPanel.setEffectName("Vignette");
+                mUtilityPanel.setGeometryEffect(false);
+                ensureFilter("Vignette");
+                break;
+            }
+            case R.id.curvesButtonRGB: {
+                ImageCurves curves = (ImageCurves) showImageView(R.id.imageCurves);
+                mUtilityPanel.setEffectName("Curves");
+                mUtilityPanel.setGeometryEffect(true);
+                curves.setUseRed(true);
+                curves.setUseGreen(true);
+                curves.setUseBlue(true);
+                curves.reloadCurve();
+                mCurrentImage = curves;
+                break;
+            }
+            case R.id.sharpenButton: {
+                mCurrentImage = showImageView(R.id.imageZoom).setShowControls(true);
+                mUtilityPanel.setEffectName("Sharpen");
+                mUtilityPanel.setGeometryEffect(false);
+                ensureFilter("Sharpen");
+                break;
+            }
+            case R.id.contrastButton: {
+                mCurrentImage = showImageView(R.id.imageShow).setShowControls(true);
+                mUtilityPanel.setEffectName("Contrast");
+                mUtilityPanel.setGeometryEffect(false);
+                ensureFilter("Contrast");
+                break;
+            }
+            case R.id.saturationButton: {
+                mCurrentImage = showImageView(R.id.imageShow).setShowControls(true);
+                mUtilityPanel.setEffectName("Saturated");
+                mUtilityPanel.setGeometryEffect(false);
+                ensureFilter("Saturated");
+                break;
+            }
+            case R.id.tintButton: {
+                mCurrentImage = showImageView(R.id.imageShow).setShowControls(true);
+                mUtilityPanel.setEffectName("Hue");
+                mUtilityPanel.setGeometryEffect(false);
+                ensureFilter("Hue");
+                break;
+            }
+            case R.id.exposureButton: {
+                mCurrentImage = showImageView(R.id.imageShow).setShowControls(true);
+                mUtilityPanel.setEffectName("Exposure");
+                mUtilityPanel.setGeometryEffect(false);
+                ensureFilter("Exposure");
+                break;
+            }
+            case R.id.vibranceButton: {
+                mCurrentImage = showImageView(R.id.imageShow).setShowControls(true);
+                mUtilityPanel.setEffectName("Vibrance");
+                mUtilityPanel.setGeometryEffect(false);
+                ensureFilter("Vibrance");
+                break;
+            }
+            case R.id.shadowRecoveryButton: {
+                mCurrentImage = showImageView(R.id.imageShow).setShowControls(true);
+                mUtilityPanel.setEffectName("Shadows");
+                mUtilityPanel.setGeometryEffect(false);
+                ensureFilter("Shadows");
+                break;
+            }
+            case R.id.resetEffect: {
+                mCurrentImage.resetParameter();
+                break;
+            }
+            case R.id.applyEffect: {
+                showPanel(mCurrentPanel);
+                break;
+            }
+        }
+        mCurrentImage.select();
+    }
+}
index 2a660d4..da38d3b 100644 (file)
@@ -1,36 +1,33 @@
 
 package com.android.gallery3d.filtershow.imageshow;
 
-import com.android.gallery3d.filtershow.FilterShowActivity;
-import com.android.gallery3d.filtershow.HistoryAdapter;
-import com.android.gallery3d.filtershow.ImageStateAdapter;
-import com.android.gallery3d.filtershow.cache.ImageLoader;
-import com.android.gallery3d.filtershow.filters.ImageFilter;
-import com.android.gallery3d.filtershow.presets.ImagePreset;
-import com.android.gallery3d.filtershow.ui.SliderListener;
-import com.android.gallery3d.filtershow.ui.SliderController;
-import com.android.gallery3d.R;
-import com.android.gallery3d.R.id;
-import com.android.gallery3d.R.layout;
-
-import java.io.File;
-
 import android.content.Context;
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
 import android.graphics.Paint;
 import android.graphics.Rect;
-import android.net.Uri;
 import android.os.Handler;
-import android.os.Message;
 import android.util.AttributeSet;
-import android.util.Log;
 import android.view.MotionEvent;
 import android.view.View;
-import android.view.View.MeasureSpec;
 import android.widget.ArrayAdapter;
+import android.widget.SeekBar;
+import android.widget.SeekBar.OnSeekBarChangeListener;
 
-public class ImageShow extends View implements SliderListener {
+import com.android.gallery3d.R;
+import com.android.gallery3d.filtershow.FilterShowActivity;
+import com.android.gallery3d.filtershow.HistoryAdapter;
+import com.android.gallery3d.filtershow.ImageStateAdapter;
+import com.android.gallery3d.filtershow.PanelController;
+import com.android.gallery3d.filtershow.cache.ImageLoader;
+import com.android.gallery3d.filtershow.filters.ImageFilter;
+import com.android.gallery3d.filtershow.presets.ImagePreset;
+import com.android.gallery3d.filtershow.ui.SliderController;
+import com.android.gallery3d.filtershow.ui.SliderListener;
+
+import java.io.File;
+
+public class ImageShow extends View implements SliderListener, OnSeekBarChangeListener {
 
     private static final String LOGTAG = "ImageShow";
 
@@ -64,8 +61,47 @@ public class ImageShow extends View implements SliderListener {
     protected float mTouchX = 0;
     protected float mTouchY = 0;
 
-    private Handler mHandler = new Handler();
+    private SeekBar mSeekBar = null;
+    private PanelController mController = null;
+
+    private final Handler mHandler = new Handler();
+
+    public void select() {
+        if (getCurrentFilter() != null) {
+            int parameter = getCurrentFilter().getParameter();
+            updateSeekBar(parameter);
+        }
+    }
 
+    public void updateSeekBar(int parameter) {
+        if (mSeekBar == null) {
+            return;
+        }
+        int progress = parameter + 100;
+        mSeekBar.setProgress(progress);
+        if (getPanelController() != null) {
+            getPanelController().onNewValue(parameter);
+        }
+    }
+
+    public void unselect() {
+
+    }
+
+    public void resetParameter() {
+        onNewValue(0);
+        mSliderController.reset();
+    }
+
+    public void setPanelController(PanelController controller) {
+        mController = controller;
+    }
+
+    public PanelController getPanelController() {
+        return mController;
+    }
+
+    @Override
     public void onNewValue(int value) {
         if (getCurrentFilter() != null) {
             getCurrentFilter().setParameter(value);
@@ -74,15 +110,21 @@ public class ImageShow extends View implements SliderListener {
             mImageLoader.resetImageForPreset(getImagePreset(), this);
             getImagePreset().fillImageStateAdapter(mImageStateAdapter);
         }
+        if (getPanelController() != null) {
+            getPanelController().onNewValue(value);
+        }
+        updateSeekBar(value);
         invalidate();
     }
 
+    @Override
     public void onTouchDown(float x, float y) {
         mTouchX = x;
         mTouchY = y;
         invalidate();
     }
 
+    @Override
     public void onTouchUp() {
     }
 
@@ -102,6 +144,7 @@ public class ImageShow extends View implements SliderListener {
                 R.id.rowTextView);
     }
 
+    @Override
     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
         int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
         int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
@@ -110,6 +153,11 @@ public class ImageShow extends View implements SliderListener {
         mSliderController.setHeight(parentHeight);
     }
 
+    public void setSeekBar(SeekBar seekBar) {
+        mSeekBar = seekBar;
+        mSeekBar.setOnSeekBarChangeListener(this);
+    }
+
     public void setCurrentFilter(ImageFilter filter) {
         mCurrentFilter = filter;
     }
@@ -180,6 +228,7 @@ public class ImageShow extends View implements SliderListener {
         }
     }
 
+    @Override
     public void onDraw(Canvas canvas) {
         drawBackground(canvas);
         getFilteredImage();
@@ -262,8 +311,18 @@ public class ImageShow extends View implements SliderListener {
         }
     }
 
-    public void setShowControls(boolean value) {
+    public ImageShow setShowControls(boolean value) {
         mShowControls = value;
+        if (mShowControls) {
+            if (mSeekBar != null) {
+                mSeekBar.setVisibility(View.VISIBLE);
+            }
+        } else {
+            if (mSeekBar != null) {
+                mSeekBar.setVisibility(View.INVISIBLE);
+            }
+        }
+        return this;
     }
 
     public boolean showControls() {
@@ -324,6 +383,7 @@ public class ImageShow extends View implements SliderListener {
         mImageLoader.saveImage(getImagePreset(), filterShowActivity, file);
     }
 
+    @Override
     public boolean onTouchEvent(MotionEvent event) {
         super.onTouchEvent(event);
         mSliderController.onTouchEvent(event);
@@ -368,4 +428,21 @@ public class ImageShow extends View implements SliderListener {
         mImageRotation = imageRotation;
         mImageRotationZoomFactor = imageRotationZoomFactor;
     }
+
+    @Override
+    public void onProgressChanged(SeekBar arg0, int progress, boolean arg2) {
+        onNewValue(progress - 100);
+    }
+
+    @Override
+    public void onStartTrackingTouch(SeekBar arg0) {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public void onStopTrackingTouch(SeekBar arg0) {
+        // TODO Auto-generated method stub
+
+    }
 }
index debaec7..4fdf830 100644 (file)
@@ -4,6 +4,7 @@ import android.content.Context;
 import android.graphics.Canvas;
 import android.util.AttributeSet;
 
+import com.android.gallery3d.filtershow.PanelController;
 import com.android.gallery3d.filtershow.filters.ImageFilter;
 import com.android.gallery3d.filtershow.presets.ImagePreset;
 
@@ -26,18 +27,22 @@ public class ImageSlave extends ImageShow {
         mMasterImageShow = master;
     }
 
+    @Override
     public ImagePreset getImagePreset() {
         return mMasterImageShow.getImagePreset();
     }
 
+    @Override
     public void setImagePreset(ImagePreset preset, boolean addToHistory) {
         mMasterImageShow.setImagePreset(preset, addToHistory);
     }
 
+    @Override
     public void setCurrentFilter(ImageFilter filter) {
         mMasterImageShow.setCurrentFilter(filter);
     }
 
+    @Override
     public ImageFilter getCurrentFilter() {
         return mMasterImageShow.getCurrentFilter();
     }
@@ -46,20 +51,35 @@ public class ImageSlave extends ImageShow {
         mMasterImageShow.setImageRotation(mImageRotation, mImageRotationZoomFactor);
     }
 
+    @Override
     public boolean showTitle() {
         return false;
     }
 
+    @Override
     public float getImageRotation() {
         return mMasterImageShow.getImageRotation();
     }
 
+    @Override
     public float getImageRotationZoomFactor() {
         return mMasterImageShow.getImageRotationZoomFactor();
     }
 
+    @Override
     public void onDraw(Canvas canvas) {
         super.onDraw(canvas);
     }
 
+    @Override
+    public void setPanelController(PanelController controller) {
+        mMasterImageShow.setPanelController(controller);
+    }
+
+    @Override
+    public PanelController getPanelController() {
+        return mMasterImageShow.getPanelController();
+    }
+
+
 }
index eb034bf..99aa389 100644 (file)
@@ -1,26 +1,24 @@
 
 package com.android.gallery3d.filtershow.imageshow;
 
-import com.android.gallery3d.filtershow.presets.ImagePreset;
-
 import android.content.Context;
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
 import android.graphics.Matrix;
 import android.graphics.Paint;
 import android.graphics.Path;
-import android.graphics.Rect;
 import android.graphics.RectF;
 import android.util.AttributeSet;
-import android.util.Log;
 import android.view.MotionEvent;
 
+import com.android.gallery3d.filtershow.presets.ImagePreset;
+
 public class ImageStraighten extends ImageSlave {
     private float mImageRotation = 0;
     private float mImageRotationZoomFactor = 0;
 
-    private float mMinAngle = -45;
-    private float mMaxAngle = 45;
+    private final float mMinAngle = -45;
+    private final float mMaxAngle = 45;
     private float mBaseAngle = 0;
     private float mAngle = 0;
     private float mCenterX;
@@ -69,6 +67,7 @@ public class ImageStraighten extends ImageSlave {
     public void setActionUp() {
         mMode = MODES.UP;
         updatePreset();
+        invalidate();
     }
 
     public void setNoAction() {
@@ -81,6 +80,16 @@ public class ImageStraighten extends ImageSlave {
         setImagePreset(copy);
     }
 
+    @Override
+    public void resetParameter() {
+        super.resetParameter();
+        mImageRotation = 0;
+        mAngle = 0;
+        updatePreset();
+        invalidate();
+    }
+
+    @Override
     public boolean onTouchEvent(MotionEvent event) {
         switch (event.getActionMasked()) {
             case (MotionEvent.ACTION_DOWN):
@@ -97,6 +106,9 @@ public class ImageStraighten extends ImageSlave {
         }
         mImageRotation = mAngle;
         updateAngle();
+        if (getPanelController() != null) {
+            getPanelController().onNewValue((int) mImageRotation);
+        }
         invalidate();
         return true;
     }
@@ -124,11 +136,16 @@ public class ImageStraighten extends ImageSlave {
 
     // ///////////////////////////////////////////////////////////////////////////
 
+    @Override
     public void onNewValue(int value) {
         mImageRotation = value;
+        if (getPanelController() != null) {
+            getPanelController().onNewValue(value);
+        }
         invalidate();
     }
 
+    @Override
     public void onDraw(Canvas canvas) {
         mCenterX = getWidth() / 2;
         mCenterY = getHeight() / 2;
index 69b3f09..8dd81d4 100644 (file)
@@ -1,8 +1,6 @@
 
 package com.android.gallery3d.filtershow.presets;
 
-import java.util.Vector;
-
 import android.graphics.Bitmap;
 import android.graphics.RectF;
 import android.util.Log;
@@ -12,6 +10,8 @@ import com.android.gallery3d.filtershow.filters.ImageFilter;
 import com.android.gallery3d.filtershow.filters.ImageFilterStraighten;
 import com.android.gallery3d.filtershow.imageshow.ImageShow;
 
+import java.util.Vector;
+
 public class ImagePreset {
 
     private static final String LOGTAG = "ImagePreset";
index 3da058b..fb18bcf 100644 (file)
@@ -1,28 +1,22 @@
 
 package com.android.gallery3d.filtershow.ui;
 
-import com.android.gallery3d.filtershow.filters.ImageFilter;
-import com.android.gallery3d.filtershow.filters.ImageFilterCurves;
-import com.android.gallery3d.filtershow.imageshow.ImageShow;
-import com.android.gallery3d.filtershow.imageshow.ImageSlave;
-import com.android.gallery3d.filtershow.presets.ImagePreset;
-import com.android.gallery3d.filtershow.ui.ControlPoint;
-import com.android.gallery3d.filtershow.ui.Spline;
-import com.android.gallery3d.R;
-
 import android.content.Context;
 import android.graphics.Canvas;
 import android.graphics.Paint;
 import android.graphics.Path;
-import android.os.Message;
 import android.util.AttributeSet;
-import android.util.Log;
 import android.view.MenuItem;
 import android.view.MotionEvent;
 import android.view.View;
 import android.widget.PopupMenu;
 import android.widget.Toast;
 
+import com.android.gallery3d.R;
+import com.android.gallery3d.filtershow.filters.ImageFilterCurves;
+import com.android.gallery3d.filtershow.imageshow.ImageSlave;
+import com.android.gallery3d.filtershow.presets.ImagePreset;
+
 public class ImageCurves extends ImageSlave {
 
     private static final String LOGTAG = "ImageCurves";
@@ -47,6 +41,7 @@ public class ImageCurves extends ImageSlave {
         resetCurve();
     }
 
+    @Override
     public boolean showTitle() {
         return false;
     }
@@ -77,6 +72,12 @@ public class ImageCurves extends ImageSlave {
         }
     }
 
+    @Override
+    public void resetParameter() {
+        super.resetParameter();
+        resetCurve();
+    }
+
     public void resetCurve() {
         mSpline = new Spline();
 
@@ -87,6 +88,7 @@ public class ImageCurves extends ImageSlave {
         }
     }
 
+    @Override
     public void onDraw(Canvas canvas) {
         super.onDraw(canvas);
 
index f2f0df3..99f66b1 100644 (file)
@@ -5,8 +5,6 @@ import android.graphics.Canvas;
 import android.graphics.Paint;
 import android.view.MotionEvent;
 
-import android.util.Log;
-
 public class SliderController {
     private static final String LOGTAG = "SliderController";
 
@@ -22,7 +20,7 @@ public class SliderController {
 
     private String mToast = null;
 
-    private Paint mPaint = new Paint();
+    private final Paint mPaint = new Paint();
 
     private SliderListener mListener = null;
 
@@ -37,7 +35,6 @@ public class SliderController {
         if (mMode == MODES.NONE || mMode == MODES.UP) {
             return;
         }
-        drawToast(canvas);
     }
 
     public void drawToast(Canvas canvas) {
@@ -62,7 +59,7 @@ public class SliderController {
     }
 
     protected int computeValue() {
-        int delta = (int) (100 * (getCurrentX() - getCenterX()) / (float) getWidth());
+        int delta = (int) (100 * (getCurrentX() - getCenterX()) / getWidth());
         int value = mOriginalValue + delta;
         if (value < -100) {
             value = -100;
@@ -170,4 +167,8 @@ public class SliderController {
         return true;
     }
 
+    public void reset() {
+        mOriginalValue = 0;
+    }
+
 }