From e02d808abf370965c3c4e4d38af11bc69110fde2 Mon Sep 17 00:00:00 2001 From: Daniel Sandler Date: Fri, 8 Oct 2010 15:13:22 -0400 Subject: [PATCH] Dynamically show the menu button on the system bar. Windows with FLAG_NEEDS_MENU_KEY (or windowNeedsMenuKey=true in their theme) will cause the system bar to show a menu icon. (Note that the phone's status bar currently ignores this, but phones tend to have hardware menu keys anyway.) Additionally, all windows whose package's SDK version is pre-Honeycomb will have FLAG_NEEDS_MENU_KEY set by default. Bug: 3003728 Change-Id: I2d983763a726ea4f32cd1af9b0390e30478b11d1 --- core/java/android/view/WindowManager.java | 13 +++++++ .../internal/statusbar/IStatusBar.aidl | 1 + .../internal/statusbar/IStatusBarService.aidl | 3 +- .../SystemUI/res/layout-xlarge/status_bar.xml | 1 + .../systemui/statusbar/CommandQueue.java | 13 +++++++ .../statusbar/PhoneStatusBarService.java | 3 ++ .../systemui/statusbar/StatusBarService.java | 13 ++++--- .../tablet/TabletStatusBarService.java | 11 ++++++ .../internal/policy/impl/PhoneWindow.java | 6 ++++ .../policy/impl/PhoneWindowManager.java | 35 ++++++++++++++++--- .../server/StatusBarManagerService.java | 33 +++++++++++++++-- 11 files changed, 120 insertions(+), 12 deletions(-) diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java index eddd04ebd3144..7cb4671b4ae26 100644 --- a/core/java/android/view/WindowManager.java +++ b/core/java/android/view/WindowManager.java @@ -611,6 +611,19 @@ public interface WindowManager extends ViewManager { * {@hide} */ public static final int FLAG_SPLIT_TOUCH = 0x00800000; + /** + * Flag for a window belonging to an activity that responds to {@link KeyEvent#KEYCODE_MENU} + * and therefore needs a Menu key. For devices where Menu is a physical button this flag is + * ignored, but on devices where the Menu key is drawn in software it may be hidden unless + * this flag is set. + * + * (Note that Action Bars, when available, are the preferred way to offer additional + * functions otherwise accessed via an options menu.) + * + * {@hide} + */ + public static final int FLAG_NEEDS_MENU_KEY = 0x01000000; + /** Window flag: *sigh* The lock screen wants to continue running its * animation while it is fading. A kind-of hack to allow this. Maybe * in the future we just make this the default behavior. diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl index e884af824eb29..34a5b118626ed 100644 --- a/core/java/com/android/internal/statusbar/IStatusBar.aidl +++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl @@ -31,5 +31,6 @@ oneway interface IStatusBar void animateExpand(); void animateCollapse(); void setLightsOn(boolean on); + void setMenuKeyVisible(boolean visible); } diff --git a/core/java/com/android/internal/statusbar/IStatusBarService.aidl b/core/java/com/android/internal/statusbar/IStatusBarService.aidl index 0763f5e6938ac..90f4d480ff2ee 100644 --- a/core/java/com/android/internal/statusbar/IStatusBarService.aidl +++ b/core/java/com/android/internal/statusbar/IStatusBarService.aidl @@ -31,12 +31,13 @@ interface IStatusBarService void setIconVisibility(String slot, boolean visible); void removeIcon(String slot); void setActiveWindowIsFullscreen(boolean fullscreen); + void setMenuKeyVisible(boolean visible); // ---- Methods below are for use by the status bar policy services ---- // You need the STATUS_BAR_SERVICE permission void registerStatusBar(IStatusBar callbacks, out StatusBarIconList iconList, out List notificationKeys, out List notifications, - out boolean[] lightsOn); + out boolean[] switches); void onPanelRevealed(); void onNotificationClick(String pkg, String tag, int id); void onNotificationError(String pkg, String tag, int id, diff --git a/packages/SystemUI/res/layout-xlarge/status_bar.xml b/packages/SystemUI/res/layout-xlarge/status_bar.xml index 494dfa88b727b..295c79b72a5d9 100644 --- a/packages/SystemUI/res/layout-xlarge/status_bar.xml +++ b/packages/SystemUI/res/layout-xlarge/status_bar.xml @@ -144,6 +144,7 @@ android:paddingLeft="4dip" android:paddingRight="4dip" systemui:keyCode="82" + android:visibility="invisible" /> notificationKeys, List notifications, - boolean lightsOn[]) { + boolean switches[]) { enforceStatusBarService(); Slog.i(TAG, "registerStatusBar bar=" + bar); @@ -332,7 +360,8 @@ public class StatusBarManagerService extends IStatusBarService.Stub } } synchronized (mLock) { - lightsOn[0] = mLightsOn; + switches[0] = mLightsOn; + switches[1] = mMenuVisible; } }