Androidにおける,ハードキーのshiftやaltの扱いがよくわからない件,いいかげん真面目に調べてみたところやっと謎がとけた.覚え書きとしてまとめておく.
(1)ハードウェアのshiftやらaltやらは普通に個別のキーコードを持つ普通のキーであり,その入力イベントをどうするかは基本的にはアプリの勝手.
(2)MetaKeyKeyListener#handleKeyDown()とかgetMetaState()とかは,現状のメタキー状態やキーイベントを受けとって,新しい状態やメタキーマスクを計算して返してくれるだけのメソッド.これを使う場合,メタキー状態はIME(やアプリ)側で管理する.
(3)それとは別に,EditTextとか(正確に言うとEditableが)が持っているメタキー状態がある.シフト状態を表す三角印を表示したり,alt+bsで全消しをしたりするのは,この状態にもとづいてEditTextとかが勝手にやっている(!).
(4)(2)と(3)は別に何も関係なく,それぞれ別個に変化できる(!!).
(5)(2)によるメタキー状態の計算は,いわゆるsticky shiftになっていないようだ.しかし(3)によるメタキー状態のほうはstickyになっているようである(!!!).
これは参った.原理的に二系統あるんだったのか.どうもわけがわからないはずだ.つまり,シフト状態の三角印とかをちゃんと機能させるには,内部で管理しているメタキー状態の変化にあわせて,InputConnectionにもキーイベントを送ってやらないといけない.
あと最初いくら(2)の系統で管理しようとしてもうまくいってないように思えたのは,どうも(5)の事実のせいだったようだ.エミュレータにしろIS01にしろ,shiftと同時押しなんかしないから気づかなかった.結局,sticky shiftにしたければ自前で管理するしかないんだろうか.どうもandroidはハードキーをあまり使わせたくない雰囲気が否めないよな.