diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 5505f597afb76..e62576c32c13e 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -10543,6 +10543,15 @@ public final class Settings { SOFT_AP_TIMEOUT_ENABLED }; + /** + * Global settings that shouldn't be persisted. + * + * @hide + */ + public static final String[] TRANSIENT_SETTINGS = { + LOCATION_GLOBAL_KILL_SWITCH, + }; + /** @hide */ public static final String[] LEGACY_RESTORE_SETTINGS = { }; diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index 7fb6ede8b29db..f4ec936664906 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -174,13 +174,10 @@ public class SettingsProvider extends ContentProvider { Settings.NameValueTable.VALUE }; - public static final int SETTINGS_TYPE_GLOBAL = 0; - public static final int SETTINGS_TYPE_SYSTEM = 1; - public static final int SETTINGS_TYPE_SECURE = 2; - public static final int SETTINGS_TYPE_SSAID = 3; - - public static final int SETTINGS_TYPE_MASK = 0xF0000000; - public static final int SETTINGS_TYPE_SHIFT = 28; + public static final int SETTINGS_TYPE_GLOBAL = SettingsState.SETTINGS_TYPE_GLOBAL; + public static final int SETTINGS_TYPE_SYSTEM = SettingsState.SETTINGS_TYPE_SYSTEM; + public static final int SETTINGS_TYPE_SECURE = SettingsState.SETTINGS_TYPE_SECURE; + public static final int SETTINGS_TYPE_SSAID = SettingsState.SETTINGS_TYPE_SSAID; private static final Bundle NULL_SETTING_BUNDLE = Bundle.forPair( Settings.NameValueTable.VALUE, null); @@ -278,40 +275,23 @@ public class SettingsProvider extends ContentProvider { private volatile IPackageManager mPackageManager; public static int makeKey(int type, int userId) { - return (type << SETTINGS_TYPE_SHIFT) | userId; + return SettingsState.makeKey(type, userId); } public static int getTypeFromKey(int key) { - return key >>> SETTINGS_TYPE_SHIFT; + return SettingsState.getTypeFromKey(key); } public static int getUserIdFromKey(int key) { - return key & ~SETTINGS_TYPE_MASK; + return SettingsState.getUserIdFromKey(key); } public static String settingTypeToString(int type) { - switch (type) { - case SETTINGS_TYPE_GLOBAL: { - return "SETTINGS_GLOBAL"; - } - case SETTINGS_TYPE_SECURE: { - return "SETTINGS_SECURE"; - } - case SETTINGS_TYPE_SYSTEM: { - return "SETTINGS_SYSTEM"; - } - case SETTINGS_TYPE_SSAID: { - return "SETTINGS_SSAID"; - } - default: { - return "UNKNOWN"; - } - } + return SettingsState.settingTypeToString(type); } public static String keyToString(int key) { - return "Key[user=" + getUserIdFromKey(key) + ";type=" - + settingTypeToString(getTypeFromKey(key)) + "]"; + return SettingsState.keyToString(key); } @Override diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java index f901bcaee69ef..a8a67abaf8ae2 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java @@ -33,6 +33,7 @@ import android.os.Message; import android.os.SystemClock; import android.os.UserHandle; import android.provider.Settings; +import android.provider.Settings.Global; import android.providers.settings.GlobalSettingsProto; import android.providers.settings.SettingsOperationProto; import android.text.TextUtils; @@ -46,6 +47,7 @@ import android.util.Xml; import android.util.proto.ProtoOutputStream; import com.android.internal.annotations.GuardedBy; +import com.android.internal.util.ArrayUtils; import com.android.server.LocalServices; import libcore.io.IoUtils; @@ -195,6 +197,51 @@ final class SettingsState { @GuardedBy("mLock") private int mNextHistoricalOpIdx; + public static final int SETTINGS_TYPE_GLOBAL = 0; + public static final int SETTINGS_TYPE_SYSTEM = 1; + public static final int SETTINGS_TYPE_SECURE = 2; + public static final int SETTINGS_TYPE_SSAID = 3; + + public static final int SETTINGS_TYPE_MASK = 0xF0000000; + public static final int SETTINGS_TYPE_SHIFT = 28; + + public static int makeKey(int type, int userId) { + return (type << SETTINGS_TYPE_SHIFT) | userId; + } + + public static int getTypeFromKey(int key) { + return key >>> SETTINGS_TYPE_SHIFT; + } + + public static int getUserIdFromKey(int key) { + return key & ~SETTINGS_TYPE_MASK; + } + + public static String settingTypeToString(int type) { + switch (type) { + case SETTINGS_TYPE_GLOBAL: { + return "SETTINGS_GLOBAL"; + } + case SETTINGS_TYPE_SECURE: { + return "SETTINGS_SECURE"; + } + case SETTINGS_TYPE_SYSTEM: { + return "SETTINGS_SYSTEM"; + } + case SETTINGS_TYPE_SSAID: { + return "SETTINGS_SSAID"; + } + default: { + return "UNKNOWN"; + } + } + } + + public static String keyToString(int key) { + return "Key[user=" + getUserIdFromKey(key) + ";type=" + + settingTypeToString(getTypeFromKey(key)) + "]"; + } + public SettingsState(Context context, Object lock, File file, int key, int maxBytesPerAppPackage, Looper looper) { // It is important that we use the same lock as the settings provider @@ -604,6 +651,13 @@ final class SettingsState { for (int i = 0; i < settingCount; i++) { Setting setting = settings.valueAt(i); + if (setting.isTransient()) { + if (DEBUG_PERSISTENCE) { + Slog.i(LOG_TAG, "[SKIPPED PERSISTING]" + setting.getName()); + } + continue; + } + writeSingleSetting(mVersion, serializer, setting.getId(), setting.getName(), setting.getValue(), setting.getDefaultValue(), setting.getPackageName(), setting.getTag(), setting.isDefaultFromSystem()); @@ -914,6 +968,14 @@ final class SettingsState { return update(this.defaultValue, false, packageName, null, true); } + public boolean isTransient() { + switch (getTypeFromKey(getKey())) { + case SETTINGS_TYPE_GLOBAL: + return ArrayUtils.contains(Global.TRANSIENT_SETTINGS, getName()); + } + return false; + } + public boolean update(String value, boolean setDefault, String packageName, String tag, boolean forceNonSystemPackage) { if (NULL_VALUE.equals(value)) {