AbsActionBarView.java revision 5c1cb19f4075b3c4ab895a30ab5f2469aff5b553
1640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell/* 2640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell * Copyright (C) 2011 The Android Open Source Project 3640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell * 4640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell * Licensed under the Apache License, Version 2.0 (the "License"); 5640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell * you may not use this file except in compliance with the License. 6640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell * You may obtain a copy of the License at 7640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell * 8640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell * http://www.apache.org/licenses/LICENSE-2.0 9640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell * 10640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell * Unless required by applicable law or agreed to in writing, software 11640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell * distributed under the License is distributed on an "AS IS" BASIS, 12640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell * See the License for the specific language governing permissions and 14640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell * limitations under the License. 15640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell */ 16640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powellpackage com.android.internal.widget; 17640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell 18640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powellimport com.android.internal.view.menu.ActionMenuPresenter; 19640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powellimport com.android.internal.view.menu.ActionMenuView; 20640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell 21640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powellimport android.animation.Animator; 22640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powellimport android.animation.AnimatorSet; 23640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powellimport android.animation.ObjectAnimator; 24640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powellimport android.animation.TimeInterpolator; 25640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powellimport android.content.Context; 26640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powellimport android.util.AttributeSet; 27640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powellimport android.view.View; 28640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powellimport android.view.ViewGroup; 29640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powellimport android.view.animation.DecelerateInterpolator; 30640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell 31640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powellpublic abstract class AbsActionBarView extends ViewGroup { 32640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell protected ActionMenuView mMenuView; 33640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell protected ActionMenuPresenter mMenuPresenter; 34640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell protected ActionBarContainer mSplitView; 35640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell 36640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell protected Animator mVisibilityAnim; 37640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell protected final VisibilityAnimListener mVisAnimListener = new VisibilityAnimListener(); 38640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell 39640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell private static final TimeInterpolator sAlphaInterpolator = new DecelerateInterpolator(); 40640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell 41640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell private static final int FADE_DURATION = 200; 42640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell 43640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell public AbsActionBarView(Context context) { 44640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell super(context); 45640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell } 46640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell 47640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell public AbsActionBarView(Context context, AttributeSet attrs) { 48640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell super(context, attrs); 49640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell } 50640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell 51640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell public AbsActionBarView(Context context, AttributeSet attrs, int defStyle) { 52640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell super(context, attrs, defStyle); 53640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell } 54640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell 55640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell public void setSplitView(ActionBarContainer splitView) { 56640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell mSplitView = splitView; 57640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell } 58640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell 59640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell public void animateToVisibility(int visibility) { 60640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell if (mVisibilityAnim != null) { 61640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell mVisibilityAnim.cancel(); 62640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell } 63640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell if (visibility == VISIBLE) { 64640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell if (getVisibility() != VISIBLE) { 65640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell setAlpha(0); 66640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell if (mSplitView != null && mMenuView != null) { 67640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell mMenuView.setAlpha(0); 68640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell } 69640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell } 70640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell ObjectAnimator anim = ObjectAnimator.ofFloat(this, "alpha", 1); 71640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell anim.setDuration(FADE_DURATION); 72640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell anim.setInterpolator(sAlphaInterpolator); 73640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell if (mSplitView != null && mMenuView != null) { 74640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell AnimatorSet set = new AnimatorSet(); 75640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell ObjectAnimator splitAnim = ObjectAnimator.ofFloat(mMenuView, "alpha", 1); 76640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell splitAnim.setDuration(FADE_DURATION); 77640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell set.addListener(mVisAnimListener.withFinalVisibility(visibility)); 78640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell set.play(anim).with(splitAnim); 795c1cb19f4075b3c4ab895a30ab5f2469aff5b553Adam Powell set.start(); 80640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell } else { 81640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell anim.addListener(mVisAnimListener.withFinalVisibility(visibility)); 82640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell anim.start(); 83640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell } 84640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell } else { 85640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell ObjectAnimator anim = ObjectAnimator.ofFloat(this, "alpha", 0); 86640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell anim.setDuration(FADE_DURATION); 87640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell anim.setInterpolator(sAlphaInterpolator); 88640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell if (mSplitView != null && mMenuView != null) { 89640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell AnimatorSet set = new AnimatorSet(); 90640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell ObjectAnimator splitAnim = ObjectAnimator.ofFloat(mMenuView, "alpha", 0); 91640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell splitAnim.setDuration(FADE_DURATION); 92640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell set.addListener(mVisAnimListener.withFinalVisibility(visibility)); 93640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell set.play(anim).with(splitAnim); 945c1cb19f4075b3c4ab895a30ab5f2469aff5b553Adam Powell set.start(); 95640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell } else { 96640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell anim.addListener(mVisAnimListener.withFinalVisibility(visibility)); 97640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell anim.start(); 98640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell } 99640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell } 100640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell } 101640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell 102640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell @Override 103640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell public void setVisibility(int visibility) { 104640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell if (mVisibilityAnim != null) { 105640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell mVisibilityAnim.end(); 106640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell } 107640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell super.setVisibility(visibility); 108640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell } 109640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell 110640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell public boolean showOverflowMenu() { 111640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell if (mMenuPresenter != null) { 112640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell return mMenuPresenter.showOverflowMenu(); 113640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell } 114640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell return false; 115640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell } 116640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell 117640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell public void postShowOverflowMenu() { 118640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell post(new Runnable() { 119640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell public void run() { 120640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell showOverflowMenu(); 121640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell } 122640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell }); 123640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell } 124640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell 125640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell public boolean hideOverflowMenu() { 126640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell if (mMenuPresenter != null) { 127640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell return mMenuPresenter.hideOverflowMenu(); 128640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell } 129640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell return false; 130640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell } 131640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell 132640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell public boolean isOverflowMenuShowing() { 133640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell if (mMenuPresenter != null) { 134640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell return mMenuPresenter.isOverflowMenuShowing(); 135640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell } 136640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell return false; 137640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell } 138640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell 139640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell public boolean isOverflowReserved() { 140640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell return mMenuPresenter != null && mMenuPresenter.isOverflowReserved(); 141640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell } 142640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell 143640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell public void dismissPopupMenus() { 144640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell if (mMenuPresenter != null) { 145640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell mMenuPresenter.dismissPopupMenus(); 146640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell } 147640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell } 148640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell 149640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell protected int measureChildView(View child, int availableWidth, int childSpecHeight, 150640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell int spacing) { 151640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell child.measure(MeasureSpec.makeMeasureSpec(availableWidth, MeasureSpec.AT_MOST), 152640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell childSpecHeight); 153640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell 154640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell availableWidth -= child.getMeasuredWidth(); 155640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell availableWidth -= spacing; 156640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell 157640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell return availableWidth; 158640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell } 159640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell 160640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell protected int positionChild(View child, int x, int y, int contentHeight) { 161640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell int childWidth = child.getMeasuredWidth(); 162640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell int childHeight = child.getMeasuredHeight(); 163640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell int childTop = y + (contentHeight - childHeight) / 2; 164640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell 165640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell child.layout(x, childTop, x + childWidth, childTop + childHeight); 166640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell 167640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell return childWidth; 168640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell } 169640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell 170640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell protected int positionChildInverse(View child, int x, int y, int contentHeight) { 171640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell int childWidth = child.getMeasuredWidth(); 172640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell int childHeight = child.getMeasuredHeight(); 173640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell int childTop = y + (contentHeight - childHeight) / 2; 174640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell 175640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell child.layout(x - childWidth, childTop, x, childTop + childHeight); 176640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell 177640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell return childWidth; 178640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell } 179640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell 180640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell protected class VisibilityAnimListener implements Animator.AnimatorListener { 181640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell private boolean mCanceled = false; 182640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell private int mFinalVisibility; 183640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell 184640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell public VisibilityAnimListener withFinalVisibility(int visibility) { 185640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell mFinalVisibility = visibility; 186640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell return this; 187640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell } 188640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell 189640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell @Override 190640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell public void onAnimationStart(Animator animation) { 191640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell setVisibility(VISIBLE); 192640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell mVisibilityAnim = animation; 193640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell mCanceled = false; 194640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell } 195640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell 196640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell @Override 197640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell public void onAnimationEnd(Animator animation) { 198640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell if (mCanceled) return; 199640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell 200640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell mVisibilityAnim = null; 201640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell setVisibility(mFinalVisibility); 202640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell } 203640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell 204640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell @Override 205640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell public void onAnimationCancel(Animator animation) { 206640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell mCanceled = true; 207640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell } 208640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell 209640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell @Override 210640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell public void onAnimationRepeat(Animator animation) { 211640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell } 212640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell } 213640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell} 214