1fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard/*
2fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard * Copyright (C) 2013 The Android Open Source Project
3fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard *
4fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard * Licensed under the Apache License, Version 2.0 (the "License");
5fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard * you may not use this file except in compliance with the License.
6fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard * You may obtain a copy of the License at
7fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard *
8fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard *      http://www.apache.org/licenses/LICENSE-2.0
9fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard *
10fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard * Unless required by applicable law or agreed to in writing, software
11fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard * distributed under the License is distributed on an "AS IS" BASIS,
12fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard * See the License for the specific language governing permissions and
14fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard * limitations under the License.
15fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard */
16fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard
17fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroardpackage com.android.gallery3d.filtershow.state;
18fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard
19fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroardimport android.content.Context;
20f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport android.content.res.Resources;
21fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroardimport android.graphics.*;
22fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroardimport android.view.MotionEvent;
23fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroardimport android.view.View;
24fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroardimport android.widget.LinearLayout;
25f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport com.android.gallery3d.R;
26fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroardimport com.android.gallery3d.filtershow.FilterShowActivity;
27edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroardimport com.android.gallery3d.filtershow.category.SwipableView;
28edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroardimport com.android.gallery3d.filtershow.filters.FilterRepresentation;
29f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport com.android.gallery3d.filtershow.imageshow.MasterImage;
30edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroardimport com.android.gallery3d.filtershow.pipeline.ImagePreset;
31fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard
32edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroardpublic class StateView extends View implements SwipableView {
33fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard
34f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    private static final String LOGTAG = "StateView";
35fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    private Path mPath = new Path();
36fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    private Paint mPaint = new Paint();
37fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard
38fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    public static int DEFAULT = 0;
39fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    public static int BEGIN = 1;
40fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    public static int END = 2;
41fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard
42fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    public static int UP = 1;
43fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    public static int DOWN = 2;
44fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    public static int LEFT = 3;
45fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    public static int RIGHT = 4;
46fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard
47fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    private int mType = DEFAULT;
48fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    private float mAlpha = 1.0f;
49fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    private String mText = "Default";
50fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    private float mTextSize = 32;
51fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    private static int sMargin = 16;
52fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    private static int sArrowHeight = 16;
53fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    private static int sArrowWidth = 8;
54edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard    private float mStartTouchX = 0;
55edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard    private float mStartTouchY = 0;
56edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard    private float mDeleteSlope = 20;
57edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard
58fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    private int mOrientation = LinearLayout.VERTICAL;
59fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    private int mDirection = DOWN;
60fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    private boolean mDuplicateButton;
61fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    private State mState;
62fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard
63f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    private int mEndsBackgroundColor;
64f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    private int mEndsTextColor;
65f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    private int mBackgroundColor;
66f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    private int mTextColor;
67f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    private int mSelectedBackgroundColor;
68f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    private int mSelectedTextColor;
69f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    private Rect mTextBounds = new Rect();
70f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
71fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    public StateView(Context context) {
72fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        this(context, DEFAULT);
73fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    }
74fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard
75fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    public StateView(Context context, int type) {
76fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        super(context);
77fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        mType = type;
78f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        Resources res = getResources();
79f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mEndsBackgroundColor = res.getColor(R.color.filtershow_stateview_end_background);
80f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mEndsTextColor = res.getColor(R.color.filtershow_stateview_end_text);
81f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mBackgroundColor = res.getColor(R.color.filtershow_stateview_background);
82f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mTextColor = res.getColor(R.color.filtershow_stateview_text);
83f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mSelectedBackgroundColor = res.getColor(R.color.filtershow_stateview_selected_background);
84f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mSelectedTextColor = res.getColor(R.color.filtershow_stateview_selected_text);
85c8d14359ff37276640b8d0e31736700311223b6cnicolasroard        mTextSize = res.getDimensionPixelSize(R.dimen.state_panel_text_size);
86fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    }
87fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard
88fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    public String getText() {
89fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        return mText;
90fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    }
91fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard
92fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    public void setText(String text) {
93fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        mText = text;
94fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        invalidate();
95fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    }
96fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard
97fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    public void setType(int type) {
98fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        mType = type;
99fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        invalidate();
100fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    }
101fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard
102fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    @Override
103fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    public void setSelected(boolean value) {
104fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        super.setSelected(value);
105fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        if (!value) {
106fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard            mDuplicateButton = false;
107fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        }
108fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        invalidate();
109fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    }
110fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard
111fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    public void drawText(Canvas canvas) {
112fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        if (mText == null) {
113fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard            return;
114fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        }
115fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        mPaint.reset();
116fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        if (isSelected()) {
117f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            mPaint.setColor(mSelectedTextColor);
118fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        } else {
119f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            mPaint.setColor(mTextColor);
120fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        }
121f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (mType == BEGIN) {
122f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            mPaint.setColor(mEndsTextColor);
123fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        }
124f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mPaint.setTypeface(Typeface.DEFAULT_BOLD);
125f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mPaint.setAntiAlias(true);
126f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mPaint.setTextSize(mTextSize);
127f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mPaint.getTextBounds(mText, 0, mText.length(), mTextBounds);
128f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        int x = (canvas.getWidth() - mTextBounds.width()) / 2;
129f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        int y = mTextBounds.height() + (canvas.getHeight() - mTextBounds.height()) / 2;
130fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        canvas.drawText(mText, x, y, mPaint);
131fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    }
132fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard
133fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    public void onDraw(Canvas canvas) {
134fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        canvas.drawARGB(0, 0, 0, 0);
13500259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard        mPaint.reset();
136fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        mPath.reset();
137fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard
138fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        float w = canvas.getWidth();
139fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        float h = canvas.getHeight();
140fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        float r = sArrowHeight;
141fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        float d = sArrowWidth;
142fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard
143fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        if (mOrientation == LinearLayout.HORIZONTAL) {
144fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard            drawHorizontalPath(w, h, r, d);
145fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        } else {
146fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard            if (mDirection == DOWN) {
147fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard                drawVerticalDownPath(w, h, r, d);
148fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard            } else {
149fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard                drawVerticalPath(w, h, r, d);
150fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard            }
151fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        }
152fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard
153f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (mType == DEFAULT || mType == END) {
154fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard            if (mDuplicateButton) {
155fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard                mPaint.setARGB(255, 200, 0, 0);
156fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard            } else if (isSelected()) {
157f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard                mPaint.setColor(mSelectedBackgroundColor);
158fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard            } else {
159f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard                mPaint.setColor(mBackgroundColor);
160fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard            }
161fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        } else {
162f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            mPaint.setColor(mEndsBackgroundColor);
163fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        }
164fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        canvas.drawPath(mPath, mPaint);
165fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        drawText(canvas);
166fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    }
167fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard
168fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    private void drawHorizontalPath(float w, float h, float r, float d) {
169105fbcf3289491aa4f590057e304fee33f1c88canicolasroard        if (this.getLayoutDirection() == LAYOUT_DIRECTION_RTL) {
170105fbcf3289491aa4f590057e304fee33f1c88canicolasroard            mPath.moveTo(w, 0);
171105fbcf3289491aa4f590057e304fee33f1c88canicolasroard            if (mType == END) {
172105fbcf3289491aa4f590057e304fee33f1c88canicolasroard                mPath.lineTo(0, 0);
173105fbcf3289491aa4f590057e304fee33f1c88canicolasroard                mPath.lineTo(0, h);
174105fbcf3289491aa4f590057e304fee33f1c88canicolasroard            } else {
175105fbcf3289491aa4f590057e304fee33f1c88canicolasroard                mPath.lineTo(d, 0);
176105fbcf3289491aa4f590057e304fee33f1c88canicolasroard                mPath.lineTo(d, r);
177105fbcf3289491aa4f590057e304fee33f1c88canicolasroard                mPath.lineTo(0, r + d);
178105fbcf3289491aa4f590057e304fee33f1c88canicolasroard                mPath.lineTo(d, r + d + r);
179105fbcf3289491aa4f590057e304fee33f1c88canicolasroard                mPath.lineTo(d, h);
180105fbcf3289491aa4f590057e304fee33f1c88canicolasroard            }
181fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard            mPath.lineTo(w, h);
182105fbcf3289491aa4f590057e304fee33f1c88canicolasroard            if (mType != BEGIN) {
183105fbcf3289491aa4f590057e304fee33f1c88canicolasroard                mPath.lineTo(w, r + d + r);
184105fbcf3289491aa4f590057e304fee33f1c88canicolasroard                mPath.lineTo(w - d, r + d);
185105fbcf3289491aa4f590057e304fee33f1c88canicolasroard                mPath.lineTo(w, r);
186105fbcf3289491aa4f590057e304fee33f1c88canicolasroard            }
187fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        } else {
188105fbcf3289491aa4f590057e304fee33f1c88canicolasroard            mPath.moveTo(0, 0);
189105fbcf3289491aa4f590057e304fee33f1c88canicolasroard            if (mType == END) {
190105fbcf3289491aa4f590057e304fee33f1c88canicolasroard                mPath.lineTo(w, 0);
191105fbcf3289491aa4f590057e304fee33f1c88canicolasroard                mPath.lineTo(w, h);
192105fbcf3289491aa4f590057e304fee33f1c88canicolasroard            } else {
193105fbcf3289491aa4f590057e304fee33f1c88canicolasroard                mPath.lineTo(w - d, 0);
194105fbcf3289491aa4f590057e304fee33f1c88canicolasroard                mPath.lineTo(w - d, r);
195105fbcf3289491aa4f590057e304fee33f1c88canicolasroard                mPath.lineTo(w, r + d);
196105fbcf3289491aa4f590057e304fee33f1c88canicolasroard                mPath.lineTo(w - d, r + d + r);
197105fbcf3289491aa4f590057e304fee33f1c88canicolasroard                mPath.lineTo(w - d, h);
198105fbcf3289491aa4f590057e304fee33f1c88canicolasroard            }
199105fbcf3289491aa4f590057e304fee33f1c88canicolasroard            mPath.lineTo(0, h);
200105fbcf3289491aa4f590057e304fee33f1c88canicolasroard            if (mType != BEGIN) {
201105fbcf3289491aa4f590057e304fee33f1c88canicolasroard                mPath.lineTo(0, r + d + r);
202105fbcf3289491aa4f590057e304fee33f1c88canicolasroard                mPath.lineTo(d, r + d);
203105fbcf3289491aa4f590057e304fee33f1c88canicolasroard                mPath.lineTo(0, r);
204105fbcf3289491aa4f590057e304fee33f1c88canicolasroard            }
205fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        }
206fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        mPath.close();
207fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    }
208fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard
209fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    private void drawVerticalPath(float w, float h, float r, float d) {
210fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        if (mType == BEGIN) {
211fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard            mPath.moveTo(0, 0);
212fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard            mPath.lineTo(w, 0);
213fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        } else {
214fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard            mPath.moveTo(0, d);
215fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard            mPath.lineTo(r, d);
216fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard            mPath.lineTo(r + d, 0);
217fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard            mPath.lineTo(r + d + r, d);
218fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard            mPath.lineTo(w, d);
219fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        }
220fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        mPath.lineTo(w, h);
221fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        if (mType != END) {
222fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard            mPath.lineTo(r + d + r, h);
223fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard            mPath.lineTo(r + d, h - d);
224fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard            mPath.lineTo(r, h);
225fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        }
226fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        mPath.lineTo(0, h);
227fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        mPath.close();
228fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    }
229fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard
230fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    private void drawVerticalDownPath(float w, float h, float r, float d) {
231fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        mPath.moveTo(0, 0);
232fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        if (mType != BEGIN) {
233fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard            mPath.lineTo(r, 0);
234fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard            mPath.lineTo(r + d, d);
235fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard            mPath.lineTo(r + d + r, 0);
236fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        }
237fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        mPath.lineTo(w, 0);
238fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard
239fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        if (mType != END) {
240fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard            mPath.lineTo(w, h - d);
241fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard
242fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard            mPath.lineTo(r + d + r, h - d);
243fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard            mPath.lineTo(r + d, h);
244fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard            mPath.lineTo(r, h - d);
245fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard
246fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard            mPath.lineTo(0, h - d);
247fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        } else {
248fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard            mPath.lineTo(w, h);
249fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard            mPath.lineTo(0, h);
250fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        }
251fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard
252fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        mPath.close();
253fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    }
254fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard
255fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    public void setBackgroundAlpha(float alpha) {
256f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (mType == BEGIN) {
257fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard            return;
258fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        }
259fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        mAlpha = alpha;
260f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        setAlpha(alpha);
261fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        invalidate();
262fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    }
263fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard
264f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public float getBackgroundAlpha() {
265fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        return mAlpha;
266fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    }
267fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard
268fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    public void setOrientation(int orientation) {
269fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        mOrientation = orientation;
270fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    }
271fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard
272fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    public void setDuplicateButton(boolean b) {
273fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        mDuplicateButton = b;
274fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        invalidate();
275fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    }
276fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard
277fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    public State getState() {
278fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        return mState;
279fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    }
280fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard
281fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    public void setState(State state) {
282fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        mState = state;
283f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mText = mState.getText().toUpperCase();
284fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        mType = mState.getType();
285fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        invalidate();
286fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    }
287fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard
288fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    public void resetPosition() {
289fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        setTranslationX(0);
290fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        setTranslationY(0);
291f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        setBackgroundAlpha(1.0f);
292fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    }
293fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard
294fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    public boolean isDraggable() {
295fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        return mState.isDraggable();
296fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard    }
297edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard
298edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard    @Override
299edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard    public void delete() {
300edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard        FilterShowActivity activity = (FilterShowActivity) getContext();
301edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard        FilterRepresentation representation = getState().getFilterRepresentation();
302edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard        activity.removeFilterRepresentation(representation);
303edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard    }
304edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard
305edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard    @Override
306edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard    public boolean onTouchEvent(MotionEvent event) {
307edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard        boolean ret = super.onTouchEvent(event);
308edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard        FilterShowActivity activity = (FilterShowActivity) getContext();
309edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard
310edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard        if (event.getActionMasked() == MotionEvent.ACTION_UP) {
311edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard            activity.startTouchAnimation(this, event.getX(), event.getY());
312edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard        }
313edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard        if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
314edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard            mStartTouchY = event.getY();
315edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard            mStartTouchX = event.getX();
316edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard            if (mType == BEGIN) {
317edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard                MasterImage.getImage().setShowsOriginal(true);
318edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard            }
319edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard        }
320e30a1cc28e6724d54ba5b20e73d303e734c05559nicolasroard        if (event.getActionMasked() == MotionEvent.ACTION_UP
321e30a1cc28e6724d54ba5b20e73d303e734c05559nicolasroard            || event.getActionMasked() == MotionEvent.ACTION_CANCEL) {
322edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard            setTranslationX(0);
323edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard            setTranslationY(0);
324edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard            MasterImage.getImage().setShowsOriginal(false);
325e30a1cc28e6724d54ba5b20e73d303e734c05559nicolasroard            if (mType != BEGIN && event.getActionMasked() == MotionEvent.ACTION_UP) {
326e30a1cc28e6724d54ba5b20e73d303e734c05559nicolasroard                setSelected(true);
327e30a1cc28e6724d54ba5b20e73d303e734c05559nicolasroard                FilterRepresentation representation = getState().getFilterRepresentation();
328e30a1cc28e6724d54ba5b20e73d303e734c05559nicolasroard                MasterImage image = MasterImage.getImage();
329e30a1cc28e6724d54ba5b20e73d303e734c05559nicolasroard                ImagePreset preset = image != null ? image.getCurrentPreset() : null;
330e30a1cc28e6724d54ba5b20e73d303e734c05559nicolasroard                if (getTranslationY() == 0
331e30a1cc28e6724d54ba5b20e73d303e734c05559nicolasroard                        && image != null && preset != null
332e30a1cc28e6724d54ba5b20e73d303e734c05559nicolasroard                        && representation != image.getCurrentFilterRepresentation()
333e30a1cc28e6724d54ba5b20e73d303e734c05559nicolasroard                        && preset.getRepresentation(representation) != null) {
334e30a1cc28e6724d54ba5b20e73d303e734c05559nicolasroard                    activity.showRepresentation(representation);
335e30a1cc28e6724d54ba5b20e73d303e734c05559nicolasroard                    setSelected(false);
336e30a1cc28e6724d54ba5b20e73d303e734c05559nicolasroard                }
337edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard            }
338edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard        }
339e30a1cc28e6724d54ba5b20e73d303e734c05559nicolasroard        if (mType != BEGIN && event.getActionMasked() == MotionEvent.ACTION_MOVE) {
340edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard            float delta = event.getY() - mStartTouchY;
341edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard            if (Math.abs(delta) > mDeleteSlope) {
342edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard                activity.setHandlesSwipeForView(this, mStartTouchX, mStartTouchY);
343edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard            }
344edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard        }
345edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard        return true;
346edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard    }
347fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard}
348