ChromeOS / デスクトップ入力
対応内容
- タッチスクリーン、マルチタッチ、加速度センサー、電話を必須にしない。バイブレーションは Android のハードウェア機能宣言ではなく、既存の
hasVibrator()判定で非搭載機を扱う。 - Rust の
pixiv-apiは既存のcargo ndk -t x86_64でx86_64-linux-android用にビルドする。Intel / AMD 向けAPKと universal APKに.soを同梱する。速度改善率は実測していない。 - MainActivity は既存の
resizeableActivity="true"とscreenSize|smallestScreenSize|screenLayout|orientationの構成変更処理を維持する。固定アスペクト比制限はない。
キーボード
| キー | 操作 |
|---|---|
| Ctrl+F | 検索欄を展開してフォーカス。検索結果表示中は検索画面を重ねない |
| Ctrl+R / F5 | 現在のフィード・ランキング・ブックマーク・検索結果・詳細・小説を再読み込み。画像ビューアでは画像キャッシュを読み飛ばして再取得 |
| Esc | Androidの戻る処理で最前面のモーダル・シート・ビューアを閉じる |
| Ctrl+W | 画像ビューア・保存済みビューア・小説リーダーを閉じる |
| ← / →、Shift+Space / Space | 画像ビューア・小説リーダーの前後ページへ移動。音量キー設定とは独立 |
| Ctrl+S | 画像ビューアの現在ページの原寸画像を通常の保存キューへ追加 |
| F | 画像ビューア・小説リーダーの全画面閲覧を切り替え |
| J / K | 小説の次・前の段落へスクロール。横書き・連続表示・縦書きに対応 |
設定画面など、再取得対象のない画面では更新キーでホームを更新しない。音量キーのページ送りは既存設定に従う。
マウス・トラックパッド
作品カードにハンドカーソルと軽いホバー拡大を適用する。右クリックは専用メニューを開き、タッチ長押しのQuickPeekを維持する。
メニューにはブラウザーの新しいタブで開く、画像コピー、非公開ブックマーク追加、別名で保存がある。アプリ内の複数タブではなく外部ブラウザーのタブを使う。既にブックマーク済みの場合は非公開追加を表示しない。別名保存はAndroidのドキュメント作成画面で保存先・ファイル名を選び、複数ページ作品は先頭ページを保存する。
ChromeOSの標準入力変換で届く2点ピンチは既存の列数変更処理に接続する。Ctrl+ホイールも同じ設定・列数範囲に従う。通常の2本指スクロールとホイールはスクロールとして扱う。2本目の指が接触したイベントをInitialパスで消費し、列数変更の閾値に達する前にカードの長押し判定をキャンセルする。1本だけ残った場合も全て離すまでイベントを消費し、QuickPeekやクリックへの誤遷移を防ぐ。
最小化中の処理
TTSは既存のmediaPlayback Foreground Service、MediaSession、音声フォーカスを使用し、Compose UIの破棄では再生を終了しない。
画像保存にはdataSync Foreground Serviceを追加する。待機中を含む保存処理を参照カウントで保護し、最後の処理の終了・失敗・キャンセルでサービスとWakeLockを解放する。別名保存も同じ保護を使用する。WakeLockには上限を設け、AndroidのdataSyncタイムアウトではサービスを停止する。OSによる強制終了、通信断、dataSyncの実行時間制限を超えた永続的再開は保証しない。
実機確認手順
- タッチ非搭載のx86_64 ChromeOSでインストールし、ログインと画像・小説取得を確認する。
- 各タブでCtrl+R / F5を押し、当該タブだけが更新されることを確認する。
- Ctrl+Fを繰り返し、検索語を直接入力できることを確認する。
- 複数ページ画像の横読み・縦読みでページ送りとCtrl+Sを確認する。テキスト入力中のSpaceが入力を妨げないことも確認する。
- 小説の全レイアウトでJ / Kを確認し、目次・設定シートではEscが先にシートを閉じることを確認する。
- 右クリック、ホバー、タッチ長押し、ピンチ、Ctrl+ホイール、通常スクロールを比較する。
- ウィンドウを連続リサイズし、位置・検索語・再生状態が保持されることを確認する。
- TTSと複数ダウンロードを開始して最小化し、通知の再生操作、保存完了、最後の保存後の通知終了を確認する。
参考: AndroidのChromeOSマニフェスト互換性、入力互換性。
操作の回帰修正
詳細画面のハートは、空のクリックを持つFABと外側のcombinedClickableを重ねず、共通のBookmarkHeartButtonでタップと長押しを一括処理する。非公開成功アニメーションはブックマーク済み状態がAPI応答で更新された後に表示する。ブックマーク成功後の任意の自動フォロー等が失敗しても、成功済みのブックマーク状態を画面へ反映する。