# 機能設計書 46-アプリ設定

## 概要

本ドキュメントは、Wikipedia iOSアプリにおけるアプリ設定機能の設計を記載する。アプリ全般の設定画面を表示し、各種サブ設定への遷移を提供するハブ機能である。

### 本機能の処理概要

アプリ設定機能は、SettingsCoordinatorを通じて設定画面（WMFSettingsViewController）を表示し、外観設定、検索設定、ストレージ・同期設定などの各種設定へのアクセスを提供する。

**業務上の目的・背景**：ユーザーがアプリの動作をカスタマイズできる統一された設定画面を提供する。テーマ、フォントサイズ、検索動作、データ同期などの設定を一元管理することで、ユーザー体験を向上させる。

**機能の利用シーン**：プロファイル画面から「Settings」をタップして遷移。テーマ変更、検索動作のカスタマイズ、オフラインストレージ管理、通知設定、アカウント管理などに使用される。

**主要な処理内容**：
1. SettingsCoordinatorの起動
2. WMFSettingsViewControllerの作成・表示
3. 各種サブ設定画面への遷移
4. 通知バッジの表示管理

**関連システム・外部連携**：各種サブ設定画面へのCoordinator経由での遷移。UserDefaultsでの設定値の保存・読み込み。

**権限による制御**：特別な権限は不要。ただし、一部の設定項目（リーディングリスト同期など）はログイン状態によって動作が変わる。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | プロファイル画面 | 遷移元画面 | Settingsボタンタップで遷移 |
| 41 | SearchSettings画面 | 遷移先画面 | 検索設定への遷移 |
| 42 | AppearanceSettings画面 | 遷移先画面 | 外観設定への遷移 |
| 45 | StorageAndSyncingSettings画面 | 遷移先画面 | ストレージ・同期設定への遷移 |

## 機能種別

画面遷移 / ナビゲーション

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| navigationController | UINavigationController | Yes | 遷移元のナビゲーションコントローラー | - |
| theme | Theme | Yes | 現在のテーマ | - |
| dataStore | MWKDataStore | Yes | データストア | - |

### 入力データソース

- プロファイル画面からの遷移要求

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| - | - | 画面遷移のみ |

### 出力先

- WMFSettingsViewController（モーダル表示）

## 処理フロー

### 処理シーケンス

```
1. SettingsCoordinator.start() が呼ばれる
2. 既存のWMFSettingsViewControllerチェック
   └─ ナビゲーションコントローラーのルートが既にWMFSettingsViewControllerの場合はtrueを返して終了
3. WMFSettingsViewControllerを作成
   └─ dataStoreとthemeを渡して初期化
4. WMFComponentNavigationControllerでラップ
   └─ modalPresentationStyle: .overFullScreen
5. モーダル表示
   └─ navigationController.present(animated: true)
6. true を返して完了
```

### フローチャート

```mermaid
flowchart TD
    A[start] --> B{既にWMFSettingsViewControllerがルート?}
    B -->|Yes| C[return true]
    B -->|No| D[WMFSettingsViewController作成]
    D --> E[WMFComponentNavigationControllerでラップ]
    E --> F[モーダル表示]
    F --> G[return true]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-46-01 | 重複表示防止 | 既にルートがWMFSettingsViewControllerの場合は再表示しない | 常時 |
| BR-46-02 | モーダル表示 | overFullScreenスタイルでモーダル表示 | 常時 |
| BR-46-03 | 通知バッジ | 未読通知がある場合はプロファイルボタンにバッジ表示 | Settings画面表示中 |

### 計算ロジック

該当なし

## データベース操作仕様

### 操作別データベース影響一覧

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| - | - | - | 直接的なDB操作なし（遷移のみ） |

### テーブル別操作詳細

該当なし

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | - | - | 特別なエラー処理なし |

### リトライ仕様

該当なし

## トランザクション仕様

該当なし

## パフォーマンス要件

- 画面遷移は即座に行う
- アニメーション付きのモーダル表示

## セキュリティ考慮事項

- 設定値はUserDefaultsに保存（機密情報は含まない）
- アカウント情報へのアクセスは別途認証管理で保護

## 備考

- WMFSettingsViewControllerはObjective-C(.m/.h)で実装されており、拡張機能はSwift(.swift)で追加
- WMFNavigationBarConfiguring、WMFNavigationBarHidingプロトコルに準拠
- プロファイルボタンの通知バッジ更新はremoteNotificationsControllerから取得

---

## コードリーディングガイド

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: Coordinatorの実装を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | SettingsCoordinator.swift | `Wikipedia/Code/SettingsCoordinator.swift` | Coordinatorプロトコル準拠、start()メソッド |

**読解のコツ**:
- **5行目**: Coordinatorプロトコルに準拠
- **9-14行目**: navigationController、theme、dataStoreのプロパティ
- **18-22行目**: initializerでの依存性注入
- **26-38行目**: start()メソッドの実装

#### Step 2: 重複表示防止ロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | SettingsCoordinator.swift | `Wikipedia/Code/SettingsCoordinator.swift` | 既存ViewController確認ロジック |

**主要処理フロー**:
- **30-33行目**: viewControllers.count == 1 && viewControllers.firstがWMFSettingsViewControllerの場合は早期リターン

#### Step 3: WMFSettingsViewControllerの拡張を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | WMFSettingsViewController+Extensions.swift | `Wikipedia/Code/WMFSettingsViewController+Extensions.swift` | ナビゲーションバー設定、プロファイルボタン |

**主要処理フロー**:
- **6-35行目**: configureNavigationBarFromObjC() - ナビゲーションバーの設定
- **37-48行目**: updateProfileButtonFromObjC() - プロファイルボタンのバッジ更新
- **59-77行目**: tappedProfile() - プロファイルボタンタップ時の処理
- **102-110行目**: LogoutCoordinatorDelegateのdidTapLogout()実装

### プログラム呼び出し階層図

```
ProfileCoordinator
    │
    └─ handleProfileAction(.showSettings)
           │
           └─ dismissProfile()
                  │
                  └─ showSettings()
                         │
                         └─ SettingsCoordinator
                                │
                                └─ start()
                                       │
                                       ├─ 重複チェック
                                       │      └─ viewControllers[0] is WMFSettingsViewController?
                                       │
                                       ├─ WMFSettingsViewController(dataStore:theme:)
                                       │
                                       ├─ WMFComponentNavigationController
                                       │      └─ modalPresentationStyle: .overFullScreen
                                       │
                                       └─ navigationController.present()
```

### データフロー図

```
[入力]                        [処理]                              [出力]

dataStore            ───▶ SettingsCoordinator.start()
theme                      │
navigationController       ▼
                    WMFSettingsViewController作成
                           │
                           ▼
                    WMFComponentNavigationControllerでラップ
                           │
                           ▼
                    モーダル表示 ────────────────────▶ Settings画面表示
                                                            │
                                                            ▼
                                                    各サブ設定画面への遷移
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| SettingsCoordinator.swift | `Wikipedia/Code/SettingsCoordinator.swift` | ソース | 設定画面遷移のCoordinator |
| WMFSettingsViewController.m | `Wikipedia/Code/WMFSettingsViewController.m` | ソース | 設定画面のメイン実装（Objective-C） |
| WMFSettingsViewController.h | `Wikipedia/Code/WMFSettingsViewController.h` | ソース | 設定画面のヘッダー |
| WMFSettingsViewController+Extensions.swift | `Wikipedia/Code/WMFSettingsViewController+Extensions.swift` | ソース | Swift拡張（ナビゲーションバー等） |
| WMFSettingsViewController.storyboard | `Wikipedia/Code/WMFSettingsViewController.storyboard` | リソース | 画面レイアウト |
| ProfileCoordinator.swift | `Wikipedia/Code/ProfileCoordinator.swift` | ソース | 呼び出し元（プロファイル画面） |
