Bug 831402: Use android spinners for tablets. [r=mfinkle]
authorSriram Ramasubramanian <sriram@mozilla.com>
Wed, 16 Jan 2013 11:11:03 -0800
changeset 119159 ce4d3552704d3bf08559510124da08eb52bbf6b7
parent 119158 48c0d6ebc3d5703a17a7c6f83bb874966ba0bf93
child 119160 154e9ce25e412ecc9df0c0ad50e8cbe25e40ef69
push id21503
push usersramasubramanian@mozilla.com
push dateThu, 17 Jan 2013 19:29:48 +0000
treeherdermozilla-inbound@384f08852a55 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmfinkle
bugs831402
milestone21.0a1
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
Bug 831402: Use android spinners for tablets. [r=mfinkle]
mobile/android/base/Makefile.in
mobile/android/base/TabsPanel.java
mobile/android/base/resources/drawable-hdpi/spinner_default.9.png
mobile/android/base/resources/drawable-hdpi/spinner_focused.9.png
mobile/android/base/resources/drawable-hdpi/spinner_pressed.9.png
mobile/android/base/resources/drawable-xhdpi/spinner_default.9.png
mobile/android/base/resources/drawable-xhdpi/spinner_focused.9.png
mobile/android/base/resources/drawable-xhdpi/spinner_pressed.9.png
mobile/android/base/resources/drawable/spinner.xml
mobile/android/base/resources/drawable/spinner_default.9.png
mobile/android/base/resources/drawable/spinner_focused.9.png
mobile/android/base/resources/drawable/spinner_pressed.9.png
mobile/android/base/resources/layout-xlarge-v11/tabs_panel_toolbar_menu.xml
mobile/android/base/resources/layout/tabs_panel_toolbar_menu.xml
mobile/android/base/resources/menu/tabs_switcher_menu.xml
mobile/android/base/resources/values-v11/styles.xml
mobile/android/base/resources/values-v11/themes.xml
mobile/android/base/resources/values/arrays.xml
--- a/mobile/android/base/Makefile.in
+++ b/mobile/android/base/Makefile.in
@@ -527,16 +527,19 @@ RES_DRAWABLE_BASE = \
   res/drawable/ic_menu_new_private_tab.png \
   res/drawable/ic_menu_new_private_tab_small.png \
   res/drawable/ic_menu_new_tab_small.png \
   res/drawable/ic_menu_reload.png \
   res/drawable/ic_menu_quit.xml \
   res/drawable/ic_status_logo.png \
   res/drawable/remote_tabs_off.png \
   res/drawable/remote_tabs_on.png \
+  res/drawable/spinner_default.9.png \
+  res/drawable/spinner_focused.9.png \
+  res/drawable/spinner_pressed.9.png \
   res/drawable/tab_indicator_divider.9.png \
   res/drawable/tab_indicator_selected.9.png \
   res/drawable/tab_indicator_selected_focused.9.png \
   res/drawable/tab_new.png \
   res/drawable/tab_new_pb.png \
   res/drawable/tab_close.png \
   res/drawable/tab_thumbnail_default.png \
   res/drawable/tab_thumbnail_shadow.png \
@@ -619,16 +622,19 @@ RES_DRAWABLE_HDPI = \
   res/drawable-hdpi/ic_menu_new_private_tab.png \
   res/drawable-hdpi/ic_menu_new_private_tab_small.png \
   res/drawable-hdpi/ic_menu_new_tab.png \
   res/drawable-hdpi/ic_menu_new_tab_small.png \
   res/drawable-hdpi/ic_menu_reload.png \
   res/drawable-hdpi/ic_status_logo.png \
   res/drawable-hdpi/remote_tabs_off.png \
   res/drawable-hdpi/remote_tabs_on.png \
