Apply restricted by admin to the disable button

Currently, we apply the same device policy for both the uninstallation
and disable button.

Also, not double check whether a package is admin (device owner or
profile owner).

Bug: 236346018
Test: Manual on App Settings page
Change-Id: If081fd8ff5422eeac931076a18f73632132a528c
This commit is contained in:
Chaohui Wang
2022-09-29 20:42:19 +08:00
parent 88f9c8fe7e
commit 4e35f2596b
4 changed files with 25 additions and 35 deletions

View File

@@ -22,9 +22,12 @@ import android.content.Context
import android.content.pm.ApplicationInfo import android.content.pm.ApplicationInfo
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.content.pm.ResolveInfo import android.content.pm.ResolveInfo
import com.android.settingslib.RestrictedLockUtils
import com.android.settingslib.RestrictedLockUtilsInternal
import com.android.settingslib.Utils import com.android.settingslib.Utils
import com.android.settingslib.spaprivileged.framework.common.devicePolicyManager import com.android.settingslib.spaprivileged.framework.common.devicePolicyManager
import com.android.settingslib.spaprivileged.model.app.isDisallowControl import com.android.settingslib.spaprivileged.model.app.isDisallowControl
import com.android.settingslib.spaprivileged.model.app.userId
class AppButtonRepository(private val context: Context) { class AppButtonRepository(private val context: Context) {
private val packageManager = context.packageManager private val packageManager = context.packageManager
@@ -43,6 +46,16 @@ class AppButtonRepository(private val context: Context) {
else -> app.isDisallowControl(context) else -> app.isDisallowControl(context)
} }
/**
* Checks whether uninstall is blocked by admin.
*/
fun isUninstallBlockedByAdmin(app: ApplicationInfo): Boolean =
RestrictedLockUtilsInternal.checkIfUninstallBlocked(context, app.packageName, app.userId)
?.let { admin ->
RestrictedLockUtils.sendShowAdminSupportDetailsIntent(context, admin)
true
} ?: false
fun getHomePackageInfo(): HomePackages { fun getHomePackageInfo(): HomePackages {
val homePackages = mutableSetOf<String>() val homePackages = mutableSetOf<String>()
val homeActivities = ArrayList<ResolveInfo>() val homeActivities = ArrayList<ResolveInfo>()

View File

@@ -16,6 +16,7 @@
package com.android.settings.spa.app.appsettings package com.android.settings.spa.app.appsettings
import android.content.pm.ApplicationInfo
import android.content.pm.PackageInfo import android.content.pm.PackageInfo
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.ArrowCircleDown import androidx.compose.material.icons.outlined.ArrowCircleDown
@@ -34,7 +35,6 @@ import com.android.settings.overlay.FeatureFactory
import com.android.settingslib.spa.widget.button.ActionButton import com.android.settingslib.spa.widget.button.ActionButton
import com.android.settingslib.spaprivileged.framework.common.devicePolicyManager import com.android.settingslib.spaprivileged.framework.common.devicePolicyManager
import com.android.settingslib.spaprivileged.framework.common.userManager import com.android.settingslib.spaprivileged.framework.common.userManager
import com.android.settingslib.spaprivileged.model.app.isActiveAdmin
import com.android.settingslib.spaprivileged.model.app.isDisabledUntilUsed import com.android.settingslib.spaprivileged.model.app.isDisabledUntilUsed
import com.android.settingslib.Utils as SettingsLibUtils import com.android.settingslib.Utils as SettingsLibUtils
@@ -58,7 +58,7 @@ class AppDisableButton(
return when { return when {
app.enabled && !app.isDisabledUntilUsed -> { app.enabled && !app.isDisabledUntilUsed -> {
disableButton(enabled = isDisableButtonEnabled(packageInfo)) disableButton(app = app, enabled = isDisableButtonEnabled(packageInfo))
} }
else -> enableButton() else -> enableButton()
@@ -82,9 +82,6 @@ class AppDisableButton(
// signed with the system certificate. // signed with the system certificate.
SettingsLibUtils.isSystemPackage(resources, packageManager, packageInfo) -> false SettingsLibUtils.isSystemPackage(resources, packageManager, packageInfo) -> false
// If this is a device admin, it can't be disabled.
app.isActiveAdmin(context) -> false
// We don't allow disabling DO/PO on *any* users if it's a system app, because // We don't allow disabling DO/PO on *any* users if it's a system app, because
// "disabling" is actually "downgrade to the system version + disable", and "downgrade" // "disabling" is actually "downgrade to the system version + disable", and "downgrade"
// will clear data on all users. // will clear data on all users.
@@ -99,11 +96,16 @@ class AppDisableButton(
} }
} }
private fun disableButton(enabled: Boolean) = ActionButton( private fun disableButton(app: ApplicationInfo, enabled: Boolean) = ActionButton(
text = context.getString(R.string.disable_text), text = context.getString(R.string.disable_text),
imageVector = Icons.Outlined.HideSource, imageVector = Icons.Outlined.HideSource,
enabled = enabled, enabled = enabled,
) { openConfirmDialog = true } ) {
// Currently we apply the same device policy for both the uninstallation and disable button.
if (!appButtonRepository.isUninstallBlockedByAdmin(app)) {
openConfirmDialog = true
}
}
private fun enableButton() = ActionButton( private fun enableButton() = ActionButton(
text = context.getString(R.string.enable_text), text = context.getString(R.string.enable_text),

View File

@@ -30,7 +30,6 @@ import com.android.settingslib.spa.widget.scaffold.MoreOptionsAction
import com.android.settingslib.spaprivileged.framework.common.devicePolicyManager import com.android.settingslib.spaprivileged.framework.common.devicePolicyManager
import com.android.settingslib.spaprivileged.framework.common.userManager import com.android.settingslib.spaprivileged.framework.common.userManager
import com.android.settingslib.spaprivileged.model.app.PackageManagers import com.android.settingslib.spaprivileged.model.app.PackageManagers
import com.android.settingslib.spaprivileged.model.app.isActiveAdmin
import com.android.settingslib.spaprivileged.model.app.isDisallowControl import com.android.settingslib.spaprivileged.model.app.isDisallowControl
import com.android.settingslib.spaprivileged.model.app.userId import com.android.settingslib.spaprivileged.model.app.userId
@@ -76,7 +75,7 @@ private fun isShowUninstallUpdates(context: Context, app: ApplicationInfo): Bool
!context.resources.getBoolean(R.bool.config_disable_uninstall_update) !context.resources.getBoolean(R.bool.config_disable_uninstall_update)
private fun isShowUninstallForAllUsers(context: Context, app: ApplicationInfo): Boolean = private fun isShowUninstallForAllUsers(context: Context, app: ApplicationInfo): Boolean =
app.userId == 0 && !app.isSystemApp && !app.isInstantApp && !app.isActiveAdmin(context) && app.userId == 0 && !app.isSystemApp && !app.isInstantApp &&
isOtherUserHasInstallPackage(context, app) isOtherUserHasInstallPackage(context, app)
private fun isOtherUserHasInstallPackage(context: Context, app: ApplicationInfo): Boolean = private fun isOtherUserHasInstallPackage(context: Context, app: ApplicationInfo): Boolean =

View File

@@ -16,32 +16,21 @@
package com.android.settings.spa.app.appsettings package com.android.settings.spa.app.appsettings
import android.app.settings.SettingsEnums
import android.content.ComponentName
import android.content.Intent
import android.content.om.OverlayManager import android.content.om.OverlayManager
import android.content.pm.ApplicationInfo import android.content.pm.ApplicationInfo
import android.content.pm.PackageInfo import android.content.pm.PackageInfo
import android.net.Uri
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Delete import androidx.compose.material.icons.outlined.Delete
import com.android.settings.R import com.android.settings.R
import com.android.settings.Utils
import com.android.settings.applications.specialaccess.deviceadmin.DeviceAdminAdd
import com.android.settingslib.RestrictedLockUtils
import com.android.settingslib.RestrictedLockUtilsInternal
import com.android.settingslib.spa.widget.button.ActionButton import com.android.settingslib.spa.widget.button.ActionButton
import com.android.settingslib.spaprivileged.framework.common.devicePolicyManager
import com.android.settingslib.spaprivileged.model.app.hasFlag import com.android.settingslib.spaprivileged.model.app.hasFlag
import com.android.settingslib.spaprivileged.model.app.isActiveAdmin import com.android.settingslib.spaprivileged.model.app.isActiveAdmin
import com.android.settingslib.spaprivileged.model.app.userHandle import com.android.settingslib.spaprivileged.model.app.userHandle
import com.android.settingslib.spaprivileged.model.app.userId
class AppUninstallButton(private val packageInfoPresenter: PackageInfoPresenter) { class AppUninstallButton(private val packageInfoPresenter: PackageInfoPresenter) {
private val context = packageInfoPresenter.context private val context = packageInfoPresenter.context
private val appButtonRepository = AppButtonRepository(context) private val appButtonRepository = AppButtonRepository(context)
private val overlayManager = context.getSystemService(OverlayManager::class.java)!! private val overlayManager = context.getSystemService(OverlayManager::class.java)!!
private val devicePolicyManager = context.devicePolicyManager
fun getActionButton(packageInfo: PackageInfo): ActionButton? { fun getActionButton(packageInfo: PackageInfo): ActionButton? {
val app = packageInfo.applicationInfo val app = packageInfo.applicationInfo
@@ -54,7 +43,7 @@ class AppUninstallButton(private val packageInfoPresenter: PackageInfoPresenter)
!app.hasFlag(ApplicationInfo.FLAG_INSTALLED) -> false !app.hasFlag(ApplicationInfo.FLAG_INSTALLED) -> false
// Not allow to uninstall DO/PO. // Not allow to uninstall DO/PO.
Utils.isProfileOrDeviceOwner(devicePolicyManager, app.packageName, app.userId) -> false app.isActiveAdmin(context) -> false
appButtonRepository.isDisallowControl(app) -> false appButtonRepository.isDisallowControl(app) -> false
@@ -99,20 +88,7 @@ class AppUninstallButton(private val packageInfoPresenter: PackageInfoPresenter)
) { onUninstallClicked(app) } ) { onUninstallClicked(app) }
private fun onUninstallClicked(app: ApplicationInfo) { private fun onUninstallClicked(app: ApplicationInfo) {
if (app.isActiveAdmin(context)) { if (appButtonRepository.isUninstallBlockedByAdmin(app)) return
packageInfoPresenter.logAction(SettingsEnums.ACTION_SETTINGS_UNINSTALL_DEVICE_ADMIN)
val intent = Intent(context, DeviceAdminAdd::class.java).apply {
putExtra(DeviceAdminAdd.EXTRA_DEVICE_ADMIN_PACKAGE_NAME, app.packageName)
}
context.startActivityAsUser(intent, app.userHandle)
return
}
RestrictedLockUtilsInternal.checkIfUninstallBlocked(
context, app.packageName, app.userId
)?.let { admin ->
RestrictedLockUtils.sendShowAdminSupportDetailsIntent(context, admin)
return
}
packageInfoPresenter.startUninstallActivity() packageInfoPresenter.startUninstallActivity()
} }
} }