12ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard/*
22ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard * Copyright (C) 2013 The Android Open Source Project
32ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard *
42ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard * Licensed under the Apache License, Version 2.0 (the "License");
52ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard * you may not use this file except in compliance with the License.
62ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard * You may obtain a copy of the License at
72ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard *
82ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard *      http://www.apache.org/licenses/LICENSE-2.0
92ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard *
102ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard * Unless required by applicable law or agreed to in writing, software
112ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard * distributed under the License is distributed on an "AS IS" BASIS,
122ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard * See the License for the specific language governing permissions and
142ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard * limitations under the License.
152ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard */
162ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard
172ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroardpackage com.android.gallery3d.filtershow.editors;
182ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard
192ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroardimport android.content.Context;
202ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroardimport android.util.AttributeSet;
212ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroardimport android.view.GestureDetector;
222ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroardimport android.view.Menu;
232ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroardimport android.view.MenuItem;
242ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroardimport android.view.MotionEvent;
252ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroardimport android.widget.Button;
262ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard
272ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroardpublic class SwapButton extends Button implements GestureDetector.OnGestureListener {
282ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard
292ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard    public static int ANIM_DURATION = 200;
302ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard
312ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard    public interface SwapButtonListener {
322ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard        public void swapLeft(MenuItem item);
332ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard        public void swapRight(MenuItem item);
342ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard    }
352ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard
362ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard    private GestureDetector mDetector;
372ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard    private SwapButtonListener mListener;
382ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard    private Menu mMenu;
392ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard    private int mCurrentMenuIndex;
402ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard
412ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard    public SwapButton(Context context, AttributeSet attrs) {
422ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard        super(context, attrs);
432ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard        mDetector = new GestureDetector(context, this);
442ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard    }
452ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard
462ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard    public SwapButtonListener getListener() {
472ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard        return mListener;
482ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard    }
492ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard
502ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard    public void setListener(SwapButtonListener listener) {
512ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard        mListener = listener;
522ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard    }
532ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard
542ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard    public boolean onTouchEvent(MotionEvent me) {
552ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard        if (!mDetector.onTouchEvent(me)) {
562ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard            return super.onTouchEvent(me);
572ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard        }
582ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard        return true;
592ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard    }
602ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard
612ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard    @Override
622ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard    public boolean onDown(MotionEvent e) {
632ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard        return true;
642ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard    }
652ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard
662ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard    @Override
672ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard    public void onShowPress(MotionEvent e) {
682ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard    }
692ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard
702ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard    @Override
712ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard    public boolean onSingleTapUp(MotionEvent e) {
722ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard        callOnClick();
732ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard        return true;
742ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard    }
752ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard
762ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard    @Override
772ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
782ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard        return false;
792ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard    }
802ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard
812ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard    @Override
822ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard    public void onLongPress(MotionEvent e) {
832ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard    }
842ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard
852ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard    @Override
862ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
872ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard        if (mMenu == null) {
882ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard            return false;
892ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard        }
902ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard        if (e1.getX() - e2.getX() > 0) {
912ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard            // right to left
922ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard            mCurrentMenuIndex++;
932ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard            if (mCurrentMenuIndex == mMenu.size()) {
942ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard                mCurrentMenuIndex = 0;
952ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard            }
962ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard            if (mListener != null) {
972ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard                mListener.swapRight(mMenu.getItem(mCurrentMenuIndex));
982ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard            }
992ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard        } else {
1002ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard            // left to right
1012ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard            mCurrentMenuIndex--;
1022ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard            if (mCurrentMenuIndex < 0) {
1032ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard                mCurrentMenuIndex = mMenu.size() - 1;
1042ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard            }
1052ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard            if (mListener != null) {
1062ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard                mListener.swapLeft(mMenu.getItem(mCurrentMenuIndex));
1072ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard            }
1082ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard        }
1092ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard        return true;
1102ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard    }
1112ff0e04ddcf770a782f94ddee936a1c205e1f322nicolasroard}
112