# 採集ラベル印刷アプリ — CollectionLabelApp

Brother PT-BT シリーズと連動し、フィールドで採集ラベルを即時印刷するAndroidアプリです。

## 機能

- **採集データ入力**: 地点ID・標本番号・採集日・採集場所・採集者・備考
- **GPS自動取得**: FusedLocationProvider で高精度位置情報を取得
- **逆ジオコーディング**: Nominatim (OpenStreetMap) で座標→住所変換、結果をRoomにキャッシュ
- **オフライン対応**: Room DB がソースオブトゥルース。オフライン時も全機能が動作
- **Firestoreバックアップ**: ネットワーク復帰時にWorkManagerが自動アップロード
- **Brother PT-BT 印刷**: Bluetooth経由でラベルを即時印刷
- **複数テープ幅対応**: 12/18/24/36mm

---

## セットアップ手順

### 1. Firebase プロジェクトの設定

1. [Firebase Console](https://console.firebase.google.com/) でプロジェクトを作成
2. Android アプリを追加 (パッケージ名: `com.fieldlabel.collector`)
3. `google-services.json` をダウンロードして `app/` ディレクトリに配置
4. Firebase Console で以下を有効化:
   - **Firestore Database** (本番モードまたはテストモード)
   - **Authentication** → 匿名認証を有効化

#### Firestore セキュリティルール (例)
```
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /collections/{userId}/records/{recordId} {
      allow read, write: if request.auth != null && request.auth.uid == userId;
    }
  }
}
```

---

### 2. Brother Print SDK の組み込み

1. Brother 開発者サイトからSDKをダウンロード:
   https://support.brother.com/g/s/es/dev/en/mobilesdk/index.html

2. `BrotherPrintLibrary.aar` を `app/libs/` ディレクトリに配置

3. `app/build.gradle.kts` の以下の行をコメント解除:
   ```kotlin
   implementation(files("libs/BrotherPrintLibrary.aar"))
   ```

4. `PrinterService.kt` の定数を変更:
   ```kotlin
   private const val BROTHER_SDK_INTEGRATED = true
   ```

5. `PrinterService.kt` 内のコメントアウトされたSDKコードを有効化

#### 対応プリンターモデル定数 (SDK内の定数名)
| モデル | SDK定数 |
|--------|---------|
| PT-P710BT | `BRLMPrinterModel.PT_P710BT` |
| PT-P910BT | `BRLMPrinterModel.PT_P910BT` |

---

### 3. Nominatim 利用規約の確認

Nominatim の利用規約:
- User-Agent ヘッダーに連絡先メールを含めること（AppModule.kt に設定済み）
- 1秒に1リクエスト以内
- 大量バッチ処理は独自インスタンスを立てること

`AppModule.kt` のUser-Agent文字列を自分の情報に変更してください:
```kotlin
.header("User-Agent", "CollectionLabelApp/1.0 (your-email@example.com)")
```

---

### 4. Android Studio でのビルド

```bash
# Android Studio で開いて Sync & Run
# または Gradle コマンドライン:
./gradlew assembleDebug
```

**必要な環境:**
- Android Studio Ladybug (2024.2) 以降
- JDK 17
- Android SDK 35

---

## プロジェクト構成

```
app/src/main/java/com/fieldlabel/collector/
├── CollectorApp.kt          # Application クラス (Hilt)
├── MainActivity.kt          # エントリポイント
├── domain/model/
│   └── CollectionRecord.kt  # ドメインモデル
├── data/
│   ├── local/               # Room DB (Entity/DAO/Database)
│   ├── remote/              # Firestore データソース
│   └── CollectionRepository.kt  # オフラインファースト Repository
├── service/
│   ├── LocationService.kt   # GPS (FusedLocationProvider)
│   ├── GeocodingService.kt  # Nominatim + キャッシュ
│   ├── PrinterService.kt    # Brother SDK ラッパー
│   └── SyncWorker.kt        # WorkManager 同期ジョブ
├── ui/
│   ├── navigation/AppNavigation.kt
│   ├── screens/             # Compose 画面
│   ├── viewmodel/           # ViewModel
│   └── theme/Theme.kt
└── di/AppModule.kt          # Hilt DI モジュール
```

---

## ラベルフォーマット (24mm テープ例)

```
┌──────────────────────────────────────────┐
│ LOC-2026-0001-01          2026-05-12     │
│ 北海道札幌市中央区大通西               │
│ 採集者: 山田太郎                    [QR] │
│ 備考: 落葉広葉樹林                  [QR] │
└──────────────────────────────────────────┘
```

QRコードには標本ID・日付・GPS座標・採集者を含むテキストを埋め込みます。

---

## オフライン動作

| 機能 | オフライン時の動作 |
|------|------------------|
| GPS取得 | 正常動作 |
| 逆ジオコーディング | キャッシュがあればキャッシュを返す。なければ座標のみ表示 |
| 保存 | Room DB に即時保存 |
| Firestore同期 | ネットワーク復帰後にWorkManagerが自動実行 |
| ラベル印刷 | 正常動作 (BT接続さえあれば) |
