NavigationBar
NavigationBar is Virtual buttons in the System Bar.Implement of NavigationBar
NavigationBar has been implemented as part of SystemUI / StatusBar.Show PhoneStatusBar.java.
\frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone
- PhoneStatusBar.java
try { boolean showNav = mWindowManager.hasNavigationBar(); if (showNav) { mNavigationBarView = (NavigationBarView) View.inflate(context, R.layout.navigation_bar, null); mNavigationBarView.setDisabledFlags(mDisabled); } } catch (RemoteException ex) { // no window manager? good luck with that }
It is just View!!
Layout file is
\frameworks\base\packages\SystemUI\res\layout
- navigation_bar.xml
Case of Tablet devices.
\frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\tablet
- TabletStatusBar.java
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) { }
If Tablet devices has NavigationBar,occurs RuntimeException!!
Tablet devices do not implement NavigationBar.
NavigationBar is enable or Diseble ?
Show PhoneWindowManager#setInitialDisplaySize().// Determine whether the status bar can hide based on the size // of the screen. We assume sizes > 600dp are tablets where we // will use the system bar. int shortSizeDp = shortSize * DisplayMetrics.DENSITY_DEFAULT / DisplayMetrics.DENSITY_DEVICE; mStatusBarCanHide = shortSizeDp < 600; mStatusBarHeight = mContext.getResources().getDimensionPixelSize( mStatusBarCanHide ? com.android.internal.R.dimen.status_bar_height : com.android.internal.R.dimen.system_bar_height); 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 = false; else if (navBarOverride.equals("0")) mHasNavigationBar = true; }To see the value of com.android.internal.R.bool.config_showNavigationBar.
It is defined in following xml
\frameworks\base\core\res\res\values - config.xml
<!-- Whether a software navigation bar should be shown. NOTE: in the future this may be autodetected from the Configuration. --> <bool name="config_showNavigationBar">false</bool>
Standard ICS is not shown as a NavigationBar.So, Check of device folder.
\device\samsung\tuna\overlay\frameworks\base\core\res\res\values
- config.xml
This value Will be displayed on GalaxyNexus.
Key Event of NavigationBar
If Buttom of home/back is touched, send inputEvent from Java Layer to Native Layer.KeyButtonView#sendEvent - WindowManagerService#injectInputEventNoWait - InputManager#injectInputEvent - InputManager#nativeInjectInputEvent - android_server_InputManager_nativeInjectInputEvent - InputDispatcher#injectInputEvent