logとコードを眺めていたら、現在 android 上で使用しているWindowManager の実装が InputMethod へ対応していないことが分かりました。
VMware 用のバイナリを作る為に、私は手抜きをして、eee_701 用の構成をそのまま使っているのですが、vendor/asus/eee_701/eee_701.mk で明示されている通り、この構成では policy として mid が指定されています。
このため、WindowManager の実装には、frameworks/policies/base/mid/com/android/internal/policy/impl/の MidWiondowManager.java が使われることになるのですが、このコードには、TYPE_INPUT_METHOD タイプ の Window 処理コードが含まれていないため、Permission Denied エラーとなってしまうようです。
phone policy用の WindowManager であるPhoneWindowManager.javaでは、このあたりを処理するコードが追加されているので、コピーしてこようとしたのですが、改変箇所が多く、意外に面倒そう...。というわけで、素直に(?) polocy を phone に切り替えてしまいました(手抜き)。
ただし、SoftKeyboard.java は InputMethodService を継承して作られているもののonEvaluateInputViewShown() と、onEvaluateFullscreenMode() とを overwrite していません。そのため、「ハードウェアキーボードがあり、かつ、現在LandScapeである」と判断されると、SoftwareKeyboard が disable されてしまいます。
そこで、SoftKeyboard.java でこれら関係するメソッドを適当に上書き。
public boolean onEvaluateInputViewShown() {
return true;
}
public boolean onEvaluateFullscreenMode() {
return false;
}
結果、Notepad で SoftwareKeyboard が表示されるようになりました。とは言うものの、現在の実装上、ソフトウェアキーへフォーカスが当たらないので、実は全く意味はないのですけれど... (^^;。
また、私がdisable 時の対処などをまともに hook していないためなのでしょう、SearchBar でSoftKeyboard を有効にして、そのまま Browser へなだれ込むと、キーボードが出っぱなしになってしまったりもして...(^^;;;。
うむ、素直に邪魔ですね(Notepadを起動することで復活できます)。
1.5版が正式コードになる日が楽しみです。
0 件のコメント:
コメントを投稿