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 352d4a18f2149..87e505bba0844 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -297,15 +297,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 de8226b626b11..00bdd448b53b4 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 1562ea4974316..47597f5b96623 100755 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -828,6 +828,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) @@ -3750,6 +3758,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 770221d98ccc4..3b760d5a16bb7 100644 --- a/services/java/com/android/server/wm/WindowManagerService.java +++ b/services/java/com/android/server/wm/WindowManagerService.java @@ -9269,6 +9269,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? + } }