Merge "Initialize and migrate 26 keys that are backed by PrepreferencesProperties."

This commit is contained in:
Haiping Yang
2021-06-18 21:52:56 +00:00
committed by Android (Google) Code Review
6 changed files with 523 additions and 5 deletions

View File

@@ -16205,6 +16205,252 @@ public final class Settings {
* @hide
*/
public static final String RESTRICTED_NETWORKING_MODE = "restricted_networking_mode";
/**
* Settings migrated from Wear OS settings provider.
* @hide
*/
public static class Wearable {
/**
* Whether the user has any pay tokens on their watch.
* @hide
*/
public static final String HAS_PAY_TOKENS = "has_pay_tokens";
/**
* Gcm checkin timeout in minutes.
* @hide
*/
public static final String GMS_CHECKIN_TIMEOUT_MIN = "gms_checkin_timeout_min";
/**
* If hotword detection should be enabled.
* @hide
*/
public static final String HOTWORD_DETECTION_ENABLED = "hotword_detection_enabled";
/**
* Whether Smart Replies are enabled within Wear.
* @hide
*/
public static final String SMART_REPLIES_ENABLED = "smart_replies_enabled";
/**
* The default vibration pattern.
* @hide
*/
public static final String DEFAULT_VIBRATION = "default_vibration";
/**
* If FLP should obtain location data from the paired device.
* @hide
*/
public static final String OBTAIN_PAIRED_DEVICE_LOCATION =
"obtain_paired_device_location";
/**
* Whether the device is in retail mode.
* @hide
*/
public static final String RETAIL_MODE = "retail_mode";
// Possible retail mode states
/** @hide */
public static final int RETAIL_MODE_CONSUMER = 0;
/** @hide */
public static final int RETAIL_MODE_RETAIL = 1;
/**
* The play store availability.
* @hide
*/
public static final String PLAY_STORE_AVAILABILITY = "play_store_availability";
// Possible play store availability states
/** @hide */
public static final int PLAY_STORE_AVAILABILITY_UNKNOWN = 0;
/** @hide */
public static final int PLAY_STORE_AVAILABLE = 1;
/** @hide */
public static final int PLAY_STORE_UNAVAILABLE = 2;
/**
* Whether the bug report is enabled.
* @hide
*/
public static final String BUG_REPORT = "bug_report";
// Possible bug report states
/** @hide */
public static final int BUG_REPORT_DISABLED = 0;
/** @hide */
public static final int BUG_REPORT_ENABLED = 1;
/**
* The enabled/disabled state of the SmartIlluminate.
* @hide
*/
public static final String SMART_ILLUMINATE_ENABLED = "smart_illuminate_enabled";
/**
* Whether automatic time is enabled on the watch.
* @hide
*/
public static final String CLOCKWORK_AUTO_TIME = "clockwork_auto_time";
// Possible clockwork auto time states
/** @hide */
public static final int SYNC_TIME_FROM_PHONE = 0;
/** @hide */
public static final int SYNC_TIME_FROM_NETWORK = 1;
/** @hide */
public static final int AUTO_TIME_OFF = 2;
/** @hide */
public static final int INVALID_AUTO_TIME_STATE = 3;
/**
* Whether automatic time zone is enabled on the watch.
* @hide
*/
public static final String CLOCKWORK_AUTO_TIME_ZONE = "clockwork_auto_time_zone";
// Possible clockwork auto time zone states
/** @hide */
public static final int SYNC_TIME_ZONE_FROM_PHONE = 0;
/** @hide */
public static final int SYNC_TIME_ZONE_FROM_NETWORK = 1;
/** @hide */
public static final int AUTO_TIME_ZONE_OFF = 2;
/** @hide */
public static final int INVALID_AUTO_TIME_ZONE_STATE = 3;
/**
* Whether 24 hour time format is enabled on the watch.
* @hide
*/
public static final String CLOCKWORK_24HR_TIME = "clockwork_24hr_time";
/**
* Whether the auto wifi toggle setting is enabled.
* @hide
*/
public static final String AUTO_WIFI = "auto_wifi";
/**
* The number of minutes after the WiFi enters power save mode.
* @hide
*/
public static final String WIFI_POWER_SAVE = "wifi_power_save";
/**
* The time at which we should no longer skip the wifi requirement check (we skip the
* wifi requirement until this time). The time is in millis since epoch.
* @hide
*/
public static final String ALT_BYPASS_WIFI_REQUIREMENT_TIME_MILLIS =
"alt_bypass_wifi_requirement_time_millis";
/**
* Wireless debug settings for wear.
* @hide
*/
public static final String WIRELESS_DEBUG_MODE = "wireless_debug_mode";
// Possible wireless debug settings.
/** @hide */
public static final int WIRELESS_DEBUG_OFF = 0;
/** @hide */
public static final int WIRELESS_DEBUG_BLUETOOTH = 1 << 0;
/** @hide */
public static final int WIRELESS_DEBUG_WIFI = 1 << 1;
/**
* Wifi debug port for wear.
* @hide
*/
public static final String WIFI_DEBUG_PORT = "wireless_debug_wifi_port";
/**
* Whether or not Up/Down Gestures are enabled.
* @hide
*/
public static final String UPDOWN_GESTURES_ENABLED = "updown_gestures_enabled";
/**
* Whether the setup was skipped.
* @hide
*/
public static final String SETUP_SKIPPED = "setup_skipped";
// Possible setup_skipped states
/** @hide */
public static final int SETUP_SKIPPED_UNKNOWN = 0;
/** @hide */
public static final int SETUP_SKIPPED_YES = 1;
/** @hide */
public static final int SETUP_SKIPPED_NO = 2;
/**
* The last requested call forwarding action.
* @hide
*/
public static final String LAST_CALL_FORWARD_ACTION = "last_call_forward_action";
// Possible call forwarding actions
/** @hide */
public static final int CALL_FORWARD_ACTION_ON = 1;
/** @hide */
public static final int CALL_FORWARD_ACTION_OFF = 2;
/** @hide */
public static final int CALL_FORWARD_NO_LAST_ACTION = -1;
// Stem button settings.
/** @hide */
public static final String STEM_1_TYPE = "STEM_1_TYPE";
/** @hide */
public static final String STEM_1_DATA = "STEM_1_DATA";
/** @hide */
public static final String STEM_1_DEFAULT_DATA = "STEM_1_DEFAULT_DATA";
/** @hide */
public static final String STEM_2_TYPE = "STEM_2_TYPE";
/** @hide */
public static final String STEM_2_DATA = "STEM_2_DATA";
/** @hide */
public static final String STEM_2_DEFAULT_DATA = "STEM_2_DEFAULT_DATA";
/** @hide */
public static final String STEM_3_TYPE = "STEM_3_TYPE";
/** @hide */
public static final String STEM_3_DATA = "STEM_3_DATA";
/** @hide */
public static final String STEM_3_DEFAULT_DATA = "STEM_3_DEFAULT_DATA";
// Stem types
/** @hide */
public static final int STEM_TYPE_UNKNOWN = -1;
/** @hide */
public static final int STEM_TYPE_APP_LAUNCH = 0;
/** @hide */
public static final int STEM_TYPE_CONTACT_LAUNCH = 1;
/**
* If the device should be muted when off body.
* @hide
*/
public static final String MUTE_WHEN_OFF_BODY_ENABLED = "obtain_mute_when_off_body";
/**
* Wear OS version string.
* @hide
*/
public static final String WEAR_OS_VERSION_STRING = "wear_os_version_string";
/**
* If an alternate launcher is enabled.
* @hide
*/
public static final String ALTERNATE_LAUNCHER_ENABLED = "alternate_launcher_enabled";
}
}
/**

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Whether to enable mute when off body by default. -->
<bool name="def_wearable_muteWhenOffBodyEnabled">false</bool>
</resources>

View File

@@ -263,4 +263,21 @@
<!-- Default for Settings.Secure.ONE_HANDED_MODE_ACTIVATED -->
<bool name="def_one_handed_mode_activated">false</bool>
<!-- ========================================== -->
<!-- Default values for wear specific settings. -->
<bool name="def_wearable_hotwordDetectionEnabled">false</bool>
<bool name="def_wearable_smartIlluminateEnabled">true</bool>
<integer name="def_wearable_offChargerWifiUsageLimitMinutes">120</integer>
<!-- Default enabled state of accelerometer-based up/down gestures. -->
<bool name="def_wearable_upDownGesturesEnabled">false</bool>
<!-- Whether to enable mute when off body by default. -->
<bool name="def_wearable_muteWhenOffBodyEnabled">true</bool>
<!-- Whether to use an alternate launcher if available. -->
<bool name="def_wearable_alternateLauncherEnabled">true</bool>
</resources>

View File

@@ -143,6 +143,111 @@ public class GlobalSettingsValidators {
/* last= */Global.ONE_HANDED_KEYGUARD_SIDE_RIGHT));
VALIDATORS.put(Global.DISABLE_WINDOW_BLURS, BOOLEAN_VALIDATOR);
VALIDATORS.put(Global.DEVICE_CONFIG_SYNC_DISABLED, BOOLEAN_VALIDATOR);
VALIDATORS.put(Global.Wearable.HAS_PAY_TOKENS, BOOLEAN_VALIDATOR);
VALIDATORS.put(Global.Wearable.GMS_CHECKIN_TIMEOUT_MIN, ANY_INTEGER_VALIDATOR);
VALIDATORS.put(Global.Wearable.HOTWORD_DETECTION_ENABLED, BOOLEAN_VALIDATOR);
VALIDATORS.put(Global.Wearable.SMART_REPLIES_ENABLED, BOOLEAN_VALIDATOR);
VALIDATORS.put(Global.Wearable.OBTAIN_PAIRED_DEVICE_LOCATION, BOOLEAN_VALIDATOR);
VALIDATORS.put(
Global.Wearable.RETAIL_MODE,
new DiscreteValueValidator(
new String[] {
String.valueOf(Global.Wearable.RETAIL_MODE_CONSUMER),
String.valueOf(Global.Wearable.RETAIL_MODE_RETAIL)
}));
VALIDATORS.put(
Global.Wearable.PLAY_STORE_AVAILABILITY,
new DiscreteValueValidator(
new String[] {
String.valueOf(Global.Wearable.PLAY_STORE_AVAILABLE),
String.valueOf(Global.Wearable.PLAY_STORE_UNAVAILABLE),
String.valueOf(Global.Wearable.PLAY_STORE_AVAILABILITY_UNKNOWN)
}));
VALIDATORS.put(
Global.Wearable.BUG_REPORT,
new DiscreteValueValidator(
new String[] {
String.valueOf(Global.Wearable.BUG_REPORT_ENABLED),
String.valueOf(Global.Wearable.BUG_REPORT_DISABLED)
}));
VALIDATORS.put(Global.Wearable.SMART_ILLUMINATE_ENABLED, BOOLEAN_VALIDATOR);
VALIDATORS.put(
Global.Wearable.CLOCKWORK_AUTO_TIME,
new DiscreteValueValidator(
new String[] {
String.valueOf(Global.Wearable.SYNC_TIME_FROM_PHONE),
String.valueOf(Global.Wearable.SYNC_TIME_FROM_NETWORK),
String.valueOf(Global.Wearable.AUTO_TIME_OFF),
String.valueOf(Global.Wearable.INVALID_AUTO_TIME_STATE)
}));
VALIDATORS.put(
Global.Wearable.CLOCKWORK_AUTO_TIME_ZONE,
new DiscreteValueValidator(
new String[] {
String.valueOf(Global.Wearable.SYNC_TIME_ZONE_FROM_PHONE),
String.valueOf(Global.Wearable.SYNC_TIME_ZONE_FROM_NETWORK),
String.valueOf(Global.Wearable.AUTO_TIME_ZONE_OFF),
String.valueOf(Global.Wearable.INVALID_AUTO_TIME_ZONE_STATE)
}));
VALIDATORS.put(Global.Wearable.CLOCKWORK_24HR_TIME, BOOLEAN_VALIDATOR);
VALIDATORS.put(Global.Wearable.AUTO_WIFI, BOOLEAN_VALIDATOR);
VALIDATORS.put(Global.Wearable.WIFI_POWER_SAVE, ANY_INTEGER_VALIDATOR);
VALIDATORS.put(
Global.Wearable.ALT_BYPASS_WIFI_REQUIREMENT_TIME_MILLIS,
ANY_INTEGER_VALIDATOR);
VALIDATORS.put(
Global.Wearable.WIRELESS_DEBUG_MODE,
new DiscreteValueValidator(
new String[] {
String.valueOf(Global.Wearable.WIRELESS_DEBUG_OFF),
String.valueOf(Global.Wearable.WIRELESS_DEBUG_WIFI),
String.valueOf(Global.Wearable.WIRELESS_DEBUG_BLUETOOTH)
}));
VALIDATORS.put(Global.Wearable.WIFI_DEBUG_PORT, ANY_INTEGER_VALIDATOR);
VALIDATORS.put(Global.Wearable.UPDOWN_GESTURES_ENABLED, BOOLEAN_VALIDATOR);
VALIDATORS.put(
Global.Wearable.SETUP_SKIPPED,
new DiscreteValueValidator(
new String[] {
String.valueOf(Global.Wearable.SETUP_SKIPPED_YES),
String.valueOf(Global.Wearable.SETUP_SKIPPED_NO),
String.valueOf(Global.Wearable.SETUP_SKIPPED_UNKNOWN)
}));
VALIDATORS.put(
Global.Wearable.LAST_CALL_FORWARD_ACTION,
new DiscreteValueValidator(
new String[] {
String.valueOf(Global.Wearable.CALL_FORWARD_ACTION_ON),
String.valueOf(Global.Wearable.CALL_FORWARD_ACTION_OFF),
String.valueOf(Global.Wearable.CALL_FORWARD_NO_LAST_ACTION)
}));
VALIDATORS.put(
Global.Wearable.STEM_1_TYPE,
new DiscreteValueValidator(
new String[] {
String.valueOf(Global.Wearable.STEM_TYPE_UNKNOWN),
String.valueOf(Global.Wearable.STEM_TYPE_APP_LAUNCH),
String.valueOf(Global.Wearable.STEM_TYPE_CONTACT_LAUNCH)
}));
VALIDATORS.put(
Global.Wearable.STEM_2_TYPE,
new DiscreteValueValidator(
new String[] {
String.valueOf(Global.Wearable.STEM_TYPE_UNKNOWN),
String.valueOf(Global.Wearable.STEM_TYPE_APP_LAUNCH),
String.valueOf(Global.Wearable.STEM_TYPE_CONTACT_LAUNCH)
}));
VALIDATORS.put(
Global.Wearable.STEM_3_TYPE,
new DiscreteValueValidator(
new String[] {
String.valueOf(Global.Wearable.STEM_TYPE_UNKNOWN),
String.valueOf(Global.Wearable.STEM_TYPE_APP_LAUNCH),
String.valueOf(Global.Wearable.STEM_TYPE_CONTACT_LAUNCH)
}));
VALIDATORS.put(Global.Wearable.MUTE_WHEN_OFF_BODY_ENABLED, BOOLEAN_VALIDATOR);
VALIDATORS.put(Global.Wearable.ALTERNATE_LAUNCHER_ENABLED, BOOLEAN_VALIDATOR);
}
}

