From 3736ece66ce3d8817992ff3a71a1555284c726e0 Mon Sep 17 00:00:00 2001 From: frankpreel Date: Fri, 27 Jun 2025 10:51:46 +0200 Subject: [PATCH] fix: Sometimes the user can exceed the limit Under certain circumstances (when the phone is not reboot) - (1) Upgrade to version 2.9 with parental control already activated without reboot - (2) New activation on version 3 without reboot In cases 1 and 2, as long as the phone is not restarted, the case where Parental Control is considered active is not properly handled, and the generation of a special event (FakeEvent) to take into account the special case where, at midnight on the dot, an application is active. REF: https://gitlab.e.foundation/e/os/backlog/-/issues/3348 --- .../e/parentalcontrol/MainActivity.kt | 4 ++++ .../e/parentalcontrol/UsageStatsManager.kt | 2 +- .../e/parentalcontrol/utils/AlarmUtils.kt | 21 +++++++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/foundation/e/parentalcontrol/MainActivity.kt b/app/src/main/java/foundation/e/parentalcontrol/MainActivity.kt index 2a2c575..4657d17 100644 --- a/app/src/main/java/foundation/e/parentalcontrol/MainActivity.kt +++ b/app/src/main/java/foundation/e/parentalcontrol/MainActivity.kt @@ -128,6 +128,7 @@ import foundation.e.parentalcontrol.ui.view.SelectManageTypeApp import foundation.e.parentalcontrol.ui.view.selectedAge import foundation.e.parentalcontrol.ui.view.selectedAllowedScreenTime import foundation.e.parentalcontrol.ui.view.selectedTypeAppManagement +import foundation.e.parentalcontrol.utils.AlarmUtils import foundation.e.parentalcontrol.utils.Constants import foundation.e.parentalcontrol.utils.Constants.DELAY_CONFIRM_PASSWORD import foundation.e.parentalcontrol.utils.Constants.DELAY_DISABLE_FMD @@ -444,6 +445,7 @@ class MainActivity : ComponentActivity() { onSetAllowedApps() val stats = UsageStatsManager() stats.activeAlarm(mActivity, 0, false) + AlarmUtils.scheduleMidnightTrigger(context) if (!isAdminActive()) { setAdmin(true) @@ -693,6 +695,7 @@ class MainActivity : ComponentActivity() { PrefsUtils.clearAllExcept(Constants.PARENTAL_CONTROL_STATUS_LIST) if (isAdminActive()) { setAdmin(false) + AlarmUtils.cancelScheduleMidnightTrigger(mActivity) } coroutineScope.launch { delay(200) @@ -1447,6 +1450,7 @@ class MainActivity : ComponentActivity() { selectedAllowedScreenTime = 0 selectedTypeAppManagement = null setAdmin(false) + AlarmUtils.cancelScheduleMidnightTrigger(mActivity) onStartUp() }, onBackPressed = { onStartUp() } diff --git a/app/src/main/java/foundation/e/parentalcontrol/UsageStatsManager.kt b/app/src/main/java/foundation/e/parentalcontrol/UsageStatsManager.kt index da9d39f..52889cd 100644 --- a/app/src/main/java/foundation/e/parentalcontrol/UsageStatsManager.kt +++ b/app/src/main/java/foundation/e/parentalcontrol/UsageStatsManager.kt @@ -170,7 +170,7 @@ class UsageStatsManager { // case when PACO has been activated before today if (elementsForToday.isEmpty()) { if (statusList.isEmpty()) { - return false + return true } val lastStatus = statusList.last() if (!lastStatus.activated) { diff --git a/app/src/main/java/foundation/e/parentalcontrol/utils/AlarmUtils.kt b/app/src/main/java/foundation/e/parentalcontrol/utils/AlarmUtils.kt index a5767ba..7cebd05 100644 --- a/app/src/main/java/foundation/e/parentalcontrol/utils/AlarmUtils.kt +++ b/app/src/main/java/foundation/e/parentalcontrol/utils/AlarmUtils.kt @@ -21,6 +21,7 @@ import android.app.AlarmManager import android.app.PendingIntent import android.content.Context import android.content.Intent +import foundation.e.parentalcontrol.AlarmReceiver import foundation.e.parentalcontrol.MidnightTriggerReceiver import java.util.Calendar @@ -51,4 +52,24 @@ object AlarmUtils { pendingIntent ) } + + fun cancelScheduleMidnightTrigger(context: Context) { + val alarmManager: AlarmManager = + context.getSystemService(Context.ALARM_SERVICE) as AlarmManager + + val pendingIntent = getScheduleMidnightTriggerPendingIntent(context) + alarmManager.cancel(pendingIntent) + } + + private fun getScheduleMidnightTriggerPendingIntent( + context: Context, + ): PendingIntent { + val intent = Intent(context, AlarmReceiver::class.java) + return PendingIntent.getBroadcast( + context, + 0, + intent, + PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT + ) + } } -- GitLab