1bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell/* 2bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * Copyright (C) 2011 The Android Open Source Project 3bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * 4bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * Licensed under the Apache License, Version 2.0 (the "License"); 5bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * you may not use this file except in compliance with the License. 6bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * You may obtain a copy of the License at 7bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * 8bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * http://www.apache.org/licenses/LICENSE-2.0 9bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * 10bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * Unless required by applicable law or agreed to in writing, software 11bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * distributed under the License is distributed on an "AS IS" BASIS, 12bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * See the License for the specific language governing permissions and 14bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * limitations under the License. 15bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell */ 16acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes 1766698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banespackage android.support.v7.widget; 18bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 19bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.content.Context; 20bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.content.res.Configuration; 21bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.content.res.TypedArray; 2234b5c9580dd01b4428ab2c5990add571eaab6b13Trevor Johnsimport android.os.Build; 2346be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banesimport android.support.v4.view.MotionEventCompat; 2449c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.view.ViewCompat; 2549c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.view.ViewPropertyAnimatorCompat; 2649c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.view.ViewPropertyAnimatorListener; 27da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brownimport android.support.v7.appcompat.R; 28bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.util.AttributeSet; 2949c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.util.TypedValue; 3049c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.ContextThemeWrapper; 3146be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banesimport android.view.MotionEvent; 32bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.view.View; 33bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.view.ViewGroup; 34bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 3579e7a9ef79920c7daa10c90339db126a4c3c592eChris Banesabstract class AbsActionBarView extends ViewGroup { 3649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private static final int FADE_DURATION = 200; 37bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 3849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes protected final VisibilityAnimListener mVisAnimListener = new VisibilityAnimListener(); 39bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 4049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes /** Context against which to inflate popup menus. */ 4149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes protected final Context mPopupContext; 42bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 4349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes protected ActionMenuView mMenuView; 4449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes protected ActionMenuPresenter mActionMenuPresenter; 4520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns protected int mContentHeight; 4620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 4749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes protected ViewPropertyAnimatorCompat mVisibilityAnim; 4820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 4946be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes private boolean mEatingTouch; 5046be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes private boolean mEatingHover; 5146be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes 5279e7a9ef79920c7daa10c90339db126a4c3c592eChris Banes AbsActionBarView(Context context) { 5349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes this(context, null); 5420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 5520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 5679e7a9ef79920c7daa10c90339db126a4c3c592eChris Banes AbsActionBarView(Context context, AttributeSet attrs) { 5749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes this(context, attrs, 0); 5820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 5920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 6079e7a9ef79920c7daa10c90339db126a4c3c592eChris Banes AbsActionBarView(Context context, AttributeSet attrs, int defStyle) { 6120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns super(context, attrs, defStyle); 6249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 6349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final TypedValue tv = new TypedValue(); 6449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (context.getTheme().resolveAttribute(R.attr.actionBarPopupTheme, tv, true) 6549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes && tv.resourceId != 0) { 6649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mPopupContext = new ContextThemeWrapper(context, tv.resourceId); 6749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } else { 6849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mPopupContext = context; 6949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 7020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 7120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 7220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns @Override 7320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns protected void onConfigurationChanged(Configuration newConfig) { 7464dbe1d454f1190b3cd8426d09b9119949a10709Kirill Grouchnikov super.onConfigurationChanged(newConfig); 7520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 7620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // Action bar can change size on configuration changes. 7720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // Reread the desired height from the theme-specified style. 7820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns TypedArray a = getContext().obtainStyledAttributes(null, R.styleable.ActionBar, 7920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns R.attr.actionBarStyle, 0); 8020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns setContentHeight(a.getLayoutDimension(R.styleable.ActionBar_height, 0)); 8120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns a.recycle(); 8249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 8320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mActionMenuPresenter != null) { 8420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mActionMenuPresenter.onConfigurationChanged(newConfig); 8520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 8620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 8720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 8846be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes @Override 8946be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes public boolean onTouchEvent(MotionEvent ev) { 9046be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes // ActionBarViews always eat touch events, but should still respect the touch event dispatch 9146be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes // contract. If the normal View implementation doesn't want the events, we'll just silently 9246be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes // eat the rest of the gesture without reporting the events to the default implementation 9346be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes // since that's what it expects. 9446be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes 9546be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes final int action = MotionEventCompat.getActionMasked(ev); 9646be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes if (action == MotionEvent.ACTION_DOWN) { 9746be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes mEatingTouch = false; 9846be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes } 9946be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes 10046be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes if (!mEatingTouch) { 10146be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes final boolean handled = super.onTouchEvent(ev); 10246be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes if (action == MotionEvent.ACTION_DOWN && !handled) { 10346be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes mEatingTouch = true; 10446be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes } 10546be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes } 10646be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes 10746be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) { 10846be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes mEatingTouch = false; 10946be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes } 11046be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes 11146be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes return true; 11246be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes } 11346be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes 11446be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes @Override 11546be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes public boolean onHoverEvent(MotionEvent ev) { 11646be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes // Same deal as onTouchEvent() above. Eat all hover events, but still 11746be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes // respect the touch event dispatch contract. 11846be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes 11946be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes final int action = MotionEventCompat.getActionMasked(ev); 12046be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes if (action == MotionEventCompat.ACTION_HOVER_ENTER) { 12146be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes mEatingHover = false; 12246be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes } 12346be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes 12446be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes if (!mEatingHover) { 12546be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes final boolean handled = super.onHoverEvent(ev); 12646be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes if (action == MotionEventCompat.ACTION_HOVER_ENTER && !handled) { 12746be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes mEatingHover = true; 12846be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes } 12946be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes } 13046be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes 13146be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes if (action == MotionEventCompat.ACTION_HOVER_EXIT 13246be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes || action == MotionEvent.ACTION_CANCEL) { 13346be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes mEatingHover = false; 13446be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes } 13546be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes 13646be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes return true; 13746be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes } 13846be6a08e9d1b4b989f74f800b71a1221321ab6eChris Banes 13920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void setContentHeight(int height) { 14020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mContentHeight = height; 14120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns requestLayout(); 14220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 14320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 14420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public int getContentHeight() { 14520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return mContentHeight; 14620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 14720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 14820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns /** 14920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * @return Current visibility or if animating, the visibility being animated to. 15020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns */ 15120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public int getAnimatedVisibility() { 15249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mVisibilityAnim != null) { 15349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mVisAnimListener.mFinalVisibility; 15449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 15520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return getVisibility(); 15620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 15720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 158acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes public ViewPropertyAnimatorCompat setupAnimatorToVisibility(int visibility, long duration) { 15949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mVisibilityAnim != null) { 16049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mVisibilityAnim.cancel(); 16149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 162acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes 16349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (visibility == VISIBLE) { 16449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (getVisibility() != VISIBLE) { 16549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewCompat.setAlpha(this, 0f); 16649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 16749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewPropertyAnimatorCompat anim = ViewCompat.animate(this).alpha(1f); 168acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes anim.setDuration(duration); 169acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes anim.setListener(mVisAnimListener.withFinalVisibility(anim, visibility)); 170acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes return anim; 17149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } else { 17249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewPropertyAnimatorCompat anim = ViewCompat.animate(this).alpha(0f); 173acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes anim.setDuration(duration); 174acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes anim.setListener(mVisAnimListener.withFinalVisibility(anim, visibility)); 175acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes return anim; 176acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes } 177acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes } 178acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes 179acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes public void animateToVisibility(int visibility) { 180acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes ViewPropertyAnimatorCompat anim = setupAnimatorToVisibility(visibility, FADE_DURATION); 181acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes anim.start(); 182acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes } 183acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes 184acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes @Override 185acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes public void setVisibility(int visibility) { 186acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes if (visibility != getVisibility()) { 187acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes if (mVisibilityAnim != null) { 188acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes mVisibilityAnim.cancel(); 1899addcff1698f71fb4145f39dacaf33a9c1fef24fChris Banes } 190acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes super.setVisibility(visibility); 1919addcff1698f71fb4145f39dacaf33a9c1fef24fChris Banes } 19220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 19320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 19420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public boolean showOverflowMenu() { 19520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mActionMenuPresenter != null) { 19620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return mActionMenuPresenter.showOverflowMenu(); 19720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 19820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return false; 19920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 20020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 20120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void postShowOverflowMenu() { 20220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns post(new Runnable() { 20320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void run() { 20420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns showOverflowMenu(); 20520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 20620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns }); 20720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 20820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 20920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public boolean hideOverflowMenu() { 21020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mActionMenuPresenter != null) { 21120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return mActionMenuPresenter.hideOverflowMenu(); 21220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 21320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return false; 21420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 21520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 21620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public boolean isOverflowMenuShowing() { 21720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mActionMenuPresenter != null) { 21820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return mActionMenuPresenter.isOverflowMenuShowing(); 21920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 22020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return false; 22120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 22220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 22349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean isOverflowMenuShowPending() { 22449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mActionMenuPresenter != null) { 22549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mActionMenuPresenter.isOverflowMenuShowPending(); 22649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 22749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return false; 22849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 22949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 23020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public boolean isOverflowReserved() { 23120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return mActionMenuPresenter != null && mActionMenuPresenter.isOverflowReserved(); 23220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 23320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 23449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean canShowOverflowMenu() { 23549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return isOverflowReserved() && getVisibility() == VISIBLE; 23649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 23749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 23820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void dismissPopupMenus() { 23920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mActionMenuPresenter != null) { 24020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mActionMenuPresenter.dismissPopupMenus(); 24120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 24220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 24320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 24420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns protected int measureChildView(View child, int availableWidth, int childSpecHeight, 24520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns int spacing) { 24620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns child.measure(MeasureSpec.makeMeasureSpec(availableWidth, MeasureSpec.AT_MOST), 24720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns childSpecHeight); 24820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 24920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns availableWidth -= child.getMeasuredWidth(); 25020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns availableWidth -= spacing; 25120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 25220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return Math.max(0, availableWidth); 25320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 25420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 25549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes static protected int next(int x, int val, boolean isRtl) { 25649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return isRtl ? x - val : x + val; 25749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 25849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 25949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes protected int positionChild(View child, int x, int y, int contentHeight, boolean reverse) { 26020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns int childWidth = child.getMeasuredWidth(); 26120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns int childHeight = child.getMeasuredHeight(); 26220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns int childTop = y + (contentHeight - childHeight) / 2; 26320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 26449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (reverse) { 26549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes child.layout(x - childWidth, childTop, x, childTop + childHeight); 26649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } else { 26749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes child.layout(x, childTop, x + childWidth, childTop + childHeight); 26849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 26920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 27049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return (reverse ? -childWidth : childWidth); 27120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 27220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 27349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes protected class VisibilityAnimListener implements ViewPropertyAnimatorListener { 27449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private boolean mCanceled = false; 27549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes int mFinalVisibility; 27620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 27749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public VisibilityAnimListener withFinalVisibility(ViewPropertyAnimatorCompat animation, 27849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes int visibility) { 27949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mVisibilityAnim = animation; 28049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mFinalVisibility = visibility; 28149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return this; 28249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 28320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 28449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 28549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void onAnimationStart(View view) { 286acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes AbsActionBarView.super.setVisibility(VISIBLE); 28749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mCanceled = false; 28849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 28949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 29049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 29149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void onAnimationEnd(View view) { 29249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mCanceled) return; 293bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 29449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mVisibilityAnim = null; 295acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes AbsActionBarView.super.setVisibility(mFinalVisibility); 29649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 29749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 29849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 29949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void onAnimationCancel(View view) { 30049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mCanceled = true; 30149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 30249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 303bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell} 304