From da9710806bc7874b8c553f4daf9cf14f35ae1b07 Mon Sep 17 00:00:00 2001 From: Adam Powell Date: Thu, 3 Oct 2013 18:21:58 -0700 Subject: [PATCH] Fix a bug in action menu measurement Thanks to a measurement optimization in KK, the view recycling behavior of ActionMenuPresenter could get into a state where the resulting ActionMenuView had changed but no layout was requested. Explicitly request a layout during menu update. Also fix an ancient typo. Bug 11047996 Change-Id: I6289fd2d142ac7d2101fbec6de19b7d3d7fbd6a2 --- .../com/android/internal/view/menu/ActionMenuPresenter.java | 2 ++ core/java/com/android/internal/view/menu/ActionMenuView.java | 5 ++--- core/java/com/android/internal/view/menu/MenuBuilder.java | 5 ++++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/core/java/com/android/internal/view/menu/ActionMenuPresenter.java b/core/java/com/android/internal/view/menu/ActionMenuPresenter.java index 6471e145722f4..23ed019d39547 100644 --- a/core/java/com/android/internal/view/menu/ActionMenuPresenter.java +++ b/core/java/com/android/internal/view/menu/ActionMenuPresenter.java @@ -216,6 +216,8 @@ public class ActionMenuPresenter extends BaseMenuPresenter } super.updateMenuView(cleared); + ((View) mMenuView).requestLayout(); + if (mMenu != null) { final ArrayList actionItems = mMenu.getActionItems(); final int count = actionItems.size(); diff --git a/core/java/com/android/internal/view/menu/ActionMenuView.java b/core/java/com/android/internal/view/menu/ActionMenuView.java index 34ade74c9d29b..16a2031a5643b 100644 --- a/core/java/com/android/internal/view/menu/ActionMenuView.java +++ b/core/java/com/android/internal/view/menu/ActionMenuView.java @@ -15,8 +15,6 @@ */ package com.android.internal.view.menu; -import com.android.internal.R; - import android.content.Context; import android.content.res.Configuration; import android.content.res.TypedArray; @@ -27,6 +25,7 @@ import android.view.ViewDebug; import android.view.ViewGroup; import android.view.accessibility.AccessibilityEvent; import android.widget.LinearLayout; +import com.android.internal.R; /** * @hide @@ -101,7 +100,7 @@ public class ActionMenuView extends LinearLayout implements MenuBuilder.ItemInvo // 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); + final int widthSize = MeasureSpec.getSize(widthMeasureSpec); if (mFormatItems && mMenu != null && widthSize != mFormatItemsWidth) { mFormatItemsWidth = widthSize; mMenu.onItemsChanged(true); diff --git a/core/java/com/android/internal/view/menu/MenuBuilder.java b/core/java/com/android/internal/view/menu/MenuBuilder.java index 458ea2f8d785f..aff697ad580c6 100644 --- a/core/java/com/android/internal/view/menu/MenuBuilder.java +++ b/core/java/com/android/internal/view/menu/MenuBuilder.java @@ -1034,6 +1034,10 @@ public class MenuBuilder implements Menu { * to avoid inadvertent reordering that may break the app's intended design. */ public void flagActionItems() { + // Important side effect: if getVisibleItems is stale it may refresh, + // which can affect action items staleness. + final ArrayList visibleItems = getVisibleItems(); + if (!mIsActionItemsStale) { return; } @@ -1052,7 +1056,6 @@ public class MenuBuilder implements Menu { if (flagged) { mActionItems.clear(); mNonActionItems.clear(); - ArrayList visibleItems = getVisibleItems(); final int itemsSize = visibleItems.size(); for (int i = 0; i < itemsSize; i++) { MenuItemImpl item = visibleItems.get(i);