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:
@@ -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>()
|
||||||
|
@@ -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),
|
||||||
|
@@ -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 =
|
||||||
|
@@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user