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

Commit 7adac045 authored by Mark Kim's avatar Mark Kim
Browse files

Use a separated flag for archiving feature in Settings

The new flag will replace the current PM-flag eventually, once they reach the same rollout status. Until then both flags are kept concurrently, to avoid a rollback of the feature.

This is done to reduce risk and potentially enable an isolated rollback
of Settings related logic, while keeping system logic intact.

Additionally, fix bug by replacing `System.getProperty("pm.archiving.enabled")` to `SystemProperties.getBoolean("pm.archiving.enabled", false)`

Test: InstalledAppCounterTest, AppButtonsTest, HibernationSwitchPreferenceTest
Bug: 323164382
Change-Id: I44a41d6a43a12134c4e3aa5df8ad6a9eb91758d4
parent c7e0649c
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -13,3 +13,10 @@ flag {
    description: "Enabling will provide an explicit package name for Intent to update mainline modules"
    bug: "278987474"
}

flag {
    name: "app_archiving"
    namespace: "android_settings"
    description: "Feature flag to enable the archiving feature."
    bug: "323164382"
}
+9 −1
Original line number Diff line number Diff line
@@ -22,12 +22,15 @@ import android.content.pm.PackageManager;
import android.content.pm.PackageManager.ApplicationInfoFlags;
import android.content.pm.UserInfo;
import android.os.AsyncTask;
import android.os.SystemProperties;
import android.os.UserHandle;
import android.os.UserManager;

import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;

import com.android.settings.flags.Flags;

import java.util.List;

public abstract class AppCounter extends AsyncTask<Void, Void, Integer> {
@@ -54,7 +57,7 @@ public abstract class AppCounter extends AsyncTask<Void, Void, Integer> {
        for (UserInfo user : mUm.getProfiles(UserHandle.myUserId())) {
            long flags = PackageManager.GET_DISABLED_COMPONENTS
                    | PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS
                    | (mFf.archiving() ? PackageManager.MATCH_ARCHIVED_PACKAGES : 0)
                    | (isArchivingEnabled() ? PackageManager.MATCH_ARCHIVED_PACKAGES : 0)
                    | (user.isAdmin() ? PackageManager.MATCH_ANY_USER : 0);
            ApplicationInfoFlags infoFlags = ApplicationInfoFlags.of(flags);
            final List<ApplicationInfo> list =
@@ -68,6 +71,11 @@ public abstract class AppCounter extends AsyncTask<Void, Void, Integer> {
        return count;
    }

    private boolean isArchivingEnabled() {
        return mFf.archiving() || SystemProperties.getBoolean("pm.archiving.enabled", false)
                || Flags.appArchiving();
    }

    @Override
    protected void onPostExecute(Integer count) {
        onCountComplete(count);
+4 −4
Original line number Diff line number Diff line
@@ -17,8 +17,8 @@
package com.android.settings.spa.app.appinfo

import android.content.pm.ApplicationInfo
import android.content.pm.FeatureFlags
import android.content.pm.FeatureFlagsImpl
import android.content.pm.FeatureFlags as PmFeatureFlags
import android.content.pm.FeatureFlagsImpl as PmFeatureFlagsImpl
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.lifecycle.compose.collectAsStateWithLifecycle
@@ -34,7 +34,7 @@ import kotlinx.coroutines.flow.MutableStateFlow
fun AppButtons(
    packageInfoPresenter: PackageInfoPresenter,
    isHibernationSwitchEnabledStateFlow: MutableStateFlow<Boolean>,
    featureFlags: FeatureFlags = FeatureFlagsImpl()
    featureFlags: PmFeatureFlags = PmFeatureFlagsImpl()
) {
    if (remember(packageInfoPresenter) { packageInfoPresenter.isMainlineModule() }) return
    val presenter = remember {
@@ -53,7 +53,7 @@ private fun PackageInfoPresenter.isMainlineModule(): Boolean =
private class AppButtonsPresenter(
    private val packageInfoPresenter: PackageInfoPresenter,
    isHibernationSwitchEnabledStateFlow: MutableStateFlow<Boolean>,
    private val featureFlags: FeatureFlags
    private val featureFlags: PmFeatureFlags
) {
    private val appLaunchButton = AppLaunchButton(packageInfoPresenter)
    private val appInstallButton = AppInstallButton(packageInfoPresenter)
+7 −5
Original line number Diff line number Diff line
@@ -18,9 +18,8 @@ package com.android.settings.spa.app.appinfo

import android.app.settings.SettingsEnums
import android.content.pm.ApplicationInfo
import android.content.pm.FeatureFlags
import android.content.pm.FeatureFlagsImpl
import android.os.Bundle
import android.os.SystemProperties
import android.os.UserHandle
import android.util.FeatureFlagUtils
import androidx.compose.runtime.Composable
@@ -51,6 +50,8 @@ import com.android.settingslib.spa.widget.ui.Category
import com.android.settingslib.spaprivileged.model.app.toRoute
import com.android.settingslib.spaprivileged.template.app.AppInfoProvider
import kotlinx.coroutines.flow.MutableStateFlow
import android.content.pm.FeatureFlags as PmFeatureFlags
import android.content.pm.FeatureFlagsImpl as PmFeatureFlagsImpl

private const val PACKAGE_NAME = "packageName"
private const val USER_ID = "userId"
@@ -121,7 +122,7 @@ object AppInfoSettingsProvider : SettingsPageProvider {
@Composable
private fun AppInfoSettings(packageInfoPresenter: PackageInfoPresenter) {
    val packageInfoState = packageInfoPresenter.flow.collectAsStateWithLifecycle()
    val featureFlags: FeatureFlags = FeatureFlagsImpl()
    val featureFlags: PmFeatureFlags = PmFeatureFlagsImpl()
    RegularScaffold(
        title = stringResource(R.string.application_info_label),
        actions = {
@@ -177,5 +178,6 @@ private fun AppInfoSettings(packageInfoPresenter: PackageInfoPresenter) {
    }
}

fun isArchivingEnabled(featureFlags: FeatureFlags) =
        featureFlags.archiving() || "true" == System.getProperty("pm.archiving.enabled")
fun isArchivingEnabled(featureFlags: PmFeatureFlags) =
        featureFlags.archiving() || SystemProperties.getBoolean("pm.archiving.enabled", false)
                || Flags.appArchiving()
 No newline at end of file
+5 −2
Original line number Diff line number Diff line
@@ -22,8 +22,9 @@ import android.app.AppOpsManager.MODE_IGNORED
import android.app.AppOpsManager.OP_AUTO_REVOKE_PERMISSIONS_IF_UNUSED
import android.content.Context
import android.content.pm.ApplicationInfo
import android.content.pm.Flags
import android.content.pm.Flags as PmFlags
import android.os.Build
import android.os.SystemProperties
import android.permission.PermissionControllerManager.HIBERNATION_ELIGIBILITY_EXEMPT_BY_SYSTEM
import android.permission.PermissionControllerManager.HIBERNATION_ELIGIBILITY_UNKNOWN
import android.provider.DeviceConfig
@@ -36,6 +37,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.android.settings.R
import com.android.settings.Utils.PROPERTY_APP_HIBERNATION_ENABLED
import com.android.settings.Utils.PROPERTY_HIBERNATION_TARGETS_PRE_S_APPS
import com.android.settings.flags.Flags
import com.android.settingslib.spa.framework.compose.OverridableFlow
import com.android.settingslib.spa.widget.preference.SwitchPreference
import com.android.settingslib.spa.widget.preference.SwitchPreferenceModel
@@ -91,7 +93,8 @@ fun HibernationSwitchPreference(
}

private fun isArchivingEnabled() =
        Flags.archiving() || "true" == System.getProperty("pm.archiving.enabled")
        PmFlags.archiving() || SystemProperties.getBoolean("pm.archiving.enabled", false)
                || Flags.appArchiving()

private class HibernationSwitchPresenter(context: Context, private val app: ApplicationInfo) {
    private val appOpsManager = context.appOpsManager
Loading