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

Commit 484000fb authored by Ruslan Tkhakokhov's avatar Ruslan Tkhakokhov
Browse files

Add preserveValueInRestore flag to Setting object

Bug: 144838882
Test: SettingsStateTest

This is part of the feature to change settings backup&restore. If a
setting has been modified, restore shouldn't override its value. To
track such settings, add preserveValueInRestore flag and set it to true when a
setting is modified by any package other than 'android' (which modifies
settings during settings upgrade - situation we don't need to consider)

Change-Id: Id6e8e93e9ec9af4c31c88e2aded9332e39fc87da
parent d261711e
Loading
Loading
Loading
Loading
+32 −6
Original line number Diff line number Diff line
@@ -117,6 +117,8 @@ final class SettingsState {
    private static final String ATTR_NAMESPACE = "namespace";
    private static final String ATTR_BANNED_HASH = "bannedHash";

    private static final String ATTR_PRESERVE_IN_RESTORE = "preserve_in_restore";

    /**
     * Non-binary value will be written in this attributes.
     */
@@ -797,7 +799,8 @@ final class SettingsState {

                    writeSingleSetting(mVersion, serializer, setting.getId(), setting.getName(),
                            setting.getValue(), setting.getDefaultValue(), setting.getPackageName(),
                            setting.getTag(), setting.isDefaultFromSystem());
                            setting.getTag(), setting.isDefaultFromSystem(),
                            setting.isValuePreservedInRestore());

                    if (DEBUG_PERSISTENCE) {
                        Slog.i(LOG_TAG, "[PERSISTED]" + setting.getName() + "="
@@ -886,7 +889,8 @@ final class SettingsState {

    static void writeSingleSetting(int version, XmlSerializer serializer, String id,
            String name, String value, String defaultValue, String packageName,
            String tag, boolean defaultSysSet) throws IOException {
            String tag, boolean defaultSysSet, boolean isValuePreservedInRestore)
            throws IOException {
        if (id == null || isBinary(id) || name == null || isBinary(name)
                || packageName == null || isBinary(packageName)) {
            // This shouldn't happen.
@@ -905,6 +909,9 @@ final class SettingsState {
            setValueAttribute(ATTR_TAG, ATTR_TAG_BASE64,
                    version, serializer, tag);
        }
        if (isValuePreservedInRestore) {
            serializer.attribute(null, ATTR_PRESERVE_IN_RESTORE, Boolean.toString(true));
        }
        serializer.endTag(null, TAG_SETTING);
    }

@@ -1041,6 +1048,10 @@ final class SettingsState {
                String packageName = parser.getAttributeValue(null, ATTR_PACKAGE);
                String defaultValue = getValueAttribute(parser, ATTR_DEFAULT_VALUE,
                        ATTR_DEFAULT_VALUE_BASE64);
                String isPreservedInRestoreString = parser.getAttributeValue(null,
                        ATTR_PRESERVE_IN_RESTORE);
                boolean isPreservedInRestore = isPreservedInRestoreString != null
                        && Boolean.parseBoolean(isPreservedInRestoreString);
                String tag = null;
                boolean fromSystem = false;
                if (defaultValue != null) {
@@ -1049,7 +1060,7 @@ final class SettingsState {
                    tag = getValueAttribute(parser, ATTR_TAG, ATTR_TAG_BASE64);
                }
                mSettings.put(name, new Setting(name, value, defaultValue, packageName, tag,
                        fromSystem, id));
                        fromSystem, id, isPreservedInRestore));

                if (DEBUG_PERSISTENCE) {
                    Slog.i(LOG_TAG, "[RESTORED] " + name + "=" + value);
@@ -1133,6 +1144,8 @@ final class SettingsState {
        private String tag;
        // Whether the default is set by the system
        private boolean defaultFromSystem;
        // Whether the value of this setting will be preserved when restore happens..
        private boolean isValuePreservedInRestore;

        public Setting(Setting other) {
            name = other.name;
@@ -1152,15 +1165,23 @@ final class SettingsState {

        public Setting(String name, String value, String defaultValue,
                String packageName, String tag, boolean fromSystem, String id) {
            this(name, value, defaultValue, packageName, tag, fromSystem, id, false);
        }

        Setting(String name, String value, String defaultValue,
                String packageName, String tag, boolean fromSystem, String id,
                boolean isValuePreservedInRestore) {
            mNextId = Math.max(mNextId, Long.parseLong(id) + 1);
            if (NULL_VALUE.equals(value)) {
                value = null;
            }
            init(name, value, tag, defaultValue, packageName, fromSystem, id);
            init(name, value, tag, defaultValue, packageName, fromSystem, id,
                    isValuePreservedInRestore);
        }

        private void init(String name, String value, String tag, String defaultValue,
                String packageName, boolean fromSystem, String id) {
                String packageName, boolean fromSystem, String id,
                boolean isValuePreservedInRestore) {
            this.name = name;
            this.value = value;
            this.tag = tag;
@@ -1168,6 +1189,7 @@ final class SettingsState {
            this.packageName = packageName;
            this.id = id;
            this.defaultFromSystem = fromSystem;
            this.isValuePreservedInRestore = isValuePreservedInRestore;
        }

        public String getName() {
@@ -1198,6 +1220,10 @@ final class SettingsState {
            return defaultFromSystem;
        }

        public boolean isValuePreservedInRestore() {
            return isValuePreservedInRestore;
        }

        public String getId() {
            return id;
        }
@@ -1263,7 +1289,7 @@ final class SettingsState {
            }

            init(name, value, tag, defaultValue, packageName, defaultFromSystem,
                    String.valueOf(mNextId++));
                    String.valueOf(mNextId++), /* isValuePreservedInRestore */ true);
            return true;
        }

+3 −3
Original line number Diff line number Diff line
@@ -99,10 +99,10 @@ public class SettingsStateTest extends AndroidTestCase {
        checkWriteSingleSetting(serializer, CRAZY_STRING, null);
        SettingsState.writeSingleSetting(
                SettingsState.SETTINGS_VERSION_NEW_ENCODING,
                serializer, null, "k", "v", null, "package", null, false);
                serializer, null, "k", "v", null, "package", null, false, false);
        SettingsState.writeSingleSetting(
                SettingsState.SETTINGS_VERSION_NEW_ENCODING,
                serializer, "1", "k", "v", null, null, null, false);
                serializer, "1", "k", "v", null, null, null, false, false);
    }

    private void checkWriteSingleSetting(XmlSerializer serializer, String key, String value)
@@ -115,7 +115,7 @@ public class SettingsStateTest extends AndroidTestCase {
        // Make sure the XML serializer won't crash.
        SettingsState.writeSingleSetting(
                SettingsState.SETTINGS_VERSION_NEW_ENCODING,
                serializer, "1", key, value, null, "package", null, false);
                serializer, "1", key, value, null, "package", null, false, false);
    }

    /**