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

Commit 5cbc7d06 authored by Chaohui Wang's avatar Chaohui Wang Committed by Android (Google) Code Review
Browse files

Merge "Hide system / root UID apps from toggle permission page" into main

parents 2d0ea3da aad8d39a
Loading
Loading
Loading
Loading
+1 −2
Original line number Original line Diff line number Diff line
@@ -68,8 +68,7 @@ abstract class AppOpPermissionListModel(
    open val permissionHasAppOpFlag: Boolean = true
    open val permissionHasAppOpFlag: Boolean = true


    /** These not changeable packages will also be hidden from app list. */
    /** These not changeable packages will also be hidden from app list. */
    private val notChangeablePackages =
    private val notChangeablePackages = setOf("com.android.systemui")
        setOf("android", "com.android.systemui", context.packageName)


    private fun createAppOpsPermissionController(app: ApplicationInfo) =
    private fun createAppOpsPermissionController(app: ApplicationInfo) =
        AppOpsPermissionController(context, app, appOps, permission)
        AppOpsPermissionController(context, app, appOps, permission)
+2 −2
Original line number Original line Diff line number Diff line
@@ -110,7 +110,7 @@ internal fun <T : AppRecord> TogglePermissionAppListModel<T>.TogglePermissionApp
    app: ApplicationInfo,
    app: ApplicationInfo,
) {
) {
    val record = remember { transformItem(app) }
    val record = remember { transformItem(app) }
    if (!remember { isChangeable(record) }) return
    if (!remember { isChangeableWithSystemUidCheck(record) }) return
    val context = LocalContext.current
    val context = LocalContext.current
    val internalListModel = remember {
    val internalListModel = remember {
        TogglePermissionInternalAppListModel(
        TogglePermissionInternalAppListModel(
@@ -178,6 +178,6 @@ private fun <T : AppRecord> TogglePermissionAppListModel<T>.rememberRecord(app:
private fun <T : AppRecord> TogglePermissionAppListModel<T>.rememberIsChangeable(record: T) =
private fun <T : AppRecord> TogglePermissionAppListModel<T>.rememberIsChangeable(record: T) =
    remember(record) {
    remember(record) {
        flow {
        flow {
            emit(isChangeable(record))
            emit(isChangeableWithSystemUidCheck(record))
        }.flowOn(Dispatchers.Default)
        }.flowOn(Dispatchers.Default)
    }.collectAsStateWithLifecycle(initialValue = false)
    }.collectAsStateWithLifecycle(initialValue = false)
+19 −1
Original line number Original line Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.settingslib.spaprivileged.template.app


import android.content.Context
import android.content.Context
import android.content.pm.ApplicationInfo
import android.content.pm.ApplicationInfo
import android.os.Process
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Composable
import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
import com.android.settingslib.spa.framework.common.SettingsPageProvider
import com.android.settingslib.spa.framework.common.SettingsPageProvider
@@ -82,6 +83,23 @@ interface TogglePermissionAppListModel<T : AppRecord> {
    fun InfoPageAdditionalContent(record: T, isAllowed: () -> Boolean?) {}
    fun InfoPageAdditionalContent(record: T, isAllowed: () -> Boolean?) {}
}
}


/**
 * And if the given app has system or root UID.
 *
 * If true, the app gets all permissions, so the permission toggle always not changeable.
 */
fun AppRecord.isSystemOrRootUid(): Boolean = app.uid in listOf(Process.SYSTEM_UID, Process.ROOT_UID)

/**
 * Gets whether the permission on / off is changeable for the given app.
 *
 * And if the given app has system or root UID, it gets all permissions, so always not changeable.
 */
fun <T : AppRecord> TogglePermissionAppListModel<T>.isChangeableWithSystemUidCheck(
    record: T,
): Boolean = !record.isSystemOrRootUid() && isChangeable(record)


interface TogglePermissionAppListProvider {
interface TogglePermissionAppListProvider {
    val permissionType: String
    val permissionType: String


+2 −1
Original line number Original line Diff line number Diff line
@@ -33,6 +33,7 @@ import com.android.settingslib.spa.framework.common.SettingsPage
import com.android.settingslib.spa.framework.common.SettingsPageProvider
import com.android.settingslib.spa.framework.common.SettingsPageProvider
import com.android.settingslib.spa.framework.compose.navigator
import com.android.settingslib.spa.framework.compose.navigator
import com.android.settingslib.spa.framework.compose.rememberContext
import com.android.settingslib.spa.framework.compose.rememberContext
import com.android.settingslib.spa.framework.util.filterItem
import com.android.settingslib.spa.framework.util.getStringArg
import com.android.settingslib.spa.framework.util.getStringArg
import com.android.settingslib.spa.widget.preference.Preference
import com.android.settingslib.spa.widget.preference.Preference
import com.android.settingslib.spa.widget.preference.PreferenceModel
import com.android.settingslib.spa.widget.preference.PreferenceModel
@@ -143,7 +144,7 @@ internal class TogglePermissionInternalAppListModel<T : AppRecord>(
        listModel.transform(userIdFlow, appListFlow)
        listModel.transform(userIdFlow, appListFlow)


    override fun filter(userIdFlow: Flow<Int>, option: Int, recordListFlow: Flow<List<T>>) =
    override fun filter(userIdFlow: Flow<Int>, option: Int, recordListFlow: Flow<List<T>>) =
        listModel.filter(userIdFlow, recordListFlow)
        listModel.filter(userIdFlow, recordListFlow.filterItem { !it.isSystemOrRootUid() })


    @Composable
    @Composable
    override fun getSummary(option: Int, record: T) = getSummary(record)
    override fun getSummary(option: Int, record: T) = getSummary(record)
+1 −1
Original line number Original line Diff line number Diff line
@@ -278,7 +278,7 @@ class AppOpPermissionAppListTest {
        const val PERMISSION = "PERMISSION"
        const val PERMISSION = "PERMISSION"
        const val BROADER_PERMISSION = "BROADER_PERMISSION"
        const val BROADER_PERMISSION = "BROADER_PERMISSION"
        val APP = ApplicationInfo().apply { packageName = PACKAGE_NAME }
        val APP = ApplicationInfo().apply { packageName = PACKAGE_NAME }
        val NOT_CHANGEABLE_APP = ApplicationInfo().apply { packageName = "android" }
        val NOT_CHANGEABLE_APP = ApplicationInfo().apply { packageName = "com.android.systemui" }
    }
    }
}
}


Loading