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:
@@ -0,0 +1,51 @@
|
||||
package com.jttools.datacontrol.data
|
||||
|
||||
import java.time.LocalDate
|
||||
|
||||
/**
|
||||
* Réglages persistés de l'application, avec leurs valeurs par défaut.
|
||||
*/
|
||||
data class AppSettings(
|
||||
val controlEnabled: Boolean = false,
|
||||
val planLimitMo: Long = 5000L,
|
||||
val planPriceEuro: Double = 19.99,
|
||||
val overagePricePerMoEuro: Double = 0.01,
|
||||
val planStartDateEpochDay: Long = LocalDate.now().toEpochDay(),
|
||||
val autoResetEnabled: Boolean = true,
|
||||
val cutoffIntervalMinutes: Int = 15,
|
||||
val baselineMobileBytesAtReset: Long = 0L,
|
||||
val whitelistedPackages: Set<String> = emptySet(),
|
||||
val showSystemApps: Boolean = false
|
||||
) {
|
||||
val planStartDate: LocalDate get() = LocalDate.ofEpochDay(planStartDateEpochDay)
|
||||
|
||||
/** Prochaine date de réinitialisation automatique (anniversaire mensuel du début de forfait). */
|
||||
fun nextAutoResetDate(): LocalDate {
|
||||
var next = planStartDate.plusMonths(1)
|
||||
val today = LocalDate.now()
|
||||
while (!next.isAfter(today)) {
|
||||
next = next.plusMonths(1)
|
||||
}
|
||||
return next
|
||||
}
|
||||
}
|
||||
|
||||
/** État calculé de la consommation, dérivé des réglages + de la mesure de données réelle. */
|
||||
data class UsageState(
|
||||
val consumedMo: Long,
|
||||
val planLimitMo: Long,
|
||||
val overageMo: Long,
|
||||
val isOverPlan: Boolean,
|
||||
val estimatedTotalPriceEuro: Double
|
||||
) {
|
||||
val percentOfPlan: Float
|
||||
get() = if (planLimitMo <= 0) 0f else (consumedMo.toFloat() / planLimitMo.toFloat()).coerceAtLeast(0f)
|
||||
}
|
||||
|
||||
enum class DataState {
|
||||
OK, // sous le forfait
|
||||
WARNING, // proche du forfait (>= 80%)
|
||||
OVERRUN_FILTER, // dépassé, liste blanche seule active
|
||||
OVERRUN_CUT, // dépassé, coupure totale cyclique en cours
|
||||
WIFI // Wi-Fi actif, aucun filtrage appliqué
|
||||
}
|
||||
Reference in New Issue
Block a user