ImageShow.java revision 4af6d6a77ad15d49605aaf9451d713eb70b6b619
1/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.gallery3d.filtershow.imageshow;
18
19import android.content.Context;
20import android.graphics.Bitmap;
21import android.graphics.Canvas;
22import android.graphics.Color;
23import android.graphics.Paint;
24import android.graphics.Rect;
25import android.graphics.RectF;
26import android.net.Uri;
27import android.os.Handler;
28import android.util.AttributeSet;
29import android.view.GestureDetector;
30import android.view.GestureDetector.OnDoubleTapListener;
31import android.view.GestureDetector.OnGestureListener;
32import android.view.MotionEvent;
33import android.view.View;
34import android.widget.ArrayAdapter;
35import android.widget.SeekBar;
36import android.widget.SeekBar.OnSeekBarChangeListener;
37
38import com.android.gallery3d.R;
39import com.android.gallery3d.filtershow.FilterShowActivity;
40import com.android.gallery3d.filtershow.HistoryAdapter;
41import com.android.gallery3d.filtershow.ImageStateAdapter;
42import com.android.gallery3d.filtershow.PanelController;
43import com.android.gallery3d.filtershow.cache.ImageLoader;
44import com.android.gallery3d.filtershow.filters.ImageFilter;
45import com.android.gallery3d.filtershow.presets.ImagePreset;
46import com.android.gallery3d.filtershow.ui.SliderController;
47import com.android.gallery3d.filtershow.ui.SliderListener;
48
49import java.io.File;
50
51public class ImageShow extends View implements OnGestureListener,
52        OnDoubleTapListener,
53        SliderListener,
54        OnSeekBarChangeListener {
55
56    private static final String LOGTAG = "ImageShow";
57
58    protected Paint mPaint = new Paint();
59    protected static int mTextSize = 24;
60    protected static int mTextPadding = 20;
61
62    protected ImagePreset mImagePreset = null;
63    protected ImagePreset mImageGeometryOnlyPreset = null;
64    protected ImagePreset mImageFiltersOnlyPreset = null;
65
66    protected ImageLoader mImageLoader = null;
67    private ImageFilter mCurrentFilter = null;
68    private boolean mDirtyGeometry = false;
69
70    private Bitmap mBackgroundImage = null;
71    private final boolean USE_BACKGROUND_IMAGE = false;
72    private static int mBackgroundColor = Color.RED;
73
74    private Bitmap mGeometryOnlyImage = null;
75    private Bitmap mFiltersOnlyImage = null;
76    private Bitmap mFilteredImage = null;
77
78    private GestureDetector mGestureDetector = null;
79
80    private HistoryAdapter mHistoryAdapter = null;
81    private ImageStateAdapter mImageStateAdapter = null;
82
83    protected Rect mImageBounds = new Rect();
84
85    private boolean mTouchShowOriginal = false;
86    private long mTouchShowOriginalDate = 0;
87    private final long mTouchShowOriginalDelayMin = 200; // 200ms
88    private final long mTouchShowOriginalDelayMax = 300; // 300ms
89    private int mShowOriginalDirection = 0;
90    private static int UNVEIL_HORIZONTAL = 1;
91    private static int UNVEIL_VERTICAL = 2;
92
93    private int mTouchDownX = 0;
94    private int mTouchDownY = 0;
95    protected float mTouchX = 0;
96    protected float mTouchY = 0;
97
98    private static int mOriginalTextMargin = 8;
99    private static int mOriginalTextSize = 26;
100    private static String mOriginalText = "Original";
101
102    protected GeometryMetadata getGeometry() {
103        return new GeometryMetadata(getImagePreset().mGeoData);
104    }
105
106    public void setGeometry(GeometryMetadata d) {
107        getImagePreset().mGeoData.set(d);
108    }
109
110    private boolean mShowControls = false;
111    private boolean mShowOriginal = false;
112    private String mToast = null;
113    private boolean mShowToast = false;
114    private boolean mImportantToast = false;
115
116    private SeekBar mSeekBar = null;
117    private PanelController mController = null;
118
119    private FilterShowActivity mActivity = null;
120
121    public static void setDefaultBackgroundColor(int value) {
122        mBackgroundColor = value;
123    }
124
125    public int getDefaultBackgroundColor() {
126        return mBackgroundColor;
127    }
128
129    public static void setTextSize(int value) {
130        mTextSize = value;
131    }
132
133    public static void setTextPadding(int value) {
134        mTextPadding = value;
135    }
136
137    public static void setOriginalTextMargin(int value) {
138        mOriginalTextMargin = value;
139    }
140
141    public static void setOriginalTextSize(int value) {
142        mOriginalTextSize = value;
143    }
144
145    public static void setOriginalText(String text) {
146        mOriginalText = text;
147    }
148
149    private final Handler mHandler = new Handler();
150
151    public void select() {
152        if (mSeekBar != null) {
153            mSeekBar.setOnSeekBarChangeListener(this);
154        }
155        if (getCurrentFilter() != null) {
156            int parameter = getCurrentFilter().getParameter();
157            int maxp = getCurrentFilter().getMaxParameter();
158            int minp = getCurrentFilter().getMinParameter();
159            updateSeekBar(parameter, minp, maxp);
160        }
161    }
162
163    private int parameterToUI(int parameter, int minp, int maxp, int uimax) {
164        return (uimax * (parameter - minp)) / (maxp - minp);
165    }
166
167    private int uiToParameter(int ui, int minp, int maxp, int uimax) {
168        return ((maxp - minp) * ui) / uimax + minp;
169    }
170
171    public void updateSeekBar(int parameter, int minp, int maxp) {
172        if (mSeekBar == null) {
173            return;
174        }
175        int seekMax = mSeekBar.getMax();
176        int progress = parameterToUI(parameter, minp, maxp, seekMax);
177        mSeekBar.setProgress(progress);
178    }
179
180    public void unselect() {
181
182    }
183
184    public boolean hasModifications() {
185        if (getImagePreset() == null) {
186            return false;
187        }
188        return getImagePreset().hasModifications();
189    }
190
191    public void resetParameter() {
192        ImageFilter currentFilter = getCurrentFilter();
193        if (currentFilter != null) {
194            updateSeekBar(currentFilter.getDefaultParameter(),
195                    getCurrentFilter().getMinParameter(), getCurrentFilter().getMaxParameter());
196        }
197    }
198
199    public void setPanelController(PanelController controller) {
200        mController = controller;
201    }
202
203    public PanelController getPanelController() {
204        return mController;
205    }
206
207    @Override
208    public void onNewValue(int parameter) {
209        int maxp = ImageFilter.DEFAULT_MAX_PARAMETER;
210        int minp = ImageFilter.DEFAULT_MIN_PARAMETER;
211        if (getCurrentFilter() != null) {
212            getCurrentFilter().setParameter(parameter);
213            maxp = getCurrentFilter().getMaxParameter();
214            minp = getCurrentFilter().getMinParameter();
215        }
216        if (getImagePreset() != null) {
217            mImageLoader.resetImageForPreset(getImagePreset(), this);
218            getImagePreset().fillImageStateAdapter(mImageStateAdapter);
219        }
220        if (getPanelController() != null) {
221            getPanelController().onNewValue(parameter);
222        }
223        invalidate();
224        mActivity.enableSave(hasModifications());
225    }
226
227    @Override
228    public void onTouchDown(float x, float y) {
229        mTouchX = x;
230        mTouchY = y;
231        invalidate();
232    }
233
234    @Override
235    public void onTouchUp() {
236    }
237
238    public ImageShow(Context context, AttributeSet attrs) {
239        super(context, attrs);
240        mHistoryAdapter = new HistoryAdapter(context, R.layout.filtershow_history_operation_row,
241                R.id.rowTextView);
242        mImageStateAdapter = new ImageStateAdapter(context,
243                R.layout.filtershow_imagestate_row);
244        setupGestureDetector(context);
245        mActivity = (FilterShowActivity) context;
246    }
247
248    public ImageShow(Context context) {
249        super(context);
250        mHistoryAdapter = new HistoryAdapter(context, R.layout.filtershow_history_operation_row,
251                R.id.rowTextView);
252        setupGestureDetector(context);
253        mActivity = (FilterShowActivity) context;
254    }
255
256    public void setupGestureDetector(Context context) {
257        mGestureDetector = new GestureDetector(context, this);
258    }
259
260    @Override
261    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
262        int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
263        int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
264        setMeasuredDimension(parentWidth, parentHeight);
265    }
266
267    public void setSeekBar(SeekBar seekBar) {
268        mSeekBar = seekBar;
269    }
270
271    public void setCurrentFilter(ImageFilter filter) {
272        mCurrentFilter = filter;
273    }
274
275    public ImageFilter getCurrentFilter() {
276        return mCurrentFilter;
277    }
278
279    public void setAdapter(HistoryAdapter adapter) {
280        mHistoryAdapter = adapter;
281    }
282
283    public void showToast(String text) {
284        showToast(text, false);
285    }
286
287    public void showToast(String text, boolean important) {
288        mToast = text;
289        mShowToast = true;
290        mImportantToast = important;
291        invalidate();
292
293        mHandler.postDelayed(new Runnable() {
294            @Override
295            public void run() {
296                mShowToast = false;
297                invalidate();
298            }
299        }, 400);
300    }
301
302    public Rect getImageBounds() {
303        Rect dst = new Rect();
304        getImagePreset().mGeoData.getPhotoBounds().roundOut(dst);
305        return dst;
306    }
307
308    public Rect getImageCropBounds() {
309        return GeometryMath.roundNearest(getImagePreset().mGeoData.getPreviewCropBounds());
310    }
311
312    public Rect getDisplayedImageBounds() {
313        return mImageBounds;
314    }
315
316    public ImagePreset getImagePreset() {
317        return mImagePreset;
318    }
319
320    public void drawToast(Canvas canvas) {
321        if (mShowToast && mToast != null) {
322            Paint paint = new Paint();
323            paint.setTextSize(128);
324            float textWidth = paint.measureText(mToast);
325            int toastX = (int) ((getWidth() - textWidth) / 2.0f);
326            int toastY = (int) (getHeight() / 3.0f);
327
328            paint.setARGB(255, 0, 0, 0);
329            canvas.drawText(mToast, toastX - 2, toastY - 2, paint);
330            canvas.drawText(mToast, toastX - 2, toastY, paint);
331            canvas.drawText(mToast, toastX, toastY - 2, paint);
332            canvas.drawText(mToast, toastX + 2, toastY + 2, paint);
333            canvas.drawText(mToast, toastX + 2, toastY, paint);
334            canvas.drawText(mToast, toastX, toastY + 2, paint);
335            if (mImportantToast) {
336                paint.setARGB(255, 200, 0, 0);
337            } else {
338                paint.setARGB(255, 255, 255, 255);
339            }
340            canvas.drawText(mToast, toastX, toastY, paint);
341        }
342    }
343
344    public void defaultDrawImage(Canvas canvas) {
345        drawImage(canvas, getFilteredImage());
346        drawPartialImage(canvas, getGeometryOnlyImage());
347    }
348
349    @Override
350    public void onDraw(Canvas canvas) {
351        drawBackground(canvas);
352        requestFilteredImages();
353        defaultDrawImage(canvas);
354
355        if (showTitle() && getImagePreset() != null) {
356            mPaint.setARGB(200, 0, 0, 0);
357            mPaint.setTextSize(mTextSize);
358
359            Rect textRect = new Rect(0, 0, getWidth(), mTextSize + mTextPadding);
360            canvas.drawRect(textRect, mPaint);
361            mPaint.setARGB(255, 200, 200, 200);
362            canvas.drawText(getImagePreset().name(), mTextPadding,
363                    1.5f * mTextPadding, mPaint);
364        }
365
366        drawToast(canvas);
367    }
368
369    public void resetImageCaches(ImageShow caller) {
370        if (mImageLoader == null) {
371            return;
372        }
373        updateImagePresets(true);
374    }
375
376    public void updateImagePresets(boolean force) {
377        ImagePreset preset = getImagePreset();
378        if (preset == null) {
379            mActivity.enableSave(false);
380            return;
381        }
382        if (force) {
383            mImageLoader.resetImageForPreset(getImagePreset(), this);
384        }
385        if (force || mImageGeometryOnlyPreset == null) {
386            ImagePreset newPreset = new ImagePreset(preset);
387            newPreset.setDoApplyFilters(false);
388            if (mImageGeometryOnlyPreset == null
389                    || !newPreset.same(mImageGeometryOnlyPreset)) {
390                mImageGeometryOnlyPreset = newPreset;
391                mGeometryOnlyImage = null;
392            }
393        }
394        if (force || mImageFiltersOnlyPreset == null) {
395            ImagePreset newPreset = new ImagePreset(preset);
396            newPreset.setDoApplyGeometry(false);
397            if (mImageFiltersOnlyPreset == null
398                    || !newPreset.same(mImageFiltersOnlyPreset)) {
399                mImageFiltersOnlyPreset = newPreset;
400                mFiltersOnlyImage = null;
401            }
402        }
403        mActivity.enableSave(hasModifications());
404    }
405
406    public void requestFilteredImages() {
407        if (mImageLoader != null) {
408            Bitmap bitmap = mImageLoader.getImageForPreset(this,
409                    getImagePreset(), showHires());
410
411            if (bitmap != null) {
412                if (mFilteredImage == null) {
413                    invalidate();
414                }
415                mFilteredImage = bitmap;
416            }
417
418            updateImagePresets(false);
419            if (mImageGeometryOnlyPreset != null) {
420                bitmap = mImageLoader.getImageForPreset(this, mImageGeometryOnlyPreset,
421                        showHires());
422                if (bitmap != null) {
423                    mGeometryOnlyImage = bitmap;
424                }
425            }
426            if (mImageFiltersOnlyPreset != null) {
427                bitmap = mImageLoader.getImageForPreset(this, mImageFiltersOnlyPreset,
428                        showHires());
429                if (bitmap != null) {
430                    mFiltersOnlyImage = bitmap;
431                }
432            }
433        }
434
435        if (mShowOriginal) {
436            mFilteredImage = mGeometryOnlyImage;
437        }
438    }
439
440    public Bitmap getFiltersOnlyImage() {
441        return mFiltersOnlyImage;
442    }
443
444    public Bitmap getGeometryOnlyImage() {
445        return mGeometryOnlyImage;
446    }
447
448    public Bitmap getFilteredImage() {
449        return mFilteredImage;
450    }
451
452    public void drawImage(Canvas canvas, Bitmap image) {
453        if (image != null) {
454            Rect s = new Rect(0, 0, image.getWidth(),
455                    image.getHeight());
456
457            float scale = GeometryMath.scale(image.getWidth(), image.getHeight(), getWidth(),
458                    getHeight());
459
460            float w = image.getWidth() * scale;
461            float h = image.getHeight() * scale;
462            float ty = (getHeight() - h) / 2.0f;
463            float tx = (getWidth() - w) / 2.0f;
464
465            Rect d = new Rect((int) tx, (int) ty, (int) (w + tx),
466                    (int) (h + ty));
467            mImageBounds = d;
468            canvas.drawBitmap(image, s, d, mPaint);
469        }
470    }
471
472    public void drawPartialImage(Canvas canvas, Bitmap image) {
473        if (!mTouchShowOriginal)
474            return;
475        canvas.save();
476        if (image != null) {
477            if (mShowOriginalDirection == 0) {
478                if ((mTouchY - mTouchDownY) > (mTouchX - mTouchDownX)) {
479                    mShowOriginalDirection = UNVEIL_VERTICAL;
480                } else {
481                    mShowOriginalDirection = UNVEIL_HORIZONTAL;
482                }
483            }
484
485            int px = 0;
486            int py = 0;
487            if (mShowOriginalDirection == UNVEIL_VERTICAL) {
488                px = mImageBounds.width();
489                py = (int) (mTouchY - mImageBounds.top);
490            } else {
491                px = (int) (mTouchX - mImageBounds.left);
492                py = mImageBounds.height();
493            }
494
495            Rect d = new Rect(mImageBounds.left, mImageBounds.top,
496                    mImageBounds.left + px, mImageBounds.top + py);
497            canvas.clipRect(d);
498            drawImage(canvas, image);
499            Paint paint = new Paint();
500            paint.setColor(Color.BLACK);
501
502            if (mShowOriginalDirection == UNVEIL_VERTICAL) {
503                canvas.drawLine(mImageBounds.left, mTouchY - 1,
504                        mImageBounds.right, mTouchY - 1, paint);
505            } else {
506                canvas.drawLine(mTouchX - 1, mImageBounds.top,
507                        mTouchX - 1, mImageBounds.bottom, paint);
508            }
509
510            Rect bounds = new Rect();
511            paint.setTextSize(mOriginalTextSize);
512            paint.getTextBounds(mOriginalText, 0, mOriginalText.length(), bounds);
513            paint.setColor(Color.BLACK);
514            canvas.drawText(mOriginalText, mImageBounds.left + mOriginalTextMargin + 1,
515                    mImageBounds.top + bounds.height() + mOriginalTextMargin + 1, paint);
516            paint.setColor(Color.WHITE);
517            canvas.drawText(mOriginalText, mImageBounds.left + mOriginalTextMargin,
518                    mImageBounds.top + bounds.height() + mOriginalTextMargin, paint);
519        }
520        canvas.restore();
521    }
522
523    public void drawBackground(Canvas canvas) {
524        if (USE_BACKGROUND_IMAGE) {
525            if (mBackgroundImage == null) {
526                mBackgroundImage = mImageLoader.getBackgroundBitmap(getResources());
527            }
528            if (mBackgroundImage != null) {
529                Rect s = new Rect(0, 0, mBackgroundImage.getWidth(),
530                        mBackgroundImage.getHeight());
531                Rect d = new Rect(0, 0, getWidth(), getHeight());
532                canvas.drawBitmap(mBackgroundImage, s, d, mPaint);
533            }
534        } else {
535            canvas.drawColor(mBackgroundColor);
536        }
537    }
538
539    public ImageShow setShowControls(boolean value) {
540        mShowControls = value;
541        if (mShowControls) {
542            if (mSeekBar != null) {
543                mSeekBar.setVisibility(View.VISIBLE);
544            }
545        } else {
546            if (mSeekBar != null) {
547                mSeekBar.setVisibility(View.INVISIBLE);
548            }
549        }
550        return this;
551    }
552
553    public boolean showControls() {
554        return mShowControls;
555    }
556
557    public boolean showHires() {
558        return true;
559    }
560
561    public boolean showTitle() {
562        return false;
563    }
564
565    public void setImagePreset(ImagePreset preset) {
566        setImagePreset(preset, true);
567    }
568
569    public void setImagePreset(ImagePreset preset, boolean addToHistory) {
570        if (preset == null) {
571            return;
572        }
573        mImagePreset = preset;
574        getImagePreset().setImageLoader(mImageLoader);
575        updateImagePresets(true);
576        if (addToHistory) {
577            mHistoryAdapter.addHistoryItem(getImagePreset());
578        }
579        getImagePreset().setEndpoint(this);
580        updateImage();
581        mImagePreset.fillImageStateAdapter(mImageStateAdapter);
582        invalidate();
583    }
584
585    public void setImageLoader(ImageLoader loader) {
586        mImageLoader = loader;
587        if (mImageLoader != null) {
588            mImageLoader.addListener(this);
589            if (mImagePreset != null) {
590                mImagePreset.setImageLoader(mImageLoader);
591            }
592        }
593    }
594
595    private void setDirtyGeometryFlag() {
596        mDirtyGeometry = true;
597    }
598
599    protected void clearDirtyGeometryFlag() {
600        mDirtyGeometry = false;
601    }
602
603    protected boolean getDirtyGeometryFlag() {
604        return mDirtyGeometry;
605    }
606
607    private void imageSizeChanged(Bitmap image) {
608        if (image == null || getImagePreset() == null)
609            return;
610        float w = image.getWidth();
611        float h = image.getHeight();
612        GeometryMetadata geo = getImagePreset().mGeoData;
613        RectF pb = geo.getPhotoBounds();
614        if (w == pb.width() && h == pb.height()) {
615            return;
616        }
617        RectF r = new RectF(0, 0, w, h);
618        getImagePreset().mGeoData.setPhotoBounds(r);
619        getImagePreset().mGeoData.setCropBounds(r);
620        setDirtyGeometryFlag();
621    }
622
623    public boolean updateGeometryFlags() {
624        return true;
625    }
626
627    public void updateImage() {
628        invalidate();
629        if (!updateGeometryFlags()) {
630            return;
631        }
632        Bitmap bitmap = mImageLoader.getOriginalBitmapLarge();
633        if (bitmap != null) {
634            imageSizeChanged(bitmap);
635        }
636    }
637
638    public void imageLoaded() {
639        updateImage();
640        invalidate();
641    }
642
643    public void updateFilteredImage(Bitmap bitmap) {
644        mFilteredImage = bitmap;
645    }
646
647    public void saveImage(FilterShowActivity filterShowActivity, File file) {
648        mImageLoader.saveImage(getImagePreset(), filterShowActivity, file);
649    }
650
651    public void saveToUri(Bitmap f, Uri u, String m, FilterShowActivity filterShowActivity) {
652        mImageLoader.saveToUri(f, u, m, filterShowActivity);
653    }
654
655    public void returnFilteredResult(FilterShowActivity filterShowActivity) {
656        mImageLoader.returnFilteredResult(getImagePreset(), filterShowActivity);
657    }
658
659    @Override
660    public boolean onTouchEvent(MotionEvent event) {
661        super.onTouchEvent(event);
662        if (mGestureDetector != null) {
663            mGestureDetector.onTouchEvent(event);
664        }
665        int ex = (int) event.getX();
666        int ey = (int) event.getY();
667        if (event.getAction() == MotionEvent.ACTION_DOWN) {
668            mTouchDownX = ex;
669            mTouchDownY = ey;
670            mTouchShowOriginalDate = System.currentTimeMillis();
671            mShowOriginalDirection = 0;
672        }
673        if (event.getAction() == MotionEvent.ACTION_MOVE) {
674            mTouchX = ex;
675            mTouchY = ey;
676            if (!mActivity.isShowingHistoryPanel()
677                    && (System.currentTimeMillis() - mTouchShowOriginalDate
678                    > mTouchShowOriginalDelayMin)) {
679                mTouchShowOriginal = true;
680            }
681        }
682        if (event.getAction() == MotionEvent.ACTION_UP) {
683            mTouchShowOriginal = false;
684            mTouchDownX = 0;
685            mTouchDownY = 0;
686            mTouchX = 0;
687            mTouchY = 0;
688        }
689        invalidate();
690        return true;
691    }
692
693    // listview stuff
694
695    public HistoryAdapter getHistory() {
696        return mHistoryAdapter;
697    }
698
699    public ArrayAdapter getImageStateAdapter() {
700        return mImageStateAdapter;
701    }
702
703    public void onItemClick(int position) {
704        setImagePreset(new ImagePreset(mHistoryAdapter.getItem(position)), false);
705        // we need a copy from the history
706        mHistoryAdapter.setCurrentPreset(position);
707    }
708
709    public void showOriginal(boolean show) {
710        mShowOriginal = show;
711        invalidate();
712    }
713
714    public float getImageRotation() {
715        return getImagePreset().mGeoData.getRotation();
716    }
717
718    public float getImageRotationZoomFactor() {
719        return getImagePreset().mGeoData.getScaleFactor();
720    }
721
722    public void setImageRotation(float r) {
723        getImagePreset().mGeoData.setRotation(r);
724    }
725
726    public void setImageRotationZoomFactor(float f) {
727        getImagePreset().mGeoData.setScaleFactor(f);
728    }
729
730    public void setImageRotation(float imageRotation,
731            float imageRotationZoomFactor) {
732        float r = getImageRotation();
733        if (imageRotation != r) {
734            invalidate();
735        }
736        setImageRotation(imageRotation);
737        setImageRotationZoomFactor(imageRotationZoomFactor);
738    }
739
740    @Override
741    public void onProgressChanged(SeekBar arg0, int progress, boolean arg2) {
742        int parameter = progress;
743        if (getCurrentFilter() != null) {
744            int maxp = getCurrentFilter().getMaxParameter();
745            int minp = getCurrentFilter().getMinParameter();
746            parameter = uiToParameter(progress, minp, maxp, arg0.getMax());
747        }
748
749        onNewValue(parameter);
750    }
751
752    @Override
753    public void onStartTrackingTouch(SeekBar arg0) {
754        // TODO Auto-generated method stub
755
756    }
757
758    @Override
759    public void onStopTrackingTouch(SeekBar arg0) {
760        // TODO Auto-generated method stub
761
762    }
763
764    @Override
765    public boolean onDoubleTap(MotionEvent arg0) {
766        // TODO Auto-generated method stub
767        return false;
768    }
769
770    @Override
771    public boolean onDoubleTapEvent(MotionEvent arg0) {
772        // TODO Auto-generated method stub
773        return false;
774    }
775
776    @Override
777    public boolean onSingleTapConfirmed(MotionEvent arg0) {
778        // TODO Auto-generated method stub
779        return false;
780    }
781
782    @Override
783    public boolean onDown(MotionEvent arg0) {
784        // TODO Auto-generated method stub
785        return false;
786    }
787
788    @Override
789    public boolean onFling(MotionEvent startEvent, MotionEvent endEvent, float arg2, float arg3) {
790        if ((!mActivity.isShowingHistoryPanel() && startEvent.getX() > endEvent.getX())
791                || (mActivity.isShowingHistoryPanel() && endEvent.getX() > startEvent.getX())) {
792            if (!mTouchShowOriginal
793                    || (mTouchShowOriginal &&
794                    (System.currentTimeMillis() - mTouchShowOriginalDate
795                    < mTouchShowOriginalDelayMax))) {
796                mActivity.toggleHistoryPanel();
797            }
798        }
799        return true;
800    }
801
802    @Override
803    public void onLongPress(MotionEvent arg0) {
804        // TODO Auto-generated method stub
805
806    }
807
808    @Override
809    public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2, float arg3) {
810        // TODO Auto-generated method stub
811        return false;
812    }
813
814    @Override
815    public void onShowPress(MotionEvent arg0) {
816        // TODO Auto-generated method stub
817
818    }
819
820    @Override
821    public boolean onSingleTapUp(MotionEvent arg0) {
822        // TODO Auto-generated method stub
823        return false;
824    }
825
826}
827