From 9a5cc2810bbbcb0eab4579aa4131039820d92101 Mon Sep 17 00:00:00 2001 From: Adam Powell Date: Sun, 28 Aug 2011 16:18:16 -0700 Subject: [PATCH] Fix bug 5124021 - Menu visibility incorrect when restoring ListView selection mode Fix visibility of menus when action modes are initiailized early. Fix ListView problems persisting check states. Change-Id: Idc21036dc39259e72f0e6831a0ccb4695f8858ef --- core/java/android/widget/AbsListView.java | 13 +++++++++++-- .../android/internal/widget/AbsActionBarView.java | 15 ++++++++++++++- .../internal/widget/ActionBarContextView.java | 7 ++++--- .../android/internal/widget/ActionBarView.java | 13 +++++++------ 4 files changed, 36 insertions(+), 12 deletions(-) diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index 86f061aedfe65..80cbbfb404236 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -1574,8 +1574,17 @@ public abstract class AbsListView extends AdapterView implements Te ss.inActionMode = mChoiceMode == CHOICE_MODE_MULTIPLE_MODAL && mChoiceActionMode != null; - ss.checkState = mCheckStates; - ss.checkIdState = mCheckedIdStates; + if (mCheckStates != null) { + ss.checkState = mCheckStates.clone(); + } + if (mCheckedIdStates != null) { + final LongSparseArray idState = new LongSparseArray(); + final int count = mCheckedIdStates.size(); + for (int i = 0; i < count; i++) { + idState.put(mCheckedIdStates.keyAt(i), mCheckedIdStates.valueAt(i)); + } + ss.checkIdState = idState; + } ss.checkedItemCount = mCheckedItemCount; return ss; diff --git a/core/java/com/android/internal/widget/AbsActionBarView.java b/core/java/com/android/internal/widget/AbsActionBarView.java index ccbce3e9587cc..df2f717e926a5 100644 --- a/core/java/com/android/internal/widget/AbsActionBarView.java +++ b/core/java/com/android/internal/widget/AbsActionBarView.java @@ -56,6 +56,16 @@ public abstract class AbsActionBarView extends ViewGroup { mSplitView = splitView; } + /** + * @return Current visibility or if animating, the visibility being animated to. + */ + public int getAnimatedVisibility() { + if (mVisibilityAnim != null) { + return mVisAnimListener.mFinalVisibility; + } + return getVisibility(); + } + public void animateToVisibility(int visibility) { if (mVisibilityAnim != null) { mVisibilityAnim.cancel(); @@ -179,7 +189,7 @@ public abstract class AbsActionBarView extends ViewGroup { protected class VisibilityAnimListener implements Animator.AnimatorListener { private boolean mCanceled = false; - private int mFinalVisibility; + int mFinalVisibility; public VisibilityAnimListener withFinalVisibility(int visibility) { mFinalVisibility = visibility; @@ -199,6 +209,9 @@ public abstract class AbsActionBarView extends ViewGroup { mVisibilityAnim = null; setVisibility(mFinalVisibility); + if (mSplitView != null && mMenuView != null) { + mMenuView.setVisibility(mFinalVisibility); + } } @Override diff --git a/core/java/com/android/internal/widget/ActionBarContextView.java b/core/java/com/android/internal/widget/ActionBarContextView.java index 45d38ae7333ee..4fccc32d19796 100644 --- a/core/java/com/android/internal/widget/ActionBarContextView.java +++ b/core/java/com/android/internal/widget/ActionBarContextView.java @@ -33,6 +33,7 @@ import android.util.AttributeSet; import android.view.ActionMode; import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; import android.view.animation.DecelerateInterpolator; import android.widget.LinearLayout; import android.widget.TextView; @@ -270,14 +271,14 @@ public class ActionBarContextView extends AbsActionBarView implements AnimatorLi } @Override - protected LayoutParams generateDefaultLayoutParams() { + protected ViewGroup.LayoutParams generateDefaultLayoutParams() { // Used by custom views if they don't supply layout params. Everything else // added to an ActionBarContextView should have them already. return new MarginLayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); } @Override - public LayoutParams generateLayoutParams(AttributeSet attrs) { + public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) { return new MarginLayoutParams(getContext(), attrs); } @@ -321,7 +322,7 @@ public class ActionBarContextView extends AbsActionBarView implements AnimatorLi } if (mCustomView != null) { - LayoutParams lp = mCustomView.getLayoutParams(); + ViewGroup.LayoutParams lp = mCustomView.getLayoutParams(); final int customWidthMode = lp.width != LayoutParams.WRAP_CONTENT ? MeasureSpec.EXACTLY : MeasureSpec.AT_MOST; final int customWidth = lp.width >= 0 ? diff --git a/core/java/com/android/internal/widget/ActionBarView.java b/core/java/com/android/internal/widget/ActionBarView.java index a0f6259669d51..ff26d5030ffd6 100644 --- a/core/java/com/android/internal/widget/ActionBarView.java +++ b/core/java/com/android/internal/widget/ActionBarView.java @@ -401,6 +401,7 @@ public class ActionBarView extends AbsActionBarView { if (oldParent != null && oldParent != mSplitView) { oldParent.removeView(menuView); } + menuView.setVisibility(getAnimatedVisibility()); mSplitView.addView(menuView, layoutParams); } else { // We'll add this later if we missed it this time. @@ -683,7 +684,7 @@ public class ActionBarView extends AbsActionBarView { } @Override - protected LayoutParams generateDefaultLayoutParams() { + protected ViewGroup.LayoutParams generateDefaultLayoutParams() { // Used by custom nav views if they don't supply layout params. Everything else // added to an ActionBarView should have them already. return new ActionBar.LayoutParams(DEFAULT_CUSTOM_GRAVITY); @@ -810,7 +811,7 @@ public class ActionBarView extends AbsActionBarView { HomeView homeLayout = mExpandedActionView != null ? mExpandedHomeLayout : mHomeLayout; if (homeLayout.getVisibility() != GONE) { - final LayoutParams lp = homeLayout.getLayoutParams(); + final ViewGroup.LayoutParams lp = homeLayout.getLayoutParams(); int homeWidthSpec; if (lp.width < 0) { homeWidthSpec = MeasureSpec.makeMeasureSpec(availableWidth, MeasureSpec.AT_MOST); @@ -881,7 +882,7 @@ public class ActionBarView extends AbsActionBarView { } if (customView != null) { - final LayoutParams lp = generateLayoutParams(customView.getLayoutParams()); + final ViewGroup.LayoutParams lp = generateLayoutParams(customView.getLayoutParams()); final ActionBar.LayoutParams ablp = lp instanceof ActionBar.LayoutParams ? (ActionBar.LayoutParams) lp : null; @@ -1017,7 +1018,7 @@ public class ActionBarView extends AbsActionBarView { customView = mCustomNavView; } if (customView != null) { - LayoutParams lp = customView.getLayoutParams(); + ViewGroup.LayoutParams lp = customView.getLayoutParams(); final ActionBar.LayoutParams ablp = lp instanceof ActionBar.LayoutParams ? (ActionBar.LayoutParams) lp : null; @@ -1095,12 +1096,12 @@ public class ActionBarView extends AbsActionBarView { } @Override - public LayoutParams generateLayoutParams(AttributeSet attrs) { + public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) { return new ActionBar.LayoutParams(getContext(), attrs); } @Override - public LayoutParams generateLayoutParams(LayoutParams lp) { + public ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams lp) { if (lp == null) { lp = generateDefaultLayoutParams(); }