View File

@@ -3576,7 +3576,7 @@ public class SettingsProvider extends ContentProvider {
}
private final class UpgradeController {
private static final int SETTINGS_VERSION = 203;
private static final int SETTINGS_VERSION = 204;
private final int mUserId;
@@ -5180,6 +5180,92 @@ public class SettingsProvider extends ContentProvider {
currentVersion = 203;
}
if (currentVersion == 203) {
// Version 203: initialize entries migrated from wear settings provide.
initGlobalSettingsDefaultValForWearLocked(Global.Wearable.HAS_PAY_TOKENS,
false);
initGlobalSettingsDefaultValForWearLocked(
Global.Wearable.GMS_CHECKIN_TIMEOUT_MIN, 6);
initGlobalSettingsDefaultValForWearLocked(
Global.Wearable.HOTWORD_DETECTION_ENABLED,
getContext()
.getResources()
.getBoolean(R.bool.def_wearable_hotwordDetectionEnabled));
initGlobalSettingsDefaultValForWearLocked(
Global.Wearable.SMART_REPLIES_ENABLED, false);
Setting locationMode = getSecureSettingsLocked(userId)
.getSettingLocked(Secure.LOCATION_MODE);
initGlobalSettingsDefaultValForWearLocked(
Global.Wearable.OBTAIN_PAIRED_DEVICE_LOCATION,
!locationMode.isNull()
&& !Integer.toString(Secure.LOCATION_MODE_OFF)
.equals(locationMode.getValue()));
initGlobalSettingsDefaultValForWearLocked(
Global.Wearable.RETAIL_MODE, Global.Wearable.RETAIL_MODE_CONSUMER);
initGlobalSettingsDefaultValForWearLocked(
Global.Wearable.PLAY_STORE_AVAILABILITY,
Global.Wearable.PLAY_STORE_AVAILABILITY_UNKNOWN);
initGlobalSettingsDefaultValForWearLocked(
Global.Wearable.BUG_REPORT,
"user".equals(Build.TYPE) // is user build?
? Global.Wearable.BUG_REPORT_DISABLED
: Global.Wearable.BUG_REPORT_ENABLED);
initGlobalSettingsDefaultValForWearLocked(
Global.Wearable.SMART_ILLUMINATE_ENABLED,
getContext()
.getResources()
.getBoolean(R.bool.def_wearable_smartIlluminateEnabled));
initGlobalSettingsDefaultValForWearLocked(
Global.Wearable.CLOCKWORK_AUTO_TIME,
Global.Wearable.SYNC_TIME_FROM_PHONE);
initGlobalSettingsDefaultValForWearLocked(
Global.Wearable.CLOCKWORK_AUTO_TIME_ZONE,
Global.Wearable.SYNC_TIME_ZONE_FROM_PHONE);
initGlobalSettingsDefaultValForWearLocked(
Global.Wearable.CLOCKWORK_24HR_TIME, false);
initGlobalSettingsDefaultValForWearLocked(Global.Wearable.AUTO_WIFI, true);
initGlobalSettingsDefaultValForWearLocked(
Global.Wearable.WIFI_POWER_SAVE,
getContext()
.getResources()
.getInteger(
R.integer
.def_wearable_offChargerWifiUsageLimitMinutes));
initGlobalSettingsDefaultValForWearLocked(
Global.Wearable.ALT_BYPASS_WIFI_REQUIREMENT_TIME_MILLIS, 0L);
initGlobalSettingsDefaultValForWearLocked(
Global.Wearable.WIRELESS_DEBUG_MODE,
Global.Wearable.WIRELESS_DEBUG_OFF);
initGlobalSettingsDefaultValForWearLocked(
Global.Wearable.WIFI_DEBUG_PORT, 5555);
initGlobalSettingsDefaultValForWearLocked(
Global.Wearable.UPDOWN_GESTURES_ENABLED,
getContext()
.getResources()
.getBoolean(R.bool.def_wearable_upDownGesturesEnabled));
initGlobalSettingsDefaultValForWearLocked(
Global.Wearable.SETUP_SKIPPED,
Global.Wearable.SETUP_SKIPPED_UNKNOWN);
initGlobalSettingsDefaultValForWearLocked(
Global.Wearable.LAST_CALL_FORWARD_ACTION,
Global.Wearable.CALL_FORWARD_NO_LAST_ACTION);
initGlobalSettingsDefaultValForWearLocked(
Global.Wearable.MUTE_WHEN_OFF_BODY_ENABLED,
getContext()
.getResources()
.getBoolean(R.bool.def_wearable_muteWhenOffBodyEnabled));
initGlobalSettingsDefaultValForWearLocked(
Global.Wearable.WEAR_OS_VERSION_STRING, "");
initGlobalSettingsDefaultValForWearLocked(
Global.Wearable.ALTERNATE_LAUNCHER_ENABLED,
getContext()
.getResources()
.getBoolean(R.bool.def_wearable_alternateLauncherEnabled));
// TODO(b/164398026): add necessary initialization logic for all entries.
currentVersion = 204;
}
// vXXX: Add new settings above this point.
if (currentVersion != newVersion) {
@@ -5196,6 +5282,31 @@ public class SettingsProvider extends ContentProvider {
// Return the current version.
return currentVersion;
}
private void initGlobalSettingsDefaultValForWearLocked(String key, boolean val) {
initGlobalSettingsDefaultValForWearLocked(key, val ? "1" : "0");
}
private void initGlobalSettingsDefaultValForWearLocked(String key, int val) {
initGlobalSettingsDefaultValForWearLocked(key, String.valueOf(val));
}
private void initGlobalSettingsDefaultValForWearLocked(String key, long val) {
initGlobalSettingsDefaultValForWearLocked(key, String.valueOf(val));
}
private void initGlobalSettingsDefaultValForWearLocked(String key, String val) {
final SettingsState globalSettings = getGlobalSettingsLocked();
Setting currentSetting = globalSettings.getSettingLocked(key);
if (currentSetting.isNull()) {
globalSettings.insertSettingOverrideableByRestoreLocked(
key,
val,
null /* tag */,
true /* makeDefault */,
SettingsState.SYSTEM_PACKAGE_NAME);
}
}
}
/**

View File

@@ -593,7 +593,40 @@ public class SettingsBackupTest {
Settings.Global.CACHED_APPS_FREEZER_ENABLED,
Settings.Global.APP_INTEGRITY_VERIFICATION_TIMEOUT,
Settings.Global.KEY_CHORD_POWER_VOLUME_UP,
Settings.Global.ADVANCED_BATTERY_USAGE_AMOUNT);
Settings.Global.ADVANCED_BATTERY_USAGE_AMOUNT,
Settings.Global.Wearable.HAS_PAY_TOKENS,
Settings.Global.Wearable.GMS_CHECKIN_TIMEOUT_MIN,
Settings.Global.Wearable.HOTWORD_DETECTION_ENABLED,
Settings.Global.Wearable.SMART_REPLIES_ENABLED,
Settings.Global.Wearable.DEFAULT_VIBRATION,
Settings.Global.Wearable.OBTAIN_PAIRED_DEVICE_LOCATION,
Settings.Global.Wearable.RETAIL_MODE,
Settings.Global.Wearable.PLAY_STORE_AVAILABILITY,
Settings.Global.Wearable.BUG_REPORT,
Settings.Global.Wearable.SMART_ILLUMINATE_ENABLED,
Settings.Global.Wearable.CLOCKWORK_AUTO_TIME,
Settings.Global.Wearable.CLOCKWORK_AUTO_TIME_ZONE,
Settings.Global.Wearable.CLOCKWORK_24HR_TIME,
Settings.Global.Wearable.AUTO_WIFI,
Settings.Global.Wearable.WIFI_POWER_SAVE,
Settings.Global.Wearable.ALT_BYPASS_WIFI_REQUIREMENT_TIME_MILLIS,
Settings.Global.Wearable.WIRELESS_DEBUG_MODE,
Settings.Global.Wearable.WIFI_DEBUG_PORT,
Settings.Global.Wearable.UPDOWN_GESTURES_ENABLED,
Settings.Global.Wearable.SETUP_SKIPPED,
Settings.Global.Wearable.LAST_CALL_FORWARD_ACTION,
Settings.Global.Wearable.STEM_1_TYPE,
Settings.Global.Wearable.STEM_1_DATA,
Settings.Global.Wearable.STEM_1_DEFAULT_DATA,
Settings.Global.Wearable.STEM_2_TYPE,
Settings.Global.Wearable.STEM_2_DATA,
Settings.Global.Wearable.STEM_2_DEFAULT_DATA,
Settings.Global.Wearable.STEM_3_TYPE,
Settings.Global.Wearable.STEM_3_DATA,
Settings.Global.Wearable.STEM_3_DEFAULT_DATA,
Settings.Global.Wearable.MUTE_WHEN_OFF_BODY_ENABLED,
Settings.Global.Wearable.WEAR_OS_VERSION_STRING,
Settings.Global.Wearable.ALTERNATE_LAUNCHER_ENABLED);
private static final Set<String> BACKUP_DENY_LIST_SECURE_SETTINGS =
newHashSet(
@@ -763,8 +796,10 @@ public class SettingsBackupTest {
@Test
public void globalSettingsBackedUpOrDenied() {
Set<String> candidateSettings = getCandidateSettings(Settings.Global.class);
candidateSettings.addAll(getCandidateSettings(Settings.Global.Wearable.class));
checkSettingsBackedUpOrDenied(
getCandidateSettings(Settings.Global.class),
candidateSettings,
newHashSet(GlobalSettings.SETTINGS_TO_BACKUP),
BACKUP_DENY_LIST_GLOBAL_SETTINGS);
}
@@ -792,8 +827,7 @@ public class SettingsBackupTest {
.that(intersect(settingsToBackup, denylist)).isEmpty();
}
private static Set<String> getCandidateSettings(
Class<? extends Settings.NameValueTable> clazz) {
private static Set<String> getCandidateSettings(Class<?> clazz) {
HashSet<String> result = new HashSet<String>();
for (Field field : clazz.getDeclaredFields()) {
if (looksLikeValidSetting(field)) {