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

Commit 2bb5c286 authored by Eugene Susla's avatar Eugene Susla
Browse files

Handle shared uid for auto revoke

Usage stats is per-package, but permissions are per-uid
This handles the case of packages sharing uid

Test: presubmit
Bug: 153607914
Change-Id: Icfea374e004f801b2fe7149e0affaf5716c96a77
parent 72caa638
Loading
Loading
Loading
Loading
+18 −4
Original line number Diff line number Diff line
@@ -250,7 +250,11 @@ private suspend fun revokePermissionsOnUnusedApps(
    // TODO ntmyren: remove once b/154796729 is fixed
    Log.i(LOG_TAG, "getting UserPackageInfoLiveData for all users " +
        "in AutoRevokePermissions")
    val unusedApps = AllPackageInfosLiveData.getInitializedValue().toMutableMap()
    val allPackagesByUser = AllPackageInfosLiveData.getInitializedValue()
    val allPackagesByUserByUid = allPackagesByUser.mapValues { (_, pkgs) ->
        pkgs.groupBy { pkg -> pkg.uid }
    }
    val unusedApps = allPackagesByUser.toMutableMap()

    val userStats = UsageStatsLiveData[getUnusedThresholdMs(context),
        if (DEBUG_OVERRIDE_THRESHOLDS) INTERVAL_DAILY else INTERVAL_MONTHLY].getInitializedValue()
@@ -277,7 +281,13 @@ private suspend fun revokePermissionsOnUnusedApps(
        unusedUserApps = unusedUserApps.filter { packageInfo ->
            val pkgName = packageInfo.packageName

            var lastTimeVisible: Long = stats.lastTimeVisible(pkgName)
            val uidPackages = allPackagesByUserByUid[user]!![packageInfo.uid]
                    ?.map { info -> info.packageName } ?: emptyList()
            if (pkgName !in uidPackages) {
                Log.wtf(LOG_TAG, "Package $pkgName not among packages for " +
                        "its uid ${packageInfo.uid}: $uidPackages")
            }
            var lastTimeVisible: Long = stats.lastTimeVisible(uidPackages)

            // Limit by install time
            lastTimeVisible = Math.max(lastTimeVisible, packageInfo.firstInstallTime)
@@ -432,16 +442,20 @@ private suspend fun revokePermissionsOnUnusedApps(
    return revokedApps
}

private fun List<UsageStats>.lastTimeVisible(pkgName: String): Long {
private fun List<UsageStats>.lastTimeVisible(pkgNames: List<String>): Long {
    var result = 0L
    for (stat in this) {
        if (stat.packageName == pkgName) {
        if (stat.packageName in pkgNames) {
            result = Math.max(result, stat.lastTimeVisible)
        }
    }
    return result
}

private fun List<UsageStats>.lastTimeVisible(pkgName: String): Long {
    return lastTimeVisible(listOf(pkgName))
}

/**
 * Checks if the given package is exempt from auto revoke in a way that's not user-overridable
 */