+  res/drawable-hdpi/spinner_default.9.png \
+  res/drawable-hdpi/spinner_focused.9.png \
+  res/drawable-hdpi/spinner_pressed.9.png \
   res/drawable-hdpi/tab_indicator_divider.9.png \
   res/drawable-hdpi/tab_indicator_selected.9.png \
   res/drawable-hdpi/tab_indicator_selected_focused.9.png \
   res/drawable-hdpi/tab_new.png \
   res/drawable-hdpi/tab_new_pb.png \
   res/drawable-hdpi/tab_close.png \
   res/drawable-hdpi/tab_thumbnail_default.png \
   res/drawable-hdpi/tab_thumbnail_shadow.png \
@@ -708,16 +714,19 @@ RES_DRAWABLE_XHDPI = \
   res/drawable-xhdpi/ic_menu_close_all_tabs.png \
   res/drawable-xhdpi/ic_menu_forward.png \
   res/drawable-xhdpi/ic_menu_new_private_tab.png \
   res/drawable-xhdpi/ic_menu_new_private_tab_small.png \
   res/drawable-xhdpi/ic_menu_new_tab.png \
   res/drawable-xhdpi/ic_menu_new_tab_small.png \
   res/drawable-xhdpi/ic_menu_reload.png \
   res/drawable-xhdpi/ic_status_logo.png \
+  res/drawable-xhdpi/spinner_default.9.png \
+  res/drawable-xhdpi/spinner_focused.9.png \
+  res/drawable-xhdpi/spinner_pressed.9.png \
   res/drawable-xhdpi/tab_indicator_divider.9.png \
   res/drawable-xhdpi/tab_indicator_selected.9.png \
   res/drawable-xhdpi/tab_indicator_selected_focused.9.png \
   res/drawable-xhdpi/tab_new.png \
   res/drawable-xhdpi/tab_new_pb.png \
   res/drawable-xhdpi/tab_close.png \
   res/drawable-xhdpi/tab_thumbnail_default.png \
   res/drawable-xhdpi/tab_thumbnail_shadow.png \
@@ -1024,17 +1033,16 @@ RES_COLOR = \
   res/color/select_item_multichoice.xml \
   res/color/tabs_counter_color.xml \
   $(NULL)
 
 RES_MENU = \
   res/menu/awesomebar_contextmenu.xml \
   res/menu/gecko_app_menu.xml \
   res/menu/tabs_menu.xml \
-  res/menu/tabs_switcher_menu.xml \
   res/menu/titlebar_contextmenu.xml \
   res/menu/abouthome_topsites_contextmenu.xml \
   res/menu-v11/tabs_menu.xml \
   $(NULL)
 
 JAVA_CLASSPATH = $(ANDROID_SDK)/android.jar
 
 ifdef MOZ_CRASHREPORTER
@@ -1074,16 +1082,17 @@ MOZ_ANDROID_DRAWABLES += \
   mobile/android/base/resources/drawable/progress_spinner_9.png                 \
   mobile/android/base/resources/drawable/progress_spinner_10.png                \
   mobile/android/base/resources/drawable/progress_spinner_11.png                \
   mobile/android/base/resources/drawable/progress_spinner_12.png                \
   mobile/android/base/resources/drawable/remote_tabs_child_divider.xml          \
   mobile/android/base/resources/drawable/remote_tabs_level.xml                  \
   mobile/android/base/resources/drawable/start.png                              \
   mobile/android/base/resources/drawable/site_security_level.xml                \
+  mobile/android/base/resources/drawable/spinner.xml                            \
   mobile/android/base/resources/drawable/suggestion_selector.xml                \
   mobile/android/base/resources/drawable/tab_new_level.xml                      \
   mobile/android/base/resources/drawable/tabs_button.xml                        \
   mobile/android/base/resources/drawable/tabs_level.xml                         \
   mobile/android/base/resources/drawable/tabs_panel_indicator.xml               \
   mobile/android/base/resources/drawable/tabs_tray_bg_repeat.xml                \
   mobile/android/base/resources/drawable/tabs_tray_selected_bg_repeat.xml       \
   mobile/android/base/resources/drawable/tabs_tray_active_selector.xml          \
--- a/mobile/android/base/TabsPanel.java
+++ b/mobile/android/base/TabsPanel.java
@@ -12,26 +12,29 @@ import android.graphics.Rect;
 import android.graphics.drawable.ColorDrawable;
 import android.util.AttributeSet;
 import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.Button;
+import android.widget.AdapterView;
 import android.widget.FrameLayout;
 import android.widget.ImageButton;
 import android.widget.LinearLayout;
+import android.widget.Spinner;
 import android.widget.TabHost;
 import android.widget.TabHost.TabSpec;
 import android.widget.TabWidget;
 
 public class TabsPanel extends TabHost
                        implements GeckoPopupMenu.OnMenuItemClickListener,
-                                  LightweightTheme.OnChangeListener {
+                                  LightweightTheme.OnChangeListener,
+                                  AdapterView.OnItemSelectedListener {
     private static final String LOGTAG = "GeckoTabsPanel";
 
     public static enum Panel {
         NORMAL_TABS,
         PRIVATE_TABS,
         REMOTE_TABS
     }
 
@@ -50,29 +53,26 @@ public class TabsPanel extends TabHost
     private GeckoApp mActivity;
     private PanelView mPanel;
     private TabsPanelToolbar mToolbar;
     private TabsLayoutChangeListener mLayoutChangeListener;
 
     private static ImageButton mMenuButton;
     private static ImageButton mAddTab;
     private TabWidget mTabWidget;
-    private Button mTabsMenuButton;
+    private Spinner mTabsSpinner;
 
     private Panel mCurrentPanel;
     private boolean mIsSideBar;
     private boolean mVisible;
     private boolean mInflated;
 
     private GeckoPopupMenu mPopupMenu;
     private Menu mMenu;
 
-    private GeckoPopupMenu mTabsPopupMenu;
-    private Menu mTabsMenu;
-
     public TabsPanel(Context context, AttributeSet attrs) {
         super(context, attrs);
         mContext = context;
         mActivity = (GeckoApp) context;
 
         mCurrentPanel = Panel.NORMAL_TABS;
         mVisible = false;
 
@@ -80,21 +80,16 @@ public class TabsPanel extends TabHost
         mIsSideBar = a.getBoolean(R.styleable.TabsPanel_sidebar, false);
         a.recycle();
 
         mPopupMenu = new GeckoPopupMenu(context);
         mPopupMenu.inflate(R.menu.tabs_menu);
         mPopupMenu.setOnMenuItemClickListener(this);
         mMenu = mPopupMenu.getMenu();
 
-        mTabsPopupMenu = new GeckoPopupMenu(context);
-        mTabsPopupMenu.inflate(R.menu.tabs_switcher_menu);
-        mTabsPopupMenu.setOnMenuItemClickListener(this);
-        mTabsMenu = mTabsPopupMenu.getMenu();
-
         LayoutInflater.from(context).inflate(R.layout.tabs_panel, this);
     }
 
     @Override
     protected void onFinishInflate() {
         super.onFinishInflate();
 
         // HACK: Without this, the onFinishInflate is called twice
@@ -155,24 +150,18 @@ public class TabsPanel extends TabHost
 
         mAddTab = (ImageButton) mToolbar.findViewById(R.id.add_tab);
         mAddTab.setOnClickListener(new Button.OnClickListener() {
             public void onClick(View v) {
                 TabsPanel.this.addTab();
             }
         });
 
-        mTabsMenuButton = (Button) mToolbar.findViewById(R.id.tabs_menu);
-        mTabsMenuButton.setOnClickListener(new Button.OnClickListener() {
-            public void onClick(View view) {
-                TabsPanel.this.openTabsSwitcherMenu();
-            }
-        });
-
-        mTabsPopupMenu.setAnchor(mTabsMenuButton);
+        mTabsSpinner = (Spinner) mToolbar.findViewById(R.id.tabs_menu);
+        mTabsSpinner.setOnItemSelectedListener(this);
 
         mMenuButton = (ImageButton) mToolbar.findViewById(R.id.menu);
         mMenuButton.setOnClickListener(new Button.OnClickListener() {
             public void onClick(View view) {
                 TabsPanel.this.openTabsMenu();
             }
         });
 
@@ -192,38 +181,35 @@ public class TabsPanel extends TabHost
         if (mCurrentPanel == Panel.REMOTE_TABS)
             mMenu.findItem(R.id.close_all_tabs).setEnabled(false);
         else
             mMenu.findItem(R.id.close_all_tabs).setEnabled(true); 
 
         mPopupMenu.show();
     }
 
-    public void openTabsSwitcherMenu() {
-        mTabsPopupMenu.show();
+    @Override
+    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
+        Panel panel = TabsPanel.Panel.NORMAL_TABS;
+        if (position == 1)
+            panel = TabsPanel.Panel.PRIVATE_TABS;
+        else if (position == 2)
+            panel = TabsPanel.Panel.REMOTE_TABS;
+
+        if (panel != mCurrentPanel)
+            show(panel);
+    }
+
+    @Override
+    public void onNothingSelected(AdapterView<?> parent) {
     }
 
     @Override
     public boolean onMenuItemClick(MenuItem item) {
         switch (item.getItemId()) {
-            case R.id.tabs_normal:
-                mTabsMenuButton.setText(R.string.tabs_normal);
-                show(Panel.NORMAL_TABS);
-                return true;
-
-            case R.id.tabs_private:
-                mTabsMenuButton.setText(R.string.tabs_private);
-                show(Panel.PRIVATE_TABS);
-                return true;
-
-            case R.id.tabs_synced:
-                mTabsMenuButton.setText(R.string.tabs_synced);
-                show(Panel.REMOTE_TABS);
-                return true;
-
             case R.id.close_all_tabs:
                 for (Tab tab : Tabs.getInstance().getTabsInOrder()) {
                     Tabs.getInstance().closeTab(tab);
                 }
                 autoHidePanel();
                 return true;
 
             case R.id.new_tab:
@@ -363,16 +349,17 @@ public class TabsPanel extends TabHost
         }
 
         final boolean showAnimation = !mVisible;
         mVisible = true;
         mCurrentPanel = panel;
 
         int index = panel.ordinal();
         setCurrentTab(index);
+        mTabsSpinner.setSelection(index);
 
         mPanel = (PanelView) getTabContentView().getChildAt(index);
         mPanel.show();
 
         if (mCurrentPanel == Panel.REMOTE_TABS) {
             mAddTab.setVisibility(View.INVISIBLE);
             mMenuButton.setVisibility(View.INVISIBLE);
         } else {
new file mode 100755
index 0000000000000000000000000000000000000000..1074d958ab60b0d9842d0d0072ee5b03a2b4435a
GIT binary patch
literal 255
zc$@+M0094qP)<h;3K|Lk000e1NJLTq001KZ001%w1^@s6)>C3<0002SNkl<Zc-rmR
z%L>CF5Cza|`#*ir&=>v4Hb3OT*Ds~los=e+RGl>33vQi*4l-cVjHizl!!Uo9en}2u
z7JNg*5JL<x#1JEc@!mg_QX6qhfH>z~;uve~JwS{xohT-Th+<Iu7DL1^TI=g4L<ECo
zy?ldI#{h92f>gzzSUU!(hDm``!Jt`BDUjlr0Kr@GOo0@|;53d?AjL319Hv5wV6f?a
z4kSAUJ+hk%$%?_ty8Q)`4U+>RK0<H?UK@sC)}5-KUvDyNPBCnY%fSEu002ovPDHLk
FV1m%uWW)df
new file mode 100755
index 0000000000000000000000000000000000000000..4621389db1510c2c7d81ce7ac425a7c73e3874eb
GIT binary patch
literal 336
zc$@)H0k8gvP)<h;3K|Lk000e1NJLTq001KZ001%w1^@s6)>C3<0003ONkl<Zc-rmR
z-3kFg6bJD04oZ0_SMDh!AGyGiug5ULBe>WP3iqDD3ux_n1y_S2L+mbg=S-Ya|C*YM
z`PJN<&H?Z)E<{f80mL|i8Xv;&bRJ7imyaQF!!T$dAZ}sM6EP!X%t-tu@ggZP?D{TY
z{4iV*3@3~i1_(nK!Vrcqg!xy@c3$ltCh-(H<_y`ar%QB<J*#%lkW*Hu7!iVsv1gS#
z2pYz=N}Wdt3dS+Z?Pn0_7{@HWgh<8gtU}8RA`KG+A_e1G`DPGE<d_R&5d;z`#x--=
zJCMjQu90oL3yB2d8kvtEp<^69UH=pkDrT=|YTrOY!-N4rZy~4${xuAZUVSi1jq4d`
i>MSx;TJfl|{5k^0UIGSzz#c0A0000<MNUMnLSTaF>4Vn*
new file mode 100755
index 0000000000000000000000000000000000000000..d2ba6db540c168eedb959823a0c2ae34d97ee84e
GIT binary patch
literal 319
zc$@)00l@x=P)<h;3K|Lk000e1NJLTq001KZ001%w1^@s6)>C3<00037Nkl<Zc-rmR
zISRs15C-7st!zAwiV7~^No=(A6e=c>6t>w4_cGVeCRd1w2N0eH1QQ{Pn!I`F4E#*{
zmBai1$-_e7GfaUplVNn<3X?$P8U@B|0hKUjz#S3IFpQZXW27fWhAA>eB}^KI34&pS
zNx}eO2tydc5QZ@SiaDG8!&NOU(J=wUv1ccAjBEAw0mQNAxR@{m72{gn2m}q|8lBxM
z1O*cZ;g0dl_BIZ}731lxL<l!b76=!Nr#ClQAcbQdkYg4|p%~w2tlxnYhVixf+mJ#q
zzE=APk~_xNs;f^SxneF~LUP080YN_@=m!2Z482}cFhafS1uHVdsdz*wziu-qAE<Jn
RfLs6o002ovPDHLkV1n4#eN+Gd
new file mode 100755
index 0000000000000000000000000000000000000000..1bc9e6025f2ee2cbeab396afcfc6deb932da11b3
GIT binary patch
literal 307
zc%17D@N?(olHy`uVBq!ia0vp^dO+;N!3HEX`k#masb8Khjv*Dd-rkDjI%FWy`tY4s
z;GBX(m6fliU0N2M<uA{o$+vapyQ!a@=lu@MW70gkDKB*GQHkUp%kWH7VZR^sedZ5a
zg#9dFgxo5d^ZKtIILzPpZq<Wpw}P9)SlNI5a9G_a?pj#kwz`3NXa3@&hZ*neb?R<Q
zUbg-Hg`|fwUY=Fo;$ac+IzOYZpdl>w!lDPMk$Srq9X%jzV)ocqR7Se+qqdc$Ohcu7
zNze|%v}@vXdHQC~+qGcw0mgYd7A-#f@xVs@l8_z#B_<YTk4~staqV$@yk_4o7xwnY
zy8O-ynh!C`wK%Qb{q(c9*uxg%V-m$SA6)<bh+{r<d!v(~Vt^bl6c{{R{an^LB{Ts5
DM%;z>
new file mode 100755
index 0000000000000000000000000000000000000000..3f2fe676026abc1ef180e2700424b524ebde79cf
GIT binary patch
literal 417
zc$@*D0bc%zP)<h;3K|Lk000e1NJLTq001rk002S=1^@s6D39b80004KNkl<Zc-rmS
zIZne+6oui-%Af!`3bp_UF(_h6APHd#6o?85J5shlgB=ghvj%$Nn0OhF7zL340Xv@V
zmCln+^QzCKpMIifM|~TQqZG|3ofcJ#Zj?rCrn?^a=EvcK3&!B_wP^MW9)67!xK7Pc
zcv}$sb~0S2B{tJ&8F0W8!j(X{0vzxdZ~`1~zySvwaKHfv9B{w^5BKWUuf)MU=lJsF
z`Tj{1+;eIlXi;#_t~Ni>V&Gl(=wcKt0^YSNKhW&qU8{Wl8=5t|=j@+NLbHYU?7h>!
z&@ADey?gQ>njPG;b{bL8tl*wiii~ChAEF;c!TnCD9v59W-0y5pg)S8Co13+1(S^bL
z##S{6x)6BZ*hq}d9sXvnAEtrM6`m$KH+W#KRnkP~0w1E?G|`#E17o$E1v*oB@UU`_
z6<XY1K3=i_2OMb=;3>id1(QM()v#oi0>7g<c^S4w3$YV(ZsGeoTp|ZOg%*8t00000
LNkvXXu0mjfnYgrl
new file mode 100755
index 0000000000000000000000000000000000000000..92fc7365cc78199e77b06f28de5dc3f2c9ab4cda
GIT binary patch
literal 393
zc$@)=0e1e0P)<h;3K|Lk000e1NJLTq001rk002S=1^@s6D39b80003{Nkl<Zc-rmS
zOHRU26b9hK${>o*#9#z;KaPwe4UdEk2;36E7i!`*Wa0{FOIgCD4H&E_w9v;n;Xlbg
zIiv3m@5xUTZ1k`27_BLzYqYQHbgiq@V45q}m-oZn1!J&3b;{1+-fN`5YjpV&-Vg-8
z0UYpcfop+q4LIN--~>3}fCCOV;D7@TIN*Q-?qzs?@h%QN?3}-SeN+ab;N}c13T_(Z
z*Kf2KxM`GpXc2JJI9ouohg(Lm{}-Ay+)}46|DoB!Emc^GW(gmula*+8a2Nd?1kDOQ
zY6nNNfltx515t2W9Y2Ldrw+H((OT$K;dblrab0w3@J-RFz@7HN!=~uO;Z8Fj2|7`D
zl<36ZPII>xB{~uK4E-4;I(GQDwbP9Q9V>i%mx~Q8?w5~C7T|!R+64G^!i82;y(Y61
nc!hHEYS>lU3tchiR(ziTz+464RLd5000000NkvXXu0mjf-R-Tk
new file mode 100644
--- /dev/null
+++ b/mobile/android/base/resources/drawable/spinner.xml
@@ -0,0 +1,17 @@
+<?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/. -->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <item android:state_pressed="true"
+          android:drawable="@drawable/spinner_pressed"/>
+
+    <item android:state_pressed="false"
+          android:state_focused="true"
+          android:drawable="@drawable/spinner_focused"/>
+
+    <item android:drawable="@drawable/spinner_default"/>
+
+</selector>
new file mode 100755
index 0000000000000000000000000000000000000000..39d82b27adb8367670515f832937edc846066b60
GIT binary patch
literal 195
zc%17D@N?(olHy`uVBq!ia0vp^5<slP!3HE<r%4(EsV+|!$B>F!Z>M;2H5l-?R-3EO
zIsbg7Rm{pdN5>^unUh<$%5OSTt*R(`NOpI)pVG!VIlnI+Pj?ji<FBxE&P|pE{}rvS
z3%1IcTXZvgc-SzRdrHt>Nk1)yHM<X;WMSB<XVJ-Eod52@MW!=*>YCg+FU0IU*vy)t
vQ~SV?DcR>Cclz!pPxil_v*YOmoeb8WSC|^sGN%0jx{ATm)z4*}Q$iB}l=w^>
new file mode 100755
index 0000000000000000000000000000000000000000..496c5a18ce9d14ba9e17e8dc1c65005e3e7138a6
GIT binary patch
literal 260
zc$@(Q0sH=mP)<h;3K|Lk000e1NJLTq000;O001Hg1^@s6MV1*e0002XNkl<Zc-muN
zzz+UHF?GQI$qerQr!Y(b;+a&zQyC@$X;*{=)HEDn$wXueV1m9>!BF$)X2E|NTJWDP
z7BGxjFlxc51=O+N!M3UvnpyB@YjyM0!>e}C#DYg#E5U}-#DYg#Dw<%1Q{94x+sYe}
z4X3IF54V(J7)~_{9&Rpaz-BmAEO@-Ns2-Q$6kG6kOJN;8!zr@h(UyW*LWYxV!K2Oj
zHN+TBmIaSC=Mrr=&2sWUm!=HE#{wERereHspUU8dx644S4hR6~fzfljSh<=20000<
KMNUMnLSTY7No|h+
new file mode 100755
index 0000000000000000000000000000000000000000..e86b405dddcab78d04c6399f6aecb68f118cc009
GIT binary patch
literal 248
zc$@+F00;kxP)<h;3K|Lk000e1NJLTq000;O001Hg1^@s6MV1*e0002LNkl<Zc-rmP
zOAdlC5P;#ioU$?+K|Pl#EI0zKapg1d9Bw!PZ8*c&1q6(U1ZKK0Z8Bl^f2)!yK=;9F
zXbuVpFoxJpN-_xu`<*oaWxPT5Z6M_sX8<w+=mY={c)$ZRKylpN*?{7(z2y(_WC3&)
zX92X@T<bVFpjGr1Ck3=xf5gcEqryv9oCGj(b^aEg3>dlWjZXqfx%e3$4cPc;NPHAf
yX2aubH~H^>*X~wF=H-`TeNSNC`(&VcfV==d^-;t%6wamq0000<MNUMnLSTY+uwc3X
--- a/mobile/android/base/resources/layout-xlarge-v11/tabs_panel_toolbar_menu.xml
+++ b/mobile/android/base/resources/layout-xlarge-v11/tabs_panel_toolbar_menu.xml
@@ -5,24 +5,25 @@
 
 <merge xmlns:android="http://schemas.android.com/apk/res/android">
 
     <TabWidget android:id="@android:id/tabs"
                android:layout_width="0dip"
                android:layout_height="0dip"
                android:visibility="gone"/>
 
-    <Button android:id="@+id/tabs_menu"
-            android:layout_width="0dip"
-            android:layout_height="fill_parent"
-            android:layout_weight="1.0"
-            android:text="@string/tabs_normal"
-            android:textColor="#FFFFFFFF"
-            android:textSize="18sp"
-            android:background="@drawable/action_bar_button"/>
+    <Spinner android:id="@+id/tabs_menu"
+             android:layout_width="0dip"
+             android:layout_height="fill_parent"
+             android:layout_weight="1.0"
+             android:background="@drawable/spinner"
+             android:popupBackground="@drawable/menu_popup_bg"
+             android:dropDownHorizontalOffset="0dip"
+             android:dropDownSelector="@drawable/action_bar_button"
+             android:entries="@array/tabs_panel_spinner"/>
 
     <ImageButton android:id="@+id/add_tab"
                  android:layout_width="@dimen/browser_toolbar_height"
                  android:layout_height="@dimen/browser_toolbar_height"
                  android:paddingTop="15dip"
                  android:paddingBottom="15dip"
                  android:paddingLeft="20dip"
                  android:paddingRight="20dip"
--- a/mobile/android/base/resources/layout/tabs_panel_toolbar_menu.xml
+++ b/mobile/android/base/resources/layout/tabs_panel_toolbar_menu.xml
@@ -7,20 +7,20 @@
 
     <TabWidget android:id="@android:id/tabs"
                android:layout_width="0dip"
                android:layout_height="fill_parent"
                android:layout_weight="1.0"
                android:tabStripEnabled="false"
                android:divider="@drawable/tab_indicator_divider"/>
 
-    <Button android:id="@+id/tabs_menu"
-            android:layout_width="0dip"
-            android:layout_height="0dip"
-            android:visibility="gone"/>
+    <Spinner android:id="@+id/tabs_menu"
+             android:layout_width="0dip"
+             android:layout_height="0dip"
+             android:visibility="gone"/>
 
     <ImageButton android:id="@+id/add_tab"
                  style="@style/AddressBar.ImageButton"
                  android:layout_width="@dimen/browser_toolbar_height"
                  android:layout_height="@dimen/browser_toolbar_height"
                  android:padding="@dimen/browser_toolbar_button_padding"
                  android:src="@drawable/tab_new_level"
                  android:contentDescription="@string/new_tab"
deleted file mode 100644
--- a/mobile/android/base/resources/menu/tabs_switcher_menu.xml
+++ /dev/null
@@ -1,17 +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/. -->
-
-<menu xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <item android:id="@+id/tabs_normal"
-          android:title="@string/tabs_normal"/>
-
-    <item android:id="@+id/tabs_private"
-          android:title="@string/tabs_private"/>
-
-    <item android:id="@+id/tabs_synced"
-          android:title="@string/tabs_synced"/>
-
-</menu>
--- a/mobile/android/base/resources/values-v11/styles.xml
+++ b/mobile/android/base/resources/values-v11/styles.xml
@@ -58,9 +58,27 @@
          <item name="android:displayOptions">showHome|homeAsUp|showTitle</item>
     </style>
  
     <!-- TabsTray ActionBar -->
     <style name="ActionBar.TabsTray">
          <item name="android:visibility">gone</item>
     </style>
 
+    <!-- DropDown List View -->
+    <style name="DropDownListView" parent="@android:style/Widget.Holo.ListView.DropDown">
+         <item name="android:listSelector">@drawable/action_bar_button</item>
+         <item name="android:divider">#FFD1D5DA</item>
+         <item name="android:dividerHeight">1dp</item>
+    </style>
+
+    <!-- Spinner Item -->
+    <style name="SpinnerItem" parent="@android:style/Widget.Holo.Light.TextView.SpinnerItem">
+         <item name="android:textColor">#FFFFFFFF</item>
+         <item name="android:textSize">18sp</item>
+    </style>
+
+    <!-- Spinner DropDown Item -->
+    <style name="SpinnerDropDownItem" parent="@android:style/Widget.Holo.DropDownItem.Spinner">
+         <item name="android:textColor">#FF222222</item>
+    </style>
+
 </resources>
--- a/mobile/android/base/resources/values-v11/themes.xml
+++ b/mobile/android/base/resources/values-v11/themes.xml
@@ -41,17 +41,20 @@
     <style name="Gecko.Translucent" parent="@android:style/Theme.Translucent">
         <item name="android:windowActionBar">true</item>
         <item name="android:windowNoTitle">false</item>
     </style>
 
     <style name="Gecko.App">
         <item name="android:windowBackground">@drawable/abouthome_bg_repeat</item>
         <item name="android:panelBackground">@drawable/menu_panel_bg</item>
+        <item name="android:dropDownListViewStyle">@style/DropDownListView</item>
         <item name="android:listViewStyle">@style/GeckoList</item>
+        <item name="android:spinnerItemStyle">@style/SpinnerItem</item>
+        <item name="android:spinnerDropDownItemStyle">@style/SpinnerDropDownItem</item>
     </style>
 
     <style name="Gecko.Light.AwesomeBar">
         <item name="android:actionBarStyle">@style/ActionBar.AwesomeBar</item>
     </style>
 
     <style name="Gecko.TitleBar.Preferences">
         <item name="android:actionBarStyle">@style/ActionBar.GeckoPreferences</item>
--- a/mobile/android/base/resources/values/arrays.xml
+++ b/mobile/android/base/resources/values/arrays.xml
@@ -91,9 +91,14 @@
         <item>@string/pref_update_autodownload_wifi</item>
         <item>@string/pref_update_autodownload_disabled</item>
     </string-array>
     <string-array name="pref_update_autodownload_values">
         <item>enabled</item>
         <item>wifi</item>
         <item>disabled</item>
     </string-array>
+    <string-array name="tabs_panel_spinner">
+        <item>@string/tabs_normal</item>
+        <item>@string/tabs_private</item>
+        <item>@string/tabs_synced</item>
+    </string-array>
 </resources>