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