ブログネタ
Android に参加中!
Galaxy Nexus では出ている software navigation bar(正式名称知らない)だが、
PandaBoard、BeegleBoard や Emulator では出ていない。
有効・無効をどこで判断してるのか、調べてみた。

通常の Emulator 画面。(full-eng でビルドしたもの)
device-2011-11-26-230834device-2011-11-26-231001

software navigation bar は出ていない。
有効・無効の判断を行っている箇所を調べた結果はイカの通り。

frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
L.826 〜 L.827 あたり

mHasNavigationBar = mContext.getResources().getBoolean(
com.android.internal.R.bool.config_showNavigationBar);

config_showNavigationBar を確認している。
この値は、
frameworks/base/core/res/res/values/config.xml で定義している。
デフォルトは false となっている。

GlaxyNexus の場合、
device/samsung/tuna/overlay/frameworks/base/core/res/res/values/config.xml
を使用する。
DEVICE_PACKAGE_OVERLAYS := device/samsung/tuna/overlay
のようにすることで、ビルド時に差し替えて使われる。

frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
L.830 〜 L.834 あたり

String navBarOverride = SystemProperties.get("qemu.hw.mainkeys");
if (! "".equals(navBarOverride)) {
if (navBarOverride.equals("1")) mHasNavigationBar = false;
else if (navBarOverride.equals("0")) mHasNavigationBar = true;
}

Emulator 限定の処理。
getprop で確認すると、Emulator の場合は
[qemu.hw.mainkeys]: [1]
と定義されている。
config.xml で定義しても、ここで上書きされて無効になる。

frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
L.836 〜 L.843 あたり

mNavigationBarHeight = mHasNavigationBar
? mContext.getResources().getDimensionPixelSize(
com.android.internal.R.dimen.navigation_bar_height)
: 0;
mNavigationBarWidth = mHasNavigationBar
? mContext.getResources().getDimensionPixelSize(
com.android.internal.R.dimen.navigation_bar_width)
: 0;

false だと Height/Width が 0 になって描画されない(出てこない)という事か。

以上を踏まえて、
Emulator で software navigation bar を出すようにしてみた。

software navigation bar を出すようにした Emulator 画面。
device-2011-11-26-223935device-2011-11-26-224053

出た。
config_showNavigationBar を true にすれば、
software navigation bar が出てくる事が分かった。