アーキテクチャ
ディレクトリ構成
Palleria/
├─ app/ Androidアプリ
│ └─ src/main/java/com/yunfie/illustia/
│ ├─ ui/ Compose UIと画面
│ ├─ data/ API・リポジトリ・永続化
│ ├─ models/ アプリとAPIのモデル
│ ├─ settings/ 設定
│ ├─ wallpaper/ 壁紙機能
│ └─ widget/ ホーム画面ウィジェット
├─ rust/
│ └─ pixiv-api/ Pixiv APIとUniFFI公開層
├─ fdroid/ F-Droidメタデータ
└─ docs/ VitePressドキュメントUI
画面はJetpack Composeで実装し、デザインシステムにはMiuix KMPを使用します。新しい画面やコンポーネントは、既存のMiuixテーマ、ナビゲーション、ポップアップ管理のパターンに合わせてください。
データフロー
UIはViewModelから状態を受け取り、Repositoryとデータ層を通じてネットワーク、データベース、設定へアクセスします。長時間処理はコルーチンで実行し、画面のライフサイクルに合わせてキャンセルできる構成を保ちます。
Rust連携
rust/pixiv-apiはRustライブラリをビルドし、UniFFI経由でKotlinバインディングを生成します。GradleのpreBuildは、ホスト向けバインディング生成とAndroid ABI向けライブラリビルドに依存します。
対象ABI:
arm64-v8aarmeabi-v7ax86_64
Android統合
アプリはURL共有、テキスト共有、ウィジェット、ライブ壁紙、Androidアカウント同期などのプラットフォーム機能を含みます。Manifestや公開コンポーネントを変更するときは、権限とexported設定を慎重に確認してください。
起動時の認証とホーム表示
初期描画用の設定を読み、ロック・プライバシーモードを確認してからホーム取得を開始します。バージョン確認と更新APKの削除は後続処理です。Activityはウィンドウ・テーマ・タイトルに必要な状態だけを購読します。
認証経路ではRoomの履歴・アカウント一覧を読み込みません。暗号化ストレージから現在の資格情報を読み、OAuthのexpires_inから算出した期限に60秒以上の余裕があり、リフレッシュトークンが一致する場合にアクセストークンを再利用します。期限不明・破損・アカウント不一致時は再認証します。Keystoreへのアクセスはバックグラウンドで必要に応じて実行されます。トークン更新では認証情報だけを保存します。
ホームの先頭ページはアプリ専用キャッシュにフィード種別ごとに最大60作品・2MB・24時間保存します。OAuthトークン自体は含めず、現在のトークンのハッシュでアカウントを照合します。現在のミュート・年齢制限・AI除外を適用して先に表示し、続けてネットワークから更新します。古いページの継続URLは使いません。ログアウト・明示的なアカウント切替で削除し、取得途中に切り替わった結果は反映しません。画像本体は既存の画像キャッシュに依存します。