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