Aller au contenu

Changelog v1.5.0

⬇️ Télécharger cette page en Markdown


Support des Vidéos (5 secondes max)

Date : 03 Janvier 2026


Capture et Upload de Vidéos

Nouveau module VideoCompressor.kt

Fichier : utils/VideoCompressor.kt (240 lignes)

Fonctionnalités : - Durée maximale : 5 secondes (troncature automatique si dépassement) - Taille maximale : 5 MB - Format : MP4 (conversion automatique via MediaMuxer) - Validation automatique (dimensions, durée, taille)


Base de Données Étendue

PhotoEntity Modifié

Nouveaux champs :

mediaType: MediaType         // PHOTO ou VIDEO
durationMs: Long?            // Durée en millisecondes
photoData: String?           // Données Base64 pour upload

Enum MediaType :

enum class MediaType {
    PHOTO,
    VIDEO
}

Migration : Version base de données 3 → 4


Interface Utilisateur Enrichie

ReportScreen Amélioré

4 boutons de capture : - Photo (caméra) - Galerie (photos) - Vidéo 5s (caméra) - Galerie ▶ (vidéos)

Aperçu vidéos avec indicateurs : - Bordure bleue (2dp) - Icône ▶ centrée - Badge durée en bas à droite (ex: "3s")

Compteur séparé : "2 photo(s) • 1 vidéo(s)"


Traitement des Vidéos

ReportViewModel Étendu

Nouvelle méthode : addVideo(uri: Uri)

Pipeline : 1. Validation avec VideoCompressor.getVideoInfo() 2. Troncature automatique si durée > 5 secondes 3. Conversion Base64 pour upload API 4. Stockage dans PhotoEntity (isVideo=true)


Algorithme de Troncature

trimVideoTo5Seconds()

Fonctionnement : - Utilise MediaExtractor pour lire la vidéo source - Utilise MediaMuxer pour écrire la vidéo tronquée - Copie toutes les pistes (vidéo + audio) - Arrêt à 5000ms (5 secondes exactement)

Fichier : VideoCompressor.kt:119-188


API et Backend

Nouveau Format JSON

Endpoint : submit_incident.php

Méthode : submitIncidentJson() avec @Body

Structure VideoData :

{
  "video": "data:video/mp4;base64,...",
  "latitude": 43.7102,
  "longitude": 7.2620
}

Request SubmitIncident :

{
  "mairie_id": 1,
  "type_id": 1,
  "photos": ["data:image/jpeg;base64,..."],
  "videos": [
    {
      "video": "data:video/mp4;base64,...",
      "latitude": 43.7102,
      "longitude": 7.2620
    }
  ]
}


Nouvelle Table videos_incident

Colonnes : - id, incident_id, type, filename, filepath, description - duration (secondes), filesize (bytes), mime_type - latitude, longitude, encrypted

Contraintes : - Foreign key vers incidents (CASCADE DELETE) - Indexes : incident_id, type, encrypted, GPS

Stockage : /uploads/videos/ (fichiers MP4)

Migration : database/migration_videos.sql


Backend PHP - Upload Vidéos avec Validation GPS

API submit_incident.php Étendue

Lignes 175-245

Traitement : 1. Décodage Base64 : data:video/{type};base64,... 2. Extraction GPS depuis VideoData.latitude/longitude 3. Validation GPS automatique : - Comparaison distance vidéo ↔ incident (Haversine) - Seuil alerte : 100 mètres - Warning logged si distance > 100m

Sauvegarde : - Format : {incident_id}_video_{timestamp}_{index}.{ext} - Insertion BDD avec métadonnées complètes - Réponse JSON enrichie : videos_uploaded, gps_warnings[]


Backoffice Mairies - Lecteur Vidéo

incident_detail.php Modifié

Validation GPS vidéos (lignes 506-519) : - Comparaison avec incident (tolérance 0.0001° ≈ 11m) - Flag gps_differs si écart détecté

Section "Vidéos du signalement" (lignes 1248-1317) : - Lecteur HTML5 <video controls preload="metadata"> - Grid responsive : minmax(400px, 1fr) - Affichage métadonnées : nom, date, taille MB - Alerte GPS si coordonnées différentes : - Badge orange ⚠️ "Localisation différente du signalement" - Coordonnées exactes (6 décimales) - Liens Google Maps + OpenStreetMap - Badge vert ✓ si localisation conforme


Avertissement RGPD pour les Vidéos

Dialogue d'Avertissement Obligatoire

Déclenchement : Avant capture/sélection vidéo

Contenu : - Icône ⚠️ orange (48dp) - Titre : "⚠️ Important - Protection des données" - Message explicatif : Floutage automatique non disponible pour vidéos

Recommandations RGPD : - Évitez de filmer des personnes identifiables - Concentrez-vous sur le problème à signaler - Respectez la vie privée des passants

Boutons : "Annuler" ou "J'ai compris, continuer"

Engagement : Confirmation explicite requise

Fichier : ReportScreen.kt:691-782


Limitations Connues

Floutage Vidéos Non Implémenté

⚠️ Floutage des visages non implémenté pour les vidéos

Raison : Complexité élevée (traitement frame par frame requis)

Solution future : ML Kit Face Detection sur chaque frame

Mitigation actuelle : Dialogue d'avertissement RGPD obligatoire


Fichiers Modifiés

  • utils/VideoCompressor.kt (nouveau, 240 lignes)
  • data/local/entities/PhotoEntity.kt - Ajout mediaType, durationMs
  • data/local/AppDatabase.kt - Version 4
  • data/local/Converters.kt - TypeConverters pour MediaType
  • ui/screens/report/ReportScreen.kt - Interface capture vidéo
  • ui/screens/report/ReportViewModel.kt - Traitement vidéo

Dépendances

Android SDK : - MediaExtractor - MediaMuxer - MediaMetadataRetriever

Aucune dépendance externe ajoutée


Tests

  • ✅ Compilation réussie (BUILD SUCCESSFUL)
  • ⏳ Tests sur appareil physique requis
  • ⏳ Validation de l'upload vers l'API backend