Loading core/java/com/android/internal/app/ActionBarImpl.java +4 −2 Original line number Diff line number Diff line Loading @@ -16,7 +16,6 @@ package com.android.internal.app; import com.android.internal.R; import com.android.internal.view.menu.MenuBuilder; import com.android.internal.view.menu.MenuPopupHelper; import com.android.internal.view.menu.SubMenuBuilder; Loading @@ -36,7 +35,6 @@ import android.app.Dialog; import android.app.FragmentTransaction; import android.content.Context; import android.content.res.Configuration; import android.content.res.TypedArray; import android.graphics.drawable.Drawable; import android.os.Handler; import android.view.ActionMode; Loading Loading @@ -580,6 +578,9 @@ public class ActionBarImpl extends ActionBar { mActionView.animateToVisibility(toActionMode ? View.GONE : View.VISIBLE); mContextView.animateToVisibility(toActionMode ? View.VISIBLE : View.GONE); if (mTabScrollView != null && !mActionView.hasEmbeddedTabs() && mActionView.isCollapsed()) { mTabScrollView.animateToVisibility(toActionMode ? View.GONE : View.VISIBLE); } } /** Loading Loading @@ -620,6 +621,7 @@ public class ActionBarImpl extends ActionBar { // Clear out the context mode views after the animation finishes mContextView.closeMode(); mActionMode = null; if (mWasHiddenBeforeMode) { Loading core/java/com/android/internal/widget/ActionBarContainer.java +10 −13 Original line number Diff line number Diff line Loading @@ -105,24 +105,19 @@ public class ActionBarContainer extends FrameLayout { public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int nonTabHeight = 0; final int count = getChildCount(); for (int i = 0; i < count; i++) { final View child = getChildAt(i); if (mActionBarView == null) return; if (child == mTabContainer) continue; final LayoutParams lp = (LayoutParams) child.getLayoutParams(); nonTabHeight = Math.max(nonTabHeight, child.getMeasuredHeight() + lp.topMargin + lp.bottomMargin); } final LayoutParams lp = (LayoutParams) mActionBarView.getLayoutParams(); final int actionBarViewHeight = mActionBarView.isCollapsed() ? 0 : mActionBarView.getMeasuredHeight() + lp.topMargin + lp.bottomMargin; if (mTabContainer != null && mTabContainer.getVisibility() != GONE) { final int mode = MeasureSpec.getMode(heightMeasureSpec); if (mode == MeasureSpec.AT_MOST) { final int maxHeight = MeasureSpec.getSize(heightMeasureSpec); setMeasuredDimension(getMeasuredWidth(), Math.min(nonTabHeight + mTabContainer.getMeasuredHeight(), maxHeight)); Math.min(actionBarViewHeight + mTabContainer.getMeasuredHeight(), maxHeight)); } } } Loading @@ -142,8 +137,10 @@ public class ActionBarContainer extends FrameLayout { if (child == mTabContainer) continue; if (!mActionBarView.isCollapsed()) { child.offsetTopAndBottom(tabHeight); } } mTabContainer.layout(l, 0, r, tabHeight); } else { mTabContainer.layout(l, containerHeight - tabHeight, r, containerHeight); Loading core/java/com/android/internal/widget/ActionBarContextView.java +1 −1 Original line number Diff line number Diff line Loading @@ -287,7 +287,7 @@ public class ActionBarContextView extends AbsActionBarView implements AnimatorLi availableWidth = measureChildView(mClose, availableWidth, childSpecHeight, 0); } if (mMenuView != null) { if (mMenuView != null && mMenuView.getParent() == this) { availableWidth = measureChildView(mMenuView, availableWidth, childSpecHeight, 0); } Loading core/java/com/android/internal/widget/ActionBarView.java +7 −0 Original line number Diff line number Diff line Loading @@ -117,6 +117,7 @@ public class ActionBarView extends AbsActionBarView { private boolean mUserTitle; private boolean mIncludeTabs; private boolean mIsCollapsable; private boolean mIsCollapsed; private MenuBuilder mOptionsMenu; Loading Loading @@ -692,6 +693,10 @@ public class ActionBarView extends AbsActionBarView { mIsCollapsable = collapsable; } public boolean isCollapsed() { return mIsCollapsed; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { final int childCount = getChildCount(); Loading @@ -708,9 +713,11 @@ public class ActionBarView extends AbsActionBarView { if (visibleChildren == 0) { // No size for an empty action bar when collapsable. setMeasuredDimension(0, 0); mIsCollapsed = true; return; } } mIsCollapsed = false; int widthMode = MeasureSpec.getMode(widthMeasureSpec); if (widthMode != MeasureSpec.EXACTLY) { Loading core/java/com/android/internal/widget/ScrollingTabContainerView.java +69 −0 Original line number Diff line number Diff line Loading @@ -15,6 +15,9 @@ */ package com.android.internal.widget; import android.animation.Animator; import android.animation.ObjectAnimator; import android.animation.TimeInterpolator; import android.app.ActionBar; import android.content.Context; import android.graphics.drawable.Drawable; Loading @@ -22,6 +25,7 @@ import android.text.TextUtils.TruncateAt; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.view.animation.DecelerateInterpolator; import android.widget.HorizontalScrollView; import android.widget.ImageView; import android.widget.LinearLayout; Loading @@ -35,6 +39,13 @@ public class ScrollingTabContainerView extends HorizontalScrollView { int mMaxTabWidth; protected Animator mVisibilityAnim; protected final VisibilityAnimListener mVisAnimListener = new VisibilityAnimListener(); private static final TimeInterpolator sAlphaInterpolator = new DecelerateInterpolator(); private static final int FADE_DURATION = 200; public ScrollingTabContainerView(Context context) { super(context); setHorizontalScrollBarEnabled(false); Loading Loading @@ -76,6 +87,30 @@ public class ScrollingTabContainerView extends HorizontalScrollView { } } public void animateToVisibility(int visibility) { if (mVisibilityAnim != null) { mVisibilityAnim.cancel(); } if (visibility == VISIBLE) { if (getVisibility() != VISIBLE) { setAlpha(0); } ObjectAnimator anim = ObjectAnimator.ofFloat(this, "alpha", 1); anim.setDuration(FADE_DURATION); anim.setInterpolator(sAlphaInterpolator); anim.addListener(mVisAnimListener.withFinalVisibility(visibility)); anim.start(); } else { ObjectAnimator anim = ObjectAnimator.ofFloat(this, "alpha", 0); anim.setDuration(FADE_DURATION); anim.setInterpolator(sAlphaInterpolator); anim.addListener(mVisAnimListener.withFinalVisibility(visibility)); anim.start(); } } public void animateToTab(int position) { final View tabView = mTabLayout.getChildAt(position); if (mTabSelector != null) { Loading Loading @@ -259,4 +294,38 @@ public class ScrollingTabContainerView extends HorizontalScrollView { } } } protected class VisibilityAnimListener implements Animator.AnimatorListener { private boolean mCanceled = false; private int mFinalVisibility; public VisibilityAnimListener withFinalVisibility(int visibility) { mFinalVisibility = visibility; return this; } @Override public void onAnimationStart(Animator animation) { setVisibility(VISIBLE); mVisibilityAnim = animation; mCanceled = false; } @Override public void onAnimationEnd(Animator animation) { if (mCanceled) return; mVisibilityAnim = null; setVisibility(mFinalVisibility); } @Override public void onAnimationCancel(Animator animation) { mCanceled = true; } @Override public void onAnimationRepeat(Animator animation) { } } } Loading
core/java/com/android/internal/app/ActionBarImpl.java +4 −2 Original line number Diff line number Diff line Loading @@ -16,7 +16,6 @@ package com.android.internal.app; import com.android.internal.R; import com.android.internal.view.menu.MenuBuilder; import com.android.internal.view.menu.MenuPopupHelper; import com.android.internal.view.menu.SubMenuBuilder; Loading @@ -36,7 +35,6 @@ import android.app.Dialog; import android.app.FragmentTransaction; import android.content.Context; import android.content.res.Configuration; import android.content.res.TypedArray; import android.graphics.drawable.Drawable; import android.os.Handler; import android.view.ActionMode; Loading Loading @@ -580,6 +578,9 @@ public class ActionBarImpl extends ActionBar { mActionView.animateToVisibility(toActionMode ? View.GONE : View.VISIBLE); mContextView.animateToVisibility(toActionMode ? View.VISIBLE : View.GONE); if (mTabScrollView != null && !mActionView.hasEmbeddedTabs() && mActionView.isCollapsed()) { mTabScrollView.animateToVisibility(toActionMode ? View.GONE : View.VISIBLE); } } /** Loading Loading @@ -620,6 +621,7 @@ public class ActionBarImpl extends ActionBar { // Clear out the context mode views after the animation finishes mContextView.closeMode(); mActionMode = null; if (mWasHiddenBeforeMode) { Loading
core/java/com/android/internal/widget/ActionBarContainer.java +10 −13 Original line number Diff line number Diff line Loading @@ -105,24 +105,19 @@ public class ActionBarContainer extends FrameLayout { public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int nonTabHeight = 0; final int count = getChildCount(); for (int i = 0; i < count; i++) { final View child = getChildAt(i); if (mActionBarView == null) return; if (child == mTabContainer) continue; final LayoutParams lp = (LayoutParams) child.getLayoutParams(); nonTabHeight = Math.max(nonTabHeight, child.getMeasuredHeight() + lp.topMargin + lp.bottomMargin); } final LayoutParams lp = (LayoutParams) mActionBarView.getLayoutParams(); final int actionBarViewHeight = mActionBarView.isCollapsed() ? 0 : mActionBarView.getMeasuredHeight() + lp.topMargin + lp.bottomMargin; if (mTabContainer != null && mTabContainer.getVisibility() != GONE) { final int mode = MeasureSpec.getMode(heightMeasureSpec); if (mode == MeasureSpec.AT_MOST) { final int maxHeight = MeasureSpec.getSize(heightMeasureSpec); setMeasuredDimension(getMeasuredWidth(), Math.min(nonTabHeight + mTabContainer.getMeasuredHeight(), maxHeight)); Math.min(actionBarViewHeight + mTabContainer.getMeasuredHeight(), maxHeight)); } } } Loading @@ -142,8 +137,10 @@ public class ActionBarContainer extends FrameLayout { if (child == mTabContainer) continue; if (!mActionBarView.isCollapsed()) { child.offsetTopAndBottom(tabHeight); } } mTabContainer.layout(l, 0, r, tabHeight); } else { mTabContainer.layout(l, containerHeight - tabHeight, r, containerHeight); Loading
core/java/com/android/internal/widget/ActionBarContextView.java +1 −1 Original line number Diff line number Diff line Loading @@ -287,7 +287,7 @@ public class ActionBarContextView extends AbsActionBarView implements AnimatorLi availableWidth = measureChildView(mClose, availableWidth, childSpecHeight, 0); } if (mMenuView != null) { if (mMenuView != null && mMenuView.getParent() == this) { availableWidth = measureChildView(mMenuView, availableWidth, childSpecHeight, 0); } Loading
core/java/com/android/internal/widget/ActionBarView.java +7 −0 Original line number Diff line number Diff line Loading @@ -117,6 +117,7 @@ public class ActionBarView extends AbsActionBarView { private boolean mUserTitle; private boolean mIncludeTabs; private boolean mIsCollapsable; private boolean mIsCollapsed; private MenuBuilder mOptionsMenu; Loading Loading @@ -692,6 +693,10 @@ public class ActionBarView extends AbsActionBarView { mIsCollapsable = collapsable; } public boolean isCollapsed() { return mIsCollapsed; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { final int childCount = getChildCount(); Loading @@ -708,9 +713,11 @@ public class ActionBarView extends AbsActionBarView { if (visibleChildren == 0) { // No size for an empty action bar when collapsable. setMeasuredDimension(0, 0); mIsCollapsed = true; return; } } mIsCollapsed = false; int widthMode = MeasureSpec.getMode(widthMeasureSpec); if (widthMode != MeasureSpec.EXACTLY) { Loading
core/java/com/android/internal/widget/ScrollingTabContainerView.java +69 −0 Original line number Diff line number Diff line Loading @@ -15,6 +15,9 @@ */ package com.android.internal.widget; import android.animation.Animator; import android.animation.ObjectAnimator; import android.animation.TimeInterpolator; import android.app.ActionBar; import android.content.Context; import android.graphics.drawable.Drawable; Loading @@ -22,6 +25,7 @@ import android.text.TextUtils.TruncateAt; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.view.animation.DecelerateInterpolator; import android.widget.HorizontalScrollView; import android.widget.ImageView; import android.widget.LinearLayout; Loading @@ -35,6 +39,13 @@ public class ScrollingTabContainerView extends HorizontalScrollView { int mMaxTabWidth; protected Animator mVisibilityAnim; protected final VisibilityAnimListener mVisAnimListener = new VisibilityAnimListener(); private static final TimeInterpolator sAlphaInterpolator = new DecelerateInterpolator(); private static final int FADE_DURATION = 200; public ScrollingTabContainerView(Context context) { super(context); setHorizontalScrollBarEnabled(false); Loading Loading @@ -76,6 +87,30 @@ public class ScrollingTabContainerView extends HorizontalScrollView { } } public void animateToVisibility(int visibility) { if (mVisibilityAnim != null) { mVisibilityAnim.cancel(); } if (visibility == VISIBLE) { if (getVisibility() != VISIBLE) { setAlpha(0); } ObjectAnimator anim = ObjectAnimator.ofFloat(this, "alpha", 1); anim.setDuration(FADE_DURATION); anim.setInterpolator(sAlphaInterpolator); anim.addListener(mVisAnimListener.withFinalVisibility(visibility)); anim.start(); } else { ObjectAnimator anim = ObjectAnimator.ofFloat(this, "alpha", 0); anim.setDuration(FADE_DURATION); anim.setInterpolator(sAlphaInterpolator); anim.addListener(mVisAnimListener.withFinalVisibility(visibility)); anim.start(); } } public void animateToTab(int position) { final View tabView = mTabLayout.getChildAt(position); if (mTabSelector != null) { Loading Loading @@ -259,4 +294,38 @@ public class ScrollingTabContainerView extends HorizontalScrollView { } } } protected class VisibilityAnimListener implements Animator.AnimatorListener { private boolean mCanceled = false; private int mFinalVisibility; public VisibilityAnimListener withFinalVisibility(int visibility) { mFinalVisibility = visibility; return this; } @Override public void onAnimationStart(Animator animation) { setVisibility(VISIBLE); mVisibilityAnim = animation; mCanceled = false; } @Override public void onAnimationEnd(Animator animation) { if (mCanceled) return; mVisibilityAnim = null; setVisibility(mFinalVisibility); } @Override public void onAnimationCancel(Animator animation) { mCanceled = true; } @Override public void onAnimationRepeat(Animator animation) { } } }