From f1ff209523a2474cb0e7aab0e083596c4afbe37f Mon Sep 17 00:00:00 2001 From: Jason Monk Date: Tue, 29 Apr 2014 16:50:53 -0400 Subject: [PATCH] Add IME Switcher icon to Navigation Bar Adds button in the same location as the menu button and overrides it when present. The setNavigationHintIconHints lets it know when the button should be shown. Bug: 14257632 Change-Id: Ia80de7fd2390cd8b083e37cbe58b7ee53555e619 --- core/java/android/app/StatusBarManager.java | 1 + .../drawable-hdpi/ic_ime_switcher_default.png | Bin 0 -> 755 bytes .../drawable-mdpi/ic_ime_switcher_default.png | Bin 0 -> 642 bytes .../ic_ime_switcher_default.png | Bin 0 -> 1012 bytes .../ic_ime_switcher_default.png | Bin 0 -> 1183 bytes .../res/layout-ldrtl/navigation_bar.xml | 66 ++++++++++++----- .../res/layout-sw600dp/navigation_bar.xml | 70 +++++++++++++----- .../SystemUI/res/layout/navigation_bar.xml | 68 ++++++++++++----- .../SystemUI/res/values-sw600dp/dimens.xml | 3 + packages/SystemUI/res/values/dimens.xml | 4 +- .../statusbar/phone/NavigationBarView.java | 28 ++++++- .../statusbar/phone/PhoneStatusBar.java | 19 +++-- 12 files changed, 192 insertions(+), 67 deletions(-) create mode 100644 packages/SystemUI/res/drawable-hdpi/ic_ime_switcher_default.png create mode 100644 packages/SystemUI/res/drawable-mdpi/ic_ime_switcher_default.png create mode 100644 packages/SystemUI/res/drawable-xhdpi/ic_ime_switcher_default.png create mode 100644 packages/SystemUI/res/drawable-xxhdpi/ic_ime_switcher_default.png diff --git a/core/java/android/app/StatusBarManager.java b/core/java/android/app/StatusBarManager.java index 5cf61a8d8c8e7..ce5306ffda4b4 100644 --- a/core/java/android/app/StatusBarManager.java +++ b/core/java/android/app/StatusBarManager.java @@ -60,6 +60,7 @@ public class StatusBarManager { | DISABLE_SEARCH; public static final int NAVIGATION_HINT_BACK_ALT = 1 << 0; + public static final int NAVIGATION_HINT_IME_SHOWN = 1 << 1; public static final int WINDOW_STATUS_BAR = 1; public static final int WINDOW_NAVIGATION_BAR = 2; diff --git a/packages/SystemUI/res/drawable-hdpi/ic_ime_switcher_default.png b/packages/SystemUI/res/drawable-hdpi/ic_ime_switcher_default.png new file mode 100644 index 0000000000000000000000000000000000000000..369c88d317077da652b1bfe3414e97c0ef5114c4 GIT binary patch literal 755 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8JTQT2VH~qM8*V|n`BJOT@DgHXCVab~uu^Ea6?p_@s$xJ)k5~g`32+df` z?8Epur18{CCeJHh+rwkhStFGuxO!Q#*cthD^L?0UZt{{*-s9$Cui1Q0zju8)dge|Y zm)RM&fUJ1a=Q3+=e>-6MapJD6p82t&azm1 zrA={G_7pzl-l8wJms!7JF1%d(wR2|lyQqrutD@hnDqp+%apUcG)h}*oxCeXipI9Wk z;-a#;YCu0rsb9u~BmZ+-7N=&3h&-ub67yW~d7kjR;KVLbotHCQSBW^N&Rf55@_`AH zYc8C;8B;&0Xr~r~sMVcEy17~`ei|MRWDc@O-&x|iNFY_fU}a>YYhZ3=U~t$v52zkVLvDUbW?Cgw zgN3fKL5Pu|m65TPfdxdv#;^Xfff^)1HU#IVm6RtIr7}3C*?y}vd$@?2>>xVF*X1I literal 0 HcmV?d00001 diff --git a/packages/SystemUI/res/drawable-mdpi/ic_ime_switcher_default.png b/packages/SystemUI/res/drawable-mdpi/ic_ime_switcher_default.png new file mode 100644 index 0000000000000000000000000000000000000000..7d97eb575f2a88418617eb47307ef45621f9dc2c GIT binary patch literal 642 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1rX+877l!}s{b%+Ad7K3vkswhI zFm^kcZ3hx8D{xE)(qO#|6+TOsF)%Q8dAc};Se$-3$u@g(qDb5N$C?d zbvkTPng<)4UEf}CEZp$_fa8_@5BUXRwOGtQiiZd&>R#(l3zTuWaL~&%z-!{ISGW7k zr#mYLia45olsi{+f6i-}bB+H492*>*{1)`{O)6RaM5SdNv*kbDLoRE6AL*K&TX}Jn zu72dk%)^fP*2z~_-}^qV)UcCffzRB#AuA0}+n7e}d8ESrB7Ke`o5e8+1J0JWvR!W; z8cR=UFbz`57SY(`wcv=A^q1g-nLGwv!mH+eT2^&9@aweXS554>tC#OxH%~Zu3G<$( zdK(US&$4-<+&^QX@8st?#zzI-&rI$rcTks@;MjKZ#_{AbgEKby5~|6w9#5$}5T~_f z(&r{sr~D;8vgJX!6>+)MS6siYDc|+3MPfVWZ_9&LuFGy76^z^L(knX8(5cgsuW&}s zlt?=Pr}uJCVjl8zPtn-ml%hWW#*#Cp^Dc>7-EZnRn4x8M#drVpX;qFsy=)WZ7!{U& zxV)cb-v(FxAII|b1|Gaj4wUlBF*LI>Hn1`>(KRr)GB7x7od;Bpq#-vyB{QuOs=-3n*dWBn(8|cz%D@7m zVdGc-*+31FARB`7(@M${i&7aJQ}UBi6+Ckj(^G>|6H_V+Po~;{jP-Q&b6Mw<&;$UG CmHdzZ literal 0 HcmV?d00001 diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_ime_switcher_default.png b/packages/SystemUI/res/drawable-xhdpi/ic_ime_switcher_default.png new file mode 100644 index 0000000000000000000000000000000000000000..900801a4d3d70770be92a21c71f59d0534d14790 GIT binary patch literal 1012 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}a}trX+877l!}s{b%+Ad7K3vk;OpT z1B~5HX4`=T%L*LRfizez!?|}o;XrMFJY5_^A`ZX3X5Sy}D#H5V{+a4;R+=3Qu3a1* z=NlXX7rhk}acExA(B*N#(eo{F%Sc*_J=Ei=WLZ7Lm~SUoP{L;G`8QE?G*abN6^&e0RS1 z*otVo^)uJpW>4o`HqS8J@y*HdYm&RKO}-LsnsU_hc;W3*|7yR9D%$TN%6t}oY7SMm zS$e`O_K0_uYuRzH)hD~&Op`CKaBJToA}A={u|1i4y#l9Q_-W#!du5lZjwPft1gi8lPFxeD zBq=4aAoFKLu5gaWv8=-@mn{yI+*s-rhVGiE=#UmUMm<8E))FS6dv{@SCsFOQ#k zd`$iFIPc5jUXMbxUmL~#?hu_@Ve$?ryI4M5>8SR_e)~o8^98@YlPmesqdGOOYsHt4 zOu4v+^dr3Ks98>IX~B$|TyO_O&by z+I{=z#IWKOSKmvBT277lw!~r6t6h)hxvK7b)+gMzuSahuJ(_ zqO^PFI#<8c`GFq|HdKd%NWHgSdP1%FO&h;%wf|xdyTYUF^9(25DZiyS|CPk5H9u}} z-!pQ{b3ZC7ztY6|{-SQfZto+nFJH}kw0l~H_Bi&)FOORewv%So~HwTgUd5Ih6hA;hMwZpv0*Bk4a?i$5}64 z|KJB^3e^(Vh?11Vl2ohYqEsNoU}RuusB2)UYh)f`Xl7+>U}a>YYhZ3=U~t$v52zkV zLvDUbW?CgwgN3fKL5Pu|m65TPfdxdv#;^Xfff^)1HU#IVm6RtIr7}3C*?y}vd$@?2>_4ry$ApR literal 0 HcmV?d00001 diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_ime_switcher_default.png b/packages/SystemUI/res/drawable-xxhdpi/ic_ime_switcher_default.png new file mode 100644 index 0000000000000000000000000000000000000000..6c8222ec50b7273ad4902efa914af497c28203cc GIT binary patch literal 1183 zcmbVMO=uKJ6z*u&OE+Nm(9{B9xWV^b;pWop-!}Bxx|{H1_o=crcWRY#?ZKFr|AFh&(pv( zQuOh7fi1XMR55eY9vYb*D(TY`x@6FUKY)RnOaLr|HBhrAZC|dX=mxG#*5NiogN6#8 zNYPDFqlICRbvy*(Q8uEp2^J){C?~{3Q9J;6mSY)~XE;8>iL$`UEDKs6O}u$VSuQGS z%NLPSbOmEqW|$xdqJa=~ym5w;Bq_w;`3TX7_)|94Y7yJ-ZzCwk*FDq4relK;Q5$or zI7Jht%@8cNP*?@F{Z^t#%9xtwGF+5pEGvwwq3z=$`b1-0ZND_-BBqFZr|RkCKFa-V zW0Jd#9fgX7jeOKI$)#wMilbL8WaGS&qRC0rFb!EuvT;5m!c3Ou5=oAe;wn_tbOI`p z0-?aQG1jw<39KTfGio-IRyYo_lE}x@xRQw_pa5gM)V9srKGtjCAmWDF+hmaXwQIb#SJCM=FM#nRp)6&Nm8OP>g<&4X;xF&=4+%ejAh zNn0)Cm2|20Y-RaLcOC5fV)5+HiOPqmYY%%)&2KmNUEKNSS2N%4`sMo{&;E7=K3?8N zZR+gW1`gJ#?r`WJ((mEc;!pLL=Wnh&fA7u*C$Il~cd59%zxS^b&z3r+u{t%g@7C#s z@46P3rWbRA=E-}(>vvD9&*eY*UR~+fbmPmb1WLUyJR2z47gyh;_MQ&#gF9=^%Kxma z?3ue`T-wbYtiJ_2zG*rRX>>NY5E?nE - + android:layout_weight="0" > + + + @@ -187,16 +200,29 @@ > - + + + + - + android:layout_marginEnd="2dp" > + + + @@ -184,7 +199,7 @@ - + android:layout_weight="0" > + + + diff --git a/packages/SystemUI/res/layout/navigation_bar.xml b/packages/SystemUI/res/layout/navigation_bar.xml index 23988493b24ac..74704090aa5a6 100644 --- a/packages/SystemUI/res/layout/navigation_bar.xml +++ b/packages/SystemUI/res/layout/navigation_bar.xml @@ -88,16 +88,31 @@ systemui:glowBackground="@drawable/ic_sysbar_highlight" android:contentDescription="@string/accessibility_recent" /> - + android:layout_weight="0" > + + + + + @@ -190,18 +205,33 @@ android:id="@+id/nav_buttons" android:animateLayoutChanges="true" > - + - + android:layout_width="match_parent" + android:layout_height="40dp" > + + + + + 280dip + + 48dip + 200dp 177dp diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 176879ea15567..aadeebe73e51d 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -128,8 +128,8 @@ 80dip - - 40dip + + 40dip 40dip diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java index 3fae3f06fa6a7..089757a087fc6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java @@ -39,6 +39,7 @@ import android.view.ViewGroup; import android.view.WindowManager; import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityManager.TouchExplorationStateChangeListener; +import android.view.inputmethod.InputMethodManager; import android.widget.ImageView; import android.widget.LinearLayout; @@ -142,6 +143,14 @@ public class NavigationBarView extends LinearLayout { } }; + private final OnClickListener mImeSwitcherClickListener = new OnClickListener() { + @Override + public void onClick(View view) { + ((InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE)) + .showInputMethodPicker(); + } + }; + private class H extends Handler { public void handleMessage(Message m) { switch (m.what) { @@ -233,6 +242,10 @@ public class NavigationBarView extends LinearLayout { return mCurrentView.findViewById(R.id.home); } + public View getImeSwitchButton() { + return mCurrentView.findViewById(R.id.ime_switcher); + } + // for when home is disabled, but search isn't public View getSearchLight() { return mCurrentView.findViewById(R.id.search_light); @@ -283,6 +296,12 @@ public class NavigationBarView extends LinearLayout { ((ImageView)getRecentsButton()).setImageDrawable(mVertical ? mRecentLandIcon : mRecentIcon); + final boolean showImeButton = ((hints & StatusBarManager.NAVIGATION_HINT_IME_SHOWN) != 0); + getImeSwitchButton().setVisibility(showImeButton ? View.VISIBLE : View.INVISIBLE); + // Update menu button in case the IME state has changed. + setMenuVisibility(mShowMenu, true); + + setDisabledFlags(mDisabledFlags, true); } @@ -363,7 +382,10 @@ public class NavigationBarView extends LinearLayout { mShowMenu = show; - getMenuButton().setVisibility(mShowMenu ? View.VISIBLE : View.INVISIBLE); + // Only show Menu if IME switcher not shown. + final boolean shouldShow = mShowMenu && + ((mNavigationIconHints & StatusBarManager.NAVIGATION_HINT_IME_SHOWN) == 0); + getMenuButton().setVisibility(shouldShow ? View.VISIBLE : View.INVISIBLE); } @Override @@ -379,6 +401,8 @@ public class NavigationBarView extends LinearLayout { mCurrentView = mRotatedViews[Surface.ROTATION_0]; + getImeSwitchButton().setOnClickListener(mImeSwitcherClickListener); + watchForAccessibilityChanges(); } @@ -424,6 +448,8 @@ public class NavigationBarView extends LinearLayout { mCurrentView = mRotatedViews[rot]; mCurrentView.setVisibility(View.VISIBLE); + getImeSwitchButton().setOnClickListener(mImeSwitcherClickListener); + mDeadZone = (DeadZone) mCurrentView.findViewById(R.id.deadzone); // force the low profile & disabled states into compliance diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index 545352c2a40e8..e154b24487460 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -18,6 +18,7 @@ package com.android.systemui.statusbar.phone; import static android.app.StatusBarManager.NAVIGATION_HINT_BACK_ALT; +import static android.app.StatusBarManager.NAVIGATION_HINT_IME_SHOWN; import static android.app.StatusBarManager.WINDOW_STATE_HIDDEN; import static android.app.StatusBarManager.WINDOW_STATE_SHOWING; import static android.app.StatusBarManager.windowStateToString; @@ -2211,12 +2212,20 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { @Override public void setImeWindowStatus(IBinder token, int vis, int backDisposition) { - boolean altBack = (backDisposition == InputMethodService.BACK_DISPOSITION_WILL_DISMISS) - || ((vis & InputMethodService.IME_VISIBLE) != 0); + boolean imeShown = (vis & InputMethodService.IME_VISIBLE) != 0; + int flags = mNavigationIconHints; + if ((backDisposition == InputMethodService.BACK_DISPOSITION_WILL_DISMISS) || imeShown) { + flags |= NAVIGATION_HINT_BACK_ALT; + } else { + flags &= ~NAVIGATION_HINT_BACK_ALT; + } + if (imeShown) { + flags |= NAVIGATION_HINT_IME_SHOWN; + } else { + flags &= ~NAVIGATION_HINT_IME_SHOWN; + } - setNavigationIconHints( - altBack ? (mNavigationIconHints | NAVIGATION_HINT_BACK_ALT) - : (mNavigationIconHints & ~NAVIGATION_HINT_BACK_ALT)); + setNavigationIconHints(flags); if (mQS != null) mQS.setImeWindowStatus(vis > 0); }