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

Commit 3218427d authored by Matías Hernández's avatar Matías Hernández
Browse files

Fix default zen config to be up to date according to enabled flags

We were doing it only when reading XML, thus on next boot it would be resolved (but it looks bad).

Fixes: 363229699
Test: atest ZenModeHelperTest + manual (adding a new user)
Flag: android.app.modes_ui
Change-Id: I4f8b24b2ada51f642f3ad69a045347a2c0a21570
parent 61dfb4a0
Loading
Loading
Loading
Loading
+30 −13
Original line number Diff line number Diff line
@@ -226,10 +226,8 @@ public class ZenModeHelper {
        mDefaultConfig = Flags.modesUi()
                ? ZenModeConfig.getDefaultConfig()
                : readDefaultConfig(mContext.getResources());
        updateDefaultConfigAutomaticRules();
        if (Flags.modesApi()) {
            updateDefaultAutomaticRulePolicies();
        }
        updateDefaultConfig(mContext, mDefaultConfig);

        mConfig = mDefaultConfig.copy();
        synchronized (mConfigsArrayLock) {
            mConfigs.put(UserHandle.USER_SYSTEM, mConfig);
@@ -1073,7 +1071,7 @@ public class ZenModeHelper {
    }

    void updateZenRulesOnLocaleChange() {
        updateDefaultConfigAutomaticRules();
        updateRuleStringsForCurrentLocale(mContext, mDefaultConfig);
        synchronized (mConfigLock) {
            if (mConfig == null) {
                return;
@@ -2229,30 +2227,49 @@ public class ZenModeHelper {
        }
    }

    private void updateDefaultConfigAutomaticRules() {
        for (ZenRule rule : mDefaultConfig.automaticRules.values()) {
    /**
     * Apply changes to the <em>default</em> {@link ZenModeConfig} so that the rules included by
     * default (Events / Sleeping) support the latest Zen features and are ready for new users.
     *
     * <p>This includes: setting a fully populated ZenPolicy, setting correct type and
     * allowManualInvocation=true, and ensuring default names and trigger descriptions correspond
     * to the current locale.
     */
    private static void updateDefaultConfig(Context context, ZenModeConfig defaultConfig) {
        if (Flags.modesApi()) {
            updateDefaultAutomaticRulePolicies(defaultConfig);
        }
        if (Flags.modesApi() && Flags.modesUi()) {
            SystemZenRules.maybeUpgradeRules(context, defaultConfig);
        }
        updateRuleStringsForCurrentLocale(context, defaultConfig);
    }

    private static void updateRuleStringsForCurrentLocale(Context context,
            ZenModeConfig defaultConfig) {
        for (ZenRule rule : defaultConfig.automaticRules.values()) {
            if (ZenModeConfig.EVENTS_DEFAULT_RULE_ID.equals(rule.id)) {
                rule.name = mContext.getResources()
                rule.name = context.getResources()
                        .getString(R.string.zen_mode_default_events_name);
            } else if (ZenModeConfig.EVERY_NIGHT_DEFAULT_RULE_ID.equals(rule.id)) {
                rule.name = mContext.getResources()
                rule.name = context.getResources()
                        .getString(R.string.zen_mode_default_every_night_name);
            }
            if (Flags.modesApi() && Flags.modesUi()) {
                SystemZenRules.updateTriggerDescription(mContext, rule);
                SystemZenRules.updateTriggerDescription(context, rule);
            }
        }
    }

    // Updates the policies in the default automatic rules (provided via default XML config) to
    // be fully filled in default values.
    private void updateDefaultAutomaticRulePolicies() {
    private static void updateDefaultAutomaticRulePolicies(ZenModeConfig defaultConfig) {
        if (!Flags.modesApi()) {
            // Should be checked before calling, but just in case.
            return;
        }
        ZenPolicy defaultPolicy = mDefaultConfig.getZenPolicy();
        for (ZenRule rule : mDefaultConfig.automaticRules.values()) {
        ZenPolicy defaultPolicy = defaultConfig.getZenPolicy();
        for (ZenRule rule : defaultConfig.automaticRules.values()) {
            if (ZenModeConfig.DEFAULT_RULE_IDS.contains(rule.id) && rule.zenPolicy == null) {
                rule.zenPolicy = defaultPolicy.copy();
            }
+48 −0
Original line number Diff line number Diff line
@@ -18,6 +18,8 @@ package com.android.server.notification;

import static android.app.AutomaticZenRule.TYPE_BEDTIME;
import static android.app.AutomaticZenRule.TYPE_IMMERSIVE;
import static android.app.AutomaticZenRule.TYPE_SCHEDULE_CALENDAR;
import static android.app.AutomaticZenRule.TYPE_UNKNOWN;
import static android.app.Flags.FLAG_MODES_API;
import static android.app.Flags.FLAG_MODES_UI;
import static android.app.NotificationManager.AUTOMATIC_RULE_STATUS_ACTIVATED;
@@ -6875,6 +6877,52 @@ public class ZenModeHelperTest extends UiServiceTestCase {
                "Didn't find rule with id %s", ruleId);
    }

    @Test
    @DisableFlags({FLAG_MODES_API, FLAG_MODES_UI})
    public void testDefaultConfig_preModesApi_rulesAreBare() {
        // Create a new user, which should get a copy of the default policy.
        mZenModeHelper.onUserSwitched(101);

        ZenRule eventsRule = mZenModeHelper.mConfig.automaticRules.get(
                ZenModeConfig.EVENTS_DEFAULT_RULE_ID);

        assertThat(eventsRule).isNotNull();
        assertThat(eventsRule.zenPolicy).isNull();
        assertThat(eventsRule.type).isEqualTo(TYPE_UNKNOWN);
        assertThat(eventsRule.triggerDescription).isNull();
    }

    @Test
    @EnableFlags(FLAG_MODES_API)
    @DisableFlags(FLAG_MODES_UI)
    public void testDefaultConfig_modesApi_rulesHaveFullPolicy() {
        // Create a new user, which should get a copy of the default policy.
        mZenModeHelper.onUserSwitched(201);

        ZenRule eventsRule = mZenModeHelper.mConfig.automaticRules.get(
                ZenModeConfig.EVENTS_DEFAULT_RULE_ID);

        assertThat(eventsRule).isNotNull();
        assertThat(eventsRule.zenPolicy).isEqualTo(mZenModeHelper.getDefaultZenPolicy());
        assertThat(eventsRule.type).isEqualTo(TYPE_UNKNOWN);
        assertThat(eventsRule.triggerDescription).isNull();
    }

    @Test
    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
    public void testDefaultConfig_modesUi_rulesHaveFullPolicy() {
        // Create a new user, which should get a copy of the default policy.
        mZenModeHelper.onUserSwitched(301);

        ZenRule eventsRule = mZenModeHelper.mConfig.automaticRules.get(
                ZenModeConfig.EVENTS_DEFAULT_RULE_ID);

        assertThat(eventsRule).isNotNull();
        assertThat(eventsRule.zenPolicy).isEqualTo(mZenModeHelper.getDefaultZenPolicy());
        assertThat(eventsRule.type).isEqualTo(TYPE_SCHEDULE_CALENDAR);
        assertThat(eventsRule.triggerDescription).isNotEmpty();
    }

    private static void addZenRule(ZenModeConfig config, String id, String ownerPkg, int zenMode,
            @Nullable ZenPolicy zenPolicy) {
        ZenRule rule = new ZenRule();