Bug 1391579 Part 2: Add MenuItemIcon draft
authorJulian_Chu <walkingice0204@gmail.com>
Thu, 24 Aug 2017 01:15:22 -0700
changeset 664042 a87a7e919d089cf17c872344aab432820701369c
parent 661737 1371406f2e130e19cf4bba3e0b5460612e5377f6
child 664043 9ab93fa2081802e37faa1ae1af69c52d99b74fe5
push id79604
push useraswan@mozilla.com
push dateWed, 13 Sep 2017 17:14:38 +0000
bugs1391579
milestone57.0a1
Bug 1391579 Part 2: Add MenuItemIcon GeckoMenu always create view from MenuItemDefault. Now lets adding a new type for MenuItem which will display a Drawable in right side. MozReview-Commit-ID: F7zVDze0RaP
mobile/android/app/src/main/res/values/attrs.xml
mobile/android/base/java/org/mozilla/gecko/menu/GeckoMenu.java
mobile/android/base/java/org/mozilla/gecko/menu/GeckoMenuItem.java
mobile/android/base/java/org/mozilla/gecko/menu/MenuItemDefault.java
mobile/android/base/java/org/mozilla/gecko/menu/MenuItemIcon.java
mobile/android/base/moz.build
--- a/mobile/android/app/src/main/res/values/attrs.xml
+++ b/mobile/android/app/src/main/res/values/attrs.xml
@@ -52,16 +52,17 @@
         <attr name="android:icon"/>
         <attr name="android:checkable"/>
         <attr name="android:checked"/>
         <attr name="android:visible"/>
         <attr name="android:enabled"/>
         <attr name="android:showAsAction"/>
         <attr name="itemType" type="enum">
             <enum name="default_menu_item" value="0x00" />
+            <enum name="icon_menu_item" value="0x01" />
         </attr>
     </declare-styleable>
 
     <declare-styleable name="MenuItemDefault">
         <attr name="state_more" format="boolean"/>
     </declare-styleable>
 
     <declare-styleable name="TabThumbnailWrapper">
--- a/mobile/android/base/java/org/mozilla/gecko/menu/GeckoMenu.java
+++ b/mobile/android/base/java/org/mozilla/gecko/menu/GeckoMenu.java
@@ -772,16 +772,17 @@ public class GeckoMenu extends ListView
             }
         }
     }
 
     // Adapter to bind menu items to the list.
     private class MenuItemsAdapter extends BaseAdapter {
         private static final int VIEW_TYPE_DEFAULT = 0;
         private static final int VIEW_TYPE_ACTION_MODE = 1;
+        private static final int VIEW_TYPE_ICON = 1;
 
         private final List<GeckoMenuItem> mItems;
 
         public MenuItemsAdapter() {
             mItems = new ArrayList<GeckoMenuItem>();
         }
 
         @Override
@@ -818,18 +819,23 @@ public class GeckoMenu extends ListView
         }
 
         @Override
         public View getView(int position, View convertView, ViewGroup parent) {
             GeckoMenuItem item = getItem(position);
             GeckoMenuItem.Layout view = null;
 
             // Try to re-use the view.
-            if (convertView == null && getItemViewType(position) == VIEW_TYPE_DEFAULT) {
-                view = new MenuItemDefault(parent.getContext(), null);
+            if (convertView == null) {
+                final int type = getItemViewType(position);
+                if (type == VIEW_TYPE_ICON) {
+                    view = new MenuItemIcon(parent.getContext(), null);
+                } else if (type == VIEW_TYPE_DEFAULT) {
+                    view = new MenuItemDefault(parent.getContext(), null);
+                }
             } else {
                 view = (GeckoMenuItem.Layout) convertView;
             }
 
             if (view == null || view instanceof MenuItemSwitcherLayout) {
                 // Always get from the menu item.
                 // This will ensure that the default activity is refreshed.
                 view = (MenuItemSwitcherLayout) item.getActionView();
@@ -851,16 +857,20 @@ public class GeckoMenu extends ListView
             // Initialize the view.
             view.setShowIcon(mShowIcons);
             view.initialize(item);
             return (View) view;
         }
 
         @Override
         public int getItemViewType(int position) {
+            final GeckoMenuItem item = getItem(position);
+            if (item.getItemType() == GeckoMenuItem.ITEM_TYPE_ICON) {
+                return VIEW_TYPE_ICON;
+            }
             return getItem(position).getGeckoActionProvider() == null ? VIEW_TYPE_DEFAULT : VIEW_TYPE_ACTION_MODE;
         }
 
         @Override
         public int getViewTypeCount() {
             return 2;
         }
 
--- a/mobile/android/base/java/org/mozilla/gecko/menu/GeckoMenuItem.java
+++ b/mobile/android/base/java/org/mozilla/gecko/menu/GeckoMenuItem.java
@@ -23,16 +23,17 @@ public class GeckoMenuItem implements Me
     // These values mirror MenuItem values that are only available on API >= 11.
     public static final int SHOW_AS_ACTION_NEVER = 0;
     public static final int SHOW_AS_ACTION_IF_ROOM = 1;
     public static final int SHOW_AS_ACTION_ALWAYS = 2;
     public static final int SHOW_AS_ACTION_WITH_TEXT = 4;
     public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8;
 
     public static final int ITEM_TYPE_DEFAULT = 0x00;
+    public static final int ITEM_TYPE_ICON = 0x01;
 
     // A View that can show a MenuItem should be able to initialize from
     // the properties of the MenuItem.
     public static interface Layout {
         public void initialize(GeckoMenuItem item);
 
         public void setShowIcon(boolean show);
     }
--- a/mobile/android/base/java/org/mozilla/gecko/menu/MenuItemDefault.java
+++ b/mobile/android/base/java/org/mozilla/gecko/menu/MenuItemDefault.java
@@ -16,24 +16,25 @@ import android.util.AttributeSet;
 import android.widget.TextView;
 
 public class MenuItemDefault extends TextView
                              implements GeckoMenuItem.Layout {
     private static final int[] STATE_MORE = new int[] { R.attr.state_more };
     private static final int[] STATE_CHECKED = new int[] { android.R.attr.state_checkable, android.R.attr.state_checked };
     private static final int[] STATE_UNCHECKED = new int[] { android.R.attr.state_checkable };
 
-    private Drawable mIcon;
+    protected Drawable mIcon;
+    protected boolean mShowIcon;
+
     private final Drawable mState;
     private static Rect sIconBounds;
 
     private boolean mCheckable;
     private boolean mChecked;
     private boolean mHasSubMenu;
-    private boolean mShowIcon;
 
     public MenuItemDefault(Context context) {
         this(context, null);
     }
 
     public MenuItemDefault(Context context, AttributeSet attrs) {
         this(context, attrs, R.attr.menuItemDefaultStyle);
     }
@@ -83,17 +84,17 @@ public class MenuItemDefault extends Tex
         setTitle(item.getTitle());
         setIcon(item.getIcon());
         setEnabled(item.isEnabled());
         setCheckable(item.isCheckable());
         setChecked(item.isChecked());
         setSubMenuIndicator(item.hasSubMenu());
     }
 
-    private void refreshIcon() {
+    protected void refreshIcon() {
         TextViewCompat.setCompoundDrawablesRelative(this, mShowIcon ? mIcon : null, null, mState, null);
     }
 
     void setIcon(Drawable icon) {
         mIcon = icon;
 
         if (mIcon != null) {
             mIcon.setBounds(sIconBounds);
new file mode 100644
--- /dev/null
+++ b/mobile/android/base/java/org/mozilla/gecko/menu/MenuItemIcon.java
@@ -0,0 +1,32 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.gecko.menu;
+
+import android.content.Context;
+import android.support.v4.widget.TextViewCompat;
+import android.util.AttributeSet;
+
+import org.mozilla.gecko.R;
+
+public class MenuItemIcon extends MenuItemDefault {
+
+    public MenuItemIcon(Context context) {
+        this(context, null);
+    }
+
+    public MenuItemIcon(Context context, AttributeSet attrs) {
+        this(context, attrs, R.attr.menuItemDefaultStyle);
+    }
+
+    public MenuItemIcon(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+    }
+
+    @Override
+    protected void refreshIcon() {
+        // always show icon, if any
+        TextViewCompat.setCompoundDrawablesRelative(this, null, null, super.mIcon, null);
+    }
+}
--- a/mobile/android/base/moz.build
+++ b/mobile/android/base/moz.build
@@ -766,16 +766,17 @@ gbjar.sources += ['java/org/mozilla/geck
     'MediaCastingBar.java',
     'MemoryMonitor.java',
     'menu/GeckoMenu.java',
     'menu/GeckoMenuInflater.java',
     'menu/GeckoMenuItem.java',
     'menu/GeckoSubMenu.java',
     'menu/MenuItemActionBar.java',
     'menu/MenuItemDefault.java',
+    'menu/MenuItemIcon.java',
     'menu/MenuItemSwitcherLayout.java',
     'menu/MenuPanel.java',
     'menu/MenuPopup.java',
     'mma/MmaDelegate.java',
     'MotionEventInterceptor.java',
     'notifications/NotificationClient.java',
     'notifications/NotificationHelper.java',
     'notifications/NotificationReceiver.java',