From 1ac2cea180b03345216c5f8e2dc505e7882dc4b3 Mon Sep 17 00:00:00 2001 From: frankpreel Date: Tue, 28 Oct 2025 17:00:25 +0100 Subject: [PATCH 1/5] feat: The Enum is duplicate Moving the Enum to a location that can be shared. Refactor ProtectionMode to TypeAppManagement as agreed. fix: https://gitlab.e.foundation/e/os/backlog/-/issues/3338 --- .../ParentalControlRepository.kt | 15 ++++------- .../apps/domain/ValidateAppAgeLimitUseCase.kt | 10 ++++---- .../data/model/TypeAppManagement.kt | 25 +++++++++++++++++++ 3 files changed, 35 insertions(+), 15 deletions(-) create mode 100644 parental-control-data/src/main/java/org/e/parentalcontrol/data/model/TypeAppManagement.kt diff --git a/app/src/main/java/foundation/e/apps/data/parentalcontrol/ParentalControlRepository.kt b/app/src/main/java/foundation/e/apps/data/parentalcontrol/ParentalControlRepository.kt index 21dfc69e1..fc7ec5cbc 100644 --- a/app/src/main/java/foundation/e/apps/data/parentalcontrol/ParentalControlRepository.kt +++ b/app/src/main/java/foundation/e/apps/data/parentalcontrol/ParentalControlRepository.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2024 MURENA SAS + * Copyright (C) 2025 MURENA SAS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,6 +23,7 @@ import dagger.hilt.android.qualifiers.ApplicationContext import javax.inject.Inject import javax.inject.Singleton import androidx.core.net.toUri +import org.e.parentalcontrol.data.model.TypeAppManagement @Singleton class ParentalControlRepository @Inject constructor( @@ -51,18 +52,18 @@ class ParentalControlRepository @Inject constructor( return Age.PARENTAL_CONTROL_DISABLED } - fun getSelectedProtectionMode(): ProtectionMode { + fun getSelectedProtectionMode(): TypeAppManagement { val uri = URI_PARENTAL_CONTROL_INSTALL_TYPE_APP_MANAGEMENT.toUri() val cursor = context.contentResolver.query(uri, null, null, null, null) cursor?.use { if (it.moveToFirst()) { val protectionMode = it.getInt(it.getColumnIndexOrThrow("protectionmode")) - return ProtectionMode.entries[protectionMode] + return TypeAppManagement.entries[protectionMode] } } - return ProtectionMode.DISABLED_MODE + return TypeAppManagement.DISABLED_MODE } } @@ -74,9 +75,3 @@ enum class Age { SEVENTEEN, PARENTAL_CONTROL_DISABLED } - -enum class ProtectionMode { - REGULAR_MODE, - REQUEST_PIN_MODE, - DISABLED_MODE -} diff --git a/app/src/main/java/foundation/e/apps/domain/ValidateAppAgeLimitUseCase.kt b/app/src/main/java/foundation/e/apps/domain/ValidateAppAgeLimitUseCase.kt index e51d4198b..14e7f46fc 100644 --- a/app/src/main/java/foundation/e/apps/domain/ValidateAppAgeLimitUseCase.kt +++ b/app/src/main/java/foundation/e/apps/domain/ValidateAppAgeLimitUseCase.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2024 MURENA SAS + * Copyright (C) 2025 MURENA SAS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -29,11 +29,11 @@ import foundation.e.apps.data.parentalcontrol.Age import foundation.e.apps.data.parentalcontrol.ContentRatingDao import foundation.e.apps.data.parentalcontrol.ParentalControlRepository import foundation.e.apps.data.parentalcontrol.ParentalControlRepository.Companion.KEY_PARENTAL_GUIDANCE -import foundation.e.apps.data.parentalcontrol.ProtectionMode import foundation.e.apps.data.parentalcontrol.fdroid.FDroidAntiFeatureRepository import foundation.e.apps.data.parentalcontrol.googleplay.GPlayContentRatingGroup import foundation.e.apps.data.parentalcontrol.googleplay.GPlayContentRatingRepository import foundation.e.apps.domain.model.ContentRatingValidity +import org.e.parentalcontrol.data.model.TypeAppManagement import timber.log.Timber import javax.inject.Inject @@ -53,7 +53,7 @@ class ValidateAppAgeLimitUseCase @Inject constructor( private val ageGroup: Age get() = parentalControlRepository.getSelectedAgeGroup() - private val protectionMode: ProtectionMode + private val typeAppManagement: TypeAppManagement get() = parentalControlRepository.getSelectedProtectionMode() suspend operator fun invoke(app: AppInstall): ResultSupreme { @@ -123,7 +123,7 @@ class ValidateAppAgeLimitUseCase @Inject constructor( ageGroup: Age, app: AppInstall ): ResultSupreme { - if (protectionMode == ProtectionMode.REGULAR_MODE) { + if (typeAppManagement == TypeAppManagement.CONTENT_RATING) { val allowedContentRating = gPlayContentRatingRepository.contentRatingGroups.find { it.id == ageGroup.toString() } @@ -181,7 +181,7 @@ class ValidateAppAgeLimitUseCase @Inject constructor( } private suspend fun isParentalGuidance(app: AppInstall): Boolean { - if (protectionMode == ProtectionMode.REGULAR_MODE) { + if (typeAppManagement == TypeAppManagement.CONTENT_RATING) { val fetchedContentRating = gPlayContentRatingRepository.getEnglishContentRating(app.packageName) return fetchedContentRating?.id == KEY_PARENTAL_GUIDANCE diff --git a/parental-control-data/src/main/java/org/e/parentalcontrol/data/model/TypeAppManagement.kt b/parental-control-data/src/main/java/org/e/parentalcontrol/data/model/TypeAppManagement.kt new file mode 100644 index 000000000..989b1447d --- /dev/null +++ b/parental-control-data/src/main/java/org/e/parentalcontrol/data/model/TypeAppManagement.kt @@ -0,0 +1,25 @@ +/* + * Copyright MURENA SAS 2025 + * Apps Quickly and easily install Android apps onto your device! + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package org.e.parentalcontrol.data.model + +enum class TypeAppManagement { + CONTENT_RATING, + SECURITY_CODE, + DISABLED_MODE +} \ No newline at end of file -- GitLab From 3e16d1c688bde8c3788846a062045d06635d5617 Mon Sep 17 00:00:00 2001 From: frankpreel Date: Tue, 28 Oct 2025 17:11:19 +0100 Subject: [PATCH 2/5] feat: Add missing README for the library project --- parental-control-data/README.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 parental-control-data/README.md diff --git a/parental-control-data/README.md b/parental-control-data/README.md new file mode 100644 index 000000000..6b0b96360 --- /dev/null +++ b/parental-control-data/README.md @@ -0,0 +1,18 @@ +# App Lounge library + +This document describes the library used for sharing information between applications: +- AppLounge +- ParentalControl + +# Versions + +## 1.0.0 + +Iniatial version : ParentalControlContract + +## 1.1.0 + +TypeAppManagement: +- CONTENT_RATING Legacy mode validation based on age +- SECURITY_CODE Security code request by the Parental Controls application +- DISABLED_MODE No restriction \ No newline at end of file -- GitLab From 396f632233ec9c202b5a37b0d4ad520fd2852f00 Mon Sep 17 00:00:00 2001 From: frankpreel Date: Tue, 28 Oct 2025 17:20:48 +0100 Subject: [PATCH 3/5] feat: Increment version number following the addition of the new Enum --- parental-control-data/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parental-control-data/build.gradle b/parental-control-data/build.gradle index 2b15ab8e7..a4c865106 100644 --- a/parental-control-data/build.gradle +++ b/parental-control-data/build.gradle @@ -14,7 +14,7 @@ publishing { jar(MavenPublication) { groupId = 'foundation.e.apps' artifactId = 'ParentalControlData' - version = '1.0.0' + version = '1.1.0' artifact("$buildDir/libs/${project.name}.jar") -- GitLab From 75ba4b62ab0f105ea7cb80ddd1b69b83d4c9d30a Mon Sep 17 00:00:00 2001 From: frankpreel Date: Tue, 28 Oct 2025 17:37:18 +0100 Subject: [PATCH 4/5] Imports must be ordered in lexicographic order without any empty lines in-between with "java", "javax", "kotlin" and aliases in the end --- .../e/apps/data/parentalcontrol/ParentalControlRepository.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/foundation/e/apps/data/parentalcontrol/ParentalControlRepository.kt b/app/src/main/java/foundation/e/apps/data/parentalcontrol/ParentalControlRepository.kt index fc7ec5cbc..eccafbba9 100644 --- a/app/src/main/java/foundation/e/apps/data/parentalcontrol/ParentalControlRepository.kt +++ b/app/src/main/java/foundation/e/apps/data/parentalcontrol/ParentalControlRepository.kt @@ -19,11 +19,11 @@ package foundation.e.apps.data.parentalcontrol import android.content.Context +import androidx.core.net.toUri import dagger.hilt.android.qualifiers.ApplicationContext +import org.e.parentalcontrol.data.model.TypeAppManagement import javax.inject.Inject import javax.inject.Singleton -import androidx.core.net.toUri -import org.e.parentalcontrol.data.model.TypeAppManagement @Singleton class ParentalControlRepository @Inject constructor( -- GitLab From 6edd72119d63fefe8cc9c3e1d1ef0753ed340311 Mon Sep 17 00:00:00 2001 From: frankpreel Date: Wed, 29 Oct 2025 09:06:10 +0100 Subject: [PATCH 5/5] feat: Improve wording and documentation --- .../apps/data/parentalcontrol/ParentalControlRepository.kt | 2 +- .../foundation/e/apps/domain/ValidateAppAgeLimitUseCase.kt | 2 +- parental-control-data/README.md | 2 +- .../org/e/parentalcontrol/data/model/TypeAppManagement.kt | 6 +++--- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/foundation/e/apps/data/parentalcontrol/ParentalControlRepository.kt b/app/src/main/java/foundation/e/apps/data/parentalcontrol/ParentalControlRepository.kt index eccafbba9..02f5e49c4 100644 --- a/app/src/main/java/foundation/e/apps/data/parentalcontrol/ParentalControlRepository.kt +++ b/app/src/main/java/foundation/e/apps/data/parentalcontrol/ParentalControlRepository.kt @@ -52,7 +52,7 @@ class ParentalControlRepository @Inject constructor( return Age.PARENTAL_CONTROL_DISABLED } - fun getSelectedProtectionMode(): TypeAppManagement { + fun getSelectedTypeAppManagement(): TypeAppManagement { val uri = URI_PARENTAL_CONTROL_INSTALL_TYPE_APP_MANAGEMENT.toUri() val cursor = context.contentResolver.query(uri, null, null, null, null) diff --git a/app/src/main/java/foundation/e/apps/domain/ValidateAppAgeLimitUseCase.kt b/app/src/main/java/foundation/e/apps/domain/ValidateAppAgeLimitUseCase.kt index 14e7f46fc..17ded1196 100644 --- a/app/src/main/java/foundation/e/apps/domain/ValidateAppAgeLimitUseCase.kt +++ b/app/src/main/java/foundation/e/apps/domain/ValidateAppAgeLimitUseCase.kt @@ -54,7 +54,7 @@ class ValidateAppAgeLimitUseCase @Inject constructor( get() = parentalControlRepository.getSelectedAgeGroup() private val typeAppManagement: TypeAppManagement - get() = parentalControlRepository.getSelectedProtectionMode() + get() = parentalControlRepository.getSelectedTypeAppManagement() suspend operator fun invoke(app: AppInstall): ResultSupreme { diff --git a/parental-control-data/README.md b/parental-control-data/README.md index 6b0b96360..5a08135e7 100644 --- a/parental-control-data/README.md +++ b/parental-control-data/README.md @@ -8,7 +8,7 @@ This document describes the library used for sharing information between applic ## 1.0.0 -Iniatial version : ParentalControlContract +Initial version : ParentalControlContract ## 1.1.0 diff --git a/parental-control-data/src/main/java/org/e/parentalcontrol/data/model/TypeAppManagement.kt b/parental-control-data/src/main/java/org/e/parentalcontrol/data/model/TypeAppManagement.kt index 989b1447d..269078a60 100644 --- a/parental-control-data/src/main/java/org/e/parentalcontrol/data/model/TypeAppManagement.kt +++ b/parental-control-data/src/main/java/org/e/parentalcontrol/data/model/TypeAppManagement.kt @@ -19,7 +19,7 @@ package org.e.parentalcontrol.data.model enum class TypeAppManagement { - CONTENT_RATING, - SECURITY_CODE, - DISABLED_MODE + CONTENT_RATING, // Legacy mode validation based on age + SECURITY_CODE, // Security code request by the Parental Controls application + DISABLED_MODE // No restriction } \ No newline at end of file -- GitLab