Skip to content

英数字バーコードに対応し、スキャン入力を画面へ渡さないようにする - #53

Merged
Atsumi3 merged 1 commit into
mainfrom
fix/barcode-alphanumeric-scan
Aug 23, 2026
Merged

英数字バーコードに対応し、スキャン入力を画面へ渡さないようにする#53
Atsumi3 merged 1 commit into
mainfrom
fix/barcode-alphanumeric-scan

Conversation

@Atsumi3

@Atsumi3 Atsumi3 commented Aug 23, 2026

Copy link
Copy Markdown
Member

背景

  • バーコードを読ませるとサイドバーが開いてしまう事象があった。MainActivity の dispatchKeyEvent がデコーダにキーを渡したあと必ず super を呼んでいたため、スキャンした数字・英字・Enter が Compose 側にも通常のキー入力として届いていた
  • デコーダは keyCode - 7 で数字を作る実装だったため、A01000008A のような先頭英字の10文字形式を扱えなかった
  • サーバの商品照会はバーコード形式を ^A(00|01|02)\d{6}A$ で検証するため、旧形式の数字10桁バーコード(例 1001010003)は Invalid barcode format で弾かれていた

変更内容

BarcodeKeyEventDecoder

  • keyCode の計算をやめ、KeyEvent の unicodeChar から実際の文字を読み取る
  • 数字10桁形式は3〜4文字目、先頭英字形式は2〜3文字目を種別コードとして解釈する
  • 小文字で届いた場合は大文字に正規化する
  • Shift / Alt / Ctrl は読み取りを中断させず読み飛ばす。Enter は通常の Enter と Numpad Enter の両方を受ける
  • 読み取り機の連打とみなせるキー(直前のキーから200ms以内)だけを消費し、消費したキーは ACTION_UP も合わせて消費する。ゆっくり手で打った文字は消費せず画面へ通すため、物理キーボードでの設定画面入力は従来どおり動く
  • Enter を消費するのは10文字のバーコードが揃ったときだけ

MainActivity

  • デコーダが消費したキーは super.dispatchKeyEvent へ渡さず true を返す

ItemRepository

  • 商品照会をキャッシュ優先にした。起動時に取得済みの商品一覧にバーコードが完全一致すればサーバへ問い合わせない。見つからないときだけ従来どおり API を呼ぶ
  • これにより、サーバの形式検証に通らない旧形式のバーコードでもキャッシュにあれば読み込める。サーバ側の検証は変更していない

テスト

BarcodeKeyEventDecoderTest を19ケースに拡充

  • 数字10桁形式の ITEM / STAFF / SALE / 未定義プレフィックス
  • 先頭英字形式(A01000008A など)の ITEM / STAFF / SALE / 未定義プレフィックス
  • 小文字入力の大文字正規化
  • 文字の間に Shift が挟まっても読み取りが壊れないこと
  • 10文字揃わずに Enter が来た場合は何も返さず、バッファがクリアされること
  • 読み取り成功後にバッファがクリアされること
  • 対象外の文字でバッファがクリアされること
  • スキャンした文字が消費され画面へ届かないこと
  • Enter はバーコードが読めたときだけ消費されること
  • 消費したキーの ACTION_UP も消費されること、触れていないキーの ACTION_UP は消費されないこと
  • ゆっくり打った文字は消費されないが読み取り自体は成立すること

ItemRepositoryTest に2ケース追加

  • キャッシュに一致する商品があれば API を呼ばずキャッシュの商品を返すこと
  • キャッシュに無ければ API にフォールバックすること

残作業

  • 実機で数字10桁形式と英数字形式の両方を読み込み、サイドバーが開かないことと商品読込が成功することの確認が必要

Generated by Claude Code

- unicodeChar から実際の文字を読み取り、数字10桁形式と先頭英字形式の
  両方をデコードする(種別コードの位置を形式ごとに切り替える)
- 読み取り機の連打とみなせるキーだけを消費し、super.dispatchKeyEvent へ
  渡さない。Enter は10文字のバーコードが揃ったときのみ消費する
- 商品照会をキャッシュ優先にし、サーバのバーコード形式検証に通らない
  旧形式でもキャッシュに一致すれば読み込めるようにする
github-actions Bot added a commit that referenced this pull request Aug 23, 2026
@github-actions

Copy link
Copy Markdown
Contributor

UI差分

基準画像との差分はありません。

全画面スクリーンショット

main_screen

main_screen

main_screen_account_result

main_screen_account_result

main_screen_calculator

main_screen_calculator

main_screen_calculator_shortage

main_screen_calculator_shortage

main_screen_drawer

main_screen_drawer

main_screen_empty

main_screen_empty

main_screen_error

main_screen_error

main_screen_item_selection

main_screen_item_selection

main_screen_item_selection_failed

main_screen_item_selection_failed

main_screen_item_selection_loading

main_screen_item_selection_loading

main_screen_store_selection

main_screen_store_selection

main_screen_store_selection_failed

main_screen_store_selection_failed

main_screen_store_selection_loading

main_screen_store_selection_loading

settings_screen

settings_screen

settings_screen_install_not_permitted

settings_screen_install_not_permitted

settings_screen_up_to_date

settings_screen_up_to_date

settings_screen_update_available

settings_screen_update_available

settings_screen_update_check_failed

settings_screen_update_check_failed

@Atsumi3
Atsumi3 merged commit 676ba2b into main Aug 23, 2026
2 checks passed
@Atsumi3
Atsumi3 deleted the fix/barcode-alphanumeric-scan branch August 23, 2026 08:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant