17898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project/*
27898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Copyright (C) 2009 The Android Open Source Project
37898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project *
47898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
57898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * you may not use this file except in compliance with the License.
67898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * You may obtain a copy of the License at
77898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project *
87898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
97898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project *
107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * See the License for the specific language governing permissions and
147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * limitations under the License.
157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */
167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectpackage com.android.inputmethod.pinyin;
187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport com.android.inputmethod.pinyin.PinyinIME.DecodingInfo;
207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport android.content.Context;
227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport android.util.AttributeSet;
237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport android.view.GestureDetector;
247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport android.view.MotionEvent;
257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport android.view.View;
267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport android.view.View.OnTouchListener;
277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport android.view.animation.AlphaAnimation;
287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport android.view.animation.Animation;
297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport android.view.animation.AnimationSet;
307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport android.view.animation.TranslateAnimation;
317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport android.view.animation.Animation.AnimationListener;
327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport android.widget.ImageButton;
337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport android.widget.RelativeLayout;
347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport android.widget.ViewFlipper;
357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectinterface ArrowUpdater {
377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    void updateArrowStatus();
387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project}
397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project/**
427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Container used to host the two candidate views. When user drags on candidate
437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * view, animation is used to dismiss the current candidate view and show a new
447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * one. These two candidate views and their parent are hosted by this container.
457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * <p>
467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Besides the candidate views, there are two arrow views to show the page
477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * forward/backward arrows.
487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * </p>
497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */
507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectpublic class CandidatesContainer extends RelativeLayout implements
517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        OnTouchListener, AnimationListener, ArrowUpdater {
527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    /**
537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * Alpha value to show an enabled arrow.
547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     */
557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private static int ARROW_ALPHA_ENABLED = 0xff;
567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    /**
587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * Alpha value to show an disabled arrow.
597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     */
607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private static int ARROW_ALPHA_DISABLED = 0x40;
617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    /**
637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * Animation time to show a new candidate view and dismiss the old one.
647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     */
657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private static int ANIMATION_TIME = 200;
667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    /**
687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * Listener used to notify IME that user clicks a candidate, or navigate
697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * between them.
707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     */
717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private CandidateViewListener mCvListener;
727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    /**
747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * The left arrow button used to show previous page.
757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     */
767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private ImageButton mLeftArrowBtn;
777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    /**
797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * The right arrow button used to show next page.
807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     */
817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private ImageButton mRightArrowBtn;
827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    /**
847898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * Decoding result to show.
857898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     */
867898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private DecodingInfo mDecInfo;
877898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
887898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    /**
897898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * The animation view used to show candidates. It contains two views.
907898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * Normally, the candidates are shown one of them. When user navigates to
917898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * another page, animation effect will be performed.
927898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     */
937898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private ViewFlipper mFlipper;
947898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
957898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    /**
967898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * The x offset of the flipper in this container.
977898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     */
987898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private int xOffsetForFlipper;
997898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1007898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    /**
1017898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * Animation used by the incoming view when the user navigates to a left
1027898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * page.
1037898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     */
1047898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private Animation mInAnimPushLeft;
1057898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1067898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    /**
1077898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * Animation used by the incoming view when the user navigates to a right
1087898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * page.
1097898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     */
1107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private Animation mInAnimPushRight;
1117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    /**
1137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * Animation used by the incoming view when the user navigates to a page
1147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * above. If the page navigation is triggered by DOWN key, this animation is
1157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * used.
1167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     */
1177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private Animation mInAnimPushUp;
1187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    /**
1207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * Animation used by the incoming view when the user navigates to a page
1217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * below. If the page navigation is triggered by UP key, this animation is
1227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * used.
1237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     */
1247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private Animation mInAnimPushDown;
1257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    /**
1277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * Animation used by the outgoing view when the user navigates to a left
1287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * page.
1297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     */
1307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private Animation mOutAnimPushLeft;
1317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    /**
1337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * Animation used by the outgoing view when the user navigates to a right
1347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * page.
1357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     */
1367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private Animation mOutAnimPushRight;
1377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    /**
1397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * Animation used by the outgoing view when the user navigates to a page
1407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * above. If the page navigation is triggered by DOWN key, this animation is
1417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * used.
1427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     */
1437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private Animation mOutAnimPushUp;
1447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    /**
1467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * Animation used by the incoming view when the user navigates to a page
1477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * below. If the page navigation is triggered by UP key, this animation is
1487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * used.
1497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     */
1507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private Animation mOutAnimPushDown;
1517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    /**
1537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * Animation object which is used for the incoming view currently.
1547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     */
1557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private Animation mInAnimInUse;
1567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    /**
1587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * Animation object which is used for the outgoing view currently.
1597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     */
1607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private Animation mOutAnimInUse;
1617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    /**
1637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * Current page number in display.
1647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     */
1657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private int mCurrentPage = -1;
1667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public CandidatesContainer(Context context, AttributeSet attrs) {
1687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        super(context, attrs);
1697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
1707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public void initialize(CandidateViewListener cvListener,
1727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            BalloonHint balloonHint, GestureDetector gestureDetector) {
1737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        mCvListener = cvListener;
1747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        mLeftArrowBtn = (ImageButton) findViewById(R.id.arrow_left_btn);
1767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        mRightArrowBtn = (ImageButton) findViewById(R.id.arrow_right_btn);
1777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        mLeftArrowBtn.setOnTouchListener(this);
1787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        mRightArrowBtn.setOnTouchListener(this);
1797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        mFlipper = (ViewFlipper) findViewById(R.id.candidate_flipper);
1817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        mFlipper.setMeasureAllChildren(true);
1827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        invalidate();
1847898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        requestLayout();
1857898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1867898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        for (int i = 0; i < mFlipper.getChildCount(); i++) {
1877898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            CandidateView cv = (CandidateView) mFlipper.getChildAt(i);
1887898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            cv.initialize(this, balloonHint, gestureDetector, mCvListener);
1897898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
1907898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
1917898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1927898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public void showCandidates(PinyinIME.DecodingInfo decInfo,
1937898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            boolean enableActiveHighlight) {
1947898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (null == decInfo) return;
1957898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        mDecInfo = decInfo;
1967898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        mCurrentPage = 0;
1977898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1987898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (decInfo.isCandidatesListEmpty()) {
1997898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            showArrow(mLeftArrowBtn, false);
2007898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            showArrow(mRightArrowBtn, false);
2017898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        } else {
2027898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            showArrow(mLeftArrowBtn, true);
2037898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            showArrow(mRightArrowBtn, true);
2047898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
2057898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2067898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        for (int i = 0; i < mFlipper.getChildCount(); i++) {
2077898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            CandidateView cv = (CandidateView) mFlipper.getChildAt(i);
2087898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            cv.setDecodingInfo(mDecInfo);
2097898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
2107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        stopAnimation();
2117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        CandidateView cv = (CandidateView) mFlipper.getCurrentView();
2137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        cv.showPage(mCurrentPage, 0, enableActiveHighlight);
2147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        updateArrowStatus();
2167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        invalidate();
2177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
2187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public int getCurrentPage() {
2207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return mCurrentPage;
2217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
2227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public void enableActiveHighlight(boolean enableActiveHighlight) {
2247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        CandidateView cv = (CandidateView) mFlipper.getCurrentView();
2257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        cv.enableActiveHighlight(enableActiveHighlight);
2267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        invalidate();
2277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
2287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    @Override
2307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
2317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        Environment env = Environment.getInstance();
2327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        int measuredWidth = env.getScreenWidth();
2337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        int measuredHeight = getPaddingTop();
2347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        measuredHeight += env.getHeightForCandidates();
2357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        widthMeasureSpec = MeasureSpec.makeMeasureSpec(measuredWidth,
2367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                MeasureSpec.EXACTLY);
2377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        heightMeasureSpec = MeasureSpec.makeMeasureSpec(measuredHeight,
2387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                MeasureSpec.EXACTLY);
2397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
2407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (null != mLeftArrowBtn) {
2427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            xOffsetForFlipper = mLeftArrowBtn.getMeasuredWidth();
2437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
2447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
2457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public boolean activeCurseBackward() {
2477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (mFlipper.isFlipping() || null == mDecInfo) {
2487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return false;
2497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
2507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        CandidateView cv = (CandidateView) mFlipper.getCurrentView();
2527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (cv.activeCurseBackward()) {
2547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            cv.invalidate();
2557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return true;
2567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        } else {
2577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return pageBackward(true, true);
2587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
2597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
2607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public boolean activeCurseForward() {
2627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (mFlipper.isFlipping() || null == mDecInfo) {
2637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return false;
2647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
2657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        CandidateView cv = (CandidateView) mFlipper.getCurrentView();
2677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (cv.activeCursorForward()) {
2697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            cv.invalidate();
2707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return true;
2717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        } else {
2727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return pageForward(true, true);
2737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
2747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
2757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public boolean pageBackward(boolean animLeftRight,
2777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            boolean enableActiveHighlight) {
2787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (null == mDecInfo) return false;
2797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (mFlipper.isFlipping() || 0 == mCurrentPage) return false;
2817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        int child = mFlipper.getDisplayedChild();
2837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        int childNext = (child + 1) % 2;
2847898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        CandidateView cv = (CandidateView) mFlipper.getChildAt(child);
2857898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        CandidateView cvNext = (CandidateView) mFlipper.getChildAt(childNext);
2867898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2877898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        mCurrentPage--;
2887898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        int activeCandInPage = cv.getActiveCandiatePosInPage();
2897898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (animLeftRight)
2907898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            activeCandInPage = mDecInfo.mPageStart.elementAt(mCurrentPage + 1)
2917898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                    - mDecInfo.mPageStart.elementAt(mCurrentPage) - 1;
2927898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2937898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        cvNext.showPage(mCurrentPage, activeCandInPage, enableActiveHighlight);
2947898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        loadAnimation(animLeftRight, false);
2957898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        startAnimation();
2967898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2977898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        updateArrowStatus();
2987898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return true;
2997898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
3007898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
3017898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public boolean pageForward(boolean animLeftRight,
3027898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            boolean enableActiveHighlight) {
3037898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (null == mDecInfo) return false;
3047898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
3057898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (mFlipper.isFlipping() || !mDecInfo.preparePage(mCurrentPage + 1)) {
3067898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return false;
3077898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
3087898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
3097898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        int child = mFlipper.getDisplayedChild();
3107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        int childNext = (child + 1) % 2;
3117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        CandidateView cv = (CandidateView) mFlipper.getChildAt(child);
3127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        int activeCandInPage = cv.getActiveCandiatePosInPage();
3137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        cv.enableActiveHighlight(enableActiveHighlight);
3147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
3157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        CandidateView cvNext = (CandidateView) mFlipper.getChildAt(childNext);
3167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        mCurrentPage++;
3177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (animLeftRight) activeCandInPage = 0;
3187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
3197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        cvNext.showPage(mCurrentPage, activeCandInPage, enableActiveHighlight);
3207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        loadAnimation(animLeftRight, true);
3217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        startAnimation();
3227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
3237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        updateArrowStatus();
3247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return true;
3257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
3267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
3277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public int getActiveCandiatePos() {
3287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (null == mDecInfo) return -1;
3297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        CandidateView cv = (CandidateView) mFlipper.getCurrentView();
3307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return cv.getActiveCandiatePosGlobal();
3317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
3327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
3337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public void updateArrowStatus() {
3347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (mCurrentPage < 0) return;
3357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        boolean forwardEnabled = mDecInfo.pageForwardable(mCurrentPage);
3367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        boolean backwardEnabled = mDecInfo.pageBackwardable(mCurrentPage);
3377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
3387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (backwardEnabled) {
3397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            enableArrow(mLeftArrowBtn, true);
3407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        } else {
3417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            enableArrow(mLeftArrowBtn, false);
3427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
3437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (forwardEnabled) {
3447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            enableArrow(mRightArrowBtn, true);
3457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        } else {
3467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            enableArrow(mRightArrowBtn, false);
3477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
3487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
3497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
3507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private void enableArrow(ImageButton arrowBtn, boolean enabled) {
3517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        arrowBtn.setEnabled(enabled);
3527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (enabled)
3537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            arrowBtn.setAlpha(ARROW_ALPHA_ENABLED);
3547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        else
3557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            arrowBtn.setAlpha(ARROW_ALPHA_DISABLED);
3567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
3577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
3587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private void showArrow(ImageButton arrowBtn, boolean show) {
3597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (show)
3607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            arrowBtn.setVisibility(View.VISIBLE);
3617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        else
3627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            arrowBtn.setVisibility(View.INVISIBLE);
3637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
3647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
3657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public boolean onTouch(View v, MotionEvent event) {
3667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (event.getAction() == MotionEvent.ACTION_DOWN) {
3677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            if (v == mLeftArrowBtn) {
3687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                mCvListener.onToRightGesture();
3697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            } else if (v == mRightArrowBtn) {
3707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                mCvListener.onToLeftGesture();
3717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            }
3727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        } else if (event.getAction() == MotionEvent.ACTION_UP) {
3737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            CandidateView cv = (CandidateView) mFlipper.getCurrentView();
3747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            cv.enableActiveHighlight(true);
3757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
3767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
3777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return false;
3787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
3797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
3807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    // The reason why we handle candiate view's touch events here is because
3817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    // that the view under the focused view may get touch events instead of the
3827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    // focused one.
3837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    @Override
3847898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public boolean onTouchEvent(MotionEvent event) {
3857898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        event.offsetLocation(-xOffsetForFlipper, 0);
3867898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        CandidateView cv = (CandidateView) mFlipper.getCurrentView();
3877898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        cv.onTouchEventReal(event);
3887898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return true;
3897898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
3907898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
3917898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public void loadAnimation(boolean animLeftRight, boolean forward) {
3927898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (animLeftRight) {
3937898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            if (forward) {
3947898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                if (null == mInAnimPushLeft) {
3957898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                    mInAnimPushLeft = createAnimation(1.0f, 0, 0, 0, 0, 1.0f,
3967898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                            ANIMATION_TIME);
3977898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                    mOutAnimPushLeft = createAnimation(0, -1.0f, 0, 0, 1.0f, 0,
3987898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                            ANIMATION_TIME);
3997898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                }
4007898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                mInAnimInUse = mInAnimPushLeft;
4017898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                mOutAnimInUse = mOutAnimPushLeft;
4027898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            } else {
4037898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                if (null == mInAnimPushRight) {
4047898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                    mInAnimPushRight = createAnimation(-1.0f, 0, 0, 0, 0, 1.0f,
4057898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                            ANIMATION_TIME);
4067898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                    mOutAnimPushRight = createAnimation(0, 1.0f, 0, 0, 1.0f, 0,
4077898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                            ANIMATION_TIME);
4087898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                }
4097898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                mInAnimInUse = mInAnimPushRight;
4107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                mOutAnimInUse = mOutAnimPushRight;
4117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            }
4127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        } else {
4137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            if (forward) {
4147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                if (null == mInAnimPushUp) {
4157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                    mInAnimPushUp = createAnimation(0, 0, 1.0f, 0, 0, 1.0f,
4167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                            ANIMATION_TIME);
4177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                    mOutAnimPushUp = createAnimation(0, 0, 0, -1.0f, 1.0f, 0,
4187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                            ANIMATION_TIME);
4197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                }
4207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                mInAnimInUse = mInAnimPushUp;
4217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                mOutAnimInUse = mOutAnimPushUp;
4227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            } else {
4237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                if (null == mInAnimPushDown) {
4247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                    mInAnimPushDown = createAnimation(0, 0, -1.0f, 0, 0, 1.0f,
4257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                            ANIMATION_TIME);
4267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                    mOutAnimPushDown = createAnimation(0, 0, 0, 1.0f, 1.0f, 0,
4277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                            ANIMATION_TIME);
4287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                }
4297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                mInAnimInUse = mInAnimPushDown;
4307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                mOutAnimInUse = mOutAnimPushDown;
4317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            }
4327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
4337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
4347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        mInAnimInUse.setAnimationListener(this);
4357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
4367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        mFlipper.setInAnimation(mInAnimInUse);
4377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        mFlipper.setOutAnimation(mOutAnimInUse);
4387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
4397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
4407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private Animation createAnimation(float xFrom, float xTo, float yFrom,
4417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            float yTo, float alphaFrom, float alphaTo, long duration) {
4427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        AnimationSet animSet = new AnimationSet(getContext(), null);
4437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        Animation trans = new TranslateAnimation(Animation.RELATIVE_TO_SELF,
4447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                xFrom, Animation.RELATIVE_TO_SELF, xTo,
4457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                Animation.RELATIVE_TO_SELF, yFrom, Animation.RELATIVE_TO_SELF,
4467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                yTo);
4477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        Animation alpha = new AlphaAnimation(alphaFrom, alphaTo);
4487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        animSet.addAnimation(trans);
4497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        animSet.addAnimation(alpha);
4507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        animSet.setDuration(duration);
4517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return animSet;
4527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
4537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
4547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private void startAnimation() {
4557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        mFlipper.showNext();
4567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
4577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
4587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private void stopAnimation() {
4597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        mFlipper.stopFlipping();
4607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
4617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
4627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public void onAnimationEnd(Animation animation) {
4637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (!mLeftArrowBtn.isPressed() && !mRightArrowBtn.isPressed()) {
4647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            CandidateView cv = (CandidateView) mFlipper.getCurrentView();
4657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            cv.enableActiveHighlight(true);
4667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
4677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
4687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
4697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public void onAnimationRepeat(Animation animation) {
4707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
4717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
4727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public void onAnimationStart(Animation animation) {
4737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
4747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project}
475