Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Compose 1.7のTextFieldはPOBox Plusで日本語変換できない

Tomoya Miwa
November 08, 2024

Compose 1.7のTextFieldはPOBox Plusで日本語変換できない

Tomoya Miwa

November 08, 2024
Tweet

More Decks by Tomoya Miwa

Other Decks in Programming

Transcript

  1. この問題の最新の情報を共有 Addressed an issue that prevented TextField from functioning correctly

    when using the POBox Japanese Keyboard on certain older Sony devices. (Ia9b99, b/373743376) Compose UI 1.8.0-alpha05 に修正が取りこまれた
  2. " 正常に文字入力できない" という問 合せが急増 Compose 1.7 にした最新版アプリを100% 配信にして、3 日ほど経過してい た

    漢字変換ができず、濁点や半濁点なども打てない トグル入力が出来ない 『あ』を三回押すと『う』ではなく『あああ』になってしまう 現象報告があるのXperia 端末のみ ただし、新しめのXperia 端末では報告無し
  3. POBox Plus 2019 年頃までのXperia にプ リインされていたIME 慣れ親しんだPOBox Plus を 新しいXperia

    に手動でイン ストールしてご利用されてい るケースもある
  4. Compose1.7.2 から1.7.3 へのアップデ ートでなおる可能性もありそう Fixed exception thrown when the IME

    is active on an external View and the Next action is used to enter focus on the ComposeView. The clearFocus() behavior aligns with View behavior on API < 28, where clearFocus() can cause the default View to be focused. 意外と簡単に修正できるかも?(フラグ)
  5. Compose1.7.x のまま、問題を回避で きる方法を探す Compose のTextField を単純にAndroid View のEditText に置き換えると、問 題を回避できる事は確認できた

    素のEditText のままで試したので、デザインは適用作業は必要 日本語入力をサポートしているComposable は3 箇所なので、EditText 化す る箇所はそんなに多くない
  6. ANR in focus search with Compose 1.7.2 Priority: P4 のまま進捗無し

    https://issuetracker.google.com/issues/369354336
  7. 基本方針 Google に問題を報告 Google Issue Tracker に登録する Compose1.7 のままワークアラウンド対応を入れてPOBox Plus

    での日本語 変換を動かす Compose1.7 側の修正に時間がかかる可能性があるため
  8. 基本方針 Google に問題を報告 Google Issue Tracker に登録する Compose1.7 のままワークアラウンド対応を入れてPOBox Plus

    での日本語 変換を動かす Compose1.7 側の修正に時間がかかる可能性があるため
  9. Google に問題を報告 TextField で日本語変換できない https://issuetracker.google.com/issues/373743376 @yuyuyuyuyuri さんに対応して貰った(再現アプリは簡単に作れた) EdiText タップでANR 発生

    https://issuetracker.google.com/issues/369354336 Issue はすでに存在するが、再現方法がわからないからか進展が無い 弊社アプリでは再現するのでこれを元に再現アプリをつくって共有する
  10. EdiText タップでANR 再現アプリ作成 - ANR 発生要素の特定 弊社アプリを弄ってシンプルにしていき、ANR 発生要素に当たりをつける LazyColumn でもLazyVerticalGrid

    でも発生する LazyList の表示アイテム数が減ると、メインスレッド占有時間は減る LazyList の表示アイテムがclickable だと、メインスレッド占有時間が増え るっぽい
  11. EdiText タップでANR 再現アプリ作成 - 再現アプリの実装 EditText + LazyColumn だけでは再現せず 弊社アプリはEditText

    の下にButton がを配置していたので、これを再現ア プリに足したら100% 再現できるようになった Isssue Tracker でこの再現アプリを共有 優先度を上げて欲しいというお願いをした:P4 -> P1 https://github.com/tomoya0x00/nowinandroid/tree/issue_edittext_anr
  12. 基本方針 Google に問題を報告 Google Issue Tracker に登録する Compose1.7 のままワークアラウンド対応を入れてPOBox Plus

    での日本語 変換を動かす Compose1.7 側の修正に時間がかかる可能性があるため
  13. なぜANR が起きているのか?を解析 どこにfocus を当てるかを探していそう androidx.compose.ui.focus.TwoDimensionalFocusSearchKt.findBestCandidate-4WY_MpI(TwoD androidx.compose.ui.focus.TwoDimensionalFocusSearchKt.searchChildren-4C6V_qg(TwoDime androidx.compose.ui.focus.TwoDimensionalFocusSearchKt.access$searchChildren-4C6V_qg( androidx.compose.ui.focus.TwoDimensionalFocusSearchKt$generateAndSearchChildren$1.in androidx.compose.ui.focus.TwoDimensionalFocusSearchKt$generateAndSearchChildren$1.in ~~

    省略 ~~ androidx.compose.ui.focus.TwoDimensionalFocusSearchKt.generateAndSearchChildren-4C6V androidx.compose.ui.focus.TwoDimensionalFocusSearchKt.twoDimensionalFocusSearch-sMXa androidx.compose.ui.focus.TwoDimensionalFocusSearchKt.twoDimensionalFocusSearch-sMXa androidx.compose.ui.focus.FocusTraversalKt.focusSearch-0X8WOeE(FocusTraversal.kt:109 androidx.compose.ui.focus.FocusOwnerImpl.focusSearch-ULY8qGw(FocusOwnerImpl.kt:247) androidx.compose.ui.platform.AndroidComposeView.focusSearch(AndroidComposeView.andro
  14. 仮説の検証:メインスレッドでfocus 先を探し続けておりANR が発生する TwoDimensionalFocusSearch 内にnot suspend なbreakpoint を追加してロ グ出力 ひたすらfocus

    先を探して探索処理を繰り返していることが判明 LazyList の中も展開して(現在は非表示の箇所も) 、探索している LazyList に渡すアイテム数が増えるとfocus 探索時間が増えてANR となる 最終的にはfocus 先を決定できずに諦めていそう
  15. 回避案1: 手動でrequestFocus してみる 結果はNG あくまでfocus が当たった後になぜか再度focus 先を探しにいっているの で、このアプローチではダメ EditText にfocus

    が当たった後、InputMethodManager 経由で再度focus 先を探しにいっている EditText の下方向に対してEditText を探しに行っているので、見つかる はずがない
  16. 解析結果を元に回避方法を探る 回避案1: 手動でrequestFocus してみる 回避案2: AndroidComposeView を差し替えてfocusSearch をブロックする 回避案3 :独自のViewGroup

    を間に挟んでfocusSearch をブロックする InputMethodManager 経由のfocus 探す処理は無駄なのでブロックした い
  17. 回避案3 :独自のViewGroup を間に挟 んでfocusSearch をブロックする focusSearch でnull を返すだけ focus に問題が発生しそうですが、軽く動かした限りは問題なさそう

    複数の子View が存在しなければたぶん大丈夫? class WorkaroundFocusSearchLayout : FrameLayout { // constructor は省略してます override fun focusSearch(focused: View?, direction: Int): View? { return null } }
  18. キーボードが隠れない Issue Tarcker に登録済み FocusManager.clearFocus() sets focus the first AndroidViewBinding

    https://issuetracker.google.com/issues/374031296 clearFocus の使用を避け、サイズが小さなSpacer にfocus を当てて代用する
  19. キーボードが隠れない focus を外したいときにfocus を当てる先のSpacer を配置 Spacer は高さ・幅共に1px 以上のサイズが必要 どちらかが0px のComposable

    にfocus を当てるとクラッシュする val dummyFocusRequester = remember { FocusRequester() } Spacer( modifier = Modifier .fillMaxWidth() .height(1.dp) .focusRequester(dummyFocusRequester) .focusable(), )
  20. キーボードが隠れない workaroundFocusManager を作る clearFocus でSpacer にrequestFocus val workaroundFocusManager: FocusManager =

    remember( focusManager, dummyFocusRequester, ) { object : FocusManager { override fun moveFocus(focusDirection: FocusDirection): Boolean = focusManager.moveFocus(focusDirection) override fun clearFocus(force: Boolean) { dummyFocusRequester.requestFocus() } } }
  21. 改めて現在の状態を共有 2024/11/08 現在、Compose1.7.x のTextField はPOBox Plus で日本語変換で きない Compose UI

    1.8.0-alpha05 には修正が取りこまれた 待っていれば1.7.x 系にも修正が適用されるはず… ? Compose1.7.x でEditText を使うには様々な問題がある タップでANR 発生、キーボード表示されない、clearFocus でsetFocus