diff --git a/mobile/android/base/menu/GeckoMenu.java b/mobile/android/base/menu/GeckoMenu.java index 8dda42ce8284..348d79946f6e 100644 --- a/mobile/android/base/menu/GeckoMenu.java +++ b/mobile/android/base/menu/GeckoMenu.java @@ -15,6 +15,7 @@ import android.content.Context; import android.content.Intent; import android.util.AttributeSet; import android.util.Log; +import android.util.SparseArray; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.Menu; @@ -90,6 +91,9 @@ public class GeckoMenu extends ListView // List of all menu items. private final List mItems; + // Quick lookup array used to make a fast path in findItem. + private final SparseArray mItemsById; + // Map of "always" action-items in action-bar and their views. private final Map mPrimaryActionItems; @@ -134,6 +138,7 @@ public class GeckoMenu extends ListView setOnItemClickListener(this); mItems = new ArrayList(); + mItemsById = new SparseArray(); mPrimaryActionItems = new HashMap(); mSecondaryActionItems = new HashMap(); @@ -362,15 +367,24 @@ public class GeckoMenu extends ListView @Override public MenuItem findItem(int id) { + assertOnUiThread(); + MenuItem quickItem = mItemsById.get(id); + if (quickItem != null) { + return quickItem; + } + for (GeckoMenuItem menuItem : mItems) { if (menuItem.getItemId() == id) { + mItemsById.put(id, menuItem); return menuItem; } else if (menuItem.hasSubMenu()) { if (!menuItem.hasActionProvider()) { SubMenu subMenu = menuItem.getSubMenu(); MenuItem item = subMenu.findItem(id); - if (item != null) + if (item != null) { + mItemsById.put(id, item); return item; + } } } } @@ -424,6 +438,9 @@ public class GeckoMenu extends ListView if (item == null) return; + // Remove it from the cache. + mItemsById.remove(id); + // Remove it from any sub-menu. for (GeckoMenuItem menuItem : mItems) { if (menuItem.hasSubMenu()) { @@ -811,6 +828,7 @@ public class GeckoMenu extends ListView } public void clear() { + mItemsById.clear(); mItems.clear(); notifyDataSetChanged(); }