diff --git a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java index 0f07afa4c23..ff191ab4476 100644 --- a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java +++ b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java @@ -352,6 +352,7 @@ public class AppButtonsPreferenceController extends BasePreferenceController imp mPackageInfo = mPm.getPackageInfo(mAppEntry.info.packageName, PackageManager.MATCH_DISABLED_COMPONENTS | PackageManager.MATCH_ANY_USER | + PackageManager.GET_SIGNATURES | PackageManager.GET_PERMISSIONS); mPackageName = mAppEntry.info.packageName; @@ -393,7 +394,7 @@ public class AppButtonsPreferenceController extends BasePreferenceController imp // We don't allow uninstalling DO/PO on *any* users if it's a system app, because // "uninstall" is actually "downgrade to the system version + disable", and "downgrade" // will clear data on all users. - if (isSystemPackage(mActivity.getResources(), mPm, mPackageInfo.applicationInfo)) { + if (isSystemPackage(mActivity.getResources(), mPm, mPackageInfo)) { if (Utils.isProfileOrDeviceOwner(mUserManager, mDpm, mPackageInfo.packageName)) { enabled = false; } @@ -562,7 +563,7 @@ public class AppButtonsPreferenceController extends BasePreferenceController imp // by not allowing disabling of apps signed with the // system cert and any launcher app in the system. if (mHomePackages.contains(mAppEntry.info.packageName) - || isSystemPackage(mActivity.getResources(), mPm, mPackageInfo.applicationInfo)) { + || isSystemPackage(mActivity.getResources(), mPm, mPackageInfo)) { // Disable button for core system applications. mButtonsPref.setButton2Text(R.string.disable_text) .setButton2Icon(R.drawable.ic_settings_disable); @@ -581,8 +582,8 @@ public class AppButtonsPreferenceController extends BasePreferenceController imp } @VisibleForTesting - boolean isSystemPackage(Resources resources, PackageManager pm, ApplicationInfo app) { - return Utils.isSystemPackage(resources, pm, app); + boolean isSystemPackage(Resources resources, PackageManager pm, PackageInfo packageInfo) { + return Utils.isSystemPackage(resources, pm, packageInfo); } private boolean isDisabledUntilUsed() { diff --git a/src/com/android/settings/spa/app/appinfo/AppButtons.kt b/src/com/android/settings/spa/app/appinfo/AppButtons.kt index 06016fcb9c2..c088fec69c5 100644 --- a/src/com/android/settings/spa/app/appinfo/AppButtons.kt +++ b/src/com/android/settings/spa/app/appinfo/AppButtons.kt @@ -16,7 +16,7 @@ package com.android.settings.spa.app.appinfo -import android.content.pm.ApplicationInfo +import android.content.pm.PackageInfo import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.remember @@ -58,17 +58,17 @@ private class AppButtonsPresenter(private val packageInfoPresenter: PackageInfoP @Composable fun rememberActionsButtons() = remember { packageInfoPresenter.flow.map { packageInfo -> - if (packageInfo != null) getActionButtons(packageInfo.applicationInfo) else emptyList() + if (packageInfo != null) getActionButtons(packageInfo) else emptyList() } }.collectAsState(initial = emptyList()) - private fun getActionButtons(app: ApplicationInfo): List = listOfNotNull( - appLaunchButton.getActionButton(app), - appInstallButton.getActionButton(app), - appDisableButton.getActionButton(app), - appUninstallButton.getActionButton(app), - appClearButton.getActionButton(app), - appForceStopButton.getActionButton(app), + private fun getActionButtons(packageInfo: PackageInfo): List = listOfNotNull( + appLaunchButton.getActionButton(packageInfo), + appInstallButton.getActionButton(packageInfo), + appDisableButton.getActionButton(packageInfo), + appUninstallButton.getActionButton(packageInfo), + appClearButton.getActionButton(packageInfo), + appForceStopButton.getActionButton(packageInfo), ) @Composable diff --git a/src/com/android/settings/spa/app/appinfo/AppClearButton.kt b/src/com/android/settings/spa/app/appinfo/AppClearButton.kt index ce00b73eed2..c441071910d 100644 --- a/src/com/android/settings/spa/app/appinfo/AppClearButton.kt +++ b/src/com/android/settings/spa/app/appinfo/AppClearButton.kt @@ -16,7 +16,7 @@ package com.android.settings.spa.app.appinfo -import android.content.pm.ApplicationInfo +import android.content.pm.PackageInfo import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Delete import androidx.compose.material3.AlertDialog @@ -37,7 +37,8 @@ class AppClearButton( private var openConfirmDialog by mutableStateOf(false) - fun getActionButton(app: ApplicationInfo): ActionButton? { + fun getActionButton(packageInfo: PackageInfo): ActionButton? { + val app = packageInfo.applicationInfo if (!app.isInstantApp) return null return clearButton() diff --git a/src/com/android/settings/spa/app/appinfo/AppDisableButton.kt b/src/com/android/settings/spa/app/appinfo/AppDisableButton.kt index 8aab3c1f312..79fb3866692 100644 --- a/src/com/android/settings/spa/app/appinfo/AppDisableButton.kt +++ b/src/com/android/settings/spa/app/appinfo/AppDisableButton.kt @@ -52,12 +52,13 @@ class AppDisableButton( private var openConfirmDialog by mutableStateOf(false) - fun getActionButton(app: ApplicationInfo): ActionButton? { + fun getActionButton(packageInfo: PackageInfo): ActionButton? { + val app = packageInfo.applicationInfo if (!app.isSystemApp) return null return when { app.enabled && !app.isDisabledUntilUsed -> { - disableButton(app = app, enabled = isDisableButtonEnabled(app)) + disableButton(app = app, enabled = isDisableButtonEnabled(packageInfo)) } else -> enableButton() @@ -67,8 +68,9 @@ class AppDisableButton( /** * Gets whether a package can be disabled. */ - private fun isDisableButtonEnabled(app: ApplicationInfo): Boolean { - val packageName = app.packageName + private fun isDisableButtonEnabled(packageInfo: PackageInfo): Boolean { + val packageName = packageInfo.packageName + val app = packageInfo.applicationInfo return when { packageName in applicationFeatureProvider.keepEnabledPackages -> false @@ -78,7 +80,7 @@ class AppDisableButton( // Try to prevent the user from bricking their phone by not allowing disabling of apps // signed with the system certificate. - SettingsLibUtils.isSystemPackage(resources, packageManager, app) -> false + SettingsLibUtils.isSystemPackage(resources, packageManager, packageInfo) -> false // 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" diff --git a/src/com/android/settings/spa/app/appinfo/AppForceStopButton.kt b/src/com/android/settings/spa/app/appinfo/AppForceStopButton.kt index a7aa6c113af..52ce3dfb5f6 100644 --- a/src/com/android/settings/spa/app/appinfo/AppForceStopButton.kt +++ b/src/com/android/settings/spa/app/appinfo/AppForceStopButton.kt @@ -48,7 +48,8 @@ class AppForceStopButton( private var openConfirmDialog by mutableStateOf(false) - fun getActionButton(app: ApplicationInfo): ActionButton { + fun getActionButton(packageInfo: PackageInfo): ActionButton { + val app = packageInfo.applicationInfo return ActionButton( text = context.getString(R.string.force_stop), imageVector = Icons.Outlined.WarningAmber, diff --git a/src/com/android/settings/spa/app/appinfo/AppInstallButton.kt b/src/com/android/settings/spa/app/appinfo/AppInstallButton.kt index caf6a4d4350..4ff246115c5 100644 --- a/src/com/android/settings/spa/app/appinfo/AppInstallButton.kt +++ b/src/com/android/settings/spa/app/appinfo/AppInstallButton.kt @@ -18,6 +18,7 @@ package com.android.settings.spa.app.appinfo import android.content.Intent import android.content.pm.ApplicationInfo +import android.content.pm.PackageInfo import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.FileDownload import com.android.settings.R @@ -28,7 +29,8 @@ import com.android.settingslib.spaprivileged.model.app.userHandle class AppInstallButton(private val packageInfoPresenter: PackageInfoPresenter) { private val context = packageInfoPresenter.context - fun getActionButton(app: ApplicationInfo): ActionButton? { + fun getActionButton(packageInfo: PackageInfo): ActionButton? { + val app = packageInfo.applicationInfo if (!app.isInstantApp) return null return AppStoreUtil.getAppStoreLink(packageInfoPresenter.userContext, app.packageName) diff --git a/src/com/android/settings/spa/app/appinfo/AppLaunchButton.kt b/src/com/android/settings/spa/app/appinfo/AppLaunchButton.kt index a1c3273eae3..9e82f53e146 100644 --- a/src/com/android/settings/spa/app/appinfo/AppLaunchButton.kt +++ b/src/com/android/settings/spa/app/appinfo/AppLaunchButton.kt @@ -18,6 +18,7 @@ package com.android.settings.spa.app.appinfo import android.content.Intent import android.content.pm.ApplicationInfo +import android.content.pm.PackageInfo import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Launch import com.android.settings.R @@ -28,9 +29,9 @@ class AppLaunchButton(packageInfoPresenter: PackageInfoPresenter) { private val context = packageInfoPresenter.context private val userPackageManager = packageInfoPresenter.userPackageManager - fun getActionButton(app: ApplicationInfo): ActionButton? = - userPackageManager.getLaunchIntentForPackage(app.packageName)?.let { intent -> - launchButton(intent, app) + fun getActionButton(packageInfo: PackageInfo): ActionButton? = + userPackageManager.getLaunchIntentForPackage(packageInfo.packageName)?.let { intent -> + launchButton(intent, packageInfo.applicationInfo) } private fun launchButton(intent: Intent, app: ApplicationInfo) = ActionButton( diff --git a/src/com/android/settings/spa/app/appinfo/AppUninstallButton.kt b/src/com/android/settings/spa/app/appinfo/AppUninstallButton.kt index f05d611984f..4b95f7bebde 100644 --- a/src/com/android/settings/spa/app/appinfo/AppUninstallButton.kt +++ b/src/com/android/settings/spa/app/appinfo/AppUninstallButton.kt @@ -18,6 +18,7 @@ package com.android.settings.spa.app.appinfo import android.content.om.OverlayManager import android.content.pm.ApplicationInfo +import android.content.pm.PackageInfo import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Delete import com.android.settings.R @@ -31,7 +32,8 @@ class AppUninstallButton(private val packageInfoPresenter: PackageInfoPresenter) private val appButtonRepository = AppButtonRepository(context) private val overlayManager = context.getSystemService(OverlayManager::class.java)!! - fun getActionButton(app: ApplicationInfo): ActionButton? { + fun getActionButton(packageInfo: PackageInfo): ActionButton? { + val app = packageInfo.applicationInfo if (app.isSystemApp || app.isInstantApp) return null return uninstallButton(app = app, enabled = isUninstallButtonEnabled(app)) } diff --git a/src/com/android/settings/spa/app/appinfo/PackageInfoPresenter.kt b/src/com/android/settings/spa/app/appinfo/PackageInfoPresenter.kt index b8949f0061a..4a6f9dbc4a7 100644 --- a/src/com/android/settings/spa/app/appinfo/PackageInfoPresenter.kt +++ b/src/com/android/settings/spa/app/appinfo/PackageInfoPresenter.kt @@ -147,7 +147,9 @@ class PackageInfoPresenter( private fun getPackageInfo() = PackageManagers.getPackageInfoAsUser( packageName = packageName, - flags = PackageManager.MATCH_DISABLED_COMPONENTS or PackageManager.GET_PERMISSIONS, + flags = PackageManager.MATCH_DISABLED_COMPONENTS or + PackageManager.GET_SIGNATURES or + PackageManager.GET_PERMISSIONS, userId = userId, ) }