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;
18
19import android.content.Context;
20import android.text.Html;
21import android.view.MenuItem;
22import android.view.View;
23import android.view.View.OnClickListener;
24import android.view.ViewPropertyAnimator;
25import android.widget.PopupMenu;
26import android.widget.TextView;
27
28import com.android.gallery3d.R;
29import com.android.gallery3d.filtershow.filters.ImageFilter;
30import com.android.gallery3d.filtershow.filters.ImageFilterBwFilter;
31import com.android.gallery3d.filtershow.filters.ImageFilterContrast;
32import com.android.gallery3d.filtershow.filters.ImageFilterCurves;
33import com.android.gallery3d.filtershow.filters.ImageFilterExposure;
34import com.android.gallery3d.filtershow.filters.ImageFilterHue;
35import com.android.gallery3d.filtershow.filters.ImageFilterRedEye;
36import com.android.gallery3d.filtershow.filters.ImageFilterSaturated;
37import com.android.gallery3d.filtershow.filters.ImageFilterShadows;
38import com.android.gallery3d.filtershow.filters.ImageFilterSharpen;
39import com.android.gallery3d.filtershow.filters.ImageFilterTinyPlanet;
40import com.android.gallery3d.filtershow.filters.ImageFilterVibrance;
41import com.android.gallery3d.filtershow.filters.ImageFilterVignette;
42import com.android.gallery3d.filtershow.filters.ImageFilterWBalance;
43import com.android.gallery3d.filtershow.imageshow.ImageCrop;
44import com.android.gallery3d.filtershow.imageshow.ImageShow;
45import com.android.gallery3d.filtershow.presets.ImagePreset;
46import com.android.gallery3d.filtershow.ui.FramedTextButton;
47import com.android.gallery3d.filtershow.ui.ImageCurves;
48
49import java.util.HashMap;
50import java.util.Vector;
51
52public class PanelController implements OnClickListener {
53    private static int PANEL = 0;
54    private static int COMPONENT = 1;
55    private static int VERTICAL_MOVE = 0;
56    private static int HORIZONTAL_MOVE = 1;
57    private static final int ANIM_DURATION = 200;
58    private static final String LOGTAG = "PanelController";
59    private boolean mDisableFilterButtons = false;
60
61    class Panel {
62        private final View mView;
63        private final View mContainer;
64        private int mPosition = 0;
65        private final Vector<View> mSubviews = new Vector<View>();
66
67        public Panel(View view, View container, int position) {
68            mView = view;
69            mContainer = container;
70            mPosition = position;
71        }
72
73        public void addView(View view) {
74            mSubviews.add(view);
75        }
76
77        public int getPosition() {
78            return mPosition;
79        }
80
81        public ViewPropertyAnimator unselect(int newPos, int move) {
82            ViewPropertyAnimator anim = mContainer.animate();
83            mView.setSelected(false);
84            mContainer.setX(0);
85            mContainer.setY(0);
86            int delta = 0;
87            int w = mRowPanel.getWidth();
88            int h = mRowPanel.getHeight();
89            if (move == HORIZONTAL_MOVE) {
90                if (newPos > mPosition) {
91                    delta = -w;
92                } else {
93                    delta = w;
94                }
95                anim.x(delta);
96            } else if (move == VERTICAL_MOVE) {
97                anim.y(h);
98            }
99            anim.setDuration(ANIM_DURATION).withLayer().withEndAction(new Runnable() {
100                @Override
101                public void run() {
102                    mContainer.setVisibility(View.GONE);
103                }
104            });
105            return anim;
106        }
107
108        public ViewPropertyAnimator select(int oldPos, int move) {
109            mView.setSelected(true);
110            mContainer.setVisibility(View.VISIBLE);
111            mContainer.setX(0);
112            mContainer.setY(0);
113            ViewPropertyAnimator anim = mContainer.animate();
114            int w = mRowPanel.getWidth();
115            int h = mRowPanel.getHeight();
116            if (move == HORIZONTAL_MOVE) {
117                if (oldPos < mPosition) {
118                    mContainer.setX(w);
119                } else {
120                    mContainer.setX(-w);
121                }
122                anim.x(0);
123            } else if (move == VERTICAL_MOVE) {
124                mContainer.setY(h);
125                anim.y(0);
126            }
127            anim.setDuration(ANIM_DURATION).withLayer();
128            return anim;
129        }
130    }
131
132    class UtilityPanel {
133        private final Context mContext;
134        private final View mView;
135        private final TextView mTextView;
136        private boolean mSelected = false;
137        private String mEffectName = null;
138        private int mParameterValue = 0;
139        private boolean mShowParameterValue = false;
140        private View mAspectButton = null;
141        private View mCurvesButton = null;
142        boolean firstTimeCropDisplayed = true;
143
144        public UtilityPanel(Context context, View view, View textView,
145                View aspectButton, View curvesButton) {
146            mContext = context;
147            mView = view;
148            mTextView = (TextView) textView;
149            mAspectButton = aspectButton;
150            mCurvesButton = curvesButton;
151        }
152
153        public boolean selected() {
154            return mSelected;
155        }
156
157        public void setAspectButton(FramedTextButton button, int itemId) {
158            ImageCrop imageCrop = (ImageCrop) mCurrentImage;
159            switch (itemId) {
160                case R.id.crop_menu_1to1: {
161                    String t = mContext.getString(R.string.aspect1to1_effect);
162                    button.setText(t);
163                    imageCrop.apply(1, 1);
164                    imageCrop.setAspectString(t);
165                    break;
166                }
167                case R.id.crop_menu_4to3: {
168                    String t = mContext.getString(R.string.aspect4to3_effect);
169                    button.setText(t);
170                    imageCrop.apply(4, 3);
171                    imageCrop.setAspectString(t);
172                    break;
173                }
174                case R.id.crop_menu_3to4: {
175                    String t = mContext.getString(R.string.aspect3to4_effect);
176                    button.setText(t);
177                    imageCrop.apply(3, 4);
178                    imageCrop.setAspectString(t);
179                    break;
180                }
181                case R.id.crop_menu_5to7: {
182                    String t = mContext.getString(R.string.aspect5to7_effect);
183                    button.setText(t);
184                    imageCrop.apply(5, 7);
185                    imageCrop.setAspectString(t);
186                    break;
187                }
188                case R.id.crop_menu_7to5: {
189                    String t = mContext.getString(R.string.aspect7to5_effect);
190                    button.setText(t);
191                    imageCrop.apply(7, 5);
192                    imageCrop.setAspectString(t);
193                    break;
194                }
195                case R.id.crop_menu_none: {
196                    String t = mContext.getString(R.string.aspectNone_effect);
197                    button.setText(t);
198                    imageCrop.applyClear();
199                    imageCrop.setAspectString(t);
200                    break;
201                }
202                case R.id.crop_menu_original: {
203                    String t = mContext.getString(R.string.aspectOriginal_effect);
204                    button.setText(t);
205                    imageCrop.applyOriginal();
206                    imageCrop.setAspectString(t);
207                    break;
208                }
209            }
210            imageCrop.invalidate();
211        }
212
213        public void showAspectButtons() {
214            if (mAspectButton != null)
215                mAspectButton.setVisibility(View.VISIBLE);
216        }
217
218        public void hideAspectButtons() {
219            if (mAspectButton != null)
220                mAspectButton.setVisibility(View.GONE);
221        }
222
223        public void showCurvesButtons() {
224            if (mCurvesButton != null)
225                mCurvesButton.setVisibility(View.VISIBLE);
226        }
227
228        public void hideCurvesButtons() {
229            if (mCurvesButton != null)
230                mCurvesButton.setVisibility(View.GONE);
231        }
232
233        public void onNewValue(int value) {
234            mParameterValue = value;
235            updateText();
236        }
237
238        public void setEffectName(String effectName) {
239            mEffectName = effectName;
240            setShowParameter(true);
241        }
242
243        public void setShowParameter(boolean s) {
244            mShowParameterValue = s;
245            updateText();
246        }
247
248        public void updateText() {
249            String apply = mContext.getString(R.string.apply_effect);
250            if (mShowParameterValue) {
251                mTextView.setText(Html.fromHtml(apply + " " + mEffectName + " "
252                        + mParameterValue));
253            } else {
254                mTextView.setText(Html.fromHtml(apply + " " + mEffectName));
255            }
256        }
257
258        public ViewPropertyAnimator unselect() {
259            ViewPropertyAnimator anim = mView.animate();
260            mView.setX(0);
261            mView.setY(0);
262            int h = mRowPanel.getHeight();
263            anim.y(-h);
264            anim.setDuration(ANIM_DURATION).withLayer().withEndAction(new Runnable() {
265                @Override
266                public void run() {
267                    mView.setVisibility(View.GONE);
268                }
269            });
270            mSelected = false;
271            return anim;
272        }
273
274        public ViewPropertyAnimator select() {
275            mView.setVisibility(View.VISIBLE);
276            int h = mRowPanel.getHeight();
277            mView.setX(0);
278            mView.setY(-h);
279            updateText();
280            ViewPropertyAnimator anim = mView.animate();
281            anim.y(0);
282            anim.setDuration(ANIM_DURATION).withLayer();
283            mSelected = true;
284            return anim;
285        }
286    }
287
288    class ViewType {
289        private final int mType;
290        private final View mView;
291
292        public ViewType(View view, int type) {
293            mView = view;
294            mType = type;
295        }
296
297        public int type() {
298            return mType;
299        }
300    }
301
302    private final HashMap<View, Panel> mPanels = new HashMap<View, Panel>();
303    private final HashMap<View, ViewType> mViews = new HashMap<View, ViewType>();
304    private final Vector<View> mImageViews = new Vector<View>();
305    private View mCurrentPanel = null;
306    private View mRowPanel = null;
307    private UtilityPanel mUtilityPanel = null;
308    private ImageShow mMasterImage = null;
309    private ImageShow mCurrentImage = null;
310    private FilterShowActivity mActivity = null;
311
312    public void setActivity(FilterShowActivity activity) {
313        mActivity = activity;
314    }
315
316    public void addView(View view) {
317        view.setOnClickListener(this);
318        mViews.put(view, new ViewType(view, COMPONENT));
319    }
320
321    public void addPanel(View view, View container, int position) {
322        mPanels.put(view, new Panel(view, container, position));
323        view.setOnClickListener(this);
324        mViews.put(view, new ViewType(view, PANEL));
325    }
326
327    public void addComponent(View aPanel, View component) {
328        Panel panel = mPanels.get(aPanel);
329        if (panel == null) {
330            return;
331        }
332        panel.addView(component);
333        component.setOnClickListener(this);
334        mViews.put(component, new ViewType(component, COMPONENT));
335    }
336
337    public void addImageView(View view) {
338        mImageViews.add(view);
339        ImageShow imageShow = (ImageShow) view;
340        imageShow.setPanelController(this);
341    }
342
343    public void resetParameters() {
344        showPanel(mCurrentPanel);
345        if (mCurrentImage != null) {
346            mCurrentImage.resetParameter();
347            mCurrentImage.select();
348        }
349        if (mDisableFilterButtons) {
350            mActivity.enableFilterButtons();
351            mDisableFilterButtons = false;
352        }
353    }
354
355    public boolean onBackPressed() {
356        if (mUtilityPanel == null || !mUtilityPanel.selected()) {
357            return true;
358        }
359        HistoryAdapter adapter = mMasterImage.getHistory();
360        int position = adapter.undo();
361        mMasterImage.onItemClick(position);
362        showPanel(mCurrentPanel);
363        mCurrentImage.select();
364        if (mDisableFilterButtons) {
365            mActivity.enableFilterButtons();
366            mActivity.resetHistory();
367            mDisableFilterButtons = false;
368        }
369        return false;
370    }
371
372    public void onNewValue(int value) {
373        mUtilityPanel.onNewValue(value);
374    }
375
376    public void showParameter(boolean s) {
377        mUtilityPanel.setShowParameter(s);
378    }
379
380    public void setCurrentPanel(View panel) {
381        showPanel(panel);
382    }
383
384    public void setRowPanel(View rowPanel) {
385        mRowPanel = rowPanel;
386    }
387
388    public void setUtilityPanel(Context context, View utilityPanel, View textView,
389            View aspectButton, View curvesButton) {
390        mUtilityPanel = new UtilityPanel(context, utilityPanel, textView,
391                aspectButton, curvesButton);
392    }
393
394    public void setMasterImage(ImageShow imageShow) {
395        mMasterImage = imageShow;
396    }
397
398    @Override
399    public void onClick(View view) {
400        ViewType type = mViews.get(view);
401        if (type.type() == PANEL) {
402            showPanel(view);
403        } else if (type.type() == COMPONENT) {
404            showComponent(view);
405        }
406    }
407
408    public ImageShow showImageView(int id) {
409        ImageShow image = null;
410        for (View view : mImageViews) {
411            if (view.getId() == id) {
412                view.setVisibility(View.VISIBLE);
413                image = (ImageShow) view;
414            } else {
415                view.setVisibility(View.GONE);
416            }
417        }
418        return image;
419    }
420
421    public void showDefaultImageView() {
422        showImageView(R.id.imageShow).setShowControls(false);
423        mMasterImage.setCurrentFilter(null);
424    }
425
426    public void showPanel(View view) {
427        view.setVisibility(View.VISIBLE);
428        boolean removedUtilityPanel = false;
429        Panel current = mPanels.get(mCurrentPanel);
430        if (mUtilityPanel != null && mUtilityPanel.selected()) {
431            ViewPropertyAnimator anim1 = mUtilityPanel.unselect();
432            removedUtilityPanel = true;
433            anim1.start();
434            if (mCurrentPanel == view) {
435                ViewPropertyAnimator anim2 = current.select(-1, VERTICAL_MOVE);
436                anim2.start();
437                showDefaultImageView();
438            }
439        }
440
441        if (mCurrentPanel == view) {
442            return;
443        }
444
445        Panel panel = mPanels.get(view);
446        if (!removedUtilityPanel) {
447            int currentPos = -1;
448            if (current != null) {
449                currentPos = current.getPosition();
450            }
451            ViewPropertyAnimator anim1 = panel.select(currentPos, HORIZONTAL_MOVE);
452            anim1.start();
453            if (current != null) {
454                ViewPropertyAnimator anim2 = current.unselect(panel.getPosition(), HORIZONTAL_MOVE);
455                anim2.start();
456            }
457        } else {
458            ViewPropertyAnimator anim = panel.select(-1, VERTICAL_MOVE);
459            anim.start();
460        }
461        showDefaultImageView();
462        mCurrentPanel = view;
463    }
464
465    public ImagePreset getImagePreset() {
466        return mMasterImage.getImagePreset();
467    }
468
469    public ImageFilter setImagePreset(ImageFilter filter, String name) {
470        ImagePreset copy = new ImagePreset(getImagePreset());
471        copy.add(filter);
472        copy.setHistoryName(name);
473        copy.setIsFx(false);
474        mMasterImage.setImagePreset(copy);
475        return filter;
476    }
477
478    public void ensureFilter(String name) {
479        ImagePreset preset = getImagePreset();
480        ImageFilter filter = preset.getFilter(name);
481        if (filter != null) {
482            // If we already have a filter, we might still want
483            // to push it onto the history stack.
484            ImagePreset copy = new ImagePreset(getImagePreset());
485            copy.setHistoryName(name);
486            mMasterImage.setImagePreset(copy);
487            filter = copy.getFilter(name);
488        }
489
490        if (filter == null && name.equalsIgnoreCase(
491                mCurrentImage.getContext().getString(R.string.curvesRGB))) {
492            filter = setImagePreset(new ImageFilterCurves(), name);
493        }
494        if (filter == null && name.equalsIgnoreCase(
495                mCurrentImage.getContext().getString(R.string.tinyplanet))) {
496            filter = setImagePreset(new ImageFilterTinyPlanet(), name);
497        }
498        if (filter == null
499                && name.equalsIgnoreCase(mCurrentImage.getContext().getString(R.string.vignette))) {
500            filter = setImagePreset(new ImageFilterVignette(), name);
501        }
502        if (filter == null
503                && name.equalsIgnoreCase(mCurrentImage.getContext().getString(R.string.sharpness))) {
504            filter = setImagePreset(new ImageFilterSharpen(), name);
505        }
506        if (filter == null
507                && name.equalsIgnoreCase(mCurrentImage.getContext().getString(R.string.contrast))) {
508            filter = setImagePreset(new ImageFilterContrast(), name);
509        }
510        if (filter == null
511                && name.equalsIgnoreCase(mCurrentImage.getContext().getString(R.string.saturation))) {
512            filter = setImagePreset(new ImageFilterSaturated(), name);
513        }
514        if (filter == null
515                && name.equalsIgnoreCase(mCurrentImage.getContext().getString(R.string.bwfilter))) {
516            filter = setImagePreset(new ImageFilterBwFilter(), name);
517        }
518        if (filter == null
519                && name.equalsIgnoreCase(mCurrentImage.getContext().getString(R.string.hue))) {
520            filter = setImagePreset(new ImageFilterHue(), name);
521        }
522        if (filter == null
523                && name.equalsIgnoreCase(mCurrentImage.getContext().getString(R.string.exposure))) {
524            filter = setImagePreset(new ImageFilterExposure(), name);
525        }
526        if (filter == null
527                && name.equalsIgnoreCase(mCurrentImage.getContext().getString(R.string.vibrance))) {
528            filter = setImagePreset(new ImageFilterVibrance(), name);
529        }
530        if (filter == null
531                && name.equalsIgnoreCase(mCurrentImage.getContext().getString(
532                        R.string.shadow_recovery))) {
533            filter = setImagePreset(new ImageFilterShadows(), name);
534        }
535        if (filter == null
536                && name.equalsIgnoreCase(mCurrentImage.getContext().getString(R.string.redeye))) {
537            filter = setImagePreset(new ImageFilterRedEye(), name);
538        }
539        if (filter == null
540                && name.equalsIgnoreCase(mCurrentImage.getContext().getString(R.string.wbalance))) {
541            filter = setImagePreset(new ImageFilterWBalance(), name);
542        }
543        mMasterImage.setCurrentFilter(filter);
544    }
545
546    private void showCurvesPopupMenu(final ImageCurves curves, final FramedTextButton anchor) {
547        PopupMenu popupMenu = new PopupMenu(mCurrentImage.getContext(), anchor);
548        popupMenu.getMenuInflater().inflate(R.menu.filtershow_menu_curves, popupMenu.getMenu());
549        popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
550            @Override
551            public boolean onMenuItemClick(MenuItem item) {
552                curves.setChannel(item.getItemId());
553                anchor.setTextFrom(item.getItemId());
554                return true;
555            }
556        });
557        popupMenu.show();
558    }
559
560    private void showCropPopupMenu(final FramedTextButton anchor) {
561        PopupMenu popupMenu = new PopupMenu(mCurrentImage.getContext(), anchor);
562        popupMenu.getMenuInflater().inflate(R.menu.filtershow_menu_crop, popupMenu.getMenu());
563        popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
564            @Override
565            public boolean onMenuItemClick(MenuItem item) {
566                mUtilityPanel.setAspectButton(anchor, item.getItemId());
567                return true;
568            }
569        });
570        popupMenu.show();
571    }
572
573    public void showComponent(View view) {
574        if (mUtilityPanel != null && !mUtilityPanel.selected()) {
575            Panel current = mPanels.get(mCurrentPanel);
576            ViewPropertyAnimator anim1 = current.unselect(-1, VERTICAL_MOVE);
577            anim1.start();
578            if (mUtilityPanel != null) {
579                ViewPropertyAnimator anim2 = mUtilityPanel.select();
580                anim2.start();
581            }
582        }
583
584        if (view.getId() == R.id.pickCurvesChannel) {
585            ImageCurves curves = (ImageCurves) showImageView(R.id.imageCurves);
586            showCurvesPopupMenu(curves, (FramedTextButton) view);
587            return;
588        }
589
590        if (view.getId() == R.id.aspect) {
591            showCropPopupMenu((FramedTextButton) view);
592            return;
593        }
594
595        if (mCurrentImage != null) {
596            mCurrentImage.unselect();
597        }
598        mUtilityPanel.hideAspectButtons();
599        mUtilityPanel.hideCurvesButtons();
600        switch (view.getId()) {
601            case R.id.tinyplanetButton: {
602                mCurrentImage = showImageView(R.id.imageTinyPlanet).setShowControls(true);
603                String ename = mCurrentImage.getContext().getString(R.string.tinyplanet);
604                mUtilityPanel.setEffectName(ename);
605                ensureFilter(ename);
606                if (!mDisableFilterButtons) {
607                    mActivity.disableFilterButtons();
608                    mDisableFilterButtons = true;
609                }
610                break;
611            }
612            case R.id.straightenButton: {
613                mCurrentImage = showImageView(R.id.imageStraighten);
614                String ename = mCurrentImage.getContext().getString(R.string.straighten);
615                mUtilityPanel.setEffectName(ename);
616                break;
617            }
618            case R.id.cropButton: {
619                mCurrentImage = showImageView(R.id.imageCrop);
620                String ename = mCurrentImage.getContext().getString(R.string.crop);
621                mUtilityPanel.setEffectName(ename);
622                mUtilityPanel.setShowParameter(false);
623                if (mCurrentImage instanceof ImageCrop && mUtilityPanel.firstTimeCropDisplayed){
624                    ((ImageCrop) mCurrentImage).applyClear();
625                    mUtilityPanel.firstTimeCropDisplayed = false;
626                }
627                mUtilityPanel.showAspectButtons();
628                break;
629            }
630            case R.id.rotateButton: {
631                mCurrentImage = showImageView(R.id.imageRotate);
632                String ename = mCurrentImage.getContext().getString(R.string.rotate);
633                mUtilityPanel.setEffectName(ename);
634                break;
635            }
636            case R.id.flipButton: {
637                mCurrentImage = showImageView(R.id.imageFlip);
638                String ename = mCurrentImage.getContext().getString(R.string.mirror);
639                mUtilityPanel.setEffectName(ename);
640                mUtilityPanel.setShowParameter(false);
641                break;
642            }
643            case R.id.vignetteButton: {
644                mCurrentImage = showImageView(R.id.imageShow).setShowControls(true);
645                String ename = mCurrentImage.getContext().getString(R.string.vignette);
646                mUtilityPanel.setEffectName(ename);
647                ensureFilter(ename);
648                break;
649            }
650            case R.id.curvesButtonRGB: {
651                ImageCurves curves = (ImageCurves) showImageView(R.id.imageCurves);
652                String ename = curves.getContext().getString(R.string.curvesRGB);
653                mUtilityPanel.setEffectName(ename);
654                mUtilityPanel.setShowParameter(false);
655                mUtilityPanel.showCurvesButtons();
656                mCurrentImage = curves;
657                ensureFilter(ename);
658                break;
659            }
660            case R.id.sharpenButton: {
661                mCurrentImage = showImageView(R.id.imageZoom).setShowControls(true);
662                String ename = mCurrentImage.getContext().getString(R.string.sharpness);
663                mUtilityPanel.setEffectName(ename);
664                ensureFilter(ename);
665                break;
666            }
667            case R.id.contrastButton: {
668                mCurrentImage = showImageView(R.id.imageShow).setShowControls(true);
669                String ename = mCurrentImage.getContext().getString(R.string.contrast);
670                mUtilityPanel.setEffectName(ename);
671                ensureFilter(ename);
672                break;
673            }
674            case R.id.saturationButton: {
675                mCurrentImage = showImageView(R.id.imageShow).setShowControls(true);
676                String ename = mCurrentImage.getContext().getString(R.string.saturation);
677                mUtilityPanel.setEffectName(ename);
678                ensureFilter(ename);
679                break;
680            }
681            case R.id.bwfilterButton: {
682            mCurrentImage = showImageView(R.id.imageShow).setShowControls(true);
683            String ename = mCurrentImage.getContext().getString(R.string.bwfilter);
684            mUtilityPanel.setEffectName(ename);
685            ensureFilter(ename);
686            break;
687        }
688            case R.id.wbalanceButton: {
689                mCurrentImage = showImageView(R.id.imageShow).setShowControls(false);
690                String ename = mCurrentImage.getContext().getString(R.string.wbalance);
691                mUtilityPanel.setEffectName(ename);
692                mUtilityPanel.setShowParameter(false);
693                ensureFilter(ename);
694                break;
695            }
696            case R.id.hueButton: {
697                mCurrentImage = showImageView(R.id.imageShow).setShowControls(true);
698                String ename = mCurrentImage.getContext().getString(R.string.hue);
699                mUtilityPanel.setEffectName(ename);
700                ensureFilter(ename);
701                break;
702            }
703            case R.id.exposureButton: {
704                mCurrentImage = showImageView(R.id.imageShow).setShowControls(true);
705                String ename = mCurrentImage.getContext().getString(R.string.exposure);
706                mUtilityPanel.setEffectName(ename);
707                ensureFilter(ename);
708                break;
709            }
710            case R.id.vibranceButton: {
711                mCurrentImage = showImageView(R.id.imageShow).setShowControls(true);
712                String ename = mCurrentImage.getContext().getString(R.string.vibrance);
713                mUtilityPanel.setEffectName(ename);
714                ensureFilter(ename);
715                break;
716            }
717            case R.id.shadowRecoveryButton: {
718                mCurrentImage = showImageView(R.id.imageShow).setShowControls(true);
719                String ename = mCurrentImage.getContext().getString(R.string.shadow_recovery);
720                mUtilityPanel.setEffectName(ename);
721                ensureFilter(ename);
722                break;
723            }
724            case R.id.redEyeButton: {
725                mCurrentImage = showImageView(R.id.imageShow).setShowControls(true);
726                String ename = mCurrentImage.getContext().getString(R.string.redeye);
727                mUtilityPanel.setEffectName(ename);
728                ensureFilter(ename);
729                break;
730            }
731            case R.id.aspect: {
732                mUtilityPanel.showAspectButtons();
733                break;
734            }
735            case R.id.applyEffect: {
736                if (mMasterImage.getCurrentFilter() instanceof ImageFilterTinyPlanet) {
737                    mActivity.saveImage();
738                } else {
739                    if (mCurrentImage instanceof ImageCrop) {
740                        ((ImageCrop) mCurrentImage).saveAndSetPreset();
741                    }
742                    showPanel(mCurrentPanel);
743                }
744                break;
745            }
746        }
747        mCurrentImage.select();
748    }
749}
750