Backed out 7 changesets (bug 1209967) for making Android Talos hang
authorPhil Ringnalda <philringnalda@gmail.com>
Wed, 02 Dec 2015 20:45:26 -0800
changeset 309386 65b735be598fc3ababd09df2f3c167a125a2196e
parent 309385 10a9cf7c54fadd9073807e863725ee1b32449ba6
child 309387 31fc97d173b3e3da5de35d54018855e6c905787e
child 309616 cd2a99c12ed311a71bfb6b444acd69379036a8e2
push id5513
push userraliiev@mozilla.com
push dateMon, 25 Jan 2016 13:55:34 +0000
treeherdermozilla-beta@5ee97dd05b5c [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
bugs1209967
milestone45.0a1
backs oute78763a5c2c3f790c164f5d0eec69d680e97d8ad
cdd9b2d4b72aa2a1ad39fe0f0f279c7687fe2542
ced2c85d9f09a4ee7972442547273b7e32a5d5ae
d458396e6f0695f0bf240f16864195fb5edf5b29
5cea26659e0df7c4b6b1bd77dc7361877f8501d1
035f6f5db4fe43f118c5d022cd87e93facd63849
7942bfbde7f2ecefd4b6aecb675e76f3e1bf8022
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Backed out 7 changesets (bug 1209967) for making Android Talos hang CLOSED TREE Backed out changeset e78763a5c2c3 (bug 1209967) Backed out changeset cdd9b2d4b72a (bug 1209967) Backed out changeset ced2c85d9f09 (bug 1209967) Backed out changeset d458396e6f06 (bug 1209967) Backed out changeset 5cea26659e0d (bug 1209967) Backed out changeset 035f6f5db4fe (bug 1209967) Backed out changeset 7942bfbde7f2 (bug 1209967)
mobile/android/base/BrowserApp.java
mobile/android/base/GeckoApp.java
mobile/android/base/resources/drawable-hdpi-v11/ic_menu_back.png
mobile/android/base/resources/drawable-hdpi/ic_menu_back.png
mobile/android/base/resources/drawable-hdpi/ic_menu_bookmark_add.png
mobile/android/base/resources/drawable-hdpi/ic_menu_bookmark_remove.png
mobile/android/base/resources/drawable-hdpi/ic_menu_forward.png
mobile/android/base/resources/drawable-hdpi/ic_menu_new_private_tab.png
mobile/android/base/resources/drawable-hdpi/ic_menu_new_tab.png
mobile/android/base/resources/drawable-hdpi/ic_menu_reload.png
mobile/android/base/resources/drawable-xhdpi-v11/ic_menu_back.png
mobile/android/base/resources/drawable-xhdpi/ic_menu_back.png
mobile/android/base/resources/drawable-xhdpi/ic_menu_bookmark_add.png
mobile/android/base/resources/drawable-xhdpi/ic_menu_bookmark_remove.png
mobile/android/base/resources/drawable-xhdpi/ic_menu_forward.png
mobile/android/base/resources/drawable-xhdpi/ic_menu_new_private_tab.png
mobile/android/base/resources/drawable-xhdpi/ic_menu_new_tab.png
mobile/android/base/resources/drawable-xhdpi/ic_menu_reload.png
mobile/android/base/resources/drawable/ic_menu_bookmark_add.xml
mobile/android/base/resources/drawable/ic_menu_bookmark_remove.xml
mobile/android/base/resources/drawable/ic_menu_reader_add.xml
mobile/android/base/resources/drawable/ic_menu_reader_remove.xml
mobile/android/base/resources/layout-large-v11/browser_toolbar.xml
mobile/android/base/resources/layout/browser_toolbar.xml
mobile/android/base/resources/layout/tabs_panel_default.xml
mobile/android/base/resources/menu/browser_app_menu.xml
mobile/android/base/tabs/TabsPanel.java
mobile/android/base/toolbar/BrowserToolbar.java
mobile/android/base/toolbar/BrowserToolbarPhone.java
mobile/android/base/toolbar/BrowserToolbarPhoneBase.java
mobile/android/base/toolbar/BrowserToolbarPreHC.java
mobile/android/base/toolbar/BrowserToolbarTabletBase.java
mobile/android/base/util/HardwareUtils.java
mobile/android/services/src/main/java/org/mozilla/gecko/fxa/activities/FxAccountStatusFragment.java
mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/components/AppMenuComponent.java
--- a/mobile/android/base/BrowserApp.java
+++ b/mobile/android/base/BrowserApp.java
@@ -3022,31 +3022,27 @@ public class BrowserApp extends GeckoApp
 
         final boolean inGuestMode = GeckoProfile.get(this).inGuestMode();
 
         final boolean isAboutReader = AboutPages.isAboutReader(tab.getURL());
         bookmark.setEnabled(!isAboutReader);
         bookmark.setVisible(!inGuestMode);
         bookmark.setCheckable(true);
         bookmark.setChecked(tab.isBookmark());
+        bookmark.setIcon(resolveBookmarkIconID(tab.isBookmark()));
         bookmark.setTitle(resolveBookmarkTitleID(tab.isBookmark()));
 
         reader.setEnabled(isAboutReader || !AboutPages.isAboutPage(tab.getURL()));
         reader.setVisible(!inGuestMode);
         reader.setCheckable(true);
         final boolean isPageInReadingList = tab.isInReadingList();
         reader.setChecked(isPageInReadingList);
+        reader.setIcon(resolveReadingListIconID(isPageInReadingList));
         reader.setTitle(resolveReadingListTitleID(isPageInReadingList));
 
-        if (Versions.feature11Plus) {
-            // We don't use icons on GB builds so not resolving icons might conserve resources.
-            bookmark.setIcon(resolveBookmarkIconID(tab.isBookmark()));
-            reader.setIcon(resolveReadingListIconID(isPageInReadingList));
-        }
-
         back.setEnabled(tab.canDoBack());
         forward.setEnabled(tab.canDoForward());
         desktopMode.setChecked(tab.getDesktopMode());
 
         View backButtonView = MenuItemCompat.getActionView(back);
 
         if (backButtonView != null) {
             backButtonView.setOnLongClickListener(new Button.OnLongClickListener() {
@@ -3228,53 +3224,41 @@ public class BrowserApp extends GeckoApp
         mBrowserToolbar.cancelEdit();
 
         if (itemId == R.id.bookmark) {
             tab = Tabs.getInstance().getSelectedTab();
             if (tab != null) {
                 if (item.isChecked()) {
                     Telemetry.sendUIEvent(TelemetryContract.Event.UNSAVE, TelemetryContract.Method.MENU, "bookmark");
                     tab.removeBookmark();
+                    item.setIcon(resolveBookmarkIconID(false));
                     item.setTitle(resolveBookmarkTitleID(false));
-                    if (Versions.feature11Plus) {
-                        // We don't use icons on GB builds so not resolving icons might conserve resources.
-                        item.setIcon(resolveBookmarkIconID(false));
-                    }
                 } else {
                     Telemetry.sendUIEvent(TelemetryContract.Event.SAVE, TelemetryContract.Method.MENU, "bookmark");
                     tab.addBookmark();
+                    item.setIcon(resolveBookmarkIconID(true));
                     item.setTitle(resolveBookmarkTitleID(true));
-                    if (Versions.feature11Plus) {
-                        // We don't use icons on GB builds so not resolving icons might conserve resources.
-                        item.setIcon(resolveBookmarkIconID(true));
-                    }
                 }
             }
             return true;
         }
 
         if (itemId == R.id.reading_list) {
             tab = Tabs.getInstance().getSelectedTab();
             if (tab != null) {
                 if (item.isChecked()) {
                     Telemetry.sendUIEvent(TelemetryContract.Event.UNSAVE, TelemetryContract.Method.MENU, "reading_list");
                     tab.removeFromReadingList();
+                    item.setIcon(resolveReadingListIconID(false));
                     item.setTitle(resolveReadingListTitleID(false));
-                    if (Versions.feature11Plus) {
-                        // We don't use icons on GB builds so not resolving icons might conserve resources.
-                        item.setIcon(resolveReadingListIconID(false));
-                    }
                 } else {
                     Telemetry.sendUIEvent(TelemetryContract.Event.SAVE, TelemetryContract.Method.MENU, "reading_list");
                     tab.addToReadingList();
+                    item.setIcon(resolveReadingListIconID(true));
                     item.setTitle(resolveReadingListTitleID(true));
-                    if (Versions.feature11Plus) {
-                        // We don't use icons on GB builds so not resolving icons might conserve resources.
-                        item.setIcon(resolveReadingListIconID(true));
-                    }
                 }
             }
             return true;
         }
 
         if (itemId == R.id.share) {
             tab = Tabs.getInstance().getSelectedTab();
             if (tab != null) {
--- a/mobile/android/base/GeckoApp.java
+++ b/mobile/android/base/GeckoApp.java
@@ -343,17 +343,21 @@ public abstract class GeckoApp
 
         MenuInflater inflater = getMenuInflater();
         inflater.inflate(R.menu.gecko_app_menu, mMenu);
         return true;
     }
 
     @Override
     public MenuInflater getMenuInflater() {
-        return new GeckoMenuInflater(this);
+        if (Versions.feature11Plus) {
+            return new GeckoMenuInflater(this);
+        } else {
+            return super.getMenuInflater();
+        }
     }
 
     public MenuPanel getMenuPanel() {
         if (mMenuPanel == null) {
             onCreatePanelMenu(Window.FEATURE_OPTIONS_PANEL, null);
             invalidateOptionsMenu();
         }
         return mMenuPanel;
@@ -394,33 +398,33 @@ public abstract class GeckoApp
 
     @Override
     public void closeMenu() {
         closeOptionsMenu();
     }
 
     @Override
     public View onCreatePanelView(int featureId) {
-        if (featureId == Window.FEATURE_OPTIONS_PANEL) {
+        if (Versions.feature11Plus && featureId == Window.FEATURE_OPTIONS_PANEL) {
             if (mMenuPanel == null) {
                 mMenuPanel = new MenuPanel(this, null);
             } else {
                 // Prepare the panel every time before showing the menu.
                 onPreparePanel(featureId, mMenuPanel, mMenu);
             }
 
             return mMenuPanel;
         }
 
         return super.onCreatePanelView(featureId);
     }
 
     @Override
     public boolean onCreatePanelMenu(int featureId, Menu menu) {
-        if (featureId == Window.FEATURE_OPTIONS_PANEL) {
+        if (Versions.feature11Plus && featureId == Window.FEATURE_OPTIONS_PANEL) {
             if (mMenuPanel == null) {
                 mMenuPanel = (MenuPanel) onCreatePanelView(featureId);
             }
 
             GeckoMenu gMenu = new GeckoMenu(this, null);
             gMenu.setCallback(this);
             gMenu.setMenuPresenter(this);
             menu = gMenu;
@@ -429,31 +433,31 @@ public abstract class GeckoApp
             return onCreateOptionsMenu(menu);
         }
 
         return super.onCreatePanelMenu(featureId, menu);
     }
 
     @Override
     public boolean onPreparePanel(int featureId, View view, Menu menu) {
-        if (featureId == Window.FEATURE_OPTIONS_PANEL) {
+        if (Versions.feature11Plus && featureId == Window.FEATURE_OPTIONS_PANEL) {
             return onPrepareOptionsMenu(menu);
         }
 
         return super.onPreparePanel(featureId, view, menu);
     }
 
     @Override
     public boolean onMenuOpened(int featureId, Menu menu) {
         // exit full-screen mode whenever the menu is opened
         if (mLayerView != null && mLayerView.isFullScreen()) {
             GeckoAppShell.sendEventToGecko(GeckoEvent.createBroadcastEvent("FullScreen:Exit", null));
         }
 
-        if (featureId == Window.FEATURE_OPTIONS_PANEL) {
+        if (Versions.feature11Plus && featureId == Window.FEATURE_OPTIONS_PANEL) {
             if (mMenu == null) {
                 // getMenuPanel() will force the creation of the menu as well
                 MenuPanel panel = getMenuPanel();
                 onPreparePanel(featureId, panel, mMenu);
             }
 
             // Scroll custom menu to the top
             if (mMenuPanel != null)
@@ -508,18 +512,20 @@ public abstract class GeckoApp
             return true;
         }
 
         return super.onOptionsItemSelected(item);
     }
 
     @Override
     public void onOptionsMenuClosed(Menu menu) {
-        mMenuPanel.removeAllViews();
-        mMenuPanel.addView((GeckoMenu) mMenu);
+        if (Versions.feature11Plus) {
+            mMenuPanel.removeAllViews();
+            mMenuPanel.addView((GeckoMenu) mMenu);
+        }
     }
 
     @Override
     public boolean onKeyDown(int keyCode, KeyEvent event) {
         // Handle hardware menu key presses separately so that we can show a custom menu in some cases.
         if (keyCode == KeyEvent.KEYCODE_MENU) {
             openOptionsMenu();
             return true;
rename from mobile/android/base/resources/drawable-hdpi-v11/ic_menu_back.png
rename to mobile/android/base/resources/drawable-hdpi/ic_menu_back.png
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..03a57c998cbf1c1060d09b0094ef3b0e2e574bbb
GIT binary patch
literal 1149
zc$@)!1cLjCP)<h;3K|Lk000e1NJLTq002k;002k`1ONa4|Kxkj000C;Nkl<ZcmeI0
z2X5kM1BN+5j=&Le1dfmcO!4+jQ3TUdF`2c%OYg<vcY26G5F|#lL`=5*+kFI%;3GWy
z?WZukC*B~*&pVSglt=GZCmt6U7Z(>77nk>Q*Sj_|MLPG*00Db-Zc21QibjS6kL@XG
zDKai`#6C$Lt5eZWk{T_VnCR2cQDkh;<V56{?6r3!`#Gj1G9?{p;|dMhGEHivueYO+
z66c5pJx;ANIy9&fzRr%cahW=8`uyQLHwQF0B6WQog_IbFH0aVEc|1d}_)Hz+`a06a
zB{`wHG<+VxiP@vh0ZBHlqoYTP&b|=pAo`KCydAmtEC21DJ@1=W=GBGKhFz2sx+D9M
zh>p5KXqOldttE3_o%ek^>wv=A%tT^-yhwnDY@m^2m)Z;cOgd_EM3p!pR=CG9i_BZ|
zEg?5|C34HEl;8pDY@w4NEmVpaY;#Ecg?=U-b>z8LrA&b=X<~#4v3eo5Fbd3GYM!j4
z5hq24JS7aOm~3+(hw6-<8OVNK?C1x6pii3`JD5~ODiq0+A&E|qHTyE>ls}Jgp|L}a
zwvhOd-}np5vRan<$K25Cd4>M0<+qa7$g=<9Hz7CRghRHann8sqmk=_&b-TgtMe6ox
z>o@i9xxYWS^gn!mE5E6Ok(lT*hjiE<c`ido=_8fcp-NTpd;%4-I?>_OYF>6jI8_ET
z*bylbwu2u%CD%<IgB=c}PG9O=TB%Q+Z47ko+aI?|{N_3ts_b8t&P1ulF;xm|5%>tD
zCG#P1Ds0oDdu2M3zS0#+23dkE+uzQ9n9c*Dl&I3+iQSUx@rspdRLFdolGM>DN}ZnF
zmyf@4r4C1wNfUhU!1)!SLji-jQ#uo+14^XW;*t8UN3M<|<SBE^6UTHU`~H2(6iE|$
z=bjWEl_^o?h<yij1TiH~NhC+u_pZl%pRCBoW$`%6V>Llh&ZBo<!F07mQ6xst*@iYp
z2{~1h?>V!>z5*iXIQ%OJ)k=`ZApXh`dCPyx_fnJI6nT-T)A#EwQu2bPo6moCQ@K6<
zk}tS5dQmDNXIhMP(?OlUtVV_`1$6bf%r`tB$OZwv5mJ*aGiH^^5@mDbpwJ_qMw$!>
z9{DCR_XrUoCK8rXUvksDC60;jS~)Vr2;!uWDuhHd{K^-WkReEz7#Z^9NE1b4on=1f
zYjeenlP1X)4*r*D#f*>=(O3~O8)!sHvrU`PcxX2;NTIXEsvJa}loS$eI>qWJLQ*7#
zCZdzVq|Mp*T<qHCGf!0^MVS~8G$O?1V>KT59TQr!BP2xPL`hQR<U(dbUr2SSktZe+
zmygxtspk+uq9jC87&KpznK1O8n>}h2NXUd)89BEL$!S`q&d`4P_JNR6U5?1hVRLZd
z|Ig~uMaZb{y^cz$0bSZuoEx&{%v1l_+;f@tOa1$J&vfJB;^N}s;^OiTmJ#PQ;|~qO
P00000NkvXXu0mjf^N%61
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..9e23244e2691906078732018e834458aa075bfe5
GIT binary patch
literal 1710
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
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..99138a56b96cc09b5fb50700e2056707f77c3a68
GIT binary patch
literal 606
zc$@)V0-^nhP)<h;3K|Lk000e1NJLTq002k;002k`1ONa4|Kxkj0006dNkl<ZcmeI!
z#S+t807r2?V9y452bMesdwhetRB@+**S$?W)6{Txmlg8i_8iC|lexG<W^U#F&kOwG
z8KL&$si~={si~>0{m(hBmpBtv-Clv?^x82!!ddsfpAbIQUJ)eOoLy+t$r0!U()Po9
zDbb>XL7^8&@w++(Z923u$jc|Sr=ERtjJ8#ahIQe*a!HqGT{1~6D+8Szev{<>ilj&v
zOp+loN%(q!bXb5I)XCz*-3z3Kl}?=u+hmh2n50AKq6+C=Af5e4s#77=8>EBOMP(9f
z=><}Uibx}7l2%<=CHL*!eWMFd*&=PUo3w1wJl8z$@8$Leyy<IYM3g8HWg{!?Be^F!
z-Z|d6`MuWQBSxOm$29Wxk~Yrsv6s+q7bA=IRXIZTUAP^KqGZVaL3s*afeK_TlBZ?^
zD7Yv=;h)QsA;ykJHi2?BRHsA9VFM^Wxk7`=AEc2d`&D%gb8OQHJ68Sg^!}SqZa(|n
zE<8K<N+a_{6~U1*eRR@Dk^Za-hvab<k6vf^h?4qPnS(Mp%ZxSbCGoM6T+V#MiJvGj
z!O>)M9PfODh>0{h9Ns9M6BV3-Y|aX{v7e|YPg_1`FQMMx%rQAzFgc<eExPhK`voV9
zA)m7g6J(W<#1UH<5*$%l8b{3i_;XH*hBS^?#HSJK5svsZX=indlt34p9w4>R>GT9g
skWQ_?c=7mx5o&5`YHDg~YHBv_JrMK43B}muKL7v#07*qoM6N<$f;*lZX#fBK
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..496ff3517df516bade75d9229cef5d37a14754db
GIT binary patch
literal 1186
zc$@*E1YP@yP)<h;3K|Lk000e1NJLTq002k;002k`1ONa4|Kxkj000DONkl<ZcmeH}
z1#BBx7e?PQGlOthu*}RL)}mcDl)0iZxmij~A@dj%CnXm>3!!CZhJXKMW?{K!ub!+-
z875Y7&PkIu_q*@)nynlh92^{WD<cq5dk#@zL{WPV2J<jbdkzJbP;ds?26>i{N9{RG
zr^IyB?qn#IW6%RJM%I>U*HTA)k8z4Dlz(xnMjdL`Qs(6zJ1Db2{&iS2xl+56GV>|#
zSugu}d)CW7!#pymJ%=Q%BvHL*z){`@{2|}-zW@3D5<m8}`9}H95J$=CV_o~o_q;#k
zeZYIH+6D=VBz9&XZ(zVtn^cbTdOgd0EBy>%3{#jXPL#DD-#XtqsWMS2vn3gWuCDYx
z<sIxfVY3?)P(qv*;yX3aci!(jeLRQj^|7*AD5EffnS^PinK%hCMiUY0#E7h7x)ztT
zk+5`*&|`U)$!<NC=Wy=>zR!IhDq%S<vwUX;3Vb&nKc3Z|Z#=(vWHpo-glQr{8iO49
zidizG#0=S<S`I_H5;W<thU)v!`<<M$+RrEg-zhtUzH1^#fSF<qAsUEP{@dJ+Ss67h
zJA>3PlNkhLCHLsJ$_@?R8YGdsUyREtgF)7Y2AQ67V)~qh5A6-~p*~D&R6*;chWG6a
z^s+vr>dHV}$`19VG^tHAD9}P4L)P2YATOPTEp|rdDLX_PQzUy#Q)DUatGYkv?&$ug
zebrLAPFwkwIzN)m4>s?VfkMg-k>M#4+B^$+hR%<={L7C~nq^0J^)bJkPlm)MW|)Wh
zWmlhNM=H(oW4ipEA3Z~fe5E5rWVo_J_zKxhTr93EO=!PplURmYvb2??<d#WVS^TsN
zvkC1NEg4Z<DIFxl@a4)5se|HwW{A;Dh&g9$p+Rna@!PC)SQ@ncBKP7J2%ivI+bkVv
z;(w+NQuc_YvNVYk7?M<5BstNL+|nR9QEd@_XgrO&BbHKjiC-(*X=FAY`o^t~T8r@I
z&5~QjsK04T-w)jN9%ks=&>gl(zhuxrgo*UW{j00Sb;-v0oHJ@Aw+u4nT(uFdOI$VX
zU;8tWh~x(8H<Zwe`zS}8C_!d3ioUpU{pIR%*Sp5K9&z36zIxD|W2nb+JcI6bU*)=6
z(s9z&<@(DlyGF?FAW>rEFm6-5BiokK_fd$)2{486_;HIa?EoeawUny?mCP;rrF#ki
z*%{LJPnK+(>Md<2=6_BR5yJ#|QVy@Fd;^#+2B?+9vQ8>e*ZFMed|Y+}3F|CH{^!!k
zs`nVTwXBU3t{5Un9krqiC%;3wYNfS$2+5@@h?T}^SzEYIRfpp6A~C|fFh&c-;i`I+
zCbX_k5GG{9FbP`M&zqsD%fg3B|K@2VxRW-Jqx5g7pQ=6!&n~Byu3kWaEE$p{#566G
zSdJ+!MKV&A&$Ntm6{NCswV7RbwyHMPYtHOv)|y#!zF9V3GT)Hjv&|djwIiQ=rIXFO
zBx^U{mZU5lS-I*bnS+CagM)*EgM)*EgTr3Re}445S9ii^IsgCw07*qoM6N<$f;?|H
AkpKVy
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..d7c6dfa117f8d36e91324afad86e529ca1308932
GIT binary patch
literal 480
zc$@*?0U!Q}P)<h;3K|Lk000e1NJLTq002k;002k`1ONa4|Kxkj0004}Nkl<ZcmeI!
zwU-n@6i49+2}#hDzYKTDCd92+sgbpo)9db%pb>5{Ar|5gU)<iTSI>FK``xgryT7mt
zHk-|6v)OD*ZQq)GYrpp=VEXp)OON(#Q3dTkafEZU()Oh?M>ssC3Oez;kpYIjH9#xw
zgDR+%e#V*n(FhT$pp0=*r!J_|KuauROq6MZMn%e?lo3&?4H^<DgOVChq6>-{5XHKn
zs0I{igZf3vpd!7ZVtql|)^F?B_GBCLw~zTi``ETnPd>eELl9{Djhz%ZjpM>RdD0qC
zil6tc<1|Hfvi(L7=opSRI*8^ip_49ACkfHKb<l?67(t*WQt{D{I!S2?169cA%(0A0
zI4Iu&L7p_{d>E)oMv`M0)i6-^-BCJ;bE=aOx*rCCdN*GhxccrY^Eb-?k!XNft}fKO
zOJlv83-w$t9im<enk&;LD(iw8Ye0><AV;gn>4MHt6`eDX098clpt49AbQ&)@{ilNr
z)Fe^|`9BNfo>hP2RB$g<LDilVPvf^d3Dr?mQ19l+YjgZ;@<GV|j?HGX*=#nO!af3g
Wd6N?jW`XGd0000<MNUMnLSTYbMB9h}
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..24026f9c070ad71f4686629cb5af99d78ebb6528
GIT binary patch
literal 1146
zc$@)x1cm#FP)<h;3K|Lk000e1NJLTq002k;002k`1ONa4|Kxkj000C*Nkl<ZcmeFe
zF#!Mo00A(ywU@!aEjIuFfUezg0B$@B;Bd~y;B4ErIXH7|Cv~<d=BnAYnZ{*owYj=o
z^e)ZX=<saY{_f42bDCrRxBPwMdH9~+wDN1WA)Wa(I;u^o|09}xr=6X1#f<AU7Z)9!
zS*HpsmL`Qo)DNg#>gRGPKr1L97tM$2K~0|a_;j5X{In`3q&q@WoBNTD8VuNIp;gj^
znL5fTK+~Obh3cnh>#JxbCU7VtRJMmEui(=PjI`p$PlzxPNthsB99XHLn7pW1LZMSZ
z3sDlpl@TgBIzLs80S5sh#OWaM8#;&+C5Q(bRTRFR7p<U~h%6OTV#$imD}1{~?uRJt
zbY!5N7$KaP<t&DODjChXkkBdqupSp-;<QT=^f1J7)(BQI%mAIVOX5WE<NZz92rW%n
z-pIOF^|*-;BQ8j=SV(Moc}v^KtdaXh?i?AnWx?jPYZ#)7xFjZt|3o;uLS=iDEUCp!
z_@_?#7-s$Ord#5>{l47lb65L@NDxaSlwG0XX;s(>5f#K3VCm;;rU;o)6OKnoCrD%V
zglZ3}eAh~lh@_9?JITv3m94I};3twsAe%zv^Xu^tA}r`+@t2u(3d<{KL6l6xpFN?n
zJ*r-6B1lLOWq{s!nM&pr>M-F&lug5zy|=9VT0L%pl1@4|X4*TsnqmyN2@o6wZ}x<$
ztIhcE3j!nvJ(A(EovB5SQ<fYJH>PX}El4%vlY|L=6x(Oi*_o`R9tU208E|D!NdHb7
zUP%N;&uAsI$Jc!4q>KJPp$DfiOaC4tPCODH&9$Rn3%w1iTi5?7%Wa7>vh-w_apIEL
zX;7=Sc8ZR+;QWc^tu7>&!-^A!#71?sYU{`PksG_jLRDO~^<!D(rA=a?^4+pMwz`nn
z=%z)|NCky=Y<;1-owU*{XrhLKr?$FK*&c20xM`9Y(4u}|t1C6v256#DV5I`hdlOGl
z{YAtBtYq4b^nKyNCa_{a$E;^3AOGibI?grjNl`|*cuGSwV-=XGL(BBnXI!7D?4-jd
z_s?PuQ@$8qs@Yc|q1Zm5kpNaK0u!}pneqKNSNhUv_8mKK%6qvyK@~b7HSyW;N}bB^
z+3}COm?cJPDMiiX@5c;{DI9;tw6iCkGUlo=6UVtGd^ig&HRv%=C$zNWl6SL0N*y<M
ze(AxCNnoH}&Ot7-n9KyhWTvA=D<o=Zz=#PW&G>OGP$`$ryE?!0VZkUcpr@89Ay7`K
zq?{^h<=hyhkdqF&suezOgBK6J9Hj;0Pf`u&si#h&N6JWS1nB)@V46z#^c*tO(oc{^
z3>mQCp^N15fpe9!NSmi*VlfF^SZVkTCfbNHz|)(P4=cP>=@~jcrAsbPe!Z9hdIbF}
zW{A}DDf95Ps;!sUKC917-J2Sdnx1@k_}bw^w~EBB?8>g}%C79nkH?l^ZVo~2hyVZp
M07*qoM6N<$g3&uFH~;_u
rename from mobile/android/base/resources/drawable-xhdpi-v11/ic_menu_back.png
rename to mobile/android/base/resources/drawable-xhdpi/ic_menu_back.png
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..042dee803279815ebc8e93a7d849ec32d1a5e98a
GIT binary patch
literal 1753
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
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..50d992e7395a89043752f486305bfc5c95d58f96
GIT binary patch
literal 2176
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
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..51fea1bc49250dbc4d670f0a2f124cdb771286f1
GIT binary patch
literal 790
zc$@(i1L^#UP)<h;3K|Lk000e1NJLTq003YB003YJ1ONa4NRhv@0008rNkl<ZcmeI0
z1FURU7)EO|Y}lA()Hr2~7pu{;t(kjk_l(WMv8T3;s0fQVjrHQps`cl-U~n=!`M(u&
zt?V8B7p&QII-O3Z)9G|NUF6E6I}Sun-f5_Q^rlnaM%d)^?Cc&R^*6q^s9=-fQAC0%
z`W`*{v?=nqNH9V_V8nze6S`(4R4;nuQwyIVV<vwvrbEG;kCeDIh4+uXOfVwAXTpf_
z{}|CGZ$`qA3txHv9j1)UO?dZ)kH7pqVI&yR`Xk}=ZcPXy;lr=qV#-i3phb>{%}JOr
z5cFx1)r3$JM)U<e8f4hy#7?6V(xxQ5|J9oe=?S_7q}Z4llQ5tw=-`vogb)*6qfbZB
z#xp13-LGGxM_bUsC1FxRmzJQ3L!1alcW6R*2~9x*8_SFY`^MhaJsJ`M>R6nftuP^a
z-GRui@*?ah9V$Ok&h#9DE%2!=IYH<j`|&stHW%b6GS~#+C!F2$I0>=~lc$P{e;z!l
zJiD5NC!WqwrH;KY4ldq#ajC2(!Fsxk8ww8PKN5~_TXH}ZH`IhjK3#G^1t&CY>R4Yd
z{R`Ql(PV@dUHS{uL!!ZpyxbgIywrgFgFYU$5D0jY*Mi0M#hRDD_TC4)wJ>k;B3<l|
z^u^))lWkw@UYr;9_&-<K8lS1qU&G_?^W_v}DqG;0pntOTFeyruk+@9OU;j|~^vt4Q
zs{WqRah@Vek&?h+%*)NS*FVZrWGGM+*e2-jF8;2cCQm_7XB2|I>OW439C<;Fp(*-F
zvg8Cc1}oQB{X;xTf(%(f)dc+=h2Qn#q{#>>^qI6*t*`nIW04{)DAO}R|KK0`Nm7Cm
zUDaRlcE$hHPmmN8>8!v0!JCh=X_CI&iF+Q#B2Ge3SYLg4#m@g?lQc<RZt%e1oK1rG
zKjdjkeUlQTzF`Sc-=KsS&b0{`N_}(o(p~RQ-~Z~ZjkVR+>2x}sPN&o9bUK~xR}eyT
U6NA)&P5=M^07*qoM6N<$f`E;KzW@LL
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0ca97ab7ed5152eb9c17e0835816000f8e3a5da1
GIT binary patch
literal 1599
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
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..3b2622ec767c66787b040cdf3ae396f2e10fd55e
GIT binary patch
literal 620
zc$@)j0+aoTP)<h;3K|Lk000e1NJLTq003YB003YJ1ONa4NRhv@0006rNkl<ZcmeI0
zMRMLi5Jt83C31>fA^#?L1DDzICLF`Y%$D^tYh-3-UgsELW?I=_nB-2Gq)ByEzjuJ?
zSJSID1V0f3K@bE%5ClOGgtF7-Z4<w(dSl)+_+Xx@dUFL9l0S^0;cLbvHUZc2)leA0
z=r0G+g1Q|x0UeJLn8xg1D%fw?1f+IHG3#*>Ij{*(nBEsKgFZe1E@lW>1xypV5}*x*
zDMBRy8UrQ?83j0)Aao=^8+nWq=J^EVFiM!?6ObhXvJ#+;3`PhuoC1ak83m*<NSNjm
zP)!C@9~e+nP*f1;rJ-o7=x)(VkDrS0w<i7-V4~<?KNW2ioiY5UsIYXebgvo>X#UF<
zbfW7oZR9aPn1_w71MEZtzP?jb=zGAGd)0^_i4@WvGahqr(MRYahs=Sd5JNSt-19x4
z{cQpc+<o@>tP2M*w88fP`>g|4lMZbE1EQ}LTy4gJ2ymdZ84Y5E@^G{n2_hheye6F>
zRw(nR4>?T^BJ;@ifH89xqfp2OtimXkFlHM5vl80b+WEMHgIvNWIoj93b`JLA&i3j#
z<Nq>@4B;>gE<}+gjPePvkRr7B1au)u*d+nl=tP3BlTSc9VubAyaCjsjO2{an4H3dN
z3D8ChY{C`^kbuL|j9$WKPCvjrpba)Gubft><53ir#|YZrvI($OlIZc6gtfvZAQe(b
zq4(GD7Lst03K@JDGnbw&;SZnsdngeEK@bE%5ClOG1mQD{)MR$F3QPF_0000<MNUMn
GLSTYgy903m
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..712916f45d07295d1a55a07095ebdc3df9348bd6
GIT binary patch
literal 1638
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
deleted file mode 100644
--- a/mobile/android/base/resources/drawable/ic_menu_bookmark_add.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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/. -->
-
-<!-- This asset is properly available in large-* dirs so this null
-     reference exists for build time on API 9 builds. -->
-<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
-        android:src="@null"/>
deleted file mode 100644
--- a/mobile/android/base/resources/drawable/ic_menu_bookmark_remove.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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/. -->
-
-<!-- This asset is properly available in large-* dirs so this null
-     reference exists for build time on API 9 builds. -->
-<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
-        android:src="@null"/>
--- a/mobile/android/base/resources/drawable/ic_menu_reader_add.xml
+++ b/mobile/android/base/resources/drawable/ic_menu_reader_add.xml
@@ -1,7 +1,11 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!-- 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/. -->
 
-<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
-        android:src="@null"/>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="rectangle">
+
+     <solid android:color="@android:color/transparent"/>
+
+</shape>
--- a/mobile/android/base/resources/drawable/ic_menu_reader_remove.xml
+++ b/mobile/android/base/resources/drawable/ic_menu_reader_remove.xml
@@ -1,7 +1,11 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!-- 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/. -->
 
-<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
-        android:src="@null"/>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="rectangle">
+
+     <solid android:color="@android:color/transparent"/>
+
+</shape>
--- a/mobile/android/base/resources/layout-large-v11/browser_toolbar.xml
+++ b/mobile/android/base/resources/layout-large-v11/browser_toolbar.xml
@@ -119,17 +119,18 @@
           android:visibility="gone"/>
 
     <org.mozilla.gecko.widget.themed.ThemedFrameLayout
             android:id="@+id/menu"
             style="@style/UrlBar.ImageButton"
             android:layout_toLeftOf="@id/menu_margin"
             android:layout_alignWithParentIfMissing="true"
             android:contentDescription="@string/menu"
-            android:background="@drawable/browser_toolbar_action_bar_button">
+            android:background="@drawable/browser_toolbar_action_bar_button"
+            android:visibility="gone">
 
         <org.mozilla.gecko.widget.themed.ThemedImageView
                 android:id="@+id/menu_icon"
                 style="@style/UrlBar.ImageButton.BrowserToolbarColors"
                 android:layout_height="@dimen/browser_toolbar_menu_icon_height"
                 android:layout_width="wrap_content"
                 android:scaleType="centerInside"
                 android:src="@drawable/menu"
--- a/mobile/android/base/resources/layout/browser_toolbar.xml
+++ b/mobile/android/base/resources/layout/browser_toolbar.xml
@@ -36,17 +36,18 @@
                android:src="@drawable/url_bar_translating_edge"
                android:scaleType="fitXY"/>
 
     <org.mozilla.gecko.toolbar.ShapedButtonFrameLayout
             android:id="@+id/menu"
             style="@style/UrlBar.ImageButton"
             android:layout_alignParentRight="true"
             android:contentDescription="@string/menu"
-            android:background="@drawable/shaped_button">
+            android:background="@drawable/shaped_button"
+            android:visibility="gone">
 
         <org.mozilla.gecko.widget.themed.ThemedImageView
                 android:id="@+id/menu_icon"
                 style="@style/UrlBar.ImageButton"
                 android:layout_height="@dimen/browser_toolbar_menu_icon_height"
                 android:layout_width="wrap_content"
                 android:scaleType="centerInside"
                 android:layout_gravity="center"
--- a/mobile/android/base/resources/layout/tabs_panel_default.xml
+++ b/mobile/android/base/resources/layout/tabs_panel_default.xml
@@ -48,17 +48,18 @@
                          android:src="@drawable/tab_new"
                          android:contentDescription="@string/new_tab"
                          android:background="@drawable/action_bar_button_inverse"/>
 
             <FrameLayout android:id="@+id/menu"
                          style="@style/UrlBar.ImageButton"
                          android:layout_width="@dimen/tabs_panel_button_width"
                          android:background="@drawable/action_bar_button_inverse"
-                         android:contentDescription="@string/menu">
+                         android:contentDescription="@string/menu"
+                         android:visibility="gone">
 
                 <ImageButton
                         style="@style/UrlBar.ImageButton"
                         android:layout_width="wrap_content"
                         android:layout_height="@dimen/browser_toolbar_menu_icon_height"
                         android:layout_gravity="center"
                         android:scaleType="centerInside"
                         android:src="@drawable/menu"
--- a/mobile/android/base/resources/menu/browser_app_menu.xml
+++ b/mobile/android/base/resources/menu/browser_app_menu.xml
@@ -1,104 +1,99 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!-- 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/. -->
 
 <menu xmlns:android="http://schemas.android.com/apk/res/android">
 
     <item android:id="@+id/reload"
+          android:icon="@drawable/ic_menu_reload"
           android:title="@string/reload"/>
 
-    <!-- We keep the reference so calls to findView don't fail. Hide
-         to avoid taking up real estate on the users' screen. -->
     <item android:id="@+id/back"
+          android:icon="@drawable/ic_menu_back"
           android:title="@string/back"
           android:visible="false"/>
 
     <item android:id="@+id/forward"
+          android:icon="@drawable/ic_menu_forward"
           android:title="@string/forward"/>
 
     <item android:id="@+id/bookmark"
+          android:icon="@drawable/ic_menu_bookmark_add"
           android:title="@string/bookmark"/>
 
     <item android:id="@+id/new_tab"
+          android:icon="@drawable/ic_menu_new_tab"
           android:title="@string/new_tab"/>
 
     <item android:id="@+id/new_private_tab"
+          android:icon="@drawable/ic_menu_new_private_tab"
           android:title="@string/new_private_tab"/>
 
     <item android:id="@+id/share"
           android:title="@string/share" />
 
     <item android:id="@+id/reading_list"
           android:title="@string/overlay_share_reading_list_btn_label" />
 
+    <item android:id="@+id/save_as_pdf"
+          android:title="@string/save_as_pdf" />
+
+    <item android:id="@+id/print"
+          android:visible="false"
+          android:title="@string/print" />
+
     <item android:id="@+id/find_in_page"
           android:title="@string/find_in_page" />
 
     <item android:id="@+id/desktop_mode"
           android:title="@string/desktop_mode"
           android:checkable="true" />
 
-    <item android:id="@+id/page"
-          android:title="@string/page">
-
-        <menu>
-            <item android:id="@+id/subscribe"
-                  android:title="@string/contextmenu_subscribe"/>
-
-            <item android:id="@+id/save_as_pdf"
-                  android:title="@string/save_as_pdf"/>
-
-            <item android:id="@+id/print"
-                  android:title="@string/print"/>
-
-            <item android:id="@+id/add_search_engine"
-                  android:title="@string/contextmenu_add_search_engine"/>
-
-            <item android:id="@+id/add_to_launcher"
-                  android:title="@string/contextmenu_add_to_launcher"/>
-        </menu>
+    <item android:id="@+id/addons"
+          android:title="@string/addons"/>
 
-    </item>
-
-    <item android:id="@+id/tools"
-          android:title="@string/tools">
+    <item android:id="@+id/downloads"
+          android:title="@string/downloads"/>
 
-        <menu>
-            <item android:id="@+id/downloads"
-                  android:title="@string/downloads"/>
-            <item android:id="@+id/addons"
-                  android:title="@string/addons"/>
-            <item android:id="@+id/logins"
-                  android:title="@string/logins"/>
-            <item android:id="@+id/new_guest_session"
-                  android:visible="false"
-                  android:title="@string/new_guest_session"/>
-            <item android:id="@+id/exit_guest_session"
-                  android:visible="false"
-                  android:title="@string/exit_guest_session"/>
-        </menu>
-
-    </item>
+    <item android:id="@+id/logins"
+          android:title="@string/logins"/>
 
     <item android:id="@+id/char_encoding"
           android:visible="false"
           android:title="@string/char_encoding"/>
 
     <item android:id="@+id/settings"
           android:title="@string/settings" />
 
     <item android:id="@+id/help"
           android:title="@string/help_menu" />
 
+    <item android:id="@+id/new_guest_session"
+          android:visible="false"
+          android:title="@string/new_guest_session"/>
+
+    <item android:id="@+id/exit_guest_session"
+          android:visible="false"
+          android:title="@string/exit_guest_session"/>
+
     <!-- Android will eliminate v11+ resource files from pre-11 builds.
          Those files are the only place in which certain IDs are defined.
          This causes compilation errors.
          To avoid nasty code workarounds, we define stub IDs here, but
          hide the menu entries. -->
 
     <item android:id="@+id/quickshare"
           android:visible="false"
           android:enabled="false" />
 
+    <item android:id="@+id/page"
+          android:visible="false"
+          android:enabled="false"
+          android:title="@string/page" />
+
+    <item android:id="@+id/tools"
+          android:visible="false"
+          android:enabled="false"
+          android:title="@string/tools" />
 </menu>
--- a/mobile/android/base/tabs/TabsPanel.java
+++ b/mobile/android/base/tabs/TabsPanel.java
@@ -362,18 +362,23 @@ public class TabsPanel extends LinearLay
 
             default:
                 throw new IllegalArgumentException("Unknown panel type " + panelToShow);
         }
         mPanel.show();
 
         mAddTab.setVisibility(View.VISIBLE);
 
-        mMenuButton.setEnabled(true);
-        mPopupMenu.setAnchor(mMenuButton);
+        if (!HardwareUtils.hasMenuButton()) {
+            mMenuButton.setVisibility(View.VISIBLE);
+            mMenuButton.setEnabled(true);
+            mPopupMenu.setAnchor(mMenuButton);
+        } else {
+            mPopupMenu.setAnchor(mAddTab);
+        }
     }
 
     public int getVerticalPanelHeight() {
         final int actionBarHeight = mContext.getResources().getDimensionPixelSize(R.dimen.browser_toolbar_height);
         final int height = actionBarHeight + getTabContainerHeight(mTabsContainer);
         return height;
     }
 
--- a/mobile/android/base/toolbar/BrowserToolbar.java
+++ b/mobile/android/base/toolbar/BrowserToolbar.java
@@ -124,16 +124,17 @@ public abstract class BrowserToolbar ext
     protected final List<View> focusOrder;
 
     private OnActivateListener activateListener;
     private OnFocusChangeListener focusChangeListener;
     private OnStartEditingListener startEditingListener;
     private OnStopEditingListener stopEditingListener;
 
     protected final BrowserApp activity;
+    protected boolean hasSoftMenuButton;
 
     protected UIMode uiMode;
     protected TabHistoryController tabHistoryController;
 
     private final Paint shadowPaint;
     private final int shadowColor;
     private final int shadowPrivateColor;
     private final int shadowSize;
@@ -188,16 +189,17 @@ public abstract class BrowserToolbar ext
         tabsButton = (ThemedImageButton) findViewById(R.id.tabs);
         tabsCounter = (TabCounter) findViewById(R.id.tabs_counter);
         if (Versions.feature11Plus) {
             tabsCounter.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
         }
 
         menuButton = (ThemedFrameLayout) findViewById(R.id.menu);
         menuIcon = (ThemedImageView) findViewById(R.id.menu_icon);
+        hasSoftMenuButton = !HardwareUtils.hasMenuButton();
 
         // The focusOrder List should be filled by sub-classes.
         focusOrder = new ArrayList<View>();
 
         final Resources res = getResources();
         shadowSize = res.getDimensionPixelSize(R.dimen.browser_toolbar_shadow_size);
 
         shadowPaint = new Paint();
@@ -314,24 +316,27 @@ public abstract class BrowserToolbar ext
                 // panel open does not go to the editing field.
                 urlEditLayout.clearFocus();
 
                 toggleTabs();
             }
         });
         tabsButton.setImageLevel(0);
 
-        menuButton.setOnClickListener(new Button.OnClickListener() {
-            @Override
-            public void onClick(View view) {
-                // Drop the soft keyboard.
-                urlEditLayout.clearFocus();
-                activity.openOptionsMenu();
-            }
-        });
+        if (hasSoftMenuButton) {
+            menuButton.setVisibility(View.VISIBLE);
+            menuButton.setOnClickListener(new Button.OnClickListener() {
+                @Override
+                public void onClick(View view) {
+                    // Drop the soft keyboard.
+                    urlEditLayout.clearFocus();
+                    activity.openOptionsMenu();
+                }
+            });
+        }
     }
 
     @Override
     public void onDetachedFromWindow() {
         super.onDetachedFromWindow();
 
         prefs.close();
     }
@@ -650,17 +655,17 @@ public abstract class BrowserToolbar ext
 
         if (needsNewFocus) {
             requestFocus();
         }
     }
 
     public void setToolBarButtonsAlpha(float alpha) {
         ViewHelper.setAlpha(tabsCounter, alpha);
-        if (!HardwareUtils.isTablet()) {
+        if (hasSoftMenuButton && !HardwareUtils.isTablet()) {
             ViewHelper.setAlpha(menuIcon, alpha);
         }
     }
 
     public void onEditSuggestion(String suggestion) {
         if (!isEditing()) {
             return;
         }
@@ -845,16 +850,20 @@ public abstract class BrowserToolbar ext
     }
 
     public void onDestroy() {
         Tabs.unregisterOnTabsChangedListener(this);
         urlDisplayLayout.destroy();
     }
 
     public boolean openOptionsMenu() {
+        if (!hasSoftMenuButton) {
+            return false;
+        }
+
         // Initialize the popup.
         if (menuPopup == null) {
             View panel = activity.getMenuPanel();
             menuPopup = new MenuPopup(activity);
             menuPopup.setPanelView(panel);
 
             menuPopup.setOnDismissListener(new PopupWindow.OnDismissListener() {
                 @Override
@@ -868,16 +877,20 @@ public abstract class BrowserToolbar ext
         if (!menuPopup.isShowing()) {
             menuPopup.showAsDropDown(menuButton);
         }
 
         return true;
     }
 
     public boolean closeOptionsMenu() {
+        if (!hasSoftMenuButton) {
+            return false;
+        }
+
         if (menuPopup != null && menuPopup.isShowing()) {
             menuPopup.dismiss();
         }
 
         return true;
     }
 
     @Override
--- a/mobile/android/base/toolbar/BrowserToolbarPhone.java
+++ b/mobile/android/base/toolbar/BrowserToolbarPhone.java
@@ -113,16 +113,20 @@ class BrowserToolbarPhone extends Browse
                         PropertyAnimator.Property.TRANSLATION_X,
                         entryTranslation);
         animator.attach(tabsButton,
                         PropertyAnimator.Property.TRANSLATION_X,
                         curveTranslation);
         animator.attach(tabsCounter,
                         PropertyAnimator.Property.TRANSLATION_X,
                         curveTranslation);
-        animator.attach(menuButton,
-                        PropertyAnimator.Property.TRANSLATION_X,
-                        curveTranslation);
-        animator.attach(menuIcon,
-                        PropertyAnimator.Property.TRANSLATION_X,
-                        curveTranslation);
+
+        if (!HardwareUtils.hasMenuButton()) {
+            animator.attach(menuButton,
+                            PropertyAnimator.Property.TRANSLATION_X,
+                            curveTranslation);
+
+            animator.attach(menuIcon,
+                            PropertyAnimator.Property.TRANSLATION_X,
+                            curveTranslation);
+        }
     }
 }
--- a/mobile/android/base/toolbar/BrowserToolbarPhoneBase.java
+++ b/mobile/android/base/toolbar/BrowserToolbarPhoneBase.java
@@ -122,28 +122,34 @@ abstract class BrowserToolbarPhoneBase e
             canvas.drawPath(roundCornerShape, roundCornerPaint);
         }
     }
 
     @Override
     public void triggerTabsPanelTransition(final PropertyAnimator animator, final boolean areTabsShown) {
         if (areTabsShown) {
             ViewHelper.setAlpha(tabsCounter, 0.0f);
-            ViewHelper.setAlpha(menuIcon, 0.0f);
+            if (hasSoftMenuButton) {
+                ViewHelper.setAlpha(menuIcon, 0.0f);
+            }
             return;
         }
 
         final PropertyAnimator buttonsAnimator =
                 new PropertyAnimator(animator.getDuration(), buttonsInterpolator);
+
         buttonsAnimator.attach(tabsCounter,
                                PropertyAnimator.Property.ALPHA,
                                1.0f);
-        buttonsAnimator.attach(menuIcon,
-                               PropertyAnimator.Property.ALPHA,
-                               1.0f);
+        if (hasSoftMenuButton) {
+            buttonsAnimator.attach(menuIcon,
+                                   PropertyAnimator.Property.ALPHA,
+                                   1.0f);
+        }
+
         buttonsAnimator.start();
     }
 
     /**
      * Returns the number of pixels the url bar translating edge
      * needs to translate to the right to enter its editing mode state.
      * A negative value means the edge must translate to the left.
      */
--- a/mobile/android/base/toolbar/BrowserToolbarPreHC.java
+++ b/mobile/android/base/toolbar/BrowserToolbarPreHC.java
@@ -49,17 +49,22 @@ class BrowserToolbarPreHC extends Browse
             entryTranslation = getUrlBarEntryTranslation();
         } else {
             curveTranslation = 0;
             entryTranslation = 0;
         }
 
         // Prevent taps through the editing mode cancel button (bug 1001243).
         tabsButton.setEnabled(!isEditing);
-        menuButton.setEnabled(!isEditing);
 
         ViewHelper.setTranslationX(urlBarTranslatingEdge, entryTranslation);
         ViewHelper.setTranslationX(tabsButton, curveTranslation);
         ViewHelper.setTranslationX(tabsCounter, curveTranslation);
-        ViewHelper.setTranslationX(menuButton, curveTranslation);
-        ViewHelper.setTranslationX(menuIcon, curveTranslation);
+
+        if (!HardwareUtils.hasMenuButton()) {
+            // Prevent tabs through the editing mode cancel button (bug 1001243).
+            menuButton.setEnabled(!isEditing);
+
+            ViewHelper.setTranslationX(menuButton, curveTranslation);
+            ViewHelper.setTranslationX(menuIcon, curveTranslation);
+        }
     }
 }
--- a/mobile/android/base/toolbar/BrowserToolbarTabletBase.java
+++ b/mobile/android/base/toolbar/BrowserToolbarTabletBase.java
@@ -64,17 +64,17 @@ abstract class BrowserToolbarTabletBase 
         focusOrder.addAll(Arrays.asList(actionItemBar, menuButton));
 
         urlDisplayLayout.updateSiteIdentityAnchor(backButton);
 
         privateBrowsingTabletMenuItemColorFilter = new PorterDuffColorFilter(
                 ColorUtils.getColor(context, R.color.tabs_tray_icon_grey), PorterDuff.Mode.SRC_IN);
 
         menuButtonMarginView = findViewById(R.id.menu_margin);
-        if (menuButtonMarginView != null) {
+        if (menuButtonMarginView != null && !HardwareUtils.hasMenuButton()) {
             menuButtonMarginView.setVisibility(View.VISIBLE);
         }
     }
 
     private void initButtonListeners() {
         backButton.setOnClickListener(new Button.OnClickListener() {
             @Override
             public void onClick(View view) {
--- a/mobile/android/base/util/HardwareUtils.java
+++ b/mobile/android/base/util/HardwareUtils.java
@@ -31,40 +31,48 @@ public final class HardwareUtils {
                                                     Build.MODEL.startsWith("KF"));
 
     private static volatile boolean sInited;
 
     // These are all set once, during init.
     private static volatile boolean sIsLargeTablet;
     private static volatile boolean sIsSmallTablet;
     private static volatile boolean sIsTelevision;
+    private static volatile boolean sHasMenuButton;
 
     private HardwareUtils() {
     }
 
     public static void init(Context context) {
         if (sInited) {
             // This is unavoidable, given that HardwareUtils is called from background services.
             Log.d(LOGTAG, "HardwareUtils already inited.");
             return;
         }
 
         // Pre-populate common flags from the context.
         final int screenLayoutSize = context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK;
         if (Build.VERSION.SDK_INT >= 11) {
+            sHasMenuButton = false;
             if (screenLayoutSize == Configuration.SCREENLAYOUT_SIZE_XLARGE) {
                 sIsLargeTablet = true;
             } else if (screenLayoutSize == Configuration.SCREENLAYOUT_SIZE_LARGE) {
                 sIsSmallTablet = true;
             }
-            if (Build.VERSION.SDK_INT >= 16) {
-                if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEVISION)) {
-                    sIsTelevision = true;
+            if (Build.VERSION.SDK_INT >= 14) {
+                sHasMenuButton = ViewConfiguration.get(context).hasPermanentMenuKey();
+
+                if (Build.VERSION.SDK_INT >= 16) {
+                    if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEVISION)) {
+                        sIsTelevision = true;
+                    }
                 }
             }
+        } else {
+            sHasMenuButton = true;
         }
 
         sInited = true;
     }
 
     public static boolean isTablet() {
         return sIsLargeTablet || sIsSmallTablet;
     }
@@ -76,16 +84,20 @@ public final class HardwareUtils {
     public static boolean isSmallTablet() {
         return sIsSmallTablet;
     }
 
     public static boolean isTelevision() {
         return sIsTelevision;
     }
 
+    public static boolean hasMenuButton() {
+        return sHasMenuButton;
+    }
+
     public static int getMemSize() {
         return SysInfo.getMemSize();
     }
 
     public static boolean isLowMemoryPlatform() {
         final int memSize = getMemSize();
 
         // Fallback to false if we fail to read meminfo
--- a/mobile/android/services/src/main/java/org/mozilla/gecko/fxa/activities/FxAccountStatusFragment.java
+++ b/mobile/android/services/src/main/java/org/mozilla/gecko/fxa/activities/FxAccountStatusFragment.java
@@ -208,16 +208,20 @@ public class FxAccountStatusFragment
 
     syncServerPreference = ensureFindPreference("sync_server");
     morePreference = ensureFindPreference("more");
     morePreference.setOnPreferenceClickListener(this);
 
     syncNowPreference = ensureFindPreference("sync_now");
     syncNowPreference.setEnabled(true);
     syncNowPreference.setOnPreferenceClickListener(this);
+
+    if (HardwareUtils.hasMenuButton()) {
+      syncCategory.removePreference(morePreference);
+    }
   }
 
   /**
    * We intentionally don't refresh here. Our owning activity is responsible for
    * providing an AndroidFxAccount to our refresh method in its onResume method.
    */
   @Override
   public void onResume() {
--- a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/components/AppMenuComponent.java
+++ b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/components/AppMenuComponent.java
@@ -6,37 +6,37 @@ package org.mozilla.gecko.tests.componen
 
 import static org.mozilla.gecko.tests.helpers.AssertionHelper.fAssertEquals;
 import static org.mozilla.gecko.tests.helpers.AssertionHelper.fAssertFalse;
 import static org.mozilla.gecko.tests.helpers.AssertionHelper.fAssertNotNull;
 import static org.mozilla.gecko.tests.helpers.AssertionHelper.fAssertTrue;
 
 import java.util.List;
 
-import org.mozilla.gecko.AppConstants;
 import org.mozilla.gecko.R;
 import org.mozilla.gecko.menu.MenuItemActionBar;
 import org.mozilla.gecko.menu.MenuItemDefault;
 import org.mozilla.gecko.tests.UITestContext;
 import org.mozilla.gecko.tests.helpers.DeviceHelper;
 import org.mozilla.gecko.tests.helpers.WaitHelper;
+import org.mozilla.gecko.util.HardwareUtils;
 
 import android.text.TextUtils;
 import android.view.View;
 import android.widget.TextView;
 
 import com.jayway.android.robotium.solo.Condition;
 import com.jayway.android.robotium.solo.RobotiumUtils;
 import com.jayway.android.robotium.solo.Solo;
 
 /**
  * A class representing any interactions that take place on the app menu.
  */
 public class AppMenuComponent extends BaseComponent {
-    private static final long MAX_WAITTIME_FOR_MENU_UPDATE_IN_MS = 7500L;
+    private static final long MAX_WAITTIME_FOR_MENU_UPDATE_IN_MS = 1000L;
 
     private Boolean hasLegacyMenu = null;
 
     public enum MenuItem {
         FORWARD(R.string.forward),
         NEW_TAB(R.string.new_tab),
         PAGE(R.string.page),
         RELOAD(R.string.reload);
@@ -238,19 +238,19 @@ public class AppMenuComponent extends Ba
 
     public void pressMenuItem(final PageMenuItem pageMenuItem) {
         pressSubMenuItem(PageMenuItem.PARENT_MENU.getString(mSolo), pageMenuItem.getString(mSolo));
     }
 
     private void openAppMenu() {
         assertMenuIsNotOpen();
 
-        // This is a hack needed for tablets & GB where the OverflowMenuButton is always in the GONE state,
+        // This is a hack needed for tablets where the OverflowMenuButton is always in the GONE state,
         // so we press the menu key instead.
-        if (DeviceHelper.isTablet() || AppConstants.Versions.preHC) {
+        if (HardwareUtils.hasMenuButton() || DeviceHelper.isTablet()) {
             mSolo.sendKey(Solo.MENU);
         } else {
             pressOverflowMenuButton();
         }
 
         waitForMenuOpen();
     }
 
@@ -278,24 +278,22 @@ public class AppMenuComponent extends Ba
 
         fAssertTrue("The overflow menu button is enabled", overflowMenuButton.isEnabled());
         fAssertEquals("The overflow menu button is visible", View.VISIBLE, overflowMenuButton.getVisibility());
 
         mSolo.clickOnView(overflowMenuButton, true);
     }
 
     /**
-    * Determines whether the app menu is open by searching for items in the menu.
+    * Determines whether the app menu is open by searching for the text "New tab".
     *
     * @return true if app menu is open.
     */
     private boolean isMenuOpen() {
-        // We choose these options because New Tab is near the top of the menu and Page is near the middle/bottom.
-        // Intermittently, the menu doesn't scroll to top so we can't just use the first item in the list.
-        return isMenuOpen(MenuItem.NEW_TAB.getString(mSolo)) || isMenuOpen(MenuItem.PAGE.getString(mSolo));
+        return isMenuOpen(MenuItem.NEW_TAB.getString(mSolo));
     }
 
     private boolean isLegacyMoreMenuOpen() {
         // Check if the first menu option is visible.
         return mSolo.searchText(mSolo.getString(R.string.share), true);
     }
 
     /**