Bug 1414084 - Part 7 - Use one set of functions for managing MenuItems in the UI. r?grisha
The original add-on functions have some additional capabilities regarding e.g.
checkboxes, disabling the menu, etc. that right now aren't required for
Webextensions (yet?), but in that case they will simply not be used - in any
case BrowserActions.jsm controls what functionality is actually exposed to
add-ons.
MozReview-Commit-ID: DPT8gV2gb6q
--- a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
+++ b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
@@ -1851,21 +1851,16 @@ public class BrowserApp extends GeckoApp
case "Menu:Open":
if (mBrowserToolbar.isEditing()) {
mBrowserToolbar.cancelEdit();
}
openOptionsMenu();
break;
- case "Menu:Update":
- updateAddonMenuItem(message.getString("uuid"),
- message.getBundle("options"));
- break;
-
case "Menu:Add":
final MenuItemInfo info = new MenuItemInfo();
info.label = message.getString("name");
if (info.label == null) {
Log.e(LOGTAG, "Invalid menu item name");
return;
}
info.id = mAddonMenuNextID++;
@@ -1887,35 +1882,40 @@ public class BrowserApp extends GeckoApp
}
addAddonMenuItem(info);
break;
case "Menu:Remove":
removeAddonMenuItem(message.getString("uuid"));
break;
+ case "Menu:Update":
+ updateAddonMenuItem(message.getString("uuid"),
+ message.getBundle("options"));
+ break;
+
case "Menu:AddBrowserAction":
final MenuItemInfo browserAction = new MenuItemInfo();
browserAction.label = message.getString("name");
if (TextUtils.isEmpty(browserAction.label)) {
Log.e(LOGTAG, "Invalid browser action name");
return;
}
browserAction.id = mAddonMenuNextID++;
browserAction.uuid = message.getString("uuid");
- addBrowserActionMenuItem(browserAction);
+ addAddonMenuItem(browserAction);
break;
case "Menu:RemoveBrowserAction":
- removeBrowserActionMenuItem(message.getString("uuid"));
+ removeAddonMenuItem(message.getString("uuid"));
break;
case "Menu:UpdateBrowserAction":
- updateBrowserActionMenuItem(message.getString("uuid"),
- message.getBundle("options"));
+ updateAddonMenuItem(message.getString("uuid"),
+ message.getBundle("options"));
break;
case "LightweightTheme:Update":
mDynamicToolbar.setVisible(true, VisibilityTransition.ANIMATE);
break;
case "Search:Keyword":
storeSearchQuery(message.getString("query"));
@@ -3257,31 +3257,37 @@ public class BrowserApp extends GeckoApp
});
item.setCheckable(info.checkable);
item.setChecked(info.checked);
item.setEnabled(info.enabled);
item.setVisible(info.visible);
}
+ /**
+ * Adds an addon menu item/webextension browser action to the menu.
+ */
private void addAddonMenuItem(final MenuItemInfo info) {
if (mAddonMenuItemsCache == null) {
- mAddonMenuItemsCache = new ArrayList<MenuItemInfo>();
+ mAddonMenuItemsCache = new ArrayList<>();
}
// Always cache so we can rebuild after a locale switch.
mAddonMenuItemsCache.add(info);
if (mMenu == null) {
return;
}
addAddonMenuItemToMenu(mMenu, info);
}
+ /**
+ * Removes an addon menu item/webextension browser action from the menu by its UUID.
+ */
private void removeAddonMenuItem(String uuid) {
int id = -1;
// Remove add-on menu item from cache, if available.
if (mAddonMenuItemsCache != null && !mAddonMenuItemsCache.isEmpty()) {
for (MenuItemInfo item : mAddonMenuItemsCache) {
if (item.uuid.equals(uuid)) {
id = item.id;
@@ -3296,16 +3302,19 @@ public class BrowserApp extends GeckoApp
}
final MenuItem menuItem = mMenu.findItem(id);
if (menuItem != null) {
mMenu.removeItem(id);
}
}
+ /**
+ * Updates the addon menu/webextension browser action with the specified UUID.
+ */
private void updateAddonMenuItem(String uuid, final GeckoBundle options) {
int id = -1;
// Set attribute for the menu item in cache, if available
if (mAddonMenuItemsCache != null && !mAddonMenuItemsCache.isEmpty()) {
for (MenuItemInfo item : mAddonMenuItemsCache) {
if (item.uuid.equals(uuid)) {
id = item.id;
@@ -3328,111 +3337,16 @@ public class BrowserApp extends GeckoApp
menuItem.setTitle(options.getString("name", menuItem.getTitle().toString()));
menuItem.setCheckable(options.getBoolean("checkable", menuItem.isCheckable()));
menuItem.setChecked(options.getBoolean("checked", menuItem.isChecked()));
menuItem.setEnabled(options.getBoolean("enabled", menuItem.isEnabled()));
menuItem.setVisible(options.getBoolean("visible", menuItem.isVisible()));
}
}
- /**
- * Add the provided item to the provided menu, which should be
- * the root (mMenu).
- */
- private void addBrowserActionMenuItemToMenu(final Menu menu, final MenuItemInfo info) {
- final MenuItem item = menu.add(Menu.NONE, info.id, Menu.NONE, info.label);
-
- item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
- @Override
- public boolean onMenuItemClick(MenuItem item) {
- final GeckoBundle data = new GeckoBundle(1);
- data.putString("item", info.uuid);
- EventDispatcher.getInstance().dispatch("Menu:Clicked", data);
- return true;
- }
- });
-
- item.setCheckable(info.checkable);
- item.setChecked(info.checked);
- item.setEnabled(info.enabled);
- item.setVisible(info.visible);
- }
-
- /**
- * Adds a WebExtension browser action to the menu.
- */
- private void addBrowserActionMenuItem(final MenuItemInfo info) {
- if (mAddonMenuItemsCache == null) {
- mAddonMenuItemsCache = new ArrayList<>();
- }
-
- // Always cache so we can rebuild after a locale switch.
- mAddonMenuItemsCache.add(info);
-
- if (mMenu == null) {
- return;
- }
-
- addBrowserActionMenuItemToMenu(mMenu, info);
- }
-
- /**
- * Removes a WebExtension browser action from the menu by its UUID.
- */
- private void removeBrowserActionMenuItem(String uuid) {
- int id = -1;
-
- // Remove browser action menu item from cache, if available.
- if (mAddonMenuItemsCache != null && !mAddonMenuItemsCache.isEmpty()) {
- for (MenuItemInfo item : mAddonMenuItemsCache) {
- if (item.uuid.equals(uuid)) {
- id = item.id;
- mAddonMenuItemsCache.remove(item);
- break;
- }
- }
- }
-
- if (mMenu == null || id == -1) {
- return;
- }
-
- final MenuItem menuItem = mMenu.findItem(id);
- if (menuItem != null) {
- mMenu.removeItem(id);
- }
- }
-
- /**
- * Updates the WebExtension browser action with the specified UUID.
- */
- private void updateBrowserActionMenuItem(String uuid, final GeckoBundle options) {
- int id = -1;
-
- // Set attribute for the menu item in cache, if available
- if (mAddonMenuItemsCache != null && !mAddonMenuItemsCache.isEmpty()) {
- for (MenuItemInfo item : mAddonMenuItemsCache) {
- if (item.uuid.equals(uuid)) {
- id = item.id;
- item.label = options.getString("name", item.label);
- break;
- }
- }
- }
-
- if (mMenu == null || id == -1) {
- return;
- }
-
- final MenuItem menuItem = mMenu.findItem(id);
- if (menuItem != null) {
- menuItem.setTitle(options.getString("name", menuItem.getTitle().toString()));
- }
- }
-
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Sets mMenu = menu.
super.onCreateOptionsMenu(menu);
// Inform the menu about the action-items bar.
if (menu instanceof GeckoMenu &&
HardwareUtils.isTablet()) {