v0.5.1 googl
EBO <eric@ebii.fr> committé le 2026-09-26 20:58
71c7b0794f97f0d3ab10698698652f2aec6ab003
1 parent(s)
33 fichiers modifiés
+399
-11
A
CONFIDENTIALITE.md
+178
-0
@@ -0,0 +1,178 @@
| 1 | +# Politique de confidentialité — PicLead | |
| 2 | + | |
| 3 | +**Éditeur** : Eric Bouhana Ingénierie Informatique (ebii) | |
| 4 | +**Contact** : contact@ebii.fr | |
| 5 | +**Application** : PicLead pour Android (`fr.ebii.piclead`) | |
| 6 | +**Dernière mise à jour** : 26 septembre 2026 | |
| 7 | + | |
| 8 | +*English version below — [Privacy policy](#privacy-policy--piclead).* | |
| 9 | + | |
| 10 | +## En résumé | |
| 11 | + | |
| 12 | +PicLead photographie une carte de visite, en lit le texte **sur l'appareil** et en tire une fiche | |
| 13 | +contact enregistrée dans un carnet local. Sans serveur configuré, **aucune donnée ne quitte votre | |
| 14 | +appareil**. Aucun service Google, aucune analyse à distance, aucune télémétrie, aucune publicité, | |
| 15 | +aucun profilage, aucune vente de données. | |
| 16 | + | |
| 17 | +## Données traitées sur l'appareil | |
| 18 | + | |
| 19 | +Tout est stocké dans une base SQLite privée à l'application, dans son espace de stockage interne : | |
| 20 | + | |
| 21 | +- fiches contact (nom, société, fonction, téléphones, e-mails, adresses, notes) ; | |
| 22 | +- images des cartes scannées et photos de contact ; | |
| 23 | +- notes vocales et leur transcription ; | |
| 24 | +- projets, tâches et comptes-rendus. | |
| 25 | + | |
| 26 | +La reconnaissance de texte (Tesseract) et la transcription des notes vocales (Vosk) s'exécutent | |
| 27 | +**localement**. Aucun enregistrement audio et aucune image ne sont envoyés à un service de | |
| 28 | +reconnaissance. | |
| 29 | + | |
| 30 | +Ces données disparaissent de l'appareil quand vous supprimez les éléments concernés dans | |
| 31 | +l'application, ou quand vous la désinstallez. | |
| 32 | + | |
| 33 | +## Accès au réseau | |
| 34 | + | |
| 35 | +PicLead n'utilise le réseau que dans deux cas, jamais en arrière-plan à votre insu : | |
| 36 | + | |
| 37 | +1. **Téléchargement des modèles de reconnaissance**, que vous déclenchez vous-même depuis | |
| 38 | + *Paramètres → Modèles hors-ligne*. La requête HTTPS va au dépôt `tessdata_fast` (ou au miroir que | |
| 39 | + vous avez configuré) et ne transporte aucune de vos données. L'intégrité de chaque fichier est | |
| 40 | + vérifiée par une empreinte SHA-256 fixée dans l'application. | |
| 41 | +2. **Synchronisation avec un serveur PicLead**, uniquement si vous en configurez un. | |
| 42 | + | |
| 43 | +## Synchronisation (optionnelle) | |
| 44 | + | |
| 45 | +Si — et seulement si — vous renseignez l'adresse d'un serveur PicLead et vos identifiants, | |
| 46 | +l'application transmet à **ce serveur** : | |
| 47 | + | |
| 48 | +| Données | Détail | | |
| 49 | +|---|---| | |
| 50 | +| Fiches contact | nom, société, fonction, coordonnées, notes | | |
| 51 | +| Images | photo de la carte scannée, photo de contact | | |
| 52 | +| Agenda | rendez-vous et réservations des calendriers PicLead, si vous activez le pont Agenda | | |
| 53 | +| Activité | projets, tâches, comptes-rendus | | |
| 54 | + | |
| 55 | +Points importants : | |
| 56 | + | |
| 57 | +- **Le serveur est choisi et hébergé par vous** (ou par votre organisation), pas par l'éditeur. | |
| 58 | + L'éditeur n'exploite aucun serveur central et ne reçoit aucune de vos données. | |
| 59 | +- Les échanges se font en **HTTPS**. Le HTTP en clair n'est possible qu'en cochant explicitement | |
| 60 | + *Autoriser HTTP (clair)* dans les paramètres, pour un usage en réseau interne ou en démonstration. | |
| 61 | +- Les identifiants de connexion sont conservés chiffrés sur l'appareil. | |
| 62 | +- La conservation et la suppression des données côté serveur relèvent de l'instance que vous | |
| 63 | + utilisez ; adressez-vous à son administrateur. | |
| 64 | + | |
| 65 | +## Agenda de l'appareil (optionnel) | |
| 66 | + | |
| 67 | +Si vous activez le pont Agenda, l'application crée des calendriers dédiés (« Mes RDV », « Salles », | |
| 68 | +« Matériel », « Véhicules ») et y écrit les rendez-vous et réservations venant du serveur. Elle lit | |
| 69 | +ces calendriers pour les afficher. Retirer un calendrier depuis les paramètres supprime ses | |
| 70 | +événements de l'appareil. L'application n'exporte jamais le contenu de vos autres calendriers. | |
| 71 | + | |
| 72 | +## Permissions demandées | |
| 73 | + | |
| 74 | +| Permission | Finalité | | |
| 75 | +|---|---| | |
| 76 | +| `CAMERA` | photographier la carte de visite à scanner | | |
| 77 | +| `RECORD_AUDIO` | enregistrer une note vocale, transcrite sur l'appareil | | |
| 78 | +| `INTERNET` | télécharger les modèles (à votre demande) et synchroniser avec votre serveur | | |
| 79 | +| `READ_CALENDAR` / `WRITE_CALENDAR` | pont Agenda, activé depuis les paramètres | | |
| 80 | + | |
| 81 | +## Vos droits | |
| 82 | + | |
| 83 | +Vous restez maître de vos données : elles sont sur votre appareil et, le cas échéant, sur votre | |
| 84 | +serveur. Vous pouvez les consulter, les corriger, les exporter au format vCard et les supprimer | |
| 85 | +depuis l'application. Pour toute question relative au RGPD, écrivez à **contact@ebii.fr**. | |
| 86 | + | |
| 87 | +## Code source | |
| 88 | + | |
| 89 | +PicLead est un logiciel libre sous licence GNU AGPL v3. Le code est public : | |
| 90 | +<https://gitrust.ebii.fr/eric/piclead-client>. | |
| 91 | + | |
| 92 | +--- | |
| 93 | + | |
| 94 | +# Privacy policy — PicLead | |
| 95 | + | |
| 96 | +**Publisher**: Eric Bouhana Ingénierie Informatique (ebii) | |
| 97 | +**Contact**: contact@ebii.fr | |
| 98 | +**App**: PicLead for Android (`fr.ebii.piclead`) | |
| 99 | +**Last updated**: 26 September 2026 | |
| 100 | + | |
| 101 | +## In short | |
| 102 | + | |
| 103 | +PicLead photographs a business card, reads its text **on the device** and turns it into a contact | |
| 104 | +record stored in a local address book. With no server configured, **no data leaves your device**. No | |
| 105 | +Google services, no remote processing, no telemetry, no advertising, no profiling, no data selling. | |
| 106 | + | |
| 107 | +## Data processed on the device | |
| 108 | + | |
| 109 | +Everything is stored in an app-private SQLite database, inside the app's internal storage: | |
| 110 | + | |
| 111 | +- contact records (name, company, job title, phone numbers, e-mails, addresses, notes); | |
| 112 | +- scanned card images and contact photos; | |
| 113 | +- voice notes and their transcription; | |
| 114 | +- projects, tasks and reports. | |
| 115 | + | |
| 116 | +Text recognition (Tesseract) and voice note transcription (Vosk) run **locally**. No audio | |
| 117 | +recording and no image is sent to any recognition service. | |
| 118 | + | |
| 119 | +This data is removed from the device when you delete the corresponding items in the app, or when you | |
| 120 | +uninstall it. | |
| 121 | + | |
| 122 | +## Network access | |
| 123 | + | |
| 124 | +PicLead uses the network in two cases only, never silently in the background: | |
| 125 | + | |
| 126 | +1. **Downloading recognition models**, which you trigger yourself from *Settings → Offline models*. | |
| 127 | + The HTTPS request goes to the `tessdata_fast` repository (or the mirror you configured) and | |
| 128 | + carries none of your data. Each file's integrity is checked against a SHA-256 digest pinned in | |
| 129 | + the app. | |
| 130 | +2. **Syncing with a PicLead server**, only if you configure one. | |
| 131 | + | |
| 132 | +## Sync (optional) | |
| 133 | + | |
| 134 | +If — and only if — you enter a PicLead server address and your credentials, the app sends to **that | |
| 135 | +server**: | |
| 136 | + | |
| 137 | +| Data | Detail | | |
| 138 | +|---|---| | |
| 139 | +| Contact records | name, company, job title, contact details, notes | | |
| 140 | +| Images | scanned card photo, contact photo | | |
| 141 | +| Calendar | appointments and bookings of the PicLead calendars, if you enable the calendar bridge | | |
| 142 | +| Activity | projects, tasks, reports | | |
| 143 | + | |
| 144 | +Key points: | |
| 145 | + | |
| 146 | +- **The server is chosen and hosted by you** (or your organisation), not by the publisher. The | |
| 147 | + publisher operates no central server and receives none of your data. | |
| 148 | +- Traffic uses **HTTPS**. Cleartext HTTP is only possible if you explicitly tick *Allow HTTP | |
| 149 | + (cleartext)* in the settings, for internal-network or demonstration use. | |
| 150 | +- Login credentials are stored encrypted on the device. | |
| 151 | +- Server-side retention and deletion are handled by the instance you use; contact its administrator. | |
| 152 | + | |
| 153 | +## Device calendar (optional) | |
| 154 | + | |
| 155 | +If you enable the calendar bridge, the app creates dedicated calendars ("My appointments", "Rooms", | |
| 156 | +"Equipment", "Vehicles") and writes the appointments and bookings coming from the server into them. | |
| 157 | +It reads those calendars to display them. Removing a calendar from the settings deletes its events | |
| 158 | +from the device. The app never exports the contents of your other calendars. | |
| 159 | + | |
| 160 | +## Permissions requested | |
| 161 | + | |
| 162 | +| Permission | Purpose | | |
| 163 | +|---|---| | |
| 164 | +| `CAMERA` | photograph the business card being scanned | | |
| 165 | +| `RECORD_AUDIO` | record a voice note, transcribed on the device | | |
| 166 | +| `INTERNET` | download models (at your request) and sync with your server | | |
| 167 | +| `READ_CALENDAR` / `WRITE_CALENDAR` | calendar bridge, enabled from the settings | | |
| 168 | + | |
| 169 | +## Your rights | |
| 170 | + | |
| 171 | +You stay in control: your data sits on your device and, where applicable, on your own server. You | |
| 172 | +can view, correct, export (vCard) and delete it from the app. For any GDPR-related question, write | |
| 173 | +to **contact@ebii.fr**. | |
| 174 | + | |
| 175 | +## Source code | |
| 176 | + | |
| 177 | +PicLead is free software under the GNU AGPL v3 licence. The source is public: | |
| 178 | +<https://gitrust.ebii.fr/eric/piclead-client>. |
M
README.md
+8
-3
@@ -208,6 +208,8 @@ Vérification optionnelle de la signature avant envoi :
| 208 | 208 | |
| 209 | 209 | Distribution : envoyez le fichier `PicLead-<version>-direct-release.apk` tel quel (mail, lien) ; à l'installation, Android demandera d'autoriser l'installation depuis une source inconnue. |
| 210 | 210 | |
| 211 | +> Publication en magasin : `docs/publication-fdroid.md` (F-Droid) et `docs/publication-google-play.md` (Google Play, App Bundle signé avec la même clé d’upload). La politique de confidentialité déclarée à Play est `CONFIDENTIALITE.md`, versionnée à la racine de ce dossier. | |
| 212 | + | |
| 211 | 213 | ## Build |
| 212 | 214 | |
| 213 | 215 | Quatre variantes : deux saveurs (`fdroid`, `direct`) × deux types (`debug`, `release`). |
@@ -261,7 +263,7 @@ Prérequis : JDK 21, Android SDK (API 35).
| 261 | 263 | |
| 262 | 264 | UI N&B éditoriale (`design.md`) : coins carrés, hairlines, polices TTF embarquées (Playfair Display, Lora, Manrope — sous licence **OFL**). Icône : `icon.png`. |
| 263 | 265 | |
| 264 | -> Le texte de la licence OFL est présent en local dans `docs/licenses/OFL-fonts.txt` mais **n’est pas versionné** (cf. ci-dessous). L’OFL impose que sa copie accompagne les polices redistribuées : à corriger avant toute publication du dépôt ou de l’APK. | |
| 266 | +> L’OFL impose que sa copie accompagne les polices redistribuées : le texte et les trois notices de copyright sont embarqués dans l’app (`app/src/main/res/raw/licence_polices_ofl.txt`) et accessibles par **À propos → Texte de la licence des polices**. C’est la source unique ; `docs/licenses/OFL-fonts.txt` n’est qu’une archive locale. | |
| 265 | 267 | |
| 266 | 268 | ## Documentation locale (non versionnée) |
| 267 | 269 |
@@ -272,15 +274,18 @@ Présent en local seulement, côté client :
| 272 | 274 | | Fichier | Contenu | |
| 273 | 275 | |---|---| |
| 274 | 276 | | `docs/publication-fdroid.md` | Procédure de publication F-Droid (recette YAML, checklist) | |
| 277 | +| `docs/publication-google-play.md` | Procédure de publication Google Play (signature, AAB, fiche, Sécurité des données) | | |
| 275 | 278 | | `docs/superpowers/specs/2026-07-22-sync-agenda-rdv-ressources-v2-design.md` | Conception de la sync agenda / ressources v2 | |
| 276 | 279 | | `docs/audit-securite-2026-07-27.md` | Audit de sécurité | |
| 277 | -| `docs/licenses/OFL-fonts.txt` | Licence des polices embarquées | | |
| 280 | +| `docs/licenses/OFL-fonts.txt` | Archive locale de la licence des polices (la version embarquée est dans `res/raw`) | | |
| 281 | +| `docs/bandeau-play.sh` | Génère le bandeau 1024 × 500 de Play depuis l’icône et la charte | | |
| 282 | +| `docs/captures-fastlane.sh` | Captures fastlane (téléphone et tablettes) sur une copie isolée de l’app | | |
| 278 | 283 | |
| 279 | 284 | Les plans du monorepo (`docs/plans/` à la racine, dont les chantiers **modèles OCR téléchargeables** et **planification des tâches**) sont dans le même cas. |
| 280 | 285 | |
| 281 | 286 | Seuls les six plans historiques de `Client/docs/plans/` restent suivis : ils avaient été committés avant l’ajout des règles d’exclusion. |
| 282 | 287 | |
| 283 | -> Deux points à trancher, hors périmètre de ce README : l’exclusion de `docs/plans` contredit son propre commentaire dans le `.gitignore` (« les plans versionnés restent dans `docs/plans/` ») et la consigne du `CLAUDE.md` (« les plans vivent dans le dépôt, avec le code »). Et la licence OFL devrait être redistribuée avec les polices. | |
| 288 | +> Un point à trancher, hors périmètre de ce README : l’exclusion de `docs/plans` contredit son propre commentaire dans le `.gitignore` (« les plans versionnés restent dans `docs/plans/` ») et la consigne du `CLAUDE.md` (« les plans vivent dans le dépôt, avec le code »). | |
| 284 | 289 | |
| 285 | 290 | ## Origine du code |
| 286 | 291 |
M
android/app/build.gradle.kts
+4
-4
@@ -42,13 +42,13 @@ val keystoreProperties = Properties().apply {
| 42 | 42 | |
| 43 | 43 | android { |
| 44 | 44 | namespace = "fr.ebii.card2vcf" |
| 45 | - compileSdk = 35 | |
| 45 | + compileSdk = 36 | |
| 46 | 46 | defaultConfig { |
| 47 | 47 | applicationId = "fr.ebii.piclead" |
| 48 | 48 | minSdk = 30 |
| 49 | - targetSdk = 35 | |
| 50 | - versionCode = 4 | |
| 51 | - versionName = "0.5.0" | |
| 49 | + targetSdk = 36 | |
| 50 | + versionCode = 5 | |
| 51 | + versionName = "0.5.1" | |
| 52 | 52 | testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" |
| 53 | 53 | ndk { |
| 54 | 54 | abiFilters += listOf("arm64-v8a") |
M
android/app/src/main/java/fr/ebii/card2vcf/MainActivity.kt
+5
-1
@@ -7,6 +7,7 @@ import androidx.activity.enableEdgeToEdge
| 7 | 7 | import androidx.compose.foundation.background |
| 8 | 8 | import androidx.compose.foundation.layout.Box |
| 9 | 9 | import androidx.compose.foundation.layout.fillMaxSize |
| 10 | +import androidx.compose.foundation.layout.imePadding | |
| 10 | 11 | import androidx.compose.foundation.layout.systemBarsPadding |
| 11 | 12 | import androidx.compose.ui.Modifier |
| 12 | 13 | import fr.ebii.card2vcf.contact.ContactInsertIntent |
@@ -41,7 +42,10 @@ class MainActivity : ComponentActivity() {
| 41 | 42 | Modifier |
| 42 | 43 | .fillMaxSize() |
| 43 | 44 | .background(Canvas) |
| 44 | - .systemBarsPadding(), | |
| 45 | + .systemBarsPadding() | |
| 46 | + // Sans cela, le clavier fait translater la fenêtre et le contenu | |
| 47 | + // passe sous la barre d'état (edge-to-edge imposé depuis Android 16). | |
| 48 | + .imePadding(), | |
| 45 | 49 | ) { |
| 46 | 50 | Card2vcfNavHost( |
| 47 | 51 | repository = repository, |
M
android/app/src/main/java/fr/ebii/card2vcf/ui/apropos/AProposScreen.kt
+23
-0
@@ -34,6 +34,7 @@ import fr.ebii.card2vcf.ui.theme.TexteFaible
| 34 | 34 | @Composable |
| 35 | 35 | fun AProposScreen( |
| 36 | 36 | onBack: () -> Unit, |
| 37 | + onLicencePolices: () -> Unit, | |
| 37 | 38 | modifier: Modifier = Modifier, |
| 38 | 39 | ) { |
| 39 | 40 | val context = LocalContext.current |
@@ -99,6 +100,20 @@ fun AProposScreen(
| 99 | 100 | ) |
| 100 | 101 | } |
| 101 | 102 | |
| 103 | + val urlConfidentialite = stringResource(R.string.apropos_lien_confidentialite_url) | |
| 104 | + TextButton( | |
| 105 | + onClick = { | |
| 106 | + context.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(urlConfidentialite))) | |
| 107 | + }, | |
| 108 | + contentPadding = PaddingValues(0.dp), | |
| 109 | + ) { | |
| 110 | + Text( | |
| 111 | + stringResource(R.string.apropos_lien_confidentialite_label), | |
| 112 | + color = Link, | |
| 113 | + style = MaterialTheme.typography.bodyMedium, | |
| 114 | + ) | |
| 115 | + } | |
| 116 | + | |
| 102 | 117 | val email = stringResource(R.string.apropos_contact_email) |
| 103 | 118 | TextButton( |
| 104 | 119 | onClick = { |
@@ -138,6 +153,14 @@ fun AProposScreen(
| 138 | 153 | Text(stringResource(R.string.apropos_composant_tesseract), style = MaterialTheme.typography.bodySmall, color = TexteFaible) |
| 139 | 154 | Text(stringResource(R.string.apropos_composant_vosk), style = MaterialTheme.typography.bodySmall, color = TexteFaible) |
| 140 | 155 | Text(stringResource(R.string.apropos_composant_markwon), style = MaterialTheme.typography.bodySmall, color = TexteFaible) |
| 156 | + Text(stringResource(R.string.apropos_composant_polices), style = MaterialTheme.typography.bodySmall, color = TexteFaible) | |
| 157 | + TextButton(onClick = onLicencePolices, contentPadding = PaddingValues(0.dp)) { | |
| 158 | + Text( | |
| 159 | + stringResource(R.string.apropos_licence_polices_label), | |
| 160 | + color = Link, | |
| 161 | + style = MaterialTheme.typography.bodyMedium, | |
| 162 | + ) | |
| 163 | + } | |
| 141 | 164 | } |
| 142 | 165 | } |
| 143 | 166 | } |
A
android/app/src/main/java/fr/ebii/card2vcf/ui/apropos/LicencePolicesScreen.kt
+57
-0
@@ -0,0 +1,57 @@
| 1 | +package fr.ebii.card2vcf.ui.apropos | |
| 2 | + | |
| 3 | +import androidx.compose.foundation.background | |
| 4 | +import androidx.compose.foundation.layout.Box | |
| 5 | +import androidx.compose.foundation.layout.Column | |
| 6 | +import androidx.compose.foundation.layout.fillMaxSize | |
| 7 | +import androidx.compose.foundation.layout.fillMaxWidth | |
| 8 | +import androidx.compose.foundation.layout.padding | |
| 9 | +import androidx.compose.foundation.rememberScrollState | |
| 10 | +import androidx.compose.foundation.verticalScroll | |
| 11 | +import androidx.compose.material3.MaterialTheme | |
| 12 | +import androidx.compose.material3.Text | |
| 13 | +import androidx.compose.runtime.Composable | |
| 14 | +import androidx.compose.runtime.remember | |
| 15 | +import androidx.compose.ui.Modifier | |
| 16 | +import androidx.compose.ui.platform.LocalContext | |
| 17 | +import androidx.compose.ui.res.stringResource | |
| 18 | +import androidx.compose.ui.unit.dp | |
| 19 | +import fr.ebii.card2vcf.R | |
| 20 | +import fr.ebii.card2vcf.ui.composants.AppTopBar | |
| 21 | +import fr.ebii.card2vcf.ui.theme.Fond | |
| 22 | +import fr.ebii.card2vcf.ui.theme.Ink | |
| 23 | +import fr.ebii.card2vcf.ui.theme.Surface | |
| 24 | + | |
| 25 | +/** Licence OFL des polices embarquées, redistribuée avec l'application (exigence de l'OFL 1.1). */ | |
| 26 | +@Composable | |
| 27 | +fun LicencePolicesScreen( | |
| 28 | + onBack: () -> Unit, | |
| 29 | + modifier: Modifier = Modifier, | |
| 30 | +) { | |
| 31 | + val context = LocalContext.current | |
| 32 | + val texte = remember { | |
| 33 | + context.resources.openRawResource(R.raw.licence_polices_ofl) | |
| 34 | + .bufferedReader() | |
| 35 | + .use { it.readText() } | |
| 36 | + } | |
| 37 | + | |
| 38 | + Column(modifier.fillMaxSize().background(Fond)) { | |
| 39 | + Box(Modifier.fillMaxWidth().background(Surface)) { | |
| 40 | + AppTopBar( | |
| 41 | + titre = stringResource(R.string.licence_polices_titre), | |
| 42 | + onBack = onBack, | |
| 43 | + modifier = Modifier.padding(horizontal = 8.dp), | |
| 44 | + ) | |
| 45 | + } | |
| 46 | + | |
| 47 | + Text( | |
| 48 | + texte, | |
| 49 | + style = MaterialTheme.typography.bodySmall, | |
| 50 | + color = Ink, | |
| 51 | + modifier = Modifier | |
| 52 | + .fillMaxSize() | |
| 53 | + .verticalScroll(rememberScrollState()) | |
| 54 | + .padding(horizontal = 24.dp, vertical = 20.dp), | |
| 55 | + ) | |
| 56 | + } | |
| 57 | +} |
M
android/app/src/main/java/fr/ebii/card2vcf/ui/nav/Card2vcfNavHost.kt
+9
-1
@@ -52,6 +52,7 @@ import fr.ebii.card2vcf.ui.projets.ProjetDetailViewModel
| 52 | 52 | import fr.ebii.card2vcf.ui.projets.ProjetsListScreen |
| 53 | 53 | import fr.ebii.card2vcf.ui.projets.ProjetsViewModel |
| 54 | 54 | import fr.ebii.card2vcf.ui.apropos.AProposScreen |
| 55 | +import fr.ebii.card2vcf.ui.apropos.LicencePolicesScreen | |
| 55 | 56 | import fr.ebii.card2vcf.ui.settings.SettingsScreen |
| 56 | 57 | import fr.ebii.card2vcf.ui.settings.SettingsViewModel |
| 57 | 58 | import fr.ebii.card2vcf.ui.sync.SyncChromeViewModel |
@@ -68,6 +69,7 @@ object Routes {
| 68 | 69 | const val ImportVcf = "import_vcf" |
| 69 | 70 | const val Settings = "settings" |
| 70 | 71 | const val APropos = "apropos" |
| 72 | + const val LicencePolices = "licence_polices" | |
| 71 | 73 | const val Projets = "projets" |
| 72 | 74 | const val ProjetDetail = "projet/{serverId}" |
| 73 | 75 |
@@ -327,7 +329,13 @@ fun Card2vcfNavHost(
| 327 | 329 | ) |
| 328 | 330 | } |
| 329 | 331 | composable(Routes.APropos) { |
| 330 | - AProposScreen(onBack = { navController.popBackStack() }) | |
| 332 | + AProposScreen( | |
| 333 | + onBack = { navController.popBackStack() }, | |
| 334 | + onLicencePolices = { navController.navigate(Routes.LicencePolices) }, | |
| 335 | + ) | |
| 336 | + } | |
| 337 | + composable(Routes.LicencePolices) { | |
| 338 | + LicencePolicesScreen(onBack = { navController.popBackStack() }) | |
| 331 | 339 | } |
| 332 | 340 | } |
| 333 | 341 | } |
A
android/app/src/main/res/raw/licence_polices_ofl.txt
+96
-0
@@ -0,0 +1,96 @@
| 1 | +Copyright 2017 The Playfair Display Project Authors (https://github.com/clauseggers/Playfair-Display), with Reserved Font Name "Playfair Display" | |
| 2 | + | |
| 3 | +Copyright 2011 The Lora Project Authors (https://github.com/cyrealtype/Lora-Cyrillic), with Reserved Font Name "Lora". | |
| 4 | + | |
| 5 | +Copyright 2018 The Manrope Project Authors (https://github.com/googlefonts/manrope) | |
| 6 | + | |
| 7 | +These fonts are used by PicLead under the SIL Open Font License, Version 1.1. | |
| 8 | +The license text is copied below, and is also available with a FAQ at: | |
| 9 | +http://scripts.sil.org/OFL | |
| 10 | + | |
| 11 | +----------------------------------------------------------- | |
| 12 | +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 | |
| 13 | +----------------------------------------------------------- | |
| 14 | + | |
| 15 | +PREAMBLE | |
| 16 | +The goals of the Open Font License (OFL) are to stimulate worldwide | |
| 17 | +development of collaborative font projects, to support the font creation | |
| 18 | +efforts of academic and linguistic communities, and to provide a free and | |
| 19 | +open framework in which fonts may be shared and improved in partnership | |
| 20 | +with others. | |
| 21 | + | |
| 22 | +The OFL allows the licensed fonts to be used, studied, modified and | |
| 23 | +redistributed freely as long as they are not sold by themselves. The | |
| 24 | +fonts, including any derivative works, can be bundled, embedded, | |
| 25 | +redistributed and/or sold with any software provided that any reserved | |
| 26 | +names are not used by derivative works. The fonts and derivatives, | |
| 27 | +however, cannot be released under any other type of license. The | |
| 28 | +requirement for fonts to remain under this license does not apply | |
| 29 | +to any document created using the fonts or their derivatives. | |
| 30 | + | |
| 31 | +DEFINITIONS | |
| 32 | +"Font Software" refers to the set of files released by the Copyright | |
| 33 | +Holder(s) under this license and clearly marked as such. This may | |
| 34 | +include source files, build scripts and documentation. | |
| 35 | + | |
| 36 | +"Reserved Font Name" refers to any names specified as such after the | |
| 37 | +copyright statement(s). | |
| 38 | + | |
| 39 | +"Original Version" refers to the collection of Font Software components as | |
| 40 | +distributed by the Copyright Holder(s). | |
| 41 | + | |
| 42 | +"Modified Version" refers to any derivative made by adding to, deleting, | |
| 43 | +or substituting -- in part or in whole -- any of the components of the | |
| 44 | +Original Version, by changing formats or by porting the Font Software to a | |
| 45 | +new environment. | |
| 46 | + | |
| 47 | +"Author" refers to any designer, engineer, programmer, technical | |
| 48 | +writer or other person who contributed to the Font Software. | |
| 49 | + | |
| 50 | +PERMISSION & CONDITIONS | |
| 51 | +Permission is hereby granted, free of charge, to any person obtaining | |
| 52 | +a copy of the Font Software, to use, study, copy, merge, embed, modify, | |
| 53 | +redistribute, and sell modified and unmodified copies of the Font | |
| 54 | +Software, subject to the following conditions: | |
| 55 | + | |
| 56 | +1) Neither the Font Software nor any of its individual components, | |
| 57 | +in Original or Modified Versions, may be sold by itself. | |
| 58 | + | |
| 59 | +2) Original or Modified Versions of the Font Software may be bundled, | |
| 60 | +redistributed and/or sold with any software, provided that each copy | |
| 61 | +contains the above copyright notice and this license. These can be | |
| 62 | +included either as stand-alone text files, human-readable headers or | |
| 63 | +in the appropriate machine-readable metadata fields within text or | |
| 64 | +binary files as long as those fields can be easily viewed by the user. | |
| 65 | + | |
| 66 | +3) No Modified Version of the Font Software may use the Reserved Font | |
| 67 | +Name(s) unless explicit written permission is granted by the corresponding | |
| 68 | +Copyright Holder. This restriction only applies to the primary font name as | |
| 69 | +presented to the users. | |
| 70 | + | |
| 71 | +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font | |
| 72 | +Software shall not be used to promote, endorse or advertise any | |
| 73 | +Modified Version, except to acknowledge the contribution(s) of the | |
| 74 | +Copyright Holder(s) and the Author(s) or with their explicit written | |
| 75 | +permission. | |
| 76 | + | |
| 77 | +5) The Font Software, modified or unmodified, in part or in whole, | |
| 78 | +must be distributed entirely under this license, and must not be | |
| 79 | +distributed under any other license. The requirement for fonts to | |
| 80 | +remain under this license does not apply to any document created | |
| 81 | +using the Font Software. | |
| 82 | + | |
| 83 | +TERMINATION | |
| 84 | +This license becomes null and void if any of the above conditions are | |
| 85 | +not met. | |
| 86 | + | |
| 87 | +DISCLAIMER | |
| 88 | +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |
| 89 | +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF | |
| 90 | +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT | |
| 91 | +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE | |
| 92 | +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, | |
| 93 | +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL | |
| 94 | +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |
| 95 | +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM | |
| 96 | +OTHER DEALINGS IN THE FONT SOFTWARE. |
M
android/app/src/main/res/values-en/strings.xml
+5
-0
@@ -189,6 +189,8 @@
| 189 | 189 | <string name="apropos_editeur_nom">Eric Bouhana Ingénierie Informatique (ebii)</string> |
| 190 | 190 | <string name="apropos_editeur_description">Open source digital services</string> |
| 191 | 191 | <string name="apropos_lien_produit_label">Product page</string> |
| 192 | + <string name="apropos_lien_confidentialite_url" translatable="false">https://gitrust.ebii.fr/eric/piclead-client/blob/main/CONFIDENTIALITE.md</string> | |
| 193 | + <string name="apropos_lien_confidentialite_label">Privacy policy</string> | |
| 192 | 194 | <string name="apropos_lien_produit_url" translatable="false">https://www.ebii.fr/fr/editions/piclead</string> |
| 193 | 195 | <string name="apropos_contact_label">Contact</string> |
| 194 | 196 | <string name="apropos_contact_email" translatable="false">contact@ebii.fr</string> |
@@ -198,6 +200,9 @@
| 198 | 200 | <string name="apropos_composant_tesseract">Tesseract4Android — Apache 2.0</string> |
| 199 | 201 | <string name="apropos_composant_vosk">Vosk — Apache 2.0</string> |
| 200 | 202 | <string name="apropos_composant_markwon">Markwon — Apache 2.0</string> |
| 203 | + <string name="apropos_composant_polices">Playfair Display, Lora, Manrope — SIL Open Font License 1.1</string> | |
| 204 | + <string name="apropos_licence_polices_label">Font licence text</string> | |
| 205 | + <string name="licence_polices_titre">Font licence</string> | |
| 201 | 206 | |
| 202 | 207 | <!-- Settings — transcription --> |
| 203 | 208 | <string name="settings_transcription_titre">Voice note transcription</string> |
M
android/app/src/main/res/values/strings.xml
+5
-0
@@ -204,6 +204,8 @@
| 204 | 204 | <string name="apropos_editeur_nom">Eric Bouhana Ingénierie Informatique (ebii)</string> |
| 205 | 205 | <string name="apropos_editeur_description">Services numériques open source</string> |
| 206 | 206 | <string name="apropos_lien_produit_label">Page produit</string> |
| 207 | + <string name="apropos_lien_confidentialite_url" translatable="false">https://gitrust.ebii.fr/eric/piclead-client/blob/main/CONFIDENTIALITE.md</string> | |
| 208 | + <string name="apropos_lien_confidentialite_label">Politique de confidentialité</string> | |
| 207 | 209 | <string name="apropos_lien_produit_url" translatable="false">https://www.ebii.fr/fr/editions/piclead</string> |
| 208 | 210 | <string name="apropos_contact_label">Contact</string> |
| 209 | 211 | <string name="apropos_contact_email" translatable="false">contact@ebii.fr</string> |
@@ -213,6 +215,9 @@
| 213 | 215 | <string name="apropos_composant_tesseract">Tesseract4Android — Apache 2.0</string> |
| 214 | 216 | <string name="apropos_composant_vosk">Vosk — Apache 2.0</string> |
| 215 | 217 | <string name="apropos_composant_markwon">Markwon — Apache 2.0</string> |
| 218 | + <string name="apropos_composant_polices">Playfair Display, Lora, Manrope — SIL Open Font License 1.1</string> | |
| 219 | + <string name="apropos_licence_polices_label">Texte de la licence des polices</string> | |
| 220 | + <string name="licence_polices_titre">Licence des polices</string> | |
| 216 | 221 | |
| 217 | 222 | <!-- Paramètres — transcription --> |
| 218 | 223 | <string name="settings_transcription_titre">Transcription des notes vocales</string> |
M
android/build.gradle.kts
+1
-1
@@ -1,5 +1,5 @@
| 1 | 1 | plugins { |
| 2 | - id("com.android.application") version "8.6.0" apply false | |
| 2 | + id("com.android.application") version "8.13.2" apply false | |
| 3 | 3 | id("org.jetbrains.kotlin.android") version "2.0.20" apply false |
| 4 | 4 | id("org.jetbrains.kotlin.plugin.compose") version "2.0.20" apply false |
| 5 | 5 | id("org.jetbrains.kotlin.plugin.serialization") version "2.0.20" apply false |
A
android/fastlane/metadata/android/en-US/changelogs/5.txt
+3
-0
@@ -0,0 +1,3 @@
| 1 | +Android 16 (API 36) compatibility. | |
| 2 | + | |
| 3 | +Bundled font licence and privacy policy now reachable from the About screen. |
A
android/fastlane/metadata/android/en-US/images/featureGraphic.png
+0
-0
A
android/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png
+0
-0
A
android/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png
+0
-0
A
android/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png
+0
-0
A
android/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png
+0
-0
A
android/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png
+0
-0
A
android/fastlane/metadata/android/en-US/images/sevenInchScreenshots/1.png
+0
-0
A
android/fastlane/metadata/android/en-US/images/sevenInchScreenshots/2.png
+0
-0
A
android/fastlane/metadata/android/en-US/images/sevenInchScreenshots/3.png
+0
-0
A
android/fastlane/metadata/android/en-US/images/tenInchScreenshots/1.png
+0
-0
A
android/fastlane/metadata/android/en-US/images/tenInchScreenshots/2.png
+0
-0
A
android/fastlane/metadata/android/en-US/images/tenInchScreenshots/3.png
+0
-0
A
android/fastlane/metadata/android/fr-FR/changelogs/5.txt
+4
-0
@@ -0,0 +1,4 @@
| 1 | +Compatibilité Android 16 (API 36). | |
| 2 | + | |
| 3 | +Licence des polices embarquées et politique de confidentialité accessibles depuis | |
| 4 | +l'écran À propos. |
A
android/fastlane/metadata/android/fr-FR/images/featureGraphic.png
+0
-0
A
android/fastlane/metadata/android/fr-FR/images/sevenInchScreenshots/1.png
+0
-0
A
android/fastlane/metadata/android/fr-FR/images/sevenInchScreenshots/2.png
+0
-0
A
android/fastlane/metadata/android/fr-FR/images/sevenInchScreenshots/3.png
+0
-0
A
android/fastlane/metadata/android/fr-FR/images/tenInchScreenshots/1.png
+0
-0
A
android/fastlane/metadata/android/fr-FR/images/tenInchScreenshots/2.png
+0
-0
A
android/fastlane/metadata/android/fr-FR/images/tenInchScreenshots/3.png
+0
-0
M
android/gradle/wrapper/gradle-wrapper.properties
+1
-1
@@ -1,6 +1,6 @@
| 1 | 1 | distributionBase=GRADLE_USER_HOME |
| 2 | 2 | distributionPath=wrapper/dists |
| 3 | -distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip | |
| 3 | +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip | |
| 4 | 4 | networkTimeout=10000 |
| 5 | 5 | retries=0 |
| 6 | 6 | retryBackOffMs=500 |
GitRust