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