# סיכום סשן — 0022
תאריך: 2026-05-22
אפליקציה: VitVital
נושא: M1.3 BLE — fail + pivot ל-Share Sheet OCR

## מה נבנה/הושלם
- **סקירת מצב** מקיפה ל-VitVital — גילוי שהמצב בקוד שונה מהותית מהתיעוד
- **ניקוי baseline:** `flutter analyze` ירד מ-20 issues (1 error) ל-17 info-lints בלבד
  - `test/widget_test.dart` נכתב מחדש (היה boilerplate שמפנה ל-MyApp שלא קיים)
  - `mi_scale_service.dart:218` הסרת `final fatMass` unused
  - `summary_service.dart:72` הסרת `final fs = FirestoreService()` + הסרת import לא בשימוש
  - `app-debugg.apk` (טייפו ישן) → `OLD/app-debugg-typo-{ts}.apk`
- **APK חדש** נבנה ב-`build/app/outputs/flutter-apk/app-debug.apk` (182.4MB עם BLE deps)
- **תוקנה קריסת `MaterialLocalizations`** — היה APK ישן (157MB ללא delegates) מותקן, build נקי פתר
- **תוקן באג BLE** ב-`mi_scale_service.dart`: הוסר filter `withServices: [0x181B, 0x181D]` + `continuousUpdates: true`. ה-S400 לא מציג 0x181B ב-advertised services (גם כשמשדר אותו ב-Service Data) → הפילטר חסם הכל.
- **תוכנית M1.3 חדשה** ב-HTML: `D:\Vitruvius Ecosystem\VitVital\_M1.3-share-sheet-ocr-plan.html`

## החלטות שהתקבלו
- **BLE direct לא יעבוד עם S400 MJTZC01YM (Nov 2025)** — המודל החדש (Yunmai-made, לא Huami) משדר **MiBeacon V5 מוצפן ב-FE95**, לא 0x181B הישן. הראייה: רק Mi Home קורא, Zepp Life/Mi Fit לא.
- **Mi Home לא מסנכרן ל-Health Connect** — אומת ע"י משתמש. Option A (HC bridge) מת.
- **MiBeacon decryption (Option C) נדחה** — דורש OAuth reverse-engineered ל-Mi Cloud + storage של refresh token עם הרשאות מלאות + AES-CCM. 3-5 ימי עבודה + תחזוקה מתמדת.
- **Option D Manual entry** קיים כ-fallback (`_openManualEntry` כבר ממומש) אבל UX לא מספיק טוב ל-14 שדות.
- **✓ פתרון נבחר: Share Sheet + OCR.** המשתמש הציע — Mi Home מייצא דוח כתמונה משותפת לאפליקציות. VitVital תירשם כ-share target, תקבל את ה-PNG, תריץ OCR, ותחלץ 14 שדות מלייאוט קבוע (regex על תוויות אנגלית).
- **3 הכרעות אושרו:**
  - OCR: **Google ML Kit on-device** (חינם, ~200ms, פרטיות)
  - דיאלוג אישור: **תמיד מוצג** (שקילה event נדיר)
  - אחסון תמונה: **לא נשמר** (Firebase Storage לא נדרש)
- **שדה חדש למודל:** `heartRateBpm` (הדוח מכיל heart rate 71bpm — בונוס מעבר ל-BLE).
- **enum value חדש:** `BodySource.miHomeShare`.

## בעיות שנפתרו
- **קריסת MaterialLocalizations**: גילוי שהקוד תקין אבל APK המותקן ישן. פתרון = rebuild + reinstall.
- **BLE filter חוסם הכל**: Xiaomi לא כולל UUID ב-advertised services גם כשמשדר ב-Service Data → הסרת הפילטר.
- **גילוי PivotS400**: ניתוח התמונות זיהה דגם MJTZC01YM Yunmai (Nov 2025) + העדות שרק Mi Home קורא = MiBeacon V5 מוצפן.

## מה לא עבד / צריך להיזהר
- **לעולם אל תניח** ש-Mi Home == Mi Fit/Zepp Life. הם שונים. אם רק Mi Home קורא → הפרוטוקול חדש ומוצפן.
- **`withServices` filter ב-flutter_blue_plus על Android** עבור Xiaomi BLE הוא **תמיד טעות**. Service Data ≠ Advertised Services.
- **`receive_sharing_intent`** לא לחזור אליו — שבר JVM ב-M1.5 (תועד ב-CLAUDE.md). חלופה: `share_handler`.
- **CLAUDE.md היה לא-מסונכרן:** ציין `flutter_web_auth_2` כיוון M1.3 כשבפועל pubspec כבר עבר ל-`flutter_blue_plus`. תיעוד מקור אמת = הקוד, לא ה-context files.
- **EU/global vs China firmware**: ייתכן ש-S400 שנמכרו במזרח אסיה משדרים 0x181B unencrypted בעוד EU/Global משדרים FE95 מוצפן. לא לסמוך על "S400" כשם דגם — לבדוק MJTZC01YM ספציפית.

## קבצים שנוצרו/שונו
- `D:\Vitruvius Ecosystem\VitVital\test\widget_test.dart` — נכתב מחדש (smoke test פשוט)
- `D:\Vitruvius Ecosystem\VitVital\lib\services\mi_scale_service.dart` — הוסרו unused var + service filter
- `D:\Vitruvius Ecosystem\VitVital\lib\services\summary_service.dart` — הוסרו unused var + import
- `D:\Vitruvius Ecosystem\VitVital\build\app\outputs\flutter-apk\app-debug.apk` — חדש (182.4MB)
- `D:\Vitruvius Ecosystem\VitVital\build\app\outputs\flutter-apk\OLD\app-debug-{ts}.apk` × 2 — ארכוב
- `D:\Vitruvius Ecosystem\VitVital\build\app\outputs\flutter-apk\OLD\app-debugg-typo-{ts}.apk` — ארכוב טייפו
- `D:\Vitruvius Ecosystem\VitVital\_M1.3-share-sheet-ocr-plan.html` — תוכנית מלאה ל-OCR pivot

## הצעד הבא — סשן 0023
**מימוש M1.3 Share Sheet + OCR (8 שלבים מסודרים):**

### שלב A — Dependencies + Manifest
1. `pubspec.yaml`: הוסף `google_mlkit_text_recognition: ^0.13.0` + `share_handler: ^0.0.22`. הסר `flutter_blue_plus` + `permission_handler` (אופציונלי — נדרשים רק אם נשאיר BLE כ-fallback)
2. `AndroidManifest.xml`: intent-filter על `MainActivity` עם `<action SEND>` + `<data mimeType="image/*">` + category DEFAULT

### שלב B — Model update
3. `lib/models/body_composition.dart`:
   - הוסף `final int? heartRateBpm` + ב-toFirestore/fromFirestore/copyWith
   - הוסף `BodySource.miHomeShare` + label "ייבוא מ-Mi Home"

### שלב C — Parser
4. `lib/services/mi_home_report_parser.dart` (חדש):
   - `Future<ParsedReport?> parseImage(File imageFile)`
   - שימוש ב-`TextRecognizer` של ML Kit
   - regex per-שדה (e.g., `RegExp(r'Body fat percentage[\s\S]*?(\d+\.?\d*)\s*%')`)
   - sanity checks: weight 5-300, bodyFat 5-60, vis fat 1-59 וכו'
   - return null אם < 8 שדות נמצאו (לא לקבל זבל)

### שלב D — Share receiver
5. `lib/main.dart`: רישום `ShareHandlerPlatform.instance.sharedMediaStream.listen(...)` + initialMedia ב-bootstrap
6. `lib/screens/body/share_receiver_screen.dart` (חדש):
   - מקבל `File image` כפרמטר
   - מציג preview + spinner בזמן OCR
   - בסיום: ConfirmDialog עם תמונה (חצי מסך) + שדות עריכים (חצי שני)
   - "אשר ושמור" → Firestore + Health Connect WRITE_WEIGHT

### שלב E — UI integration
7. `lib/screens/body/body_screen.dart`:
   - הסרת `_onScanPressed` (BLE)
   - כפתור חדש "ייבא מ-Mi Home" → AlertDialog עם הוראות (1.שקול 2.כפתור Share 3.בחר VitVital)
   - הסרת `_mi`, `_miSub`, listeners
8. `lib/services/mi_scale_service.dart`: header `@deprecated('M1.3 BLE — replaced by Mi Home Share Sheet OCR in 0022')`; לא למחוק לפני M1.5

### שלב F — Build + manual test
9. ארכב APK → `flutter build apk --debug` → APK חדש לבדיקה
10. בדיקת end-to-end: שקול → Mi Home Share → בחר VitVital → אישור 14 שדות → שמירה → בדיקת Firestore

**אומדן:** 2-3 שעות מימוש + עוד 30 דק כיוונון regex אחרי הבדיקה הראשונה.
