Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8c5156b2 authored by Matheo Levallois's avatar Matheo Levallois
Browse files

fix: add paginating in getAgeRatings Provider

parent bd6927dd
Loading
Loading
Loading
Loading
Loading
+24 −5
Original line number Diff line number Diff line
@@ -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,11 @@ 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.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_NAMES
import foundation.e.apps.data.ResultSupreme
import foundation.e.apps.data.blockedApps.BlockedAppRepository
import foundation.e.apps.data.enums.Source
@@ -78,6 +82,8 @@ class AgeRatingProvider : ContentProvider() {
        private const val CHANNEL_ID = "applounge_provider"
        private const val NOTIFICATION_ID = 77
        private const val AUTHORITY = "foundation.e.apps.provider"
        private const val DEFAULT_LIMIT_VALUE = 50
        private const val DEFAULT_OFFSET_VALUE = 0
    }

    private lateinit var authenticatorRepository: AuthenticatorRepository
@@ -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 {
    fun getAgeRatings(uri: Uri?): Cursor {
        val cursor = MatrixCursor(arrayOf(COLUMN_PACKAGE_NAME))

        val limit = uri?.getQueryParameter(LIMIT)?.toIntOrNull() ?: DEFAULT_LIMIT_VALUE
        val offset = uri?.getQueryParameter(OFFSET)?.toIntOrNull() ?: DEFAULT_OFFSET_VALUE
        runBlocking {
            showNotification()
            val packageNames = appLoungePackageManager.getAllUserApps().map { it.packageName }
            Timber.d("Start preparing blocklist from ${packageNames.size} apps.")
            val totalPackageNames = packageNames.size

            cursor.extras = Bundle().apply {
                putInt(TOTAL_PACKAGE_NAMES, totalPackageNames)
                putInt(LIMIT, limit)
                putInt(OFFSET, offset)
            }
            val page = packageNames
                .drop(offset)
                .take(limit)

            Timber.d("Start preparing blocklist from ${page.size} apps.")
            withContext(IO) {
                try {
                    if (packageNames.isEmpty()) return@withContext cursor
                    if (page.isEmpty()) return@withContext cursor
                    initAuthData()

                    ensureAgeGroupDataExists()
                    compileAppBlockList(cursor, packageNames)
                    compileAppBlockList(cursor, page)
                } catch (e: Exception) {
                    Timber.e("AgeRatingProvider", "Error fetching age ratings", e)
                }
+4 −0
Original line number Diff line number Diff line
@@ -21,6 +21,10 @@ package foundation.e.apps.contract

object ParentalControlContract {
    const val COLUMN_PACKAGE_NAME = "package_name"
    const val TOTAL_PACKAGE_NAMES = "total_package_names"
    const val OFFSET = "offset"
    const val LIMIT = "limit"

    const val COLUMN_LOGIN_TYPE = "login_type"

    const val PATH_LOGIN_TYPE = "login_type"