docs: README mini-CRM et polish empty states Checklist Gherkin (chemins code vérifiés) : - scan save → ScanCarteViewModel.saveToCarnet + ContactRepository.insert - FTS notes → ContactRepository.search / insertAndSearchNotes - import skip → importSkipsDuplicateEmail / skippedDuplicates - import 4→export 3 → VCardParser.parseSample4 + VCardSerializer.toVCard3 - badge merge → fiche_doublons + DuplicateReviewViewModel.mergeContacts - mark different → markDifferent / dup_marquer_differents - rescan notes → preserveNotesIfBlankDraft + existing.notes on rescan file_paths.xml : inchangé (cache vcf/images ; contacts via filesDir absolu). Suite : 62 tests unitaires OK, assembleDebug OK.
EBO <eric.bouhana@softalys.com> committé le 2026-07-22 15:54
ecb3eeb664cf9f13f8951973dc36b651fc2f6e64
1 parent(s)
3 fichiers modifiés
+23
-7
M
README.md
+21
-5
@@ -1,22 +1,37 @@
| 1 | 1 | # Card2vcf |
| 2 | 2 | |
| 3 | -Application Android **hors-ligne** : scan d’une carte de visite → OCR local (Tesseract) → brouillon éditable → contact Android **et** export `.vcf`. | |
| 3 | +Application Android **hors-ligne** : scan d’une carte de visite → OCR local (Tesseract) → brouillon éditable → **carnet local** (SQLite), contact Android et export `.vcf`. | |
| 4 | 4 | |
| 5 | -Aucune dépendance Google Play Services / ML Kit, aucun LLM, aucune permission Internet. | |
| 5 | +Aucune dépendance Google Play Services / ML Kit, aucun LLM, aucune permission Internet, **pas de synchronisation cloud**. | |
| 6 | 6 | |
| 7 | 7 | [](LICENSE) |
| 8 | 8 |  |
| 9 | 9 |  |
| 10 | 10 | |
| 11 | -## Fonctionnement | |
| 11 | +## Mini-CRM (carnet local) | |
| 12 | + | |
| 13 | +L’écran d’accueil est un **carnet offline** stocké en SQLite (Room) sur l’appareil : | |
| 14 | + | |
| 15 | +- **Recherche FTS** sur nom, entreprise, téléphones, e-mails et **notes** | |
| 16 | +- Tri (nom, prénom, entreprise, date) + abcédaire | |
| 17 | +- Fiche contact (swipe), notes, édition, photo de profil, **rescan** de la carte (les notes sont conservées) | |
| 18 | +- **Import VCF** : lecture vCard **3.0 et 4.0**, anti-doublons (skip si déjà présent) | |
| 19 | +- **Export VCF** : écriture **vCard 3.0** uniquement | |
| 20 | +- Gestion des **doublons** : badge, revue, fusion ou marquage « contacts différents » | |
| 21 | +- Création : scan, saisie manuelle ou import | |
| 22 | + | |
| 23 | +Aucune sync, aucun compte, aucune donnée hors appareil. | |
| 24 | + | |
| 25 | +## Fonctionnement (scan / OCR) | |
| 12 | 26 | |
| 13 | 27 | 1. Cadrez la carte et capturez (CameraX). |
| 14 | 28 | 2. Correction géométrique (OpenCV) + orientation EXIF. |
| 15 | 29 | 3. OCR Tesseract (7 langues) + post-traitement. |
| 16 | 30 | 4. Structuration **heuristique** (pas de modèle de langage). |
| 17 | 31 | 5. Vérifiez le brouillon, puis : |
| 32 | + - **Enregistrer** → carnet local (SQLite) | |
| 18 | 33 | - **Créer le contact** → `ACTION_INSERT` Contacts |
| 19 | - - **Exporter VCF** → partage d’un fichier `.vcf` | |
| 34 | + - **Exporter VCF** → partage d’un fichier `.vcf` (vCard 3.0) | |
| 20 | 35 | |
| 21 | 36 | ## Langues OCR |
| 22 | 37 |
@@ -79,7 +94,8 @@ Prérequis : JDK 21, Android SDK (API 35).
| 79 | 94 | ## Limites (assumées) |
| 80 | 95 | |
| 81 | 96 | - **Pas de LLM** : la qualité du brouillon dépend des heuristiques + du texte OCR. Cartes très décoratives ou manuscrites peuvent échouer. |
| 82 | -- **Caméra obligatoire** (`android.hardware.camera` required). | |
| 97 | +- **Caméra obligatoire** (`android.hardware.camera` required) pour le scan ; le carnet et l’import VCF restent utilisables sans. | |
| 98 | +- **Pas de sync** : le carnet est local uniquement ; perte/désinstallation = perte des données sauf export VCF. | |
| 83 | 99 | - Structuration sémantique avancée (homonymes, mises en page atypiques) hors périmètre. |
| 84 | 100 | |
| 85 | 101 | ## Design |
M
android/app/src/main/res/values-en/strings.xml
+1
-1
@@ -37,7 +37,7 @@
| 37 | 37 | <string name="carnet_fab_scanner">Scan</string> |
| 38 | 38 | <string name="carnet_fab_manuel">Manual</string> |
| 39 | 39 | <string name="carnet_fab_import">Import VCF</string> |
| 40 | - <string name="carnet_vide">No contacts</string> | |
| 40 | + <string name="carnet_vide">No contacts — scan a card or import a VCF</string> | |
| 41 | 41 | |
| 42 | 42 | <string name="fiche_editer">Edit</string> |
| 43 | 43 | <string name="fiche_doublons">%d duplicate(s)</string> |
M
android/app/src/main/res/values/strings.xml
+1
-1
@@ -37,7 +37,7 @@
| 37 | 37 | <string name="carnet_fab_scanner">Scanner</string> |
| 38 | 38 | <string name="carnet_fab_manuel">Manuel</string> |
| 39 | 39 | <string name="carnet_fab_import">Import VCF</string> |
| 40 | - <string name="carnet_vide">Aucun contact</string> | |
| 40 | + <string name="carnet_vide">Aucun contact — scanner une carte ou importer un VCF</string> | |
| 41 | 41 | |
| 42 | 42 | <string name="fiche_editer">Éditer</string> |
| 43 | 43 | <string name="fiche_doublons">%d doublon(s)</string> |
GitRust