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

Commit aa07312d authored by Alan Stokes's avatar Alan Stokes Committed by Android (Google) Code Review
Browse files

Merge "Allow background activity starts to be controlled by DeviceConfig."

parents b4b5a811 fb227077
Loading
Loading
Loading
Loading
+0 −9
Original line number Diff line number Diff line
@@ -11527,15 +11527,6 @@ public final class Settings {
        public static final String BACKGROUND_ACTIVITY_STARTS_ENABLED =
                "background_activity_starts_enabled";
        /**
         * The packages temporarily whitelisted to be able so start activities from background.
         * The list of packages is {@code ":"} colon delimited.
         *
         * @hide
         */
        public static final String BACKGROUND_ACTIVITY_STARTS_PACKAGE_NAMES_WHITELIST =
                "background_activity_starts_package_names_whitelist";
        /**
         * @hide
         * @see com.android.server.appbinding.AppBindingConstants
+0 −1
Original line number Diff line number Diff line
@@ -131,7 +131,6 @@ public class SettingsBackupTest {
                    Settings.Global.AUTOFILL_MAX_VISIBLE_DATASETS,
                    Settings.Global.AUTOMATIC_POWER_SAVE_MODE,
                    Settings.Global.BACKGROUND_ACTIVITY_STARTS_ENABLED,
                    Settings.Global.BACKGROUND_ACTIVITY_STARTS_PACKAGE_NAMES_WHITELIST,
                    Settings.Global.BATTERY_CHARGING_STATE_UPDATE_DELAY,
                    Settings.Global.BROADCAST_BG_CONSTANTS,
                    Settings.Global.BROADCAST_FG_CONSTANTS,
+66 −32
Original line number Diff line number Diff line
@@ -116,6 +116,22 @@ final class ActivityManagerConstants extends ContentObserver {
     */
    private static final String KEY_MAX_CACHED_PROCESSES = "max_cached_processes";

    /**
     * Default value for mFlagBackgroundActivityStartsEnabled if not explicitly set in
     * Settings.Global. This allows it to be set experimentally unless it has been
     * enabled/disabled in developer options. Defaults to true.
     */
    private static final String KEY_DEFAULT_BACKGROUND_ACTIVITY_STARTS_ENABLED =
            "default_background_activity_starts_enabled";

    /**
     * The packages temporarily whitelisted to be able to start activities from background.
     * The list of packages is {@code ":"} colon delimited.
     */
    private static final String KEY_BACKGROUND_ACTIVITY_STARTS_PACKAGE_NAMES_WHITELIST =
            "background_activity_starts_package_names_whitelist";


    // Maximum number of cached processes we will allow.
    public int MAX_CACHED_PROCESSES = DEFAULT_MAX_CACHED_PROCESSES;

@@ -242,7 +258,8 @@ final class ActivityManagerConstants extends ContentObserver {
    volatile boolean mFlagActivityStartsLoggingEnabled;

    // Indicates whether the background activity starts is enabled.
    // Controlled by Settings.Global.BACKGROUND_ACTIVITY_STARTS_ENABLED
    // Controlled by Settings.Global.BACKGROUND_ACTIVITY_STARTS_ENABLED.
    // If not set explicitly the default is controlled by DeviceConfig.
    volatile boolean mFlagBackgroundActivityStartsEnabled;

    volatile ArraySet<String> mPackageNamesWhitelistedForBgActivityStarts = new ArraySet<>();
@@ -295,10 +312,6 @@ final class ActivityManagerConstants extends ContentObserver {
                Settings.Global.getUriFor(
                        Settings.Global.BACKGROUND_ACTIVITY_STARTS_ENABLED);

    private static final Uri BACKGROUND_ACTIVITY_STARTS_PACKAGE_NAMES_WHITELIST_URI =
                Settings.Global.getUriFor(
                        Settings.Global.BACKGROUND_ACTIVITY_STARTS_PACKAGE_NAMES_WHITELIST);

    private static final Uri ENABLE_AUTOMATIC_SYSTEM_SERVER_HEAP_DUMPS_URI =
            Settings.Global.getUriFor(Settings.Global.ENABLE_AUTOMATIC_SYSTEM_SERVER_HEAP_DUMPS);

@@ -306,8 +319,19 @@ final class ActivityManagerConstants extends ContentObserver {
            new OnPropertyChangedListener() {
                @Override
                public void onPropertyChanged(String namespace, String name, String value) {
                    if (KEY_MAX_CACHED_PROCESSES.equals(name)) {
                    if (name == null) {
                        return;
                    }
                    switch (name) {
                        case KEY_MAX_CACHED_PROCESSES:
                            updateMaxCachedProcesses();
                            break;
                        case KEY_DEFAULT_BACKGROUND_ACTIVITY_STARTS_ENABLED:
                        case KEY_BACKGROUND_ACTIVITY_STARTS_PACKAGE_NAMES_WHITELIST:
                            updateBackgroundActivityStarts();
                            break;
                        default:
                            break;
                    }
                }
            };
@@ -330,16 +354,11 @@ final class ActivityManagerConstants extends ContentObserver {
        mResolver.registerContentObserver(ACTIVITY_MANAGER_CONSTANTS_URI, false, this);
        mResolver.registerContentObserver(ACTIVITY_STARTS_LOGGING_ENABLED_URI, false, this);
        mResolver.registerContentObserver(BACKGROUND_ACTIVITY_STARTS_ENABLED_URI, false, this);
        mResolver.registerContentObserver(BACKGROUND_ACTIVITY_STARTS_PACKAGE_NAMES_WHITELIST_URI,
                false, this);
        if (mSystemServerAutomaticHeapDumpEnabled) {
            mResolver.registerContentObserver(ENABLE_AUTOMATIC_SYSTEM_SERVER_HEAP_DUMPS_URI,
                    false, this);
        }
        updateConstants();
        updateActivityStartsLoggingEnabled();
        updateBackgroundActivityStartsEnabled();
        updateBackgroundActivityStartsPackageNamesWhitelist();
        if (mSystemServerAutomaticHeapDumpEnabled) {
            updateEnableAutomaticSystemServerHeapDumps();
        }
@@ -347,7 +366,8 @@ final class ActivityManagerConstants extends ContentObserver {
                ActivityThread.currentApplication().getMainExecutor(),
                mOnDeviceConfigChangedListener);
        updateMaxCachedProcesses();

        updateActivityStartsLoggingEnabled();
        updateBackgroundActivityStarts();
    }

    public void setOverrideMaxCachedProcesses(int value) {
@@ -371,9 +391,7 @@ final class ActivityManagerConstants extends ContentObserver {
        } else if (ACTIVITY_STARTS_LOGGING_ENABLED_URI.equals(uri)) {
            updateActivityStartsLoggingEnabled();
        } else if (BACKGROUND_ACTIVITY_STARTS_ENABLED_URI.equals(uri)) {
            updateBackgroundActivityStartsEnabled();
        } else if (BACKGROUND_ACTIVITY_STARTS_PACKAGE_NAMES_WHITELIST_URI.equals(uri)) {
            updateBackgroundActivityStartsPackageNamesWhitelist();
            updateBackgroundActivityStarts();
        } else if (ENABLE_AUTOMATIC_SYSTEM_SERVER_HEAP_DUMPS_URI.equals(uri)) {
            updateEnableAutomaticSystemServerHeapDumps();
        }
@@ -463,25 +481,41 @@ final class ActivityManagerConstants extends ContentObserver {
                Settings.Global.ACTIVITY_STARTS_LOGGING_ENABLED, 1) == 1;
    }

    private void updateBackgroundActivityStartsEnabled() {
        mFlagBackgroundActivityStartsEnabled = Settings.Global.getInt(mResolver,
                Settings.Global.BACKGROUND_ACTIVITY_STARTS_ENABLED, 1) == 1;
    private void updateBackgroundActivityStarts() {
        String whitelistedPackageNames = null;
        int settingsValue = Settings.Global.getInt(mResolver,
                Settings.Global.BACKGROUND_ACTIVITY_STARTS_ENABLED, -1);

        // If the user has explicitly enabled or disabled, that affects all apps.
        // Otherwise we take the default state and whitelist from DeviceConfig.
        if (settingsValue >= 0) {
            mFlagBackgroundActivityStartsEnabled = settingsValue != 0;
        } else {
            boolean enabledInDeviceConfig = DeviceConfig.getBoolean(
                    DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                    KEY_DEFAULT_BACKGROUND_ACTIVITY_STARTS_ENABLED,
                    /*defaultValue*/ true);
            mFlagBackgroundActivityStartsEnabled = enabledInDeviceConfig;
            if (!enabledInDeviceConfig) {
                whitelistedPackageNames = DeviceConfig.getProperty(
                        DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                        KEY_BACKGROUND_ACTIVITY_STARTS_PACKAGE_NAMES_WHITELIST);
            }

    private void updateBackgroundActivityStartsPackageNamesWhitelist() {
        final String setting = Settings.Global.getString(mResolver,
                Settings.Global.BACKGROUND_ACTIVITY_STARTS_PACKAGE_NAMES_WHITELIST);
        if (TextUtils.isEmpty(setting)) {
            return;
        }
        if (TextUtils.isEmpty(whitelistedPackageNames)) {
            if (!mPackageNamesWhitelistedForBgActivityStarts.isEmpty()) {
                mPackageNamesWhitelistedForBgActivityStarts = new ArraySet<>();
            }
        } else {
            ArraySet<String> newSet = new ArraySet<>();
            SimpleStringSplitter splitter = new SimpleStringSplitter(':');
        splitter.setString(setting);
            splitter.setString(whitelistedPackageNames);
            while (splitter.hasNext()) {
                newSet.add(splitter.next());
            }
            mPackageNamesWhitelistedForBgActivityStarts = newSet;
        }
    }

    private void updateEnableAutomaticSystemServerHeapDumps() {
        if (!mSystemServerAutomaticHeapDumpEnabled) {