DataControl v0.1.0 : contrôle du forfait data mobile via pare-feu VPN local

Surveillance de la consommation de données mobiles avec coupure automatique
en cas de dépassement de forfait, sans root ni impact sur le Wi-Fi.

- Pare-feu local (VpnService) actif uniquement sur données mobiles
- Liste blanche d'applications toujours autorisées
- Coupure cyclique totale après dépassement (intervalle paramétrable)
- Réglages complets (forfait, prix, date de début, reset auto/manuel)
- Estimation du coût total en temps réel
- Notification permanente colorée par état
- UI Compose Material 3

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
JohnnyandClaude Sonnet 5 committed 2026-07-02 18:37:45 +02:00
1 parent a71026898b
commit 536a981f9e
57 files changed
+2871

No files matched your search

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#00695C"
android:pathData="M0,0h108v108H0z" />
<path
android:fillColor="#00BFA5"
android:fillAlpha="0.25"
android:pathData="M0,108 C30,88 78,88 108,108 L108,0 C78,20 30,20 0,0 Z" />
</vector>
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<!-- Cadran de jauge (data gauge) -->
<path
android:fillColor="#FFFFFF"
android:pathData="M54,30 A24,24 0 1,1 30,54 A24,24 0 0,1 54,30 Z M54,36 A18,18 0 1,0 72,54 A18,18 0 0,0 54,36 Z" />
<!-- Aiguille -->
<path
android:fillColor="#FFFFFF"
android:pathData="M54,54 L64,42 L56,52 Z" />
<path
android:fillColor="#FFFFFF"
android:pathData="M51,54 m-3,0 a3,3 0 1,0 6,0 a3,3 0 1,0 -6,0" />
<!-- Barres de signal en dessous -->
<path android:fillColor="#FFFFFF" android:pathData="M36,78 L42,78 L42,86 L36,86 Z" />
<path android:fillColor="#FFFFFF" android:pathData="M48,74 L54,74 L54,86 L48,86 Z" />
<path android:fillColor="#FFFFFF" android:pathData="M60,68 L66,68 L66,86 L60,86 Z" />
<path android:fillColor="#00BFA5" android:pathData="M72,62 L78,62 L78,86 L72,86 Z" />
</vector>
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="#FFFFFF">
<path
android:fillColor="#FF000000"
android:pathData="M4,14 L8,14 L8,20 L4,20 Z M10,9 L14,9 L14,20 L10,20 Z M16,4 L20,4 L20,20 L16,20 Z" />
</vector>
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>
+4
View File
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="primary">#00695C</color>
</resources>
+77
View File
@@ -0,0 +1,77 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">DataControl</string>
<!-- Navigation -->
<string name="nav_dashboard">Tableau de bord</string>
<string name="nav_settings">Réglages</string>
<string name="nav_whitelist">Liste blanche</string>
<!-- Dashboard -->
<string name="dashboard_title">Tableau de bord</string>
<string name="dashboard_consumed">Données consommées</string>
<string name="dashboard_plan_label">Forfait</string>
<string name="dashboard_remaining">Restant</string>
<string name="dashboard_overage">Dépassement</string>
<string name="dashboard_state_label">État des données</string>
<string name="dashboard_state_ok">Sous le forfait</string>
<string name="dashboard_state_warning">Proche du forfait</string>
<string name="dashboard_state_overrun_filtered">Hors-forfait — liste blanche seule</string>
<string name="dashboard_state_overrun_cut">Hors-forfait — coupure en cours</string>
<string name="dashboard_state_wifi">Wi-Fi actif — aucun filtrage</string>
<string name="dashboard_cost_title">Estimation du coût</string>
<string name="dashboard_cost_plan">Prix du forfait</string>
<string name="dashboard_cost_overage">Coût hors-forfait</string>
<string name="dashboard_cost_total">Total estimé</string>
<string name="dashboard_next_reset">Prochaine réinitialisation</string>
<string name="dashboard_toggle_enable">Activer le contrôle</string>
<string name="dashboard_toggle_disable">Désactiver le contrôle</string>
<string name="dashboard_reset_now">Réinitialiser le forfait maintenant</string>
<string name="dashboard_reset_confirm_title">Réinitialiser le forfait ?</string>
<string name="dashboard_reset_confirm_message">Le compteur de données consommées sera remis à zéro immédiatement.</string>
<string name="dashboard_permissions_needed">Autorisations requises pour fonctionner correctement</string>
<string name="dashboard_control_disabled">Contrôle désactivé</string>
<!-- Settings -->
<string name="settings_title">Réglages</string>
<string name="settings_section_plan">Forfait</string>
<string name="settings_plan_limit_mo">Forfait data (Mo)</string>
<string name="settings_plan_price">Prix du forfait (€)</string>
<string name="settings_overage_price">Prix par Mo hors-forfait (€)</string>
<string name="settings_start_date">Date de début du forfait</string>
<string name="settings_auto_reset">Réinitialisation automatique mensuelle</string>
<string name="settings_section_cutoff">Coupure automatique</string>
<string name="settings_cutoff_interval">Intervalle de coupure (minutes)</string>
<string name="settings_cutoff_help">Une fois le forfait dépassé, une coupure totale (même pour la liste blanche) se déclenche brièvement à cet intervalle.</string>
<string name="settings_section_permissions">Autorisations</string>
<string name="settings_perm_usage_access">Accès aux statistiques d\'utilisation</string>
<string name="settings_perm_usage_access_desc">Nécessaire pour mesurer la consommation de données mobiles</string>
<string name="settings_perm_vpn">Pare-feu local (VPN)</string>
<string name="settings_perm_vpn_desc">Nécessaire pour filtrer les applications sur les données mobiles</string>
<string name="settings_perm_notifications">Notifications</string>
<string name="settings_perm_notifications_desc">Nécessaire pour afficher l\'état des données en continu</string>
<string name="settings_perm_battery">Optimisation de la batterie</string>
<string name="settings_perm_battery_desc">Ignorer l\'optimisation pour que la surveillance ne soit pas interrompue</string>
<string name="settings_perm_granted">Accordée</string>
<string name="settings_perm_missing">Manquante</string>
<string name="settings_save">Enregistrer</string>
<string name="settings_edit_date">Modifier</string>
<string name="settings_saved">Réglages enregistrés</string>
<!-- Whitelist -->
<string name="whitelist_title">Liste blanche</string>
<string name="whitelist_description">Ces applications gardent toujours accès aux données mobiles, y compris en dépassement de forfait (sauf pendant les coupures cycliques totales).</string>
<string name="whitelist_search_hint">Rechercher une application</string>
<string name="whitelist_system_apps_toggle">Afficher les applications système</string>
<!-- Notification -->
<string name="notification_channel_name">Surveillance des données</string>
<string name="notification_channel_description">Affiche la consommation de données et l\'état de la coupure</string>
<string name="notification_title">DataControl</string>
<!-- Common -->
<string name="unit_mo">Mo</string>
<string name="unit_euro">€</string>
<string name="common_cancel">Annuler</string>
<string name="common_confirm">Confirmer</string>
</resources>
+6
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.DataControl" parent="android:Theme.Material.Light.NoActionBar">
<item name="android:statusBarColor">@color/primary</item>
</style>
</resources>
+4
View File
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<full-backup-content>
<exclude domain="sharedpref" path="." />
</full-backup-content>
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<data-extraction-rules>
<cloud-backup>
<exclude domain="sharedpref" path="." />
</cloud-backup>
</data-extraction-rules>