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 [![Licence: AGPL v3](https://img.shields.io/badge/Licence-AGPL%20v3-blue.svg)](LICENSE)
8 8 ![Plateforme](https://img.shields.io/badge/Plateforme-Android%2012%2B-3DDC84?logo=android&logoColor=white)
9 9 ![100% on-device](https://img.shields.io/badge/100%25-on--device-success)
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>