diff --git a/app/src/main/java/foundation/e/apps/provider/AgeRatingProvider.kt b/app/src/main/java/foundation/e/apps/provider/AgeRatingProvider.kt index 1cd4991b512b474bfad5af2e3aafcabc887a6b38..efd1c7ed7519e14e17f58ae0b4534caa72225cdf 100644 --- a/app/src/main/java/foundation/e/apps/provider/AgeRatingProvider.kt +++ b/app/src/main/java/foundation/e/apps/provider/AgeRatingProvider.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 @@ -26,6 +26,7 @@ import android.content.UriMatcher import android.database.Cursor import android.database.MatrixCursor import android.net.Uri +import android.os.Bundle import androidx.core.app.NotificationCompat import dagger.hilt.EntryPoint import dagger.hilt.InstallIn @@ -34,8 +35,13 @@ import dagger.hilt.components.SingletonComponent import foundation.e.apps.R import foundation.e.apps.contract.ParentalControlContract.COLUMN_LOGIN_TYPE import foundation.e.apps.contract.ParentalControlContract.COLUMN_PACKAGE_NAME +import foundation.e.apps.contract.ParentalControlContract.DEFAULT_LIMIT_VALUE +import foundation.e.apps.contract.ParentalControlContract.DEFAULT_OFFSET_VALUE +import foundation.e.apps.contract.ParentalControlContract.LIMIT +import foundation.e.apps.contract.ParentalControlContract.OFFSET import foundation.e.apps.contract.ParentalControlContract.PATH_BLOCKLIST import foundation.e.apps.contract.ParentalControlContract.PATH_LOGIN_TYPE +import foundation.e.apps.contract.ParentalControlContract.TOTAL_PACKAGE_NUMBER import foundation.e.apps.data.ResultSupreme import foundation.e.apps.data.blockedApps.BlockedAppRepository import foundation.e.apps.data.enums.Source @@ -113,7 +119,7 @@ class AgeRatingProvider : ContentProvider() { val code = uriMatcher.match(uri) return when (code) { UriCode.LoginType.code -> getLoginType() - UriCode.AgeRating.code -> getAgeRatings() + UriCode.AgeRating.code -> getAgeRatings(uri) else -> null } } @@ -124,20 +130,33 @@ class AgeRatingProvider : ContentProvider() { return cursor } - private fun getAgeRatings(): Cursor { + private fun getAgeRatings(uri: Uri?): Cursor { val cursor = MatrixCursor(arrayOf(COLUMN_PACKAGE_NAME)) + val limit = (uri?.getQueryParameter(LIMIT)?.toIntOrNull() ?: DEFAULT_LIMIT_VALUE).coerceAtLeast(0) + val offset = (uri?.getQueryParameter(OFFSET)?.toIntOrNull() ?: DEFAULT_OFFSET_VALUE).coerceAtLeast(0) runBlocking { showNotification() val packageNames = appLoungePackageManager.getAllUserApps().map { it.packageName } - Timber.d("Start preparing blocklist from ${packageNames.size} apps.") + val totalPackageNumber = packageNames.size + + cursor.extras = Bundle().apply { + putInt(TOTAL_PACKAGE_NUMBER, totalPackageNumber) + putInt(LIMIT, limit) + putInt(OFFSET, offset) + } + val pagedPackageNames = packageNames + .drop(offset) + .take(limit) + + Timber.d("Start preparing blocklist from ${pagedPackageNames.size} apps.") withContext(IO) { try { - if (packageNames.isEmpty()) return@withContext cursor + if (pagedPackageNames.isEmpty()) return@withContext cursor initAuthData() ensureAgeGroupDataExists() - compileAppBlockList(cursor, packageNames) + compileAppBlockList(cursor, pagedPackageNames) } catch (e: Exception) { Timber.e("AgeRatingProvider", "Error fetching age ratings", e) } diff --git a/parental-control-data/README.md b/parental-control-data/README.md index 5a08135e7150fdac6194ea7c2159f5f4aab02127..46aefed92684bbfa342d031600e05ad63133f4ee 100644 --- a/parental-control-data/README.md +++ b/parental-control-data/README.md @@ -15,4 +15,13 @@ Initial version : ParentalControlContract 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 +- DISABLED_MODE No restriction + +## 1.2.0 + +ParentalControlContract: +- TOTAL_PACKAGE_NUMBER Total number of items to be processed +- OFFSET +- LIMIT +- DEFAULT_LIMIT_VALUE 50 +- DEFAULT_OFFSET_VALUE 0 \ No newline at end of file diff --git a/parental-control-data/build.gradle b/parental-control-data/build.gradle index a4c8651069572788805f31335b668dfa2006e575..75f7c659ce1806d87e4529dd9e8cb2eb98ed7b99 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.1.0' + version = '1.2.0' artifact("$buildDir/libs/${project.name}.jar") diff --git a/parental-control-data/src/main/java/foundation/e/apps/contract/ParentalControlContract.kt b/parental-control-data/src/main/java/foundation/e/apps/contract/ParentalControlContract.kt index 0b6797e56ddfb370c161fb547fd03bf7ac72bf26..793a1473c72cb070b7ebb20716618071c0848c04 100644 --- a/parental-control-data/src/main/java/foundation/e/apps/contract/ParentalControlContract.kt +++ b/parental-control-data/src/main/java/foundation/e/apps/contract/ParentalControlContract.kt @@ -1,5 +1,5 @@ /* - * Copyright MURENA SAS 2024 + * 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 @@ -21,6 +21,12 @@ package foundation.e.apps.contract object ParentalControlContract { const val COLUMN_PACKAGE_NAME = "package_name" + const val TOTAL_PACKAGE_NUMBER = "total_package_number" + const val OFFSET = "offset" + const val LIMIT = "limit" + const val DEFAULT_LIMIT_VALUE = 50 + const val DEFAULT_OFFSET_VALUE = 0 + const val COLUMN_LOGIN_TYPE = "login_type" const val PATH_LOGIN_TYPE = "login_type"