From 0c4ccff36930ff4f0292b94ad51e164c9fa060a3 Mon Sep 17 00:00:00 2001 From: Daniel Sandler Date: Wed, 19 Oct 2011 16:39:14 -0400 Subject: [PATCH] Add hasNavigationBar() to the window manager. It is no longer sufficient to check the value of internal.R.bool.config_showNavigationBar to determine if a navigation bar (separate from the status bar) is shown on a device, because the emulator needs to be able to override this value (now possible by setting qemu.hw.mainkeys to "1" or "0", for navbar or no navbar, respectively). This logic is now contained in PhoneWindowManager, and any clients wishing to know whether the system has a software nav bar should consult the new hasNavigationBar() method. Bug: 5404945 Change-Id: I119d32a8c84b88b2ef46f63244e7f11dc5de0359 --- core/java/android/view/IWindowManager.aidl | 5 +++++ core/java/android/view/ViewConfiguration.java | 3 +-- core/java/android/view/WindowManagerPolicy.java | 5 +++++ .../systemui/statusbar/phone/PhoneStatusBar.java | 6 +++--- .../systemui/statusbar/tablet/TabletStatusBar.java | 13 ++++++++----- .../internal/policy/impl/PhoneWindowManager.java | 14 ++++++++++++++ .../android/server/wm/WindowManagerService.java | 5 +++++ .../bridge/android/BridgeWindowManager.java | 4 ++++ 8 files changed, 45 insertions(+), 10 deletions(-) diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl index fe32a5f196a41..93a9d50ac4790 100644 --- a/core/java/android/view/IWindowManager.aidl +++ b/core/java/android/view/IWindowManager.aidl @@ -224,4 +224,9 @@ interface IWindowManager * Block until the given window has been drawn to the screen. */ void waitForWindowDrawn(IBinder token, in IRemoteCallback callback); + + /** + * Device has a software navigation bar (separate from the status bar). + */ + boolean hasNavigationBar(); } diff --git a/core/java/android/view/ViewConfiguration.java b/core/java/android/view/ViewConfiguration.java index 5e104f9e373fa..3441f7e57d7fa 100644 --- a/core/java/android/view/ViewConfiguration.java +++ b/core/java/android/view/ViewConfiguration.java @@ -292,8 +292,7 @@ public class ViewConfiguration { if (!sHasPermanentMenuKeySet) { IWindowManager wm = Display.getWindowManager(); try { - sHasPermanentMenuKey = wm.canStatusBarHide() && !res.getBoolean( - com.android.internal.R.bool.config_showNavigationBar); + sHasPermanentMenuKey = wm.canStatusBarHide() && !wm.hasNavigationBar(); sHasPermanentMenuKeySet = true; } catch (RemoteException ex) { sHasPermanentMenuKey = false; diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java index 17bdff2c96287..2e19bf64d3e17 100644 --- a/core/java/android/view/WindowManagerPolicy.java +++ b/core/java/android/view/WindowManagerPolicy.java @@ -1009,6 +1009,11 @@ public interface WindowManagerPolicy { */ public int adjustSystemUiVisibilityLw(int visibility); + /** + * Specifies whether there is an on-screen navigation bar separate from the status bar. + */ + public boolean hasNavigationBar(); + /** * Print the WindowManagerPolicy's state into the given stream. * 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 b7245522c8b4d..fa6f1763fcebe 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -295,15 +295,15 @@ public class PhoneStatusBar extends StatusBar { mStatusBarView = sb; try { - boolean showNav = res.getBoolean(com.android.internal.R.bool.config_showNavigationBar); + boolean showNav = mWindowManager.hasNavigationBar(); if (showNav) { mNavigationBarView = (NavigationBarView) View.inflate(context, R.layout.navigation_bar, null); mNavigationBarView.setDisabledFlags(mDisabled); } - } catch (Resources.NotFoundException ex) { - // no nav bar for you + } catch (RemoteException ex) { + // no window manager? good luck with that } // figure out which pixel-format to use for the status bar. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java index f0a10f30d65fc..becd5085ec7e7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java @@ -444,11 +444,14 @@ public class TabletStatusBar extends StatusBar implements sb.setHandler(mHandler); - // Sanity-check that someone hasn't set up the config wrong and asked for a navigation bar - // on a tablet that has only the system bar - if (mContext.getResources().getBoolean( - com.android.internal.R.bool.config_showNavigationBar)) { - throw new RuntimeException("Tablet device cannot show navigation bar and system bar"); + try { + // Sanity-check that someone hasn't set up the config wrong and asked for a navigation + // bar on a tablet that has only the system bar + if (mWindowManager.hasNavigationBar()) { + throw new RuntimeException( + "Tablet device cannot show navigation bar and system bar"); + } + } catch (RemoteException ex) { } mBarContents = (ViewGroup) sb.findViewById(R.id.bar_contents); diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index b9fe18298ca28..fd6ecebbeb917 100755 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -823,6 +823,14 @@ public class PhoneWindowManager implements WindowManagerPolicy { mHasNavigationBar = mContext.getResources().getBoolean( com.android.internal.R.bool.config_showNavigationBar); + // Allow a system property to override this. Used by the emulator. + // See also hasNavigationBar(). + String navBarOverride = SystemProperties.get("qemu.hw.mainkeys"); + if (! "".equals(navBarOverride)) { + if (navBarOverride.equals("1")) mHasNavigationBar = true; + else if (navBarOverride.equals("0")) mHasNavigationBar = false; + } + mNavigationBarHeight = mHasNavigationBar ? mContext.getResources().getDimensionPixelSize( com.android.internal.R.dimen.navigation_bar_height) @@ -3725,6 +3733,12 @@ public class PhoneWindowManager implements WindowManagerPolicy { return diff; } + // Use this instead of checking config_showNavigationBar so that it can be consistently + // overridden by qemu.hw.mainkeys in the emulator. + public boolean hasNavigationBar() { + return mHasNavigationBar; + } + public void dump(String prefix, FileDescriptor fd, PrintWriter pw, String[] args) { pw.print(prefix); pw.print("mSafeMode="); pw.print(mSafeMode); pw.print(" mSystemReady="); pw.print(mSystemReady); diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java index 68f0e66dfdac8..3af3e06d3b368 100644 --- a/services/java/com/android/server/wm/WindowManagerService.java +++ b/services/java/com/android/server/wm/WindowManagerService.java @@ -9263,6 +9263,11 @@ public class WindowManagerService extends IWindowManager.Stub } } + @Override + public boolean hasNavigationBar() { + return mPolicy.hasNavigationBar(); + } + void dumpInput(FileDescriptor fd, PrintWriter pw, boolean dumpAll) { pw.println("WINDOW MANAGER INPUT (dumpsys window input)"); mInputManager.dump(pw); diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowManager.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowManager.java index 44bdff33f5af9..1e66ca2ce1a07 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowManager.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowManager.java @@ -467,4 +467,8 @@ public class BridgeWindowManager implements IWindowManager { public void dismissKeyguard() { } + + public boolean hasNavigationBar() { + return false; // should this return something else? + } }