# アーキテクチャ・非機能仕様書 (Architecture & Non-functional Specification)

本ドキュメントでは，MiniTIAS のアーキテクチャ（コード構成）と非機能要件を定義する．

- 画面・UI・パーミッションは [SPEC_01 画面機能仕様書](SPEC_01_画面機能仕様書.md) を参照
- カメラ制御・撮影フロー・ファイル管理は [SPEC_02 カメラ撮影仕様書](SPEC_02_カメラ撮影仕様書.md) を参照

## アーキテクチャ (Architecture)

### 状態管理

- `provider` パッケージを使用する
- 画面ごとに ChangeNotifier を作成し，ビジネスロジックを UI から分離する

### Provider 構成

| Provider | 責務 |
| --- | --- |
| `CameraProvider` | カメラの初期化・プレビュー制御・撮影実行・ライフサイクル管理 |
| `GalleryProvider` | 画像一覧の取得・キャッシュ・削除操作 |
| `DiagnosticsProvider` | カメラ診断の実行・結果保存（インフラのみ・UI 非表示） |

### ディレクトリ構成

```text
lib/
├── main.dart                     # アプリエントリポイント，Provider 登録
├── app.dart                      # MaterialApp 定義，テーマ設定，180° 回転
├── providers/
│   ├── camera_provider.dart      # カメラ制御の状態管理
│   ├── gallery_provider.dart     # 画像一覧の状態管理
│   └── diagnostics_provider.dart # カメラ診断（インフラのみ）
├── screens/
│   ├── home_screen.dart          # BottomNavigationBar による画面切替
│   ├── capture_screen.dart       # 撮影画面 (S-01)
│   └── gallery_screen.dart       # 一覧画面 (S-02)
├── widgets/
│   ├── camera_preview.dart       # カメラプレビューウィジェット
│   ├── shutter_button.dart       # シャッターボタン
│   └── image_grid.dart           # サムネイルグリッド
└── services/
    ├── file_service.dart         # ファイル保存・命名・削除
    ├── permission_service.dart   # パーミッション管理
    ├── raw_capture_service.dart  # ネイティブ撮影（DNG/PNG）・診断の MethodChannel
    └── sound_service.dart        # シャッター音・保存完了音の制御
```

※ 撮影・画像変換・診断の実処理は Android ネイティブ
`android/.../RawCapturePlugin.kt`（Camera2 / `DngCreator`）が担い，
`raw_capture_service.dart` が MethodChannel で橋渡しする。

### レイヤー構成

```text
┌─────────────────────────────────┐
│  Screens（画面）                  │  UI 層: ウィジェット構築のみ
├─────────────────────────────────┤
│  Widgets（部品）                  │  再利用可能な UI コンポーネント
├─────────────────────────────────┤
│  Providers（状態管理）            │  ビジネスロジック・状態保持
├─────────────────────────────────┤
│  Services（サービス）             │  外部リソースとのインタフェース
└─────────────────────────────────┘
```

- **Screens** は Provider を `context.watch` / `context.read` で参照し，直接 Service を呼ばない
- **Providers** は Service を呼び出し，結果を状態として保持する
- **Services** はプラットフォーム API やファイルシステムとの橋渡しを行う

## 非機能要件 (Non-functional Requirements)

### 画面輝度

- アプリ起動時に画面の輝度をデフォルト値（0.8）に設定する
- ユーザーが明るさスライダーで任意に調整できる
- アプリ終了時にシステムの輝度設定に復帰する
- アタッチメント装着時に光センサーで画面が暗くなることへの対策

### パフォーマンス

- 撮影操作から次の撮影が可能になるまでを，研究運用上ストレスのない時間に収める（旧 PNG 経路は約 2 秒．DNG 定量モードは設定反映のための 3 枚連続キャプチャ + 約 16 MB の DNG 書き込みのぶん長くなる）
- 一覧画面のサムネイル読み込みは非同期で行い，画面表示をブロックしない

### データ保全

- 撮影データは端末ローカルにのみ保存する（クラウド同期なし）
- 定量モードは RAW（DNG，10-bit BGGR Bayer）で保存し，ISP 処理による情報欠落を防ぐ（旧通常モードは非圧縮 PNG）

### 対応端末

- 試験端末: AQUOS sense3（SH-02M，Android 9）
- minSdkVersion: `flutter.minSdkVersion`（`android/app/build.gradle.kts` が参照する Flutter 規定値）
- targetSdkVersion: Flutter デフォルト（最新安定版に追従）
