10cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng/* 20cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng * Copyright (C) 2012 The Android Open Source Project 30cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng * 40cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng * Licensed under the Apache License, Version 2.0 (the "License"); 50cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng * you may not use this file except in compliance with the License. 60cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng * You may obtain a copy of the License at 70cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng * 80cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng * http://www.apache.org/licenses/LICENSE-2.0 90cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng * 100cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng * Unless required by applicable law or agreed to in writing, software 110cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng * distributed under the License is distributed on an "AS IS" BASIS, 120cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng * See the License for the specific language governing permissions and 140cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng * limitations under the License 150cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng */ 160cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng 170cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Chengpackage com.android.deskclock.widget; 180cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng 190cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Chengimport android.animation.Animator; 200cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Chengimport android.animation.AnimatorInflater; 210cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Chengimport android.content.Context; 220cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Chengimport android.util.AttributeSet; 230cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Chengimport android.view.LayoutInflater; 240cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Chengimport android.view.MotionEvent; 250cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Chengimport android.view.View; 260cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Chengimport android.widget.FrameLayout; 270cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Chengimport android.widget.ImageView; 280cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Chengimport android.widget.LinearLayout; 290cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Chengimport android.widget.TextView; 300cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng 310cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Chengimport com.android.deskclock.R; 320cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng 330cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng/** 340cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng * A custom {@link View} that exposes an action to the user. 350cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng * <p> 360cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng * This is a copy of packages/apps/UnifiedEmail/src/com/android/mail/ui/ActionableToastBar.java 370cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng * with minor modifications. 380cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng */ 390cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Chengpublic class ActionableToastBar extends LinearLayout { 400cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng private boolean mHidden = false; 410cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng private Animator mShowAnimation; 420cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng private Animator mHideAnimation; 430cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng private final int mBottomMarginSizeInConversation; 440cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng 450cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng /** Icon for the description. */ 460cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng private ImageView mActionDescriptionIcon; 470cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng /** The clickable view */ 480cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng private View mActionButton; 490cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng /** Icon for the action button. */ 500cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng private View mActionIcon; 510cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng /** The view that contains the description. */ 520cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng private TextView mActionDescriptionView; 530cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng /** The view that contains the text for the action button. */ 540cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng private TextView mActionText; 550cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng //private ToastBarOperation mOperation; 560cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng 570cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng public ActionableToastBar(Context context) { 580cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng this(context, null); 590cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng } 600cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng 610cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng public ActionableToastBar(Context context, AttributeSet attrs) { 620cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng this(context, attrs, 0); 630cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng } 640cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng 650cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng public ActionableToastBar(Context context, AttributeSet attrs, int defStyle) { 660cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng super(context, attrs, defStyle); 670cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng mBottomMarginSizeInConversation = context.getResources().getDimensionPixelSize( 680cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng R.dimen.toast_bar_bottom_margin_in_conversation); 690cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng LayoutInflater.from(context).inflate(R.layout.actionable_toast_row, this, true); 700cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng } 710cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng 720cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng @Override 730cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng protected void onFinishInflate() { 740cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng super.onFinishInflate(); 750cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng 760cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng mActionDescriptionIcon = (ImageView) findViewById(R.id.description_icon); 770cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng mActionDescriptionView = (TextView) findViewById(R.id.description_text); 780cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng mActionButton = findViewById(R.id.action_button); 790cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng mActionIcon = findViewById(R.id.action_icon); 800cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng mActionText = (TextView) findViewById(R.id.action_text); 810cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng } 820cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng 830cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng /** 840cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng * Tells the view that it will be appearing in the conversation pane 850cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng * and should adjust its layout parameters accordingly. 860cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng * @param isInConversationMode true if the view will be shown in the conversation view 870cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng */ 880cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng public void setConversationMode(boolean isInConversationMode) { 890cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng final FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) getLayoutParams(); 900cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng params.bottomMargin = isInConversationMode ? mBottomMarginSizeInConversation : 0; 910cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng setLayoutParams(params); 920cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng } 930cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng 940cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng /** 950cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng * Displays the toast bar and makes it visible. Allows the setting of 960cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng * parameters to customize the display. 970cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng * @param listener performs some action when the action button is clicked 980cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng * @param descriptionIconResourceId resource ID for the description icon or 990cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng * 0 if no icon should be shown 1000cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng * @param descriptionText a description text to show in the toast bar 1010cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng * @param showActionIcon if true, the action button icon should be shown 1020cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng * @param actionTextResource resource ID for the text to show in the action button 1030cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng * @param replaceVisibleToast if true, this toast should replace any currently visible toast. 1040cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng * Otherwise, skip showing this toast. 1050cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng */ 1060cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng public void show(final ActionClickedListener listener, int descriptionIconResourceId, 1070cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng CharSequence descriptionText, boolean showActionIcon, int actionTextResource, 1080cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng boolean replaceVisibleToast) { 1090cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng 1100cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng if (!mHidden && !replaceVisibleToast) { 1110cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng return; 1120cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng } 1130cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng 1140cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng mActionButton.setOnClickListener(new OnClickListener() { 1150cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng @Override 1160cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng public void onClick(View widget) { 1170cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng if (listener != null) { 1180cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng listener.onActionClicked(); 1190cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng } 1200cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng hide(true); 1210cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng } 1220cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng }); 1230cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng 1240cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng // Set description icon. 1250cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng if (descriptionIconResourceId == 0) { 1260cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng mActionDescriptionIcon.setVisibility(GONE); 1270cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng } else { 1280cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng mActionDescriptionIcon.setVisibility(VISIBLE); 1290cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng mActionDescriptionIcon.setImageResource(descriptionIconResourceId); 1300cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng } 1310cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng 1320cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng mActionDescriptionView.setText(descriptionText); 1330cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng mActionIcon.setVisibility(showActionIcon ? VISIBLE : GONE); 1340cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng mActionText.setText(actionTextResource); 1350cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng 1360cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng mHidden = false; 1370cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng getShowAnimation().start(); 1380cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng } 1390cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng 1400cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng /** 1410cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng * Hides the view and resets the state. 1420cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng */ 1430cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng public void hide(boolean animate) { 1440cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng // Prevent multiple call to hide. 14500c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng // Also prevent hiding if show animation is going on. 14600c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng if (!mHidden && !getShowAnimation().isRunning()) { 1470cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng mHidden = true; 1480cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng if (getVisibility() == View.VISIBLE) { 1490cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng mActionDescriptionView.setText(""); 1500cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng mActionButton.setOnClickListener(null); 1510cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng // Hide view once it's clicked. 1520cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng if (animate) { 1530cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng getHideAnimation().start(); 1540cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng } else { 1550cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng setAlpha(0); 1560cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng setVisibility(View.GONE); 1570cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng } 1580cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng } 1590cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng } 1600cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng } 1610cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng 1620cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng private Animator getShowAnimation() { 1630cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng if (mShowAnimation == null) { 1640cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng mShowAnimation = AnimatorInflater.loadAnimator(getContext(), 1650cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng R.anim.fade_in); 1660cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng mShowAnimation.addListener(new Animator.AnimatorListener() { 1670cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng @Override 1680cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng public void onAnimationStart(Animator animation) { 1690cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng setVisibility(View.VISIBLE); 1700cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng } 1710cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng @Override 1720cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng public void onAnimationEnd(Animator animation) { 17300c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng // There is a tiny change that and hide animation could have finished right 17400c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng // before the show animation finished. In that case, the hide will mark the 17500c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng // view as GONE. We need to make sure the last one wins. 17600c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng setVisibility(View.VISIBLE); 1770cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng } 1780cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng @Override 1790cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng public void onAnimationCancel(Animator animation) { 1800cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng } 1810cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng @Override 1820cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng public void onAnimationRepeat(Animator animation) { 1830cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng } 1840cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng }); 1850cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng mShowAnimation.setTarget(this); 1860cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng } 1870cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng return mShowAnimation; 1880cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng } 1890cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng 1900cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng private Animator getHideAnimation() { 1910cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng if (mHideAnimation == null) { 1920cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng mHideAnimation = AnimatorInflater.loadAnimator(getContext(), 1930cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng R.anim.fade_out); 1940cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng mHideAnimation.addListener(new Animator.AnimatorListener() { 1950cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng @Override 1960cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng public void onAnimationStart(Animator animation) { 1970cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng } 1980cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng @Override 1990cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng public void onAnimationRepeat(Animator animation) { 2000cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng } 2010cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng @Override 2020cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng public void onAnimationEnd(Animator animation) { 2030cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng setVisibility(View.GONE); 2040cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng } 2050cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng @Override 2060cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng public void onAnimationCancel(Animator animation) { 2070cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng } 2080cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng }); 2090cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng mHideAnimation.setTarget(this); 2100cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng } 2110cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng return mHideAnimation; 2120cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng } 2130cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng 2140cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng public boolean isEventInToastBar(MotionEvent event) { 2150cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng if (!isShown()) { 2160cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng return false; 2170cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng } 2180cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng int[] xy = new int[2]; 2190cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng float x = event.getX(); 2200cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng float y = event.getY(); 2210cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng getLocationOnScreen(xy); 2220cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng return (x > xy[0] && x < (xy[0] + getWidth()) && y > xy[1] && y < xy[1] + getHeight()); 2230cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng } 2240cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng 2250cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng /** 2260cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng * Classes that wish to perform some action when the action button is clicked 2270cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng * should implement this interface. 2280cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng */ 2290cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng public interface ActionClickedListener { 2300cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng public void onActionClicked(); 2310cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng } 2320cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng} 233