1c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein/**
2c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein * Copyright (c) 2011, Google Inc.
3c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein *
4c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein * Licensed under the Apache License, Version 2.0 (the "License");
5c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein * you may not use this file except in compliance with the License.
6c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein * You may obtain a copy of the License at
7c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein *
8c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein *     http://www.apache.org/licenses/LICENSE-2.0
9c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein *
10c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein * Unless required by applicable law or agreed to in writing, software
11c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein * distributed under the License is distributed on an "AS IS" BASIS,
12c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein * See the License for the specific language governing permissions and
14c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein * limitations under the License.
15c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein */
16c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sappersteinpackage com.android.mail.ui;
17c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein
18c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sappersteinimport android.animation.Animator;
19c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sappersteinimport android.animation.AnimatorInflater;
20c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sappersteinimport android.content.Context;
210a96c46d564aa2047cd3a2f3f94ac420940f0f82Rohan Shahimport android.os.Handler;
22c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sappersteinimport android.util.AttributeSet;
23c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sappersteinimport android.view.LayoutInflater;
24c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sappersteinimport android.view.MotionEvent;
25c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sappersteinimport android.view.View;
26c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sappersteinimport android.widget.ImageView;
27c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sappersteinimport android.widget.LinearLayout;
28c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sappersteinimport android.widget.TextView;
29c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein
30c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sappersteinimport com.android.mail.R;
31c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein
32c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein/**
33c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein * A custom {@link View} that exposes an action to the user.
34c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein */
35c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sappersteinpublic class ActionableToastBar extends LinearLayout {
36c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein    private boolean mHidden = false;
37c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein    private Animator mShowAnimation;
38c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein    private Animator mHideAnimation;
390a96c46d564aa2047cd3a2f3f94ac420940f0f82Rohan Shah    private final Runnable mRunnable;
400a96c46d564aa2047cd3a2f3f94ac420940f0f82Rohan Shah    private final Handler mFadeOutHandler;
41c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein
420a96c46d564aa2047cd3a2f3f94ac420940f0f82Rohan Shah    /** How long toast will last in ms */
430a96c46d564aa2047cd3a2f3f94ac420940f0f82Rohan Shah    private static final long TOAST_LIFETIME = 15*1000L;
440a96c46d564aa2047cd3a2f3f94ac420940f0f82Rohan Shah
45c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein    /** Icon for the description. */
46c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein    private ImageView mActionDescriptionIcon;
47c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein    /** The clickable view */
48c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein    private View mActionButton;
49c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein    /** Icon for the action button. */
50c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein    private View mActionIcon;
51c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein    /** The view that contains the description. */
52c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein    private TextView mActionDescriptionView;
53c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein    /** The view that contains the text for the action button. */
54c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein    private TextView mActionText;
55d3367499e56116854ed637b1036fd71057ac0f49Mindy Pereira    private ToastBarOperation mOperation;
56c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein
57c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein    public ActionableToastBar(Context context) {
58c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein        this(context, null);
59c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein    }
60c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein
61c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein    public ActionableToastBar(Context context, AttributeSet attrs) {
62c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein        this(context, attrs, 0);
63c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein    }
64c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein
65c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein    public ActionableToastBar(Context context, AttributeSet attrs, int defStyle) {
66c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein        super(context, attrs, defStyle);
670a96c46d564aa2047cd3a2f3f94ac420940f0f82Rohan Shah        mFadeOutHandler = new Handler();
680a96c46d564aa2047cd3a2f3f94ac420940f0f82Rohan Shah        mRunnable = new Runnable() {
690a96c46d564aa2047cd3a2f3f94ac420940f0f82Rohan Shah            @Override
700a96c46d564aa2047cd3a2f3f94ac420940f0f82Rohan Shah            public void run() {
710a96c46d564aa2047cd3a2f3f94ac420940f0f82Rohan Shah                if(!mHidden) {
72f8ccdcfc26f362d9c20771e2295a0c0e8d1195f3Andrew Sapperstein                    hide(true, false /* actionClicked */);
730a96c46d564aa2047cd3a2f3f94ac420940f0f82Rohan Shah                }
740a96c46d564aa2047cd3a2f3f94ac420940f0f82Rohan Shah            }
750a96c46d564aa2047cd3a2f3f94ac420940f0f82Rohan Shah        };
76c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein        LayoutInflater.from(context).inflate(R.layout.actionable_toast_row, this, true);
77c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein    }
78c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein
79c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein    @Override
80c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein    protected void onFinishInflate() {
81c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein        super.onFinishInflate();
82c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein
83c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein        mActionDescriptionIcon = (ImageView) findViewById(R.id.description_icon);
84c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein        mActionDescriptionView = (TextView) findViewById(R.id.description_text);
85c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein        mActionButton = findViewById(R.id.action_button);
86c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein        mActionIcon = findViewById(R.id.action_icon);
87c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein        mActionText = (TextView) findViewById(R.id.action_text);
88c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein    }
89c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein
90c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein    /**
91c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein     * Displays the toast bar and makes it visible. Allows the setting of
92c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein     * parameters to customize the display.
93f8ccdcfc26f362d9c20771e2295a0c0e8d1195f3Andrew Sapperstein     * @param listener Performs some action when the action button is clicked.
94f8ccdcfc26f362d9c20771e2295a0c0e8d1195f3Andrew Sapperstein     *                 If the {@link ToastBarOperation} overrides
95f8ccdcfc26f362d9c20771e2295a0c0e8d1195f3Andrew Sapperstein     *                 {@link ToastBarOperation#shouldTakeOnActionClickedPrecedence()}
96f8ccdcfc26f362d9c20771e2295a0c0e8d1195f3Andrew Sapperstein     *                 to return <code>true</code>, the
97f8ccdcfc26f362d9c20771e2295a0c0e8d1195f3Andrew Sapperstein     *                 {@link ToastBarOperation#onActionClicked(android.content.Context)}
98f8ccdcfc26f362d9c20771e2295a0c0e8d1195f3Andrew Sapperstein     *                 will override this listener and be called instead.
99c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein     * @param descriptionIconResourceId resource ID for the description icon or
100f8ccdcfc26f362d9c20771e2295a0c0e8d1195f3Andrew Sapperstein     *                                  0 if no icon should be shown
101c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein     * @param descriptionText a description text to show in the toast bar
102c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein     * @param showActionIcon if true, the action button icon should be shown
103c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein     * @param actionTextResource resource ID for the text to show in the action button
104c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein     * @param replaceVisibleToast if true, this toast should replace any currently visible toast.
105f8ccdcfc26f362d9c20771e2295a0c0e8d1195f3Andrew Sapperstein     *                            Otherwise, skip showing this toast.
1069d7519d18e8ddbcdd59b37eec7c85210fca0e8c2Andrew Sapperstein     * @param op the operation that corresponds to the specific toast being shown
107c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein     */
1089d7519d18e8ddbcdd59b37eec7c85210fca0e8c2Andrew Sapperstein    public void show(final ActionClickedListener listener, int descriptionIconResourceId,
1099d7519d18e8ddbcdd59b37eec7c85210fca0e8c2Andrew Sapperstein            CharSequence descriptionText, boolean showActionIcon, int actionTextResource,
110f8ccdcfc26f362d9c20771e2295a0c0e8d1195f3Andrew Sapperstein            boolean replaceVisibleToast, final ToastBarOperation op) {
1119d7519d18e8ddbcdd59b37eec7c85210fca0e8c2Andrew Sapperstein
112c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein        if (!mHidden && !replaceVisibleToast) {
113c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein            return;
114c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein        }
1150a96c46d564aa2047cd3a2f3f94ac420940f0f82Rohan Shah        // Remove any running delayed animations first
1160a96c46d564aa2047cd3a2f3f94ac420940f0f82Rohan Shah        mFadeOutHandler.removeCallbacks(mRunnable);
1179d7519d18e8ddbcdd59b37eec7c85210fca0e8c2Andrew Sapperstein
1189d7519d18e8ddbcdd59b37eec7c85210fca0e8c2Andrew Sapperstein        mOperation = op;
1199d7519d18e8ddbcdd59b37eec7c85210fca0e8c2Andrew Sapperstein
120c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein        mActionButton.setOnClickListener(new OnClickListener() {
121c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein            @Override
122c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein            public void onClick(View widget) {
123f8ccdcfc26f362d9c20771e2295a0c0e8d1195f3Andrew Sapperstein                if (op.shouldTakeOnActionClickedPrecedence()) {
124f8ccdcfc26f362d9c20771e2295a0c0e8d1195f3Andrew Sapperstein                    op.onActionClicked(getContext());
125f8ccdcfc26f362d9c20771e2295a0c0e8d1195f3Andrew Sapperstein                } else {
126f8ccdcfc26f362d9c20771e2295a0c0e8d1195f3Andrew Sapperstein                    listener.onActionClicked(getContext());
127f8ccdcfc26f362d9c20771e2295a0c0e8d1195f3Andrew Sapperstein                }
128f8ccdcfc26f362d9c20771e2295a0c0e8d1195f3Andrew Sapperstein                hide(true /* animate */, true /* actionClicked */);
129c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein            }
130c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein        });
131c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein
132c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein        // Set description icon.
133c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein        if (descriptionIconResourceId == 0) {
134c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein            mActionDescriptionIcon.setVisibility(GONE);
135c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein        } else {
136c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein            mActionDescriptionIcon.setVisibility(VISIBLE);
137c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein            mActionDescriptionIcon.setImageResource(descriptionIconResourceId);
138c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein        }
139c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein
140c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein        mActionDescriptionView.setText(descriptionText);
141c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein        mActionIcon.setVisibility(showActionIcon ? VISIBLE : GONE);
142c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein        mActionText.setText(actionTextResource);
143c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein
144c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein        mHidden = false;
145c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein        getShowAnimation().start();
1460a96c46d564aa2047cd3a2f3f94ac420940f0f82Rohan Shah
1470a96c46d564aa2047cd3a2f3f94ac420940f0f82Rohan Shah        // Set up runnable to execute hide toast once delay is completed
1480a96c46d564aa2047cd3a2f3f94ac420940f0f82Rohan Shah        mFadeOutHandler.postDelayed(mRunnable, TOAST_LIFETIME);
149c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein    }
150c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein
151d3367499e56116854ed637b1036fd71057ac0f49Mindy Pereira    public ToastBarOperation getOperation() {
152d3367499e56116854ed637b1036fd71057ac0f49Mindy Pereira        return mOperation;
153d3367499e56116854ed637b1036fd71057ac0f49Mindy Pereira    }
154d3367499e56116854ed637b1036fd71057ac0f49Mindy Pereira
155c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein    /**
156c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein     * Hides the view and resets the state.
157c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein     */
158f8ccdcfc26f362d9c20771e2295a0c0e8d1195f3Andrew Sapperstein    public void hide(boolean animate, boolean actionClicked) {
159ea04f938bef8e2ec7c6f64067511f006681318fbmindyp        mHidden = true;
1600a96c46d564aa2047cd3a2f3f94ac420940f0f82Rohan Shah        mFadeOutHandler.removeCallbacks(mRunnable);
161ea04f938bef8e2ec7c6f64067511f006681318fbmindyp        if (getVisibility() == View.VISIBLE) {
162ea04f938bef8e2ec7c6f64067511f006681318fbmindyp            mActionDescriptionView.setText("");
163ea04f938bef8e2ec7c6f64067511f006681318fbmindyp            mActionButton.setOnClickListener(null);
164ea04f938bef8e2ec7c6f64067511f006681318fbmindyp            // Hide view once it's clicked.
165ea04f938bef8e2ec7c6f64067511f006681318fbmindyp            if (animate) {
166ea04f938bef8e2ec7c6f64067511f006681318fbmindyp                getHideAnimation().start();
167ea04f938bef8e2ec7c6f64067511f006681318fbmindyp            } else {
168ea04f938bef8e2ec7c6f64067511f006681318fbmindyp                setAlpha(0);
169ea04f938bef8e2ec7c6f64067511f006681318fbmindyp                setVisibility(View.GONE);
170c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein            }
1713f0c976aaf55697139717318af13a46d642f42e4Scott Kennedy
1723f0c976aaf55697139717318af13a46d642f42e4Scott Kennedy            if (!actionClicked && mOperation != null) {
1733f0c976aaf55697139717318af13a46d642f42e4Scott Kennedy                mOperation.onToastBarTimeout(getContext());
1743f0c976aaf55697139717318af13a46d642f42e4Scott Kennedy            }
175c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein        }
176c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein    }
177c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein
178c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein    private Animator getShowAnimation() {
179c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein        if (mShowAnimation == null) {
180c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein            mShowAnimation = AnimatorInflater.loadAnimator(getContext(),
18197f30a0d9c004ca784a6bc932108f86e20264be6mindyp                    R.anim.fade_in);
182c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein            mShowAnimation.addListener(new Animator.AnimatorListener() {
183c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein                @Override
184c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein                public void onAnimationStart(Animator animation) {
185c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein                    setVisibility(View.VISIBLE);
186c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein                }
187c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein                @Override
188c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein                public void onAnimationEnd(Animator animation) {
189c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein                }
190c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein                @Override
191c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein                public void onAnimationCancel(Animator animation) {
192c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein                }
193c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein                @Override
194c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein                public void onAnimationRepeat(Animator animation) {
195c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein                }
196c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein            });
197c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein            mShowAnimation.setTarget(this);
198c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein        }
199c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein        return mShowAnimation;
200c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein    }
201c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein
202c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein    private Animator getHideAnimation() {
203c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein        if (mHideAnimation == null) {
204c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein            mHideAnimation = AnimatorInflater.loadAnimator(getContext(),
20597f30a0d9c004ca784a6bc932108f86e20264be6mindyp                    R.anim.fade_out);
206c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein            mHideAnimation.addListener(new Animator.AnimatorListener() {
207c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein                @Override
208c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein                public void onAnimationStart(Animator animation) {
209c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein                }
210c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein                @Override
211c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein                public void onAnimationRepeat(Animator animation) {
212c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein                }
213c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein                @Override
214c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein                public void onAnimationEnd(Animator animation) {
215c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein                    setVisibility(View.GONE);
216c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein                }
217c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein                @Override
218c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein                public void onAnimationCancel(Animator animation) {
219c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein                }
220c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein            });
221c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein            mHideAnimation.setTarget(this);
222c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein        }
223c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein        return mHideAnimation;
224c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein    }
225c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein
226c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein    public boolean isEventInToastBar(MotionEvent event) {
227c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein        if (!isShown()) {
228c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein            return false;
229c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein        }
230c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein        int[] xy = new int[2];
231c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein        float x = event.getX();
232c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein        float y = event.getY();
233c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein        getLocationOnScreen(xy);
234c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein        return (x > xy[0] && x < (xy[0] + getWidth()) && y > xy[1] && y < xy[1] + getHeight());
235c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein    }
236c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein
237d243d459b64003c5171ac5ff606729e525161be6Mark Wei    public boolean isAnimating() {
238d243d459b64003c5171ac5ff606729e525161be6Mark Wei        return mShowAnimation != null && mShowAnimation.isStarted();
239d243d459b64003c5171ac5ff606729e525161be6Mark Wei    }
2400a96c46d564aa2047cd3a2f3f94ac420940f0f82Rohan Shah
2410a96c46d564aa2047cd3a2f3f94ac420940f0f82Rohan Shah    @Override
2420a96c46d564aa2047cd3a2f3f94ac420940f0f82Rohan Shah    public void onDetachedFromWindow() {
2430a96c46d564aa2047cd3a2f3f94ac420940f0f82Rohan Shah        mFadeOutHandler.removeCallbacks(mRunnable);
2440a96c46d564aa2047cd3a2f3f94ac420940f0f82Rohan Shah        super.onDetachedFromWindow();
2450a96c46d564aa2047cd3a2f3f94ac420940f0f82Rohan Shah    }
2460a96c46d564aa2047cd3a2f3f94ac420940f0f82Rohan Shah
247c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein    /**
248c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein     * Classes that wish to perform some action when the action button is clicked
249c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein     * should implement this interface.
250c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein     */
251c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein    public interface ActionClickedListener {
252f8ccdcfc26f362d9c20771e2295a0c0e8d1195f3Andrew Sapperstein        public void onActionClicked(Context context);
253c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein    }
254c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein}
255