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.editors;
18
19import android.content.Context;
20import android.os.Handler;
21import android.view.LayoutInflater;
22import android.view.MenuItem;
23import android.view.View;
24import android.view.ViewGroup;
25import android.widget.FrameLayout;
26import android.widget.LinearLayout;
27import android.widget.PopupMenu;
28import android.widget.SeekBar;
29import android.widget.TextView;
30
31import com.android.gallery3d.R;
32import com.android.gallery3d.filtershow.FilterShowActivity;
33import com.android.gallery3d.filtershow.controller.BasicParameterInt;
34import com.android.gallery3d.filtershow.controller.Parameter;
35import com.android.gallery3d.filtershow.filters.FilterVignetteRepresentation;
36import com.android.gallery3d.filtershow.filters.FilterRepresentation;
37import com.android.gallery3d.filtershow.imageshow.ImageVignette;
38
39public class EditorVignette extends ParametricEditor {
40    public static final int ID = R.id.vignetteEditor;
41    private static final String LOGTAG = "EditorVignettePlanet";
42    ImageVignette mImageVignette;
43
44    private SeekBar mVignetteBar;
45    private SeekBar mExposureBar;
46    private SeekBar mSaturationBar;
47    private SeekBar mContrastBar;
48    private SeekBar mFalloffBar;
49
50
51    private TextView mVignetteValue;
52    private TextView mExposureValue;
53    private TextView mSaturationValue;
54    private TextView mContrastValue;
55    private TextView mFalloffValue;
56
57    private SwapButton mButton;
58    private final Handler mHandler = new Handler();
59
60    int[] mMenuStrings = {
61            R.string.vignette_main,
62            R.string.vignette_exposure,
63            R.string.vignette_saturation,
64            R.string.vignette_contrast,
65            R.string.vignette_falloff,
66    };
67
68    String mCurrentlyEditing = null;
69
70
71    public EditorVignette() {
72        super(ID, R.layout.filtershow_vignette_editor, R.id.imageVignette);
73    }
74
75    @Override
76    public void createEditor(Context context, FrameLayout frameLayout) {
77        super.createEditor(context, frameLayout);
78        mImageVignette = (ImageVignette) mImageShow;
79        mImageVignette.setEditor(this);
80    }
81
82    @Override
83    public void reflectCurrentFilter() {
84        if (useCompact(mContext)) {
85            super.reflectCurrentFilter();
86
87            FilterRepresentation rep = getLocalRepresentation();
88            if (rep != null && getLocalRepresentation() instanceof FilterVignetteRepresentation) {
89                FilterVignetteRepresentation drawRep = (FilterVignetteRepresentation) rep;
90                mImageVignette.setRepresentation(drawRep);
91            }
92            updateText();
93            return;
94        }
95        mLocalRepresentation = null;
96        if (getLocalRepresentation() != null
97                && getLocalRepresentation() instanceof FilterVignetteRepresentation) {
98            FilterVignetteRepresentation rep =
99                    (FilterVignetteRepresentation) getLocalRepresentation();
100            int min;
101            int []mode = {
102                    FilterVignetteRepresentation.MODE_VIGNETTE,
103                    FilterVignetteRepresentation.MODE_EXPOSURE,
104                    FilterVignetteRepresentation.MODE_SATURATION,
105                    FilterVignetteRepresentation.MODE_CONTRAST,
106                    FilterVignetteRepresentation.MODE_FALLOFF
107            };
108            SeekBar []sliders = {
109                    mVignetteBar,
110                    mExposureBar,
111                    mSaturationBar,
112                    mContrastBar,
113                    mFalloffBar
114            };
115            TextView []label = {
116                    mVignetteValue,
117                    mExposureValue,
118                    mSaturationValue,
119                    mContrastValue,
120                    mFalloffValue
121            };
122            for (int i = 0; i < mode.length; i++) {
123                BasicParameterInt p = (BasicParameterInt) rep.getFilterParameter(mode[i]);
124                int value = p.getValue();
125                sliders[i].setMax(p.getMaximum() - p.getMinimum());
126                sliders[i].setProgress(value - p.getMinimum());
127                label[i].setText("" + value);
128            }
129
130            mImageVignette.setRepresentation(rep);
131            String text = mContext.getString(rep.getTextId()).toUpperCase();
132            mFilterTitle.setText(text);
133            updateText();
134        }
135    }
136
137
138
139    @Override
140    public String calculateUserMessage(Context context, String effectName, Object parameterValue) {
141        FilterRepresentation rep = getLocalRepresentation();
142        if (rep == null || !(rep instanceof FilterVignetteRepresentation)) {
143            return "";
144        }
145        FilterVignetteRepresentation csrep = (FilterVignetteRepresentation) rep;
146        int mode = csrep.getParameterMode();
147        String paramString;
148
149        paramString = mContext.getString(mMenuStrings[mode]);
150
151        int val = csrep.getCurrentParameter();
152        return paramString + ((val > 0) ? " +" : " ") + val;
153    }
154
155    @Override
156    public void openUtilityPanel(final LinearLayout accessoryViewList) {
157        mButton = (SwapButton) accessoryViewList.findViewById(R.id.applyEffect);
158        mButton.setText(mContext.getString(R.string.vignette_main));
159
160        if (useCompact(mContext)) {
161            final PopupMenu popupMenu = new PopupMenu(mImageShow.getActivity(), mButton);
162
163            popupMenu.getMenuInflater().inflate(R.menu.filtershow_menu_vignette,
164                    popupMenu.getMenu());
165
166            popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
167                @Override
168                public boolean onMenuItemClick(MenuItem item) {
169                    selectMenuItem(item);
170                    return true;
171                }
172            });
173            mButton.setOnClickListener(new View.OnClickListener() {
174                @Override
175                public void onClick(View arg0) {
176                    popupMenu.show();
177                    ((FilterShowActivity)mContext).onShowMenu(popupMenu);
178                }
179            });
180            mButton.setListener(this);
181
182            FilterVignetteRepresentation csrep = getVignetteRep();
183            String menuString = mContext.getString(mMenuStrings[0]);
184            switchToMode(csrep, FilterVignetteRepresentation.MODE_VIGNETTE, menuString);
185        } else {
186            mButton.setText(mContext.getString(R.string.vignette_main));
187        }
188    }
189
190    @Override
191    public void setUtilityPanelUI(View actionButton, View editControl) {
192        if (useCompact(mContext)) {
193            super.setUtilityPanelUI(actionButton, editControl);
194            return;
195        }
196        mActionButton = actionButton;
197        mEditControl = editControl;
198        mEditTitle.setCompoundDrawables(null, null, null, null);
199        LinearLayout group = (LinearLayout) editControl;
200        LayoutInflater inflater =
201                (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
202        LinearLayout controls = (LinearLayout) inflater.inflate(
203                R.layout.filtershow_vignette_controls, group, false);
204        ViewGroup.LayoutParams lp = new LinearLayout.LayoutParams(
205                ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
206        controls.setLayoutParams(lp);
207        group.removeAllViews();
208        group.addView(controls);
209
210        mVignetteBar = (SeekBar) controls.findViewById(R.id.mainVignetteSeekbar);
211        mVignetteBar.setMax(200);
212        mVignetteBar.setOnSeekBarChangeListener(this);
213        mVignetteValue = (TextView) controls.findViewById(R.id.mainVignetteValue);
214        mExposureBar = (SeekBar) controls.findViewById(R.id.exposureSeekBar);
215        mExposureBar.setMax(200);
216        mExposureBar.setOnSeekBarChangeListener(this);
217        mExposureValue = (TextView) controls.findViewById(R.id.exposureValue);
218        mSaturationBar = (SeekBar) controls.findViewById(R.id.saturationSeekBar);
219        mSaturationBar.setMax(200);
220        mSaturationBar.setOnSeekBarChangeListener(this);
221        mSaturationValue = (TextView) controls.findViewById(R.id.saturationValue);
222        mContrastBar = (SeekBar) controls.findViewById(R.id.contrastSeekBar);
223        mContrastBar.setMax(200);
224        mContrastBar.setOnSeekBarChangeListener(this);
225        mContrastValue = (TextView) controls.findViewById(R.id.contrastValue);
226        mFalloffBar = (SeekBar) controls.findViewById(R.id.falloffSeekBar);
227        mFalloffBar.setMax(200);
228        mFalloffBar.setOnSeekBarChangeListener(this);
229        mFalloffValue = (TextView) controls.findViewById(R.id.falloffValue);
230    }
231
232    public int getParameterIndex(int id) {
233        switch (id) {
234            case R.id.editor_vignette_main:
235                return FilterVignetteRepresentation.MODE_VIGNETTE;
236            case R.id.editor_vignette_saturation:
237                return FilterVignetteRepresentation.MODE_SATURATION;
238            case R.id.editor_vignette_contrast:
239                return FilterVignetteRepresentation.MODE_CONTRAST;
240            case R.id.editor_vignette_exposure:
241                return FilterVignetteRepresentation.MODE_EXPOSURE;
242            case R.id.editor_vignette_falloff:
243                return FilterVignetteRepresentation.MODE_FALLOFF;
244        }
245        return -1;
246    }
247
248    @Override
249    public void detach() {
250        if (mButton == null) {
251            return;
252        }
253        mButton.setListener(null);
254        mButton.setOnClickListener(null);
255    }
256
257    private void updateSeekBar(FilterVignetteRepresentation rep) {
258        mControl.updateUI();
259    }
260
261    @Override
262    protected Parameter getParameterToEdit(FilterRepresentation rep) {
263        if (rep instanceof FilterVignetteRepresentation) {
264            FilterVignetteRepresentation csrep = (FilterVignetteRepresentation) rep;
265            Parameter param = csrep.getFilterParameter(csrep.getParameterMode());
266
267            return param;
268        }
269        return null;
270    }
271
272    private FilterVignetteRepresentation getVignetteRep() {
273        FilterRepresentation rep = getLocalRepresentation();
274        if (rep != null
275                && rep instanceof FilterVignetteRepresentation) {
276            FilterVignetteRepresentation csrep = (FilterVignetteRepresentation) rep;
277            return csrep;
278        }
279        return null;
280    }
281
282    protected void selectMenuItem(MenuItem item) {
283        if (getLocalRepresentation() != null
284                && getLocalRepresentation() instanceof FilterVignetteRepresentation) {
285            FilterVignetteRepresentation csrep =
286                    (FilterVignetteRepresentation) getLocalRepresentation();
287
288            switchToMode(csrep, getParameterIndex(item.getItemId()), item.getTitle().toString());
289        }
290    }
291
292    protected void switchToMode(FilterVignetteRepresentation csrep, int mode, String title) {
293        if (csrep == null) {
294            return;
295        }
296        csrep.setParameterMode(mode);
297        mCurrentlyEditing = title;
298        mButton.setText(mCurrentlyEditing);
299        {
300            Parameter param = getParameterToEdit(csrep);
301
302            control(param, mEditControl);
303        }
304        updateSeekBar(csrep);
305        mView.invalidate();
306    }
307
308    @Override
309    public void onProgressChanged(SeekBar sbar, int progress, boolean arg2) {
310        FilterVignetteRepresentation rep = getVignetteRep();
311        int value = progress;
312        BasicParameterInt  p;
313        switch (sbar.getId()) {
314            case R.id.mainVignetteSeekbar:
315                rep.setParameterMode(FilterVignetteRepresentation.MODE_VIGNETTE);
316                p = rep.getFilterParameter(rep.getParameterMode());
317                value += p.getMinimum();
318                mVignetteValue.setText("" + value);
319                break;
320            case R.id.exposureSeekBar:
321                rep.setParameterMode(FilterVignetteRepresentation.MODE_EXPOSURE);
322                p = rep.getFilterParameter(rep.getParameterMode());
323                value += p.getMinimum();
324                mExposureValue.setText("" + value);
325                break;
326            case R.id.saturationSeekBar:
327                rep.setParameterMode(FilterVignetteRepresentation.MODE_SATURATION);
328                p = rep.getFilterParameter(rep.getParameterMode());
329                value += p.getMinimum();
330                mSaturationValue.setText("" + value);
331                break;
332            case R.id.contrastSeekBar:
333                rep.setParameterMode(FilterVignetteRepresentation.MODE_CONTRAST);
334                p = rep.getFilterParameter(rep.getParameterMode());
335                value += p.getMinimum();
336                mContrastValue.setText("" + value);
337                break;
338            case R.id.falloffSeekBar:
339                rep.setParameterMode(FilterVignetteRepresentation.MODE_FALLOFF);
340                p = rep.getFilterParameter(rep.getParameterMode());
341                value += p.getMinimum();
342                mFalloffValue.setText("" + value);
343                break;
344        }
345        rep.setCurrentParameter(value);
346        commitLocalRepresentation();
347    }
348
349    @Override
350    public void swapLeft(MenuItem item) {
351        super.swapLeft(item);
352        mButton.setTranslationX(0);
353        mButton.animate().translationX(mButton.getWidth()).setDuration(SwapButton.ANIM_DURATION);
354        Runnable updateButton = new Runnable() {
355            @Override
356            public void run() {
357                mButton.animate().cancel();
358                mButton.setTranslationX(0);
359            }
360        };
361        mHandler.postDelayed(updateButton, SwapButton.ANIM_DURATION);
362        selectMenuItem(item);
363    }
364
365    @Override
366    public void swapRight(MenuItem item) {
367        super.swapRight(item);
368        mButton.setTranslationX(0);
369        mButton.animate().translationX(-mButton.getWidth()).setDuration(SwapButton.ANIM_DURATION);
370        Runnable updateButton = new Runnable() {
371            @Override
372            public void run() {
373                mButton.animate().cancel();
374                mButton.setTranslationX(0);
375            }
376        };
377        mHandler.postDelayed(updateButton, SwapButton.ANIM_DURATION);
378        selectMenuItem(item);
379    }
380}
381