diff options
5 files changed, 22 insertions, 17 deletions
diff --git a/core/java/android/app/Fragment.java b/core/java/android/app/Fragment.java index cb97c4671bfe..7006192c901f 100644 --- a/core/java/android/app/Fragment.java +++ b/core/java/android/app/Fragment.java @@ -880,7 +880,7 @@ public class Fragment implements ComponentCallbacks, OnCreateContextMenuListener public void setHasOptionsMenu(boolean hasMenu) { if (mHasMenu != hasMenu) { mHasMenu = hasMenu; - if (isAdded() && !isHidden()) { + if (isAdded() && !isHidden() && isResumed()) { mActivity.invalidateOptionsMenu(); } } diff --git a/core/java/android/app/FragmentManager.java b/core/java/android/app/FragmentManager.java index 789d3a692775..24550c5f9dbc 100644 --- a/core/java/android/app/FragmentManager.java +++ b/core/java/android/app/FragmentManager.java @@ -978,7 +978,7 @@ final class FragmentManagerImpl extends FragmentManager { } } - if (mNeedMenuInvalidate && mActivity != null) { + if (mNeedMenuInvalidate && mActivity != null && mCurState == Fragment.RESUMED) { mActivity.invalidateOptionsMenu(); mNeedMenuInvalidate = false; } diff --git a/core/java/com/android/internal/view/menu/ActionMenuView.java b/core/java/com/android/internal/view/menu/ActionMenuView.java index bf2965b0b469..bff621c0def6 100644 --- a/core/java/com/android/internal/view/menu/ActionMenuView.java +++ b/core/java/com/android/internal/view/menu/ActionMenuView.java @@ -36,8 +36,8 @@ public class ActionMenuView extends LinearLayout implements MenuBuilder.ItemInvo private boolean mReserveOverflow; private ActionMenuPresenter mPresenter; - private boolean mUpdateContentsBeforeMeasure; private boolean mFormatItems; + private int mFormatItemsWidth; private int mMinCellSize; private int mMeasuredExtraWidth; @@ -71,19 +71,21 @@ public class ActionMenuView extends LinearLayout implements MenuBuilder.ItemInvo } @Override - public void requestLayout() { - // Layout can influence how many action items fit. - mUpdateContentsBeforeMeasure = true; - super.requestLayout(); - } - - @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // If we've been given an exact size to match, apply special formatting during layout. + final boolean wasFormatted = mFormatItems; mFormatItems = MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.EXACTLY; - if (mUpdateContentsBeforeMeasure && mMenu != null) { + + if (wasFormatted != mFormatItems) { + mFormatItemsWidth = 0; // Reset this when switching modes + } + + // Special formatting can change whether items can fit as action buttons. + // Kick the menu and update presenters when this changes. + final int widthSize = MeasureSpec.getMode(widthMeasureSpec); + if (mFormatItems && mMenu != null && widthSize != mFormatItemsWidth) { + mFormatItemsWidth = widthSize; mMenu.onItemsChanged(true); - mUpdateContentsBeforeMeasure = false; } if (mFormatItems) { diff --git a/core/java/com/android/internal/view/menu/MenuBuilder.java b/core/java/com/android/internal/view/menu/MenuBuilder.java index 159b3da440bd..19cbe25af54d 100644 --- a/core/java/com/android/internal/view/menu/MenuBuilder.java +++ b/core/java/com/android/internal/view/menu/MenuBuilder.java @@ -27,6 +27,7 @@ import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Parcelable; +import android.util.Log; import android.util.SparseArray; import android.view.ActionProvider; import android.view.ContextMenu.ContextMenuInfo; @@ -47,7 +48,7 @@ import java.util.concurrent.CopyOnWriteArrayList; * standard menu UI. */ public class MenuBuilder implements Menu { - private static final String LOGTAG = "MenuBuilder"; + private static final String TAG = "MenuBuilder"; private static final String PRESENTER_KEY = "android:menu:presenters"; private static final String ACTION_VIEW_STATES_KEY = "android:menu:actionviewstates"; diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindow.java b/policy/src/com/android/internal/policy/impl/PhoneWindow.java index bfc3cddb334f..a4e94ef59c6e 100644 --- a/policy/src/com/android/internal/policy/impl/PhoneWindow.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindow.java @@ -374,13 +374,13 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { st.menu.startDispatchingItemsChanged(); return false; } - st.menu.startDispatchingItemsChanged(); // Set the proper keymap KeyCharacterMap kmap = KeyCharacterMap.load( event != null ? event.getDeviceId() : KeyCharacterMap.VIRTUAL_KEYBOARD); st.qwertyMode = kmap.getKeyboardType() != KeyCharacterMap.NUMERIC; st.menu.setQwertyMode(st.qwertyMode); + st.menu.startDispatchingItemsChanged(); } // Set other state @@ -454,8 +454,6 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { if (featureId == FEATURE_OPTIONS_PANEL && mActionBar != null && mActionBar.isOverflowReserved()) { if (mActionBar.getVisibility() == View.VISIBLE) { - // Invalidate the options menu, we want a prepare event that the app can respond to. - invalidatePanelMenu(FEATURE_OPTIONS_PANEL); mActionBar.showOverflowMenu(); } } else { @@ -664,6 +662,8 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { if (savedActionViewStates.size() > 0) { st.frozenActionViewState = savedActionViewStates; } + // This will be started again when the panel is prepared. + st.menu.stopDispatchingItemsChanged(); st.menu.clear(); } st.refreshMenuContent = true; @@ -2657,7 +2657,9 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { // being called in the middle of onCreate or similar. mDecor.post(new Runnable() { public void run() { - if (!isDestroyed()) { + // Invalidate if the panel menu hasn't been created before this. + PanelFeatureState st = getPanelState(FEATURE_OPTIONS_PANEL, false); + if (!isDestroyed() && (st == null || st.menu == null)) { invalidatePanelMenu(FEATURE_ACTION_BAR); } } |