diff --git a/app/src/main/java/se/ajpanton/statusbartweak/shell/settings/SbtSettings.java b/app/src/main/java/se/ajpanton/statusbartweak/shell/settings/SbtSettings.java index ee1934d..ca2d717 100644 --- a/app/src/main/java/se/ajpanton/statusbartweak/shell/settings/SbtSettings.java +++ b/app/src/main/java/se/ajpanton/statusbartweak/shell/settings/SbtSettings.java @@ -16,6 +16,86 @@ public final class SbtSettings { String key(int index); } + interface SettingsSource { + boolean getBoolean(String key, boolean defaultValue); + + int getInt(String key, int defaultValue); + + String getString(String key, String defaultValue); + + Set getStringSet(String key); + + boolean contains(String key); + } + + private static final class SharedPreferencesSource implements SettingsSource { + private final SharedPreferences preferences; + + SharedPreferencesSource(SharedPreferences preferences) { + this.preferences = preferences; + } + + @Override + public boolean getBoolean(String key, boolean defaultValue) { + return preferences.getBoolean(key, defaultValue); + } + + @Override + public int getInt(String key, int defaultValue) { + return preferences.getInt(key, defaultValue); + } + + @Override + public String getString(String key, String defaultValue) { + return preferences.getString(key, defaultValue); + } + + @Override + public Set getStringSet(String key) { + Set values = preferences.getStringSet(key, Collections.emptySet()); + return values != null ? values : Collections.emptySet(); + } + + @Override + public boolean contains(String key) { + return preferences.contains(key); + } + } + + private static final class BundleSource implements SettingsSource { + private final Bundle bundle; + + BundleSource(Bundle bundle) { + this.bundle = bundle; + } + + @Override + public boolean getBoolean(String key, boolean defaultValue) { + return bundle.getBoolean(key, defaultValue); + } + + @Override + public int getInt(String key, int defaultValue) { + return bundle.getInt(key, defaultValue); + } + + @Override + public String getString(String key, String defaultValue) { + return bundle.getString(key, defaultValue); + } + + @Override + public Set getStringSet(String key) { + ArrayList values = bundle.getStringArrayList(key); + return values == null || values.isEmpty() ? Collections.emptySet() : new HashSet<>(values); + } + + @Override + public boolean contains(String key) { + return bundle.containsKey(key); + } + } + public static final String MODULE_PACKAGE = "se.ajpanton.statusbartweak"; public static final String PREFS_NAME = "sbt_settings"; public static final String ACTION_SETTINGS_CHANGED = @@ -592,28 +672,24 @@ public final class SbtSettings { this.batteryBarAlignment = batteryBarAlignment != null ? batteryBarAlignment : SbtDefaults.BATTERY_BAR_ALIGNMENT_DEFAULT; - this.batteryBarThicknessDp = clampInt( + this.batteryBarThicknessDp = clampAtLeast( batteryBarThicknessDp, - SbtDefaults.BATTERY_BAR_THICKNESS_DP_MIN, - SbtDefaults.BATTERY_BAR_THICKNESS_DP_MAX); - this.batteryBarEdgeOffsetDp = clampInt( + SbtDefaults.BATTERY_BAR_THICKNESS_DP_MIN); + this.batteryBarEdgeOffsetDp = clampAtLeast( batteryBarEdgeOffsetDp, - SbtDefaults.BATTERY_BAR_EDGE_OFFSET_DP_MIN, - SbtDefaults.BATTERY_BAR_EDGE_OFFSET_DP_MAX); + SbtDefaults.BATTERY_BAR_EDGE_OFFSET_DP_MIN); this.batteryBarCurvedGeometryMode = readBatteryBarCurvedGeometryMode(batteryBarCurvedGeometryMode); this.batteryBarGeometryOverrideEnabledScenarios = sanitizeBatteryBarScenarioSet(batteryBarGeometryOverrideEnabledScenarios); this.batteryBarGeometryOverrides = sanitizeBatteryBarScenarioMap(batteryBarGeometryOverrides); this.batteryBarScenarioEnabled = sanitizeBatteryBarScenarioEnabledMap(batteryBarScenarioEnabled); - int clampedMinLevel = clampInt( + int clampedMinLevel = clampAtLeast( batteryBarMinLevel, - SbtDefaults.BATTERY_BAR_MIN_LEVEL_MIN, - SbtDefaults.BATTERY_BAR_MIN_LEVEL_MAX); - int clampedMaxLevel = clampInt( + SbtDefaults.BATTERY_BAR_MIN_LEVEL_MIN); + int clampedMaxLevel = clampAtLeast( batteryBarMaxLevel, - SbtDefaults.BATTERY_BAR_MAX_LEVEL_MIN, - SbtDefaults.BATTERY_BAR_MAX_LEVEL_MAX); + SbtDefaults.BATTERY_BAR_MAX_LEVEL_MIN); if (clampedMaxLevel <= clampedMinLevel) { clampedMaxLevel = Math.min( SbtDefaults.BATTERY_BAR_MAX_LEVEL_MAX, @@ -643,14 +719,12 @@ public final class SbtSettings { ? clockMiddleCutoutSide : SbtDefaults.CLOCK_MIDDLE_CUTOUT_SIDE_DEFAULT; this.clockMiddleAutoNearestSide = clockMiddleAutoNearestSide; - this.clockMiddleCutoutGapPx = clampInt( + this.clockMiddleCutoutGapPx = clampAtLeast( clockMiddleCutoutGapPx, - SbtDefaults.CLOCK_MIDDLE_CUTOUT_GAP_PX_MIN, - SbtDefaults.CLOCK_MIDDLE_CUTOUT_GAP_PX_MAX); - this.clockVerticalOffsetPx = clampInt( + SbtDefaults.CLOCK_MIDDLE_CUTOUT_GAP_PX_MIN); + this.clockVerticalOffsetPx = clampAtLeast( clockVerticalOffsetPx, - SbtDefaults.CLOCK_VERTICAL_OFFSET_PX_MIN, - SbtDefaults.CLOCK_VERTICAL_OFFSET_PX_MAX); + SbtDefaults.CLOCK_VERTICAL_OFFSET_PX_MIN); this.clockTextSizeSteps = clampIconHeightSteps(clockTextSizeSteps); this.clockLockTextSizeSteps = clampIconHeightSteps(clockLockTextSizeSteps); this.clockShowSeconds = clockShowSeconds; @@ -671,10 +745,9 @@ public final class SbtSettings { this.layoutPaddingCutoutPx = layoutPaddingCutoutPx; this.layoutPaddingLeftPx = layoutPaddingLeftPx; this.layoutPaddingRightPx = layoutPaddingRightPx; - this.layoutItemPaddingPx = clampInt( + this.layoutItemPaddingPx = clampAtLeast( layoutItemPaddingPx, - SbtDefaults.LAYOUT_ITEM_PADDING_PX_MIN, - SbtDefaults.LAYOUT_ITEM_PADDING_PX_MAX); + SbtDefaults.LAYOUT_ITEM_PADDING_PX_MIN); this.layoutPaddingLeftAddStock = layoutPaddingLeftAddStock; this.layoutPaddingRightAddStock = layoutPaddingRightAddStock; this.layoutIgnoreUnderDisplayCameras = layoutIgnoreUnderDisplayCameras; @@ -688,10 +761,9 @@ public final class SbtSettings { this.layoutCarrierMiddleSide = layoutCarrierMiddleSide != null ? layoutCarrierMiddleSide : SbtDefaults.LAYOUT_CARRIER_MIDDLE_SIDE_DEFAULT; - this.layoutCarrierVerticalOffsetPx = clampInt( + this.layoutCarrierVerticalOffsetPx = clampAtLeast( layoutCarrierVerticalOffsetPx, - SbtDefaults.CLOCK_VERTICAL_OFFSET_PX_MIN, - SbtDefaults.CLOCK_VERTICAL_OFFSET_PX_MAX); + SbtDefaults.CLOCK_VERTICAL_OFFSET_PX_MIN); this.layoutChipPosition = layoutChipPosition != null ? layoutChipPosition : SbtDefaults.LAYOUT_CHIP_POSITION_DEFAULT; @@ -699,10 +771,9 @@ public final class SbtSettings { this.layoutChipMiddleSide = layoutChipMiddleSide != null ? layoutChipMiddleSide : SbtDefaults.LAYOUT_CHIP_MIDDLE_SIDE_DEFAULT; - this.layoutChipVerticalOffsetPx = clampInt( + this.layoutChipVerticalOffsetPx = clampAtLeast( layoutChipVerticalOffsetPx, - SbtDefaults.CLOCK_VERTICAL_OFFSET_PX_MIN, - SbtDefaults.CLOCK_VERTICAL_OFFSET_PX_MAX); + SbtDefaults.CLOCK_VERTICAL_OFFSET_PX_MIN); this.layoutChipHeightSteps = clampIconHeightSteps(layoutChipHeightSteps); this.layoutNotifPosition = layoutNotifPosition != null ? layoutNotifPosition @@ -716,10 +787,9 @@ public final class SbtSettings { this.layoutNotifMiddleSide = layoutNotifMiddleSide != null ? layoutNotifMiddleSide : SbtDefaults.LAYOUT_NOTIF_MIDDLE_SIDE_DEFAULT; - this.layoutNotifVerticalOffsetPx = clampInt( + this.layoutNotifVerticalOffsetPx = clampAtLeast( layoutNotifVerticalOffsetPx, - SbtDefaults.CLOCK_VERTICAL_OFFSET_PX_MIN, - SbtDefaults.CLOCK_VERTICAL_OFFSET_PX_MAX); + SbtDefaults.CLOCK_VERTICAL_OFFSET_PX_MIN); this.layoutNotifIconHeightSteps = clampIconHeightSteps(layoutNotifIconHeightSteps); this.layoutNotifLockIconHeightSteps = clampIconHeightSteps(layoutNotifLockIconHeightSteps); this.layoutNotifAodIconHeightSteps = clampIconHeightSteps(layoutNotifAodIconHeightSteps); @@ -777,10 +847,9 @@ public final class SbtSettings { this.layoutStatusMiddleSide = layoutStatusMiddleSide != null ? layoutStatusMiddleSide : SbtDefaults.LAYOUT_STATUS_MIDDLE_SIDE_DEFAULT; - this.layoutStatusVerticalOffsetPx = clampInt( + this.layoutStatusVerticalOffsetPx = clampAtLeast( layoutStatusVerticalOffsetPx, - SbtDefaults.CLOCK_VERTICAL_OFFSET_PX_MIN, - SbtDefaults.CLOCK_VERTICAL_OFFSET_PX_MAX); + SbtDefaults.CLOCK_VERTICAL_OFFSET_PX_MIN); this.layoutStatusIconHeightSteps = clampIconHeightSteps(layoutStatusIconHeightSteps); this.layoutStatusLockIconHeightSteps = clampIconHeightSteps(layoutStatusLockIconHeightSteps); this.layoutStatusAodIconHeightSteps = clampIconHeightSteps(layoutStatusAodIconHeightSteps); @@ -1050,7 +1119,7 @@ public final class SbtSettings { } } SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE); - return fromPrefs(prefs); + return fromSource(new SharedPreferencesSource(prefs)); } private static SbtSettings fromProvider(Context context) { @@ -1059,7 +1128,7 @@ public final class SbtSettings { if (out == null) { return null; } - return fromBundle(out); + return fromSource(new BundleSource(out)); } public static boolean isDebugLogWritingEnabled(Context context) { @@ -1174,84 +1243,69 @@ public final class SbtSettings { .resolveContentProvider(SbtSettingsProvider.AUTHORITY, 0) != null; } - private static SbtSettings fromPrefs(SharedPreferences prefs) { + static SbtSettings fromSource(SettingsSource prefs) { if (prefs == null) { return defaults(); } - Map systemIconBlockedModes = readSystemIconBlockedModesFromPrefs(prefs); + Map systemIconBlockedModes = readSystemIconBlockedModes(prefs); return new SbtSettings( prefs.getBoolean(KEY_ICONS_AOD_CUTOUT_LIMIT, SbtDefaults.ICONS_AOD_CUTOUT_LIMIT_DEFAULT), prefs.getBoolean(KEY_ICONS_LOCK_CUTOUT_LIMIT, SbtDefaults.ICONS_LOCK_CUTOUT_LIMIT_DEFAULT), - clampInt(prefs.getInt(KEY_UNLOCKED_MAX_ICONS_PER_ROW, SbtDefaults.UNLOCKED_MAX_ICONS_PER_ROW_DEFAULT), - SbtDefaults.UNLOCKED_MAX_ICONS_PER_ROW_MIN, - SbtDefaults.UNLOCKED_MAX_ICONS_PER_ROW_MAX), - clampInt(prefs.getInt(KEY_ICONS_AOD_MAX_ICONS_PER_ROW, SbtDefaults.ICONS_AOD_MAX_ICONS_PER_ROW_DEFAULT), - SbtDefaults.ICONS_AOD_MAX_ICONS_PER_ROW_MIN, - SbtDefaults.ICONS_AOD_MAX_ICONS_PER_ROW_MAX), - clampInt(prefs.getInt(KEY_ICONS_AOD_MAX_ROWS, SbtDefaults.ICONS_AOD_MAX_ROWS_DEFAULT), - SbtDefaults.ICONS_AOD_MAX_ROWS_MIN, - SbtDefaults.ICONS_AOD_MAX_ROWS_MAX), + clampAtLeast(prefs.getInt(KEY_UNLOCKED_MAX_ICONS_PER_ROW, SbtDefaults.UNLOCKED_MAX_ICONS_PER_ROW_DEFAULT), + SbtDefaults.UNLOCKED_MAX_ICONS_PER_ROW_MIN), + clampAtLeast(prefs.getInt(KEY_ICONS_AOD_MAX_ICONS_PER_ROW, SbtDefaults.ICONS_AOD_MAX_ICONS_PER_ROW_DEFAULT), + SbtDefaults.ICONS_AOD_MAX_ICONS_PER_ROW_MIN), + clampAtLeast(prefs.getInt(KEY_ICONS_AOD_MAX_ROWS, SbtDefaults.ICONS_AOD_MAX_ROWS_DEFAULT), + SbtDefaults.ICONS_AOD_MAX_ROWS_MIN), prefs.getBoolean(KEY_ICONS_AOD_EVEN_DISTRIBUTION, SbtDefaults.ICONS_AOD_EVEN_DISTRIBUTION_DEFAULT), - clampInt(prefs.getInt(KEY_ICONS_LOCK_MAX_ICONS_PER_ROW, SbtDefaults.ICONS_LOCK_MAX_ICONS_PER_ROW_DEFAULT), - SbtDefaults.ICONS_LOCK_MAX_ICONS_PER_ROW_MIN, - SbtDefaults.ICONS_LOCK_MAX_ICONS_PER_ROW_MAX), - clampInt(prefs.getInt(KEY_ICONS_LOCK_MAX_ROWS, SbtDefaults.ICONS_LOCK_MAX_ROWS_DEFAULT), - SbtDefaults.ICONS_LOCK_MAX_ROWS_MIN, - SbtDefaults.ICONS_LOCK_MAX_ROWS_MAX), + clampAtLeast(prefs.getInt(KEY_ICONS_LOCK_MAX_ICONS_PER_ROW, SbtDefaults.ICONS_LOCK_MAX_ICONS_PER_ROW_DEFAULT), + SbtDefaults.ICONS_LOCK_MAX_ICONS_PER_ROW_MIN), + clampAtLeast(prefs.getInt(KEY_ICONS_LOCK_MAX_ROWS, SbtDefaults.ICONS_LOCK_MAX_ROWS_DEFAULT), + SbtDefaults.ICONS_LOCK_MAX_ROWS_MIN), prefs.getBoolean(KEY_ICONS_LOCK_EVEN_DISTRIBUTION, SbtDefaults.ICONS_LOCK_EVEN_DISTRIBUTION_DEFAULT), - clampInt(prefs.getInt(KEY_CARDS_AOD_MAX_ICONS_PER_ROW, SbtDefaults.CARDS_AOD_MAX_ICONS_PER_ROW_DEFAULT), - SbtDefaults.CARDS_AOD_MAX_ICONS_PER_ROW_MIN, - SbtDefaults.CARDS_AOD_MAX_ICONS_PER_ROW_MAX), - clampInt(prefs.getInt(KEY_CARDS_AOD_MAX_ROWS, SbtDefaults.CARDS_AOD_MAX_ROWS_DEFAULT), - SbtDefaults.CARDS_AOD_MAX_ROWS_MIN, - SbtDefaults.CARDS_AOD_MAX_ROWS_MAX), + clampAtLeast(prefs.getInt(KEY_CARDS_AOD_MAX_ICONS_PER_ROW, SbtDefaults.CARDS_AOD_MAX_ICONS_PER_ROW_DEFAULT), + SbtDefaults.CARDS_AOD_MAX_ICONS_PER_ROW_MIN), + clampAtLeast(prefs.getInt(KEY_CARDS_AOD_MAX_ROWS, SbtDefaults.CARDS_AOD_MAX_ROWS_DEFAULT), + SbtDefaults.CARDS_AOD_MAX_ROWS_MIN), prefs.getBoolean(KEY_CARDS_AOD_EVEN_DISTRIBUTION, SbtDefaults.CARDS_AOD_EVEN_DISTRIBUTION_DEFAULT), prefs.getBoolean(KEY_CARDS_AOD_LIMIT_TO_WIDTH, SbtDefaults.CARDS_AOD_LIMIT_TO_WIDTH_DEFAULT), - clampInt(prefs.getInt(KEY_CARDS_AOD_ICON_HEIGHT_STEPS, + clampAtLeast(prefs.getInt(KEY_CARDS_AOD_ICON_HEIGHT_STEPS, SbtDefaults.LAYOUT_CARDS_NOTIF_AOD_ICON_HEIGHT_STEPS_DEFAULT), - SbtDefaults.LAYOUT_ICON_HEIGHT_STEPS_MIN, - SbtDefaults.LAYOUT_ICON_HEIGHT_STEPS_MAX), - clampInt(prefs.getInt(KEY_CARDS_LOCK_MAX_ICONS_PER_ROW, SbtDefaults.CARDS_LOCK_MAX_ICONS_PER_ROW_DEFAULT), - SbtDefaults.CARDS_LOCK_MAX_ICONS_PER_ROW_MIN, - SbtDefaults.CARDS_LOCK_MAX_ICONS_PER_ROW_MAX), - clampInt(prefs.getInt(KEY_CARDS_LOCK_MAX_ROWS, SbtDefaults.CARDS_LOCK_MAX_ROWS_DEFAULT), - SbtDefaults.CARDS_LOCK_MAX_ROWS_MIN, - SbtDefaults.CARDS_LOCK_MAX_ROWS_MAX), + SbtDefaults.LAYOUT_ICON_HEIGHT_STEPS_MIN), + clampAtLeast(prefs.getInt(KEY_CARDS_LOCK_MAX_ICONS_PER_ROW, SbtDefaults.CARDS_LOCK_MAX_ICONS_PER_ROW_DEFAULT), + SbtDefaults.CARDS_LOCK_MAX_ICONS_PER_ROW_MIN), + clampAtLeast(prefs.getInt(KEY_CARDS_LOCK_MAX_ROWS, SbtDefaults.CARDS_LOCK_MAX_ROWS_DEFAULT), + SbtDefaults.CARDS_LOCK_MAX_ROWS_MIN), prefs.getBoolean(KEY_CARDS_LOCK_EVEN_DISTRIBUTION, SbtDefaults.CARDS_LOCK_EVEN_DISTRIBUTION_DEFAULT), prefs.getBoolean(KEY_CARDS_LOCK_LIMIT_TO_WIDTH, SbtDefaults.CARDS_LOCK_LIMIT_TO_WIDTH_DEFAULT), - clampInt(prefs.getInt(KEY_CARDS_LOCK_ICON_HEIGHT_STEPS, + clampAtLeast(prefs.getInt(KEY_CARDS_LOCK_ICON_HEIGHT_STEPS, SbtDefaults.LAYOUT_CARDS_NOTIF_LOCK_ICON_HEIGHT_STEPS_DEFAULT), - SbtDefaults.LAYOUT_ICON_HEIGHT_STEPS_MIN, - SbtDefaults.LAYOUT_ICON_HEIGHT_STEPS_MAX), + SbtDefaults.LAYOUT_ICON_HEIGHT_STEPS_MIN), prefs.getBoolean(KEY_AOD_KEEP_VISIBLE_DURING_CALL, SbtDefaults.AOD_KEEP_VISIBLE_DURING_CALL_DEFAULT), prefs.getBoolean(KEY_BATTERY_LOCKSCREEN_UNPLUGGED_PERCENT, SbtDefaults.BATTERY_LOCKSCREEN_UNPLUGGED_PERCENT_DEFAULT), prefs.getBoolean(KEY_BATTERY_AOD_UNPLUGGED_PERCENT, SbtDefaults.BATTERY_AOD_UNPLUGGED_PERCENT_DEFAULT), prefs.getBoolean(KEY_BATTERY_BAR_ENABLED, SbtDefaults.BATTERY_BAR_ENABLED_DEFAULT), prefs.getString(KEY_BATTERY_BAR_POSITION, SbtDefaults.BATTERY_BAR_POSITION_DEFAULT), prefs.getString(KEY_BATTERY_BAR_ALIGNMENT, SbtDefaults.BATTERY_BAR_ALIGNMENT_DEFAULT), - clampInt(prefs.getInt(KEY_BATTERY_BAR_THICKNESS_DP, SbtDefaults.BATTERY_BAR_THICKNESS_DP_DEFAULT), - SbtDefaults.BATTERY_BAR_THICKNESS_DP_MIN, - SbtDefaults.BATTERY_BAR_THICKNESS_DP_MAX), - clampInt(prefs.getInt(KEY_BATTERY_BAR_EDGE_OFFSET_DP, SbtDefaults.BATTERY_BAR_EDGE_OFFSET_DP_DEFAULT), - SbtDefaults.BATTERY_BAR_EDGE_OFFSET_DP_MIN, - SbtDefaults.BATTERY_BAR_EDGE_OFFSET_DP_MAX), + clampAtLeast(prefs.getInt(KEY_BATTERY_BAR_THICKNESS_DP, SbtDefaults.BATTERY_BAR_THICKNESS_DP_DEFAULT), + SbtDefaults.BATTERY_BAR_THICKNESS_DP_MIN), + clampAtLeast(prefs.getInt(KEY_BATTERY_BAR_EDGE_OFFSET_DP, SbtDefaults.BATTERY_BAR_EDGE_OFFSET_DP_DEFAULT), + SbtDefaults.BATTERY_BAR_EDGE_OFFSET_DP_MIN), prefs.getString( KEY_BATTERY_BAR_CURVED_GEOMETRY_MODE, SbtDefaults.BATTERY_BAR_CURVED_GEOMETRY_MODE_DEFAULT), - readBatteryBarScenarioSetFromPrefs(prefs), - readBatteryBarScenarioMapFromPrefs(prefs), - readBatteryBarScenarioEnabledMapFromPrefs(prefs), - clampInt(prefs.getInt(KEY_BATTERY_BAR_MIN_LEVEL, SbtDefaults.BATTERY_BAR_MIN_LEVEL_DEFAULT), - SbtDefaults.BATTERY_BAR_MIN_LEVEL_MIN, - SbtDefaults.BATTERY_BAR_MIN_LEVEL_MAX), - clampInt(prefs.getInt(KEY_BATTERY_BAR_MAX_LEVEL, SbtDefaults.BATTERY_BAR_MAX_LEVEL_DEFAULT), - SbtDefaults.BATTERY_BAR_MAX_LEVEL_MIN, - SbtDefaults.BATTERY_BAR_MAX_LEVEL_MAX), + readBatteryBarScenarioSet(prefs), + readBatteryBarScenarioMap(prefs), + readBatteryBarScenarioEnabledMap(prefs), + clampAtLeast(prefs.getInt(KEY_BATTERY_BAR_MIN_LEVEL, SbtDefaults.BATTERY_BAR_MIN_LEVEL_DEFAULT), + SbtDefaults.BATTERY_BAR_MIN_LEVEL_MIN), + clampAtLeast(prefs.getInt(KEY_BATTERY_BAR_MAX_LEVEL, SbtDefaults.BATTERY_BAR_MAX_LEVEL_DEFAULT), + SbtDefaults.BATTERY_BAR_MAX_LEVEL_MIN), prefs.getString(KEY_BATTERY_BAR_DEFAULT_DISCHARGE_COLOR, SbtDefaults.BATTERY_BAR_DEFAULT_DISCHARGE_COLOR_DEFAULT), prefs.getString(KEY_BATTERY_BAR_DEFAULT_CHARGE_COLOR, SbtDefaults.BATTERY_BAR_DEFAULT_CHARGE_COLOR_DEFAULT), - BatteryBarStyle.loadThresholds(prefs, KEY_BATTERY_BAR_THRESHOLDS), + BatteryBarStyle.decodeThresholds(prefs.getStringSet(KEY_BATTERY_BAR_THRESHOLDS)), prefs.getBoolean(KEY_CLOCK_ENABLED, SbtDefaults.CLOCK_ENABLED_DEFAULT), prefs.getBoolean(KEY_CLOCK_ENABLED_LOCKSCREEN, SbtDefaults.CLOCK_ENABLED_LOCKSCREEN_DEFAULT), prefs.getBoolean(KEY_CLOCK_ENABLED_UNLOCKED, SbtDefaults.CLOCK_ENABLED_UNLOCKED_DEFAULT), @@ -1259,12 +1313,10 @@ public final class SbtSettings { prefs.getInt(KEY_CLOCK_HORIZONTAL_OFFSET_PX, SbtDefaults.CLOCK_HORIZONTAL_OFFSET_PX_DEFAULT), prefs.getString(KEY_CLOCK_MIDDLE_CUTOUT_SIDE, SbtDefaults.CLOCK_MIDDLE_CUTOUT_SIDE_DEFAULT), prefs.getBoolean(KEY_CLOCK_MIDDLE_AUTO_NEAREST_SIDE, SbtDefaults.CLOCK_MIDDLE_AUTO_NEAREST_SIDE_DEFAULT), - clampInt(prefs.getInt(KEY_CLOCK_MIDDLE_CUTOUT_GAP_PX, SbtDefaults.CLOCK_MIDDLE_CUTOUT_GAP_PX_DEFAULT), - SbtDefaults.CLOCK_MIDDLE_CUTOUT_GAP_PX_MIN, - SbtDefaults.CLOCK_MIDDLE_CUTOUT_GAP_PX_MAX), - clampInt(prefs.getInt(KEY_CLOCK_VERTICAL_OFFSET_PX, SbtDefaults.CLOCK_VERTICAL_OFFSET_PX_DEFAULT), - SbtDefaults.CLOCK_VERTICAL_OFFSET_PX_MIN, - SbtDefaults.CLOCK_VERTICAL_OFFSET_PX_MAX), + clampAtLeast(prefs.getInt(KEY_CLOCK_MIDDLE_CUTOUT_GAP_PX, SbtDefaults.CLOCK_MIDDLE_CUTOUT_GAP_PX_DEFAULT), + SbtDefaults.CLOCK_MIDDLE_CUTOUT_GAP_PX_MIN), + clampAtLeast(prefs.getInt(KEY_CLOCK_VERTICAL_OFFSET_PX, SbtDefaults.CLOCK_VERTICAL_OFFSET_PX_DEFAULT), + SbtDefaults.CLOCK_VERTICAL_OFFSET_PX_MIN), clampIconHeightSteps(prefs.getInt(KEY_CLOCK_TEXT_SIZE_STEPS, SbtDefaults.CLOCK_TEXT_SIZE_STEPS_DEFAULT)), clampIconHeightSteps(prefs.getInt(KEY_CLOCK_LOCK_TEXT_SIZE_STEPS, @@ -1285,9 +1337,8 @@ public final class SbtSettings { prefs.getInt(KEY_LAYOUT_PADDING_CUTOUT_PX, SbtDefaults.LAYOUT_PADDING_CUTOUT_PX_DEFAULT), prefs.getInt(KEY_LAYOUT_PADDING_LEFT_PX, SbtDefaults.LAYOUT_PADDING_LEFT_PX_DEFAULT), prefs.getInt(KEY_LAYOUT_PADDING_RIGHT_PX, SbtDefaults.LAYOUT_PADDING_RIGHT_PX_DEFAULT), - clampInt(prefs.getInt(KEY_LAYOUT_ITEM_PADDING_PX, SbtDefaults.LAYOUT_ITEM_PADDING_PX_DEFAULT), - SbtDefaults.LAYOUT_ITEM_PADDING_PX_MIN, - SbtDefaults.LAYOUT_ITEM_PADDING_PX_MAX), + clampAtLeast(prefs.getInt(KEY_LAYOUT_ITEM_PADDING_PX, SbtDefaults.LAYOUT_ITEM_PADDING_PX_DEFAULT), + SbtDefaults.LAYOUT_ITEM_PADDING_PX_MIN), prefs.getBoolean(KEY_LAYOUT_PADDING_LEFT_ADD_STOCK, SbtDefaults.LAYOUT_PADDING_LEFT_ADD_STOCK_DEFAULT), prefs.getBoolean(KEY_LAYOUT_PADDING_RIGHT_ADD_STOCK, SbtDefaults.LAYOUT_PADDING_RIGHT_ADD_STOCK_DEFAULT), prefs.getBoolean(KEY_LAYOUT_IGNORE_UNDER_DISPLAY_CAMERAS, SbtDefaults.LAYOUT_IGNORE_UNDER_DISPLAY_CAMERAS_DEFAULT), @@ -1299,10 +1350,9 @@ public final class SbtSettings { prefs.getString(KEY_LAYOUT_CHIP_POSITION, SbtDefaults.LAYOUT_CHIP_POSITION_DEFAULT), prefs.getBoolean(KEY_LAYOUT_CHIP_ENABLED_UNLOCKED, SbtDefaults.LAYOUT_CHIP_ENABLED_UNLOCKED_DEFAULT), prefs.getString(KEY_LAYOUT_CHIP_MIDDLE_SIDE, SbtDefaults.LAYOUT_CHIP_MIDDLE_SIDE_DEFAULT), - clampInt(prefs.getInt(KEY_LAYOUT_CHIP_VERTICAL_OFFSET_PX, + clampAtLeast(prefs.getInt(KEY_LAYOUT_CHIP_VERTICAL_OFFSET_PX, SbtDefaults.LAYOUT_CHIP_VERTICAL_OFFSET_PX_DEFAULT), - SbtDefaults.CLOCK_VERTICAL_OFFSET_PX_MIN, - SbtDefaults.CLOCK_VERTICAL_OFFSET_PX_MAX), + SbtDefaults.CLOCK_VERTICAL_OFFSET_PX_MIN), clampIconHeightSteps(prefs.getInt(KEY_LAYOUT_CHIP_HEIGHT_STEPS, SbtDefaults.LAYOUT_CHIP_HEIGHT_STEPS_DEFAULT)), prefs.getString(KEY_LAYOUT_NOTIF_POSITION, SbtDefaults.LAYOUT_NOTIF_POSITION_DEFAULT), @@ -1311,35 +1361,31 @@ public final class SbtSettings { prefs.getBoolean(KEY_LAYOUT_NOTIF_ENABLED_LOCKSCREEN, SbtDefaults.LAYOUT_NOTIF_ENABLED_LOCKSCREEN_DEFAULT), prefs.getBoolean(KEY_LAYOUT_NOTIF_ENABLED_UNLOCKED, SbtDefaults.LAYOUT_NOTIF_ENABLED_UNLOCKED_DEFAULT), prefs.getString(KEY_LAYOUT_NOTIF_MIDDLE_SIDE, SbtDefaults.LAYOUT_NOTIF_MIDDLE_SIDE_DEFAULT), - clampInt(prefs.getInt(KEY_LAYOUT_NOTIF_VERTICAL_OFFSET_PX, + clampAtLeast(prefs.getInt(KEY_LAYOUT_NOTIF_VERTICAL_OFFSET_PX, SbtDefaults.LAYOUT_NOTIF_VERTICAL_OFFSET_PX_DEFAULT), - SbtDefaults.CLOCK_VERTICAL_OFFSET_PX_MIN, - SbtDefaults.CLOCK_VERTICAL_OFFSET_PX_MAX), - clampInt(prefs.getInt(KEY_LAYOUT_NOTIF_ICON_HEIGHT_STEPS, + SbtDefaults.CLOCK_VERTICAL_OFFSET_PX_MIN), + clampAtLeast(prefs.getInt(KEY_LAYOUT_NOTIF_ICON_HEIGHT_STEPS, SbtDefaults.LAYOUT_NOTIF_ICON_HEIGHT_STEPS_DEFAULT), - SbtDefaults.LAYOUT_ICON_HEIGHT_STEPS_MIN, - SbtDefaults.LAYOUT_ICON_HEIGHT_STEPS_MAX), - clampInt(prefs.getInt(layoutLockNotifIconHeightKey(), + SbtDefaults.LAYOUT_ICON_HEIGHT_STEPS_MIN), + clampAtLeast(prefs.getInt(layoutLockNotifIconHeightKey(), SbtDefaults.LAYOUT_NOTIF_LOCK_ICON_HEIGHT_STEPS_DEFAULT), - SbtDefaults.LAYOUT_ICON_HEIGHT_STEPS_MIN, - SbtDefaults.LAYOUT_ICON_HEIGHT_STEPS_MAX), - clampInt(prefs.getInt(layoutAodNotifIconHeightKey(), + SbtDefaults.LAYOUT_ICON_HEIGHT_STEPS_MIN), + clampAtLeast(prefs.getInt(layoutAodNotifIconHeightKey(), SbtDefaults.LAYOUT_NOTIF_AOD_ICON_HEIGHT_STEPS_DEFAULT), - SbtDefaults.LAYOUT_ICON_HEIGHT_STEPS_MIN, - SbtDefaults.LAYOUT_ICON_HEIGHT_STEPS_MAX), + SbtDefaults.LAYOUT_ICON_HEIGHT_STEPS_MIN), readIconContainerCount( prefs, KEY_LAYOUT_NOTIF_UNLOCKED_COUNT, SbtDefaults.LAYOUT_NOTIF_UNLOCKED_COUNT_DEFAULT), - readStringArrayFromPrefs( + readStringArray( prefs, SbtSettings::layoutNotifPositionKey, SbtDefaults.LAYOUT_NOTIF_POSITION_DEFAULT), - readStringArrayFromPrefs( + readStringArray( prefs, SbtSettings::layoutNotifMiddleSideKey, SbtDefaults.LAYOUT_NOTIF_MIDDLE_SIDE_DEFAULT), - readIntArrayFromPrefs( + readIntArray( prefs, SbtSettings::layoutNotifVerticalOffsetKey, SbtDefaults.LAYOUT_NOTIF_VERTICAL_OFFSET_PX_DEFAULT), @@ -1347,15 +1393,15 @@ public final class SbtSettings { prefs, KEY_LAYOUT_NOTIF_LOCK_COUNT, SbtDefaults.LAYOUT_NOTIF_UNLOCKED_COUNT_DEFAULT), - readStringArrayFromPrefs( + readStringArray( prefs, SbtSettings::layoutLockNotifPositionKey, SbtDefaults.LAYOUT_NOTIF_POSITION_DEFAULT), - readStringArrayFromPrefs( + readStringArray( prefs, SbtSettings::layoutLockNotifMiddleSideKey, SbtDefaults.LAYOUT_NOTIF_MIDDLE_SIDE_DEFAULT), - readIntArrayFromPrefs( + readIntArray( prefs, SbtSettings::layoutLockNotifVerticalOffsetKey, SbtDefaults.LAYOUT_NOTIF_VERTICAL_OFFSET_PX_DEFAULT), @@ -1363,15 +1409,15 @@ public final class SbtSettings { prefs, KEY_LAYOUT_NOTIF_AOD_COUNT, SbtDefaults.LAYOUT_NOTIF_UNLOCKED_COUNT_DEFAULT), - readStringArrayFromPrefs( + readStringArray( prefs, SbtSettings::layoutAodNotifPositionKey, SbtDefaults.LAYOUT_NOTIF_POSITION_DEFAULT), - readStringArrayFromPrefs( + readStringArray( prefs, SbtSettings::layoutAodNotifMiddleSideKey, SbtDefaults.LAYOUT_NOTIF_MIDDLE_SIDE_DEFAULT), - readIntArrayFromPrefs( + readIntArray( prefs, SbtSettings::layoutAodNotifVerticalOffsetKey, SbtDefaults.LAYOUT_NOTIF_VERTICAL_OFFSET_PX_DEFAULT), @@ -1380,35 +1426,31 @@ public final class SbtSettings { prefs.getBoolean(KEY_LAYOUT_STATUS_ENABLED_LOCKSCREEN, SbtDefaults.LAYOUT_STATUS_ENABLED_LOCKSCREEN_DEFAULT), prefs.getBoolean(KEY_LAYOUT_STATUS_ENABLED_UNLOCKED, SbtDefaults.LAYOUT_STATUS_ENABLED_UNLOCKED_DEFAULT), prefs.getString(KEY_LAYOUT_STATUS_MIDDLE_SIDE, SbtDefaults.LAYOUT_STATUS_MIDDLE_SIDE_DEFAULT), - clampInt(prefs.getInt(KEY_LAYOUT_STATUS_VERTICAL_OFFSET_PX, + clampAtLeast(prefs.getInt(KEY_LAYOUT_STATUS_VERTICAL_OFFSET_PX, SbtDefaults.LAYOUT_STATUS_VERTICAL_OFFSET_PX_DEFAULT), - SbtDefaults.CLOCK_VERTICAL_OFFSET_PX_MIN, - SbtDefaults.CLOCK_VERTICAL_OFFSET_PX_MAX), - clampInt(prefs.getInt(KEY_LAYOUT_STATUS_ICON_HEIGHT_STEPS, + SbtDefaults.CLOCK_VERTICAL_OFFSET_PX_MIN), + clampAtLeast(prefs.getInt(KEY_LAYOUT_STATUS_ICON_HEIGHT_STEPS, SbtDefaults.LAYOUT_STATUS_ICON_HEIGHT_STEPS_DEFAULT), - SbtDefaults.LAYOUT_ICON_HEIGHT_STEPS_MIN, - SbtDefaults.LAYOUT_ICON_HEIGHT_STEPS_MAX), - clampInt(prefs.getInt(layoutLockStatusIconHeightKey(), + SbtDefaults.LAYOUT_ICON_HEIGHT_STEPS_MIN), + clampAtLeast(prefs.getInt(layoutLockStatusIconHeightKey(), SbtDefaults.LAYOUT_STATUS_ICON_HEIGHT_STEPS_DEFAULT), - SbtDefaults.LAYOUT_ICON_HEIGHT_STEPS_MIN, - SbtDefaults.LAYOUT_ICON_HEIGHT_STEPS_MAX), - clampInt(prefs.getInt(layoutAodStatusIconHeightKey(), + SbtDefaults.LAYOUT_ICON_HEIGHT_STEPS_MIN), + clampAtLeast(prefs.getInt(layoutAodStatusIconHeightKey(), SbtDefaults.LAYOUT_STATUS_ICON_HEIGHT_STEPS_DEFAULT), - SbtDefaults.LAYOUT_ICON_HEIGHT_STEPS_MIN, - SbtDefaults.LAYOUT_ICON_HEIGHT_STEPS_MAX), + SbtDefaults.LAYOUT_ICON_HEIGHT_STEPS_MIN), readIconContainerCount( prefs, KEY_LAYOUT_STATUS_UNLOCKED_COUNT, SbtDefaults.LAYOUT_STATUS_UNLOCKED_COUNT_DEFAULT), - readStringArrayFromPrefs( + readStringArray( prefs, SbtSettings::layoutStatusPositionKey, SbtDefaults.LAYOUT_STATUS_POSITION_DEFAULT), - readStringArrayFromPrefs( + readStringArray( prefs, SbtSettings::layoutStatusMiddleSideKey, SbtDefaults.LAYOUT_STATUS_MIDDLE_SIDE_DEFAULT), - readIntArrayFromPrefs( + readIntArray( prefs, SbtSettings::layoutStatusVerticalOffsetKey, SbtDefaults.LAYOUT_STATUS_VERTICAL_OFFSET_PX_DEFAULT), @@ -1416,15 +1458,15 @@ public final class SbtSettings { prefs, KEY_LAYOUT_STATUS_LOCK_COUNT, SbtDefaults.LAYOUT_STATUS_UNLOCKED_COUNT_DEFAULT), - readStringArrayFromPrefs( + readStringArray( prefs, SbtSettings::layoutLockStatusPositionKey, SbtDefaults.LAYOUT_STATUS_POSITION_DEFAULT), - readStringArrayFromPrefs( + readStringArray( prefs, SbtSettings::layoutLockStatusMiddleSideKey, SbtDefaults.LAYOUT_STATUS_MIDDLE_SIDE_DEFAULT), - readIntArrayFromPrefs( + readIntArray( prefs, SbtSettings::layoutLockStatusVerticalOffsetKey, SbtDefaults.LAYOUT_STATUS_VERTICAL_OFFSET_PX_DEFAULT), @@ -1432,19 +1474,20 @@ public final class SbtSettings { prefs, KEY_LAYOUT_STATUS_AOD_COUNT, SbtDefaults.LAYOUT_STATUS_UNLOCKED_COUNT_DEFAULT), - readStringArrayFromPrefs( + readStringArray( prefs, SbtSettings::layoutAodStatusPositionKey, SbtDefaults.LAYOUT_STATUS_POSITION_DEFAULT), - readStringArrayFromPrefs( + readStringArray( prefs, SbtSettings::layoutAodStatusMiddleSideKey, SbtDefaults.LAYOUT_STATUS_MIDDLE_SIDE_DEFAULT), - readIntArrayFromPrefs( + readIntArray( prefs, SbtSettings::layoutAodStatusVerticalOffsetKey, SbtDefaults.LAYOUT_STATUS_VERTICAL_OFFSET_PX_DEFAULT), - ClockCameraTypeSupport.loadOverrides(prefs, KEY_CLOCK_CAMERA_TYPE_OVERRIDES), + ClockCameraTypeSupport.parseOverrides( + prefs.getStringSet(KEY_CLOCK_CAMERA_TYPE_OVERRIDES)), systemIconBlockedModes, readSystemIconDualSimSignalMode(prefs.getString( KEY_SYSTEM_ICON_DUAL_SIM_SIGNAL_MODE, @@ -1454,10 +1497,10 @@ public final class SbtSettings { prefs.getBoolean(KEY_STATUS_CHIPS_HIDE_NAV_UNLOCKED, false), prefs.getBoolean(KEY_STATUS_CHIPS_HIDE_CALL, false), prefs.getBoolean(KEY_STATUS_CHIPS_HIDE_BATTERY, false), - AppIconRules.parseBlockedModes(readStringSetFromPrefs( + AppIconRules.parseBlockedModes(readStringSet( prefs, KEY_APP_ICON_BLOCKED_MODES)), - AppIconRules.parseExceptionRules(readStringSetFromPrefs( + AppIconRules.parseExceptionRules(readStringSet( prefs, KEY_APP_ICON_EXCEPTION_RULES)), prefs.getString(KEY_LOCKED_NOTIFICATION_MODE, "dot"), @@ -1485,318 +1528,7 @@ public final class SbtSettings { ); } - private static SbtSettings fromBundle(Bundle bundle) { - if (bundle == null) { - return defaults(); - } - Map systemIconBlockedModes = readSystemIconBlockedModesFromBundle(bundle); - return new SbtSettings( - bundle.getBoolean(KEY_ICONS_AOD_CUTOUT_LIMIT, SbtDefaults.ICONS_AOD_CUTOUT_LIMIT_DEFAULT), - bundle.getBoolean(KEY_ICONS_LOCK_CUTOUT_LIMIT, SbtDefaults.ICONS_LOCK_CUTOUT_LIMIT_DEFAULT), - clampInt(bundle.getInt(KEY_UNLOCKED_MAX_ICONS_PER_ROW, SbtDefaults.UNLOCKED_MAX_ICONS_PER_ROW_DEFAULT), - SbtDefaults.UNLOCKED_MAX_ICONS_PER_ROW_MIN, - SbtDefaults.UNLOCKED_MAX_ICONS_PER_ROW_MAX), - clampInt(bundle.getInt(KEY_ICONS_AOD_MAX_ICONS_PER_ROW, SbtDefaults.ICONS_AOD_MAX_ICONS_PER_ROW_DEFAULT), - SbtDefaults.ICONS_AOD_MAX_ICONS_PER_ROW_MIN, - SbtDefaults.ICONS_AOD_MAX_ICONS_PER_ROW_MAX), - clampInt(bundle.getInt(KEY_ICONS_AOD_MAX_ROWS, SbtDefaults.ICONS_AOD_MAX_ROWS_DEFAULT), - SbtDefaults.ICONS_AOD_MAX_ROWS_MIN, - SbtDefaults.ICONS_AOD_MAX_ROWS_MAX), - bundle.getBoolean(KEY_ICONS_AOD_EVEN_DISTRIBUTION, SbtDefaults.ICONS_AOD_EVEN_DISTRIBUTION_DEFAULT), - clampInt(bundle.getInt(KEY_ICONS_LOCK_MAX_ICONS_PER_ROW, SbtDefaults.ICONS_LOCK_MAX_ICONS_PER_ROW_DEFAULT), - SbtDefaults.ICONS_LOCK_MAX_ICONS_PER_ROW_MIN, - SbtDefaults.ICONS_LOCK_MAX_ICONS_PER_ROW_MAX), - clampInt(bundle.getInt(KEY_ICONS_LOCK_MAX_ROWS, SbtDefaults.ICONS_LOCK_MAX_ROWS_DEFAULT), - SbtDefaults.ICONS_LOCK_MAX_ROWS_MIN, - SbtDefaults.ICONS_LOCK_MAX_ROWS_MAX), - bundle.getBoolean(KEY_ICONS_LOCK_EVEN_DISTRIBUTION, SbtDefaults.ICONS_LOCK_EVEN_DISTRIBUTION_DEFAULT), - clampInt(bundle.getInt(KEY_CARDS_AOD_MAX_ICONS_PER_ROW, SbtDefaults.CARDS_AOD_MAX_ICONS_PER_ROW_DEFAULT), - SbtDefaults.CARDS_AOD_MAX_ICONS_PER_ROW_MIN, - SbtDefaults.CARDS_AOD_MAX_ICONS_PER_ROW_MAX), - clampInt(bundle.getInt(KEY_CARDS_AOD_MAX_ROWS, SbtDefaults.CARDS_AOD_MAX_ROWS_DEFAULT), - SbtDefaults.CARDS_AOD_MAX_ROWS_MIN, - SbtDefaults.CARDS_AOD_MAX_ROWS_MAX), - bundle.getBoolean(KEY_CARDS_AOD_EVEN_DISTRIBUTION, SbtDefaults.CARDS_AOD_EVEN_DISTRIBUTION_DEFAULT), - bundle.getBoolean(KEY_CARDS_AOD_LIMIT_TO_WIDTH, SbtDefaults.CARDS_AOD_LIMIT_TO_WIDTH_DEFAULT), - clampInt(bundle.getInt(KEY_CARDS_AOD_ICON_HEIGHT_STEPS, - SbtDefaults.LAYOUT_CARDS_NOTIF_AOD_ICON_HEIGHT_STEPS_DEFAULT), - SbtDefaults.LAYOUT_ICON_HEIGHT_STEPS_MIN, - SbtDefaults.LAYOUT_ICON_HEIGHT_STEPS_MAX), - clampInt(bundle.getInt(KEY_CARDS_LOCK_MAX_ICONS_PER_ROW, SbtDefaults.CARDS_LOCK_MAX_ICONS_PER_ROW_DEFAULT), - SbtDefaults.CARDS_LOCK_MAX_ICONS_PER_ROW_MIN, - SbtDefaults.CARDS_LOCK_MAX_ICONS_PER_ROW_MAX), - clampInt(bundle.getInt(KEY_CARDS_LOCK_MAX_ROWS, SbtDefaults.CARDS_LOCK_MAX_ROWS_DEFAULT), - SbtDefaults.CARDS_LOCK_MAX_ROWS_MIN, - SbtDefaults.CARDS_LOCK_MAX_ROWS_MAX), - bundle.getBoolean(KEY_CARDS_LOCK_EVEN_DISTRIBUTION, SbtDefaults.CARDS_LOCK_EVEN_DISTRIBUTION_DEFAULT), - bundle.getBoolean(KEY_CARDS_LOCK_LIMIT_TO_WIDTH, SbtDefaults.CARDS_LOCK_LIMIT_TO_WIDTH_DEFAULT), - clampInt(bundle.getInt(KEY_CARDS_LOCK_ICON_HEIGHT_STEPS, - SbtDefaults.LAYOUT_CARDS_NOTIF_LOCK_ICON_HEIGHT_STEPS_DEFAULT), - SbtDefaults.LAYOUT_ICON_HEIGHT_STEPS_MIN, - SbtDefaults.LAYOUT_ICON_HEIGHT_STEPS_MAX), - bundle.getBoolean(KEY_AOD_KEEP_VISIBLE_DURING_CALL, SbtDefaults.AOD_KEEP_VISIBLE_DURING_CALL_DEFAULT), - bundle.getBoolean(KEY_BATTERY_LOCKSCREEN_UNPLUGGED_PERCENT, SbtDefaults.BATTERY_LOCKSCREEN_UNPLUGGED_PERCENT_DEFAULT), - bundle.getBoolean(KEY_BATTERY_AOD_UNPLUGGED_PERCENT, SbtDefaults.BATTERY_AOD_UNPLUGGED_PERCENT_DEFAULT), - bundle.getBoolean(KEY_BATTERY_BAR_ENABLED, SbtDefaults.BATTERY_BAR_ENABLED_DEFAULT), - bundle.getString(KEY_BATTERY_BAR_POSITION, SbtDefaults.BATTERY_BAR_POSITION_DEFAULT), - bundle.getString(KEY_BATTERY_BAR_ALIGNMENT, SbtDefaults.BATTERY_BAR_ALIGNMENT_DEFAULT), - clampInt(bundle.getInt(KEY_BATTERY_BAR_THICKNESS_DP, SbtDefaults.BATTERY_BAR_THICKNESS_DP_DEFAULT), - SbtDefaults.BATTERY_BAR_THICKNESS_DP_MIN, - SbtDefaults.BATTERY_BAR_THICKNESS_DP_MAX), - clampInt(bundle.getInt(KEY_BATTERY_BAR_EDGE_OFFSET_DP, SbtDefaults.BATTERY_BAR_EDGE_OFFSET_DP_DEFAULT), - SbtDefaults.BATTERY_BAR_EDGE_OFFSET_DP_MIN, - SbtDefaults.BATTERY_BAR_EDGE_OFFSET_DP_MAX), - bundle.getString( - KEY_BATTERY_BAR_CURVED_GEOMETRY_MODE, - SbtDefaults.BATTERY_BAR_CURVED_GEOMETRY_MODE_DEFAULT), - readBatteryBarScenarioSetFromBundle(bundle), - readBatteryBarScenarioMapFromBundle(bundle), - readBatteryBarScenarioEnabledMapFromBundle(bundle), - clampInt(bundle.getInt(KEY_BATTERY_BAR_MIN_LEVEL, SbtDefaults.BATTERY_BAR_MIN_LEVEL_DEFAULT), - SbtDefaults.BATTERY_BAR_MIN_LEVEL_MIN, - SbtDefaults.BATTERY_BAR_MIN_LEVEL_MAX), - clampInt(bundle.getInt(KEY_BATTERY_BAR_MAX_LEVEL, SbtDefaults.BATTERY_BAR_MAX_LEVEL_DEFAULT), - SbtDefaults.BATTERY_BAR_MAX_LEVEL_MIN, - SbtDefaults.BATTERY_BAR_MAX_LEVEL_MAX), - bundle.getString(KEY_BATTERY_BAR_DEFAULT_DISCHARGE_COLOR, - SbtDefaults.BATTERY_BAR_DEFAULT_DISCHARGE_COLOR_DEFAULT), - bundle.getString(KEY_BATTERY_BAR_DEFAULT_CHARGE_COLOR, - SbtDefaults.BATTERY_BAR_DEFAULT_CHARGE_COLOR_DEFAULT), - BatteryBarStyle.decodeThresholds(bundle.getStringArrayList(KEY_BATTERY_BAR_THRESHOLDS)), - bundle.getBoolean(KEY_CLOCK_ENABLED, SbtDefaults.CLOCK_ENABLED_DEFAULT), - bundle.getBoolean(KEY_CLOCK_ENABLED_LOCKSCREEN, SbtDefaults.CLOCK_ENABLED_LOCKSCREEN_DEFAULT), - bundle.getBoolean(KEY_CLOCK_ENABLED_UNLOCKED, SbtDefaults.CLOCK_ENABLED_UNLOCKED_DEFAULT), - bundle.getString(KEY_CLOCK_POSITION, SbtDefaults.CLOCK_POSITION_DEFAULT), - bundle.getInt(KEY_CLOCK_HORIZONTAL_OFFSET_PX, SbtDefaults.CLOCK_HORIZONTAL_OFFSET_PX_DEFAULT), - bundle.getString(KEY_CLOCK_MIDDLE_CUTOUT_SIDE, SbtDefaults.CLOCK_MIDDLE_CUTOUT_SIDE_DEFAULT), - bundle.getBoolean(KEY_CLOCK_MIDDLE_AUTO_NEAREST_SIDE, SbtDefaults.CLOCK_MIDDLE_AUTO_NEAREST_SIDE_DEFAULT), - clampInt(bundle.getInt(KEY_CLOCK_MIDDLE_CUTOUT_GAP_PX, SbtDefaults.CLOCK_MIDDLE_CUTOUT_GAP_PX_DEFAULT), - SbtDefaults.CLOCK_MIDDLE_CUTOUT_GAP_PX_MIN, - SbtDefaults.CLOCK_MIDDLE_CUTOUT_GAP_PX_MAX), - clampInt(bundle.getInt(KEY_CLOCK_VERTICAL_OFFSET_PX, SbtDefaults.CLOCK_VERTICAL_OFFSET_PX_DEFAULT), - SbtDefaults.CLOCK_VERTICAL_OFFSET_PX_MIN, - SbtDefaults.CLOCK_VERTICAL_OFFSET_PX_MAX), - clampIconHeightSteps(bundle.getInt(KEY_CLOCK_TEXT_SIZE_STEPS, - SbtDefaults.CLOCK_TEXT_SIZE_STEPS_DEFAULT)), - clampIconHeightSteps(bundle.getInt(KEY_CLOCK_LOCK_TEXT_SIZE_STEPS, - SbtDefaults.CLOCK_TEXT_SIZE_STEPS_DEFAULT)), - bundle.getBoolean(KEY_CLOCK_SHOW_SECONDS, SbtDefaults.CLOCK_SHOW_SECONDS_DEFAULT), - bundle.getBoolean(KEY_CLOCK_SHOW_DATE_PREFIX, SbtDefaults.CLOCK_SHOW_DATE_PREFIX_DEFAULT), - bundle.getBoolean(KEY_CLOCK_CUSTOM_FORMAT_ENABLED, SbtDefaults.CLOCK_CUSTOM_FORMAT_ENABLED_DEFAULT), - bundle.getString(KEY_CLOCK_CUSTOM_FORMAT, SbtDefaults.CLOCK_CUSTOM_FORMAT_DEFAULT), - bundle.getBoolean(KEY_DRAWER_CLOCK_CUSTOM_FORMAT_ENABLED, - SbtDefaults.DRAWER_CLOCK_CUSTOM_FORMAT_ENABLED_DEFAULT), - bundle.getString(KEY_DRAWER_CLOCK_CUSTOM_FORMAT, - SbtDefaults.DRAWER_CLOCK_CUSTOM_FORMAT_DEFAULT), - bundle.getBoolean(KEY_DRAWER_DATE_CUSTOM_FORMAT_ENABLED, - SbtDefaults.DRAWER_DATE_CUSTOM_FORMAT_ENABLED_DEFAULT), - bundle.getString(KEY_DRAWER_DATE_CUSTOM_FORMAT, - SbtDefaults.DRAWER_DATE_CUSTOM_FORMAT_DEFAULT), - bundle.getBoolean(KEY_CLOCK_IGNORE_UNDER_DISPLAY_CAMERAS, SbtDefaults.CLOCK_IGNORE_UNDER_DISPLAY_CAMERAS_DEFAULT), - bundle.getInt(KEY_LAYOUT_PADDING_CUTOUT_PX, SbtDefaults.LAYOUT_PADDING_CUTOUT_PX_DEFAULT), - bundle.getInt(KEY_LAYOUT_PADDING_LEFT_PX, SbtDefaults.LAYOUT_PADDING_LEFT_PX_DEFAULT), - bundle.getInt(KEY_LAYOUT_PADDING_RIGHT_PX, SbtDefaults.LAYOUT_PADDING_RIGHT_PX_DEFAULT), - clampInt(bundle.getInt(KEY_LAYOUT_ITEM_PADDING_PX, SbtDefaults.LAYOUT_ITEM_PADDING_PX_DEFAULT), - SbtDefaults.LAYOUT_ITEM_PADDING_PX_MIN, - SbtDefaults.LAYOUT_ITEM_PADDING_PX_MAX), - bundle.getBoolean(KEY_LAYOUT_PADDING_LEFT_ADD_STOCK, SbtDefaults.LAYOUT_PADDING_LEFT_ADD_STOCK_DEFAULT), - bundle.getBoolean(KEY_LAYOUT_PADDING_RIGHT_ADD_STOCK, SbtDefaults.LAYOUT_PADDING_RIGHT_ADD_STOCK_DEFAULT), - bundle.getBoolean(KEY_LAYOUT_IGNORE_UNDER_DISPLAY_CAMERAS, SbtDefaults.LAYOUT_IGNORE_UNDER_DISPLAY_CAMERAS_DEFAULT), - bundle.getString(KEY_LAYOUT_ITEM_ORDER, SbtDefaults.LAYOUT_ITEM_ORDER_DEFAULT), - bundle.getString(KEY_LAYOUT_CARRIER_POSITION, SbtDefaults.LAYOUT_CARRIER_POSITION_DEFAULT), - bundle.getBoolean(KEY_LAYOUT_CARRIER_ENABLED_LOCKSCREEN, SbtDefaults.LAYOUT_CARRIER_ENABLED_LOCKSCREEN_DEFAULT), - bundle.getString(KEY_LAYOUT_CARRIER_MIDDLE_SIDE, SbtDefaults.LAYOUT_CARRIER_MIDDLE_SIDE_DEFAULT), - bundle.getInt(KEY_LAYOUT_CARRIER_VERTICAL_OFFSET_PX, SbtDefaults.LAYOUT_CARRIER_VERTICAL_OFFSET_PX_DEFAULT), - bundle.getString(KEY_LAYOUT_CHIP_POSITION, SbtDefaults.LAYOUT_CHIP_POSITION_DEFAULT), - bundle.getBoolean(KEY_LAYOUT_CHIP_ENABLED_UNLOCKED, SbtDefaults.LAYOUT_CHIP_ENABLED_UNLOCKED_DEFAULT), - bundle.getString(KEY_LAYOUT_CHIP_MIDDLE_SIDE, SbtDefaults.LAYOUT_CHIP_MIDDLE_SIDE_DEFAULT), - clampInt(bundle.getInt(KEY_LAYOUT_CHIP_VERTICAL_OFFSET_PX, - SbtDefaults.LAYOUT_CHIP_VERTICAL_OFFSET_PX_DEFAULT), - SbtDefaults.CLOCK_VERTICAL_OFFSET_PX_MIN, - SbtDefaults.CLOCK_VERTICAL_OFFSET_PX_MAX), - clampIconHeightSteps(bundle.getInt(KEY_LAYOUT_CHIP_HEIGHT_STEPS, - SbtDefaults.LAYOUT_CHIP_HEIGHT_STEPS_DEFAULT)), - bundle.getString(KEY_LAYOUT_NOTIF_POSITION, SbtDefaults.LAYOUT_NOTIF_POSITION_DEFAULT), - bundle.getString(KEY_LAYOUT_NOTIF_SORT_ORDER, SbtDefaults.LAYOUT_NOTIF_SORT_ORDER_DEFAULT), - bundle.getBoolean(KEY_LAYOUT_NOTIF_ENABLED_AOD, SbtDefaults.LAYOUT_NOTIF_ENABLED_AOD_DEFAULT), - bundle.getBoolean(KEY_LAYOUT_NOTIF_ENABLED_LOCKSCREEN, SbtDefaults.LAYOUT_NOTIF_ENABLED_LOCKSCREEN_DEFAULT), - bundle.getBoolean(KEY_LAYOUT_NOTIF_ENABLED_UNLOCKED, SbtDefaults.LAYOUT_NOTIF_ENABLED_UNLOCKED_DEFAULT), - bundle.getString(KEY_LAYOUT_NOTIF_MIDDLE_SIDE, SbtDefaults.LAYOUT_NOTIF_MIDDLE_SIDE_DEFAULT), - clampInt(bundle.getInt(KEY_LAYOUT_NOTIF_VERTICAL_OFFSET_PX, - SbtDefaults.LAYOUT_NOTIF_VERTICAL_OFFSET_PX_DEFAULT), - SbtDefaults.CLOCK_VERTICAL_OFFSET_PX_MIN, - SbtDefaults.CLOCK_VERTICAL_OFFSET_PX_MAX), - clampInt(bundle.getInt(KEY_LAYOUT_NOTIF_ICON_HEIGHT_STEPS, - SbtDefaults.LAYOUT_NOTIF_ICON_HEIGHT_STEPS_DEFAULT), - SbtDefaults.LAYOUT_ICON_HEIGHT_STEPS_MIN, - SbtDefaults.LAYOUT_ICON_HEIGHT_STEPS_MAX), - clampInt(bundle.getInt(layoutLockNotifIconHeightKey(), - SbtDefaults.LAYOUT_NOTIF_LOCK_ICON_HEIGHT_STEPS_DEFAULT), - SbtDefaults.LAYOUT_ICON_HEIGHT_STEPS_MIN, - SbtDefaults.LAYOUT_ICON_HEIGHT_STEPS_MAX), - clampInt(bundle.getInt(layoutAodNotifIconHeightKey(), - SbtDefaults.LAYOUT_NOTIF_AOD_ICON_HEIGHT_STEPS_DEFAULT), - SbtDefaults.LAYOUT_ICON_HEIGHT_STEPS_MIN, - SbtDefaults.LAYOUT_ICON_HEIGHT_STEPS_MAX), - readIconContainerCount( - bundle, - KEY_LAYOUT_NOTIF_UNLOCKED_COUNT, - SbtDefaults.LAYOUT_NOTIF_UNLOCKED_COUNT_DEFAULT), - readStringArrayFromBundle( - bundle, - SbtSettings::layoutNotifPositionKey, - SbtDefaults.LAYOUT_NOTIF_POSITION_DEFAULT), - readStringArrayFromBundle( - bundle, - SbtSettings::layoutNotifMiddleSideKey, - SbtDefaults.LAYOUT_NOTIF_MIDDLE_SIDE_DEFAULT), - readIntArrayFromBundle( - bundle, - SbtSettings::layoutNotifVerticalOffsetKey, - SbtDefaults.LAYOUT_NOTIF_VERTICAL_OFFSET_PX_DEFAULT), - readIconContainerCount( - bundle, - KEY_LAYOUT_NOTIF_LOCK_COUNT, - SbtDefaults.LAYOUT_NOTIF_UNLOCKED_COUNT_DEFAULT), - readStringArrayFromBundle( - bundle, - SbtSettings::layoutLockNotifPositionKey, - SbtDefaults.LAYOUT_NOTIF_POSITION_DEFAULT), - readStringArrayFromBundle( - bundle, - SbtSettings::layoutLockNotifMiddleSideKey, - SbtDefaults.LAYOUT_NOTIF_MIDDLE_SIDE_DEFAULT), - readIntArrayFromBundle( - bundle, - SbtSettings::layoutLockNotifVerticalOffsetKey, - SbtDefaults.LAYOUT_NOTIF_VERTICAL_OFFSET_PX_DEFAULT), - readIconContainerCount( - bundle, - KEY_LAYOUT_NOTIF_AOD_COUNT, - SbtDefaults.LAYOUT_NOTIF_UNLOCKED_COUNT_DEFAULT), - readStringArrayFromBundle( - bundle, - SbtSettings::layoutAodNotifPositionKey, - SbtDefaults.LAYOUT_NOTIF_POSITION_DEFAULT), - readStringArrayFromBundle( - bundle, - SbtSettings::layoutAodNotifMiddleSideKey, - SbtDefaults.LAYOUT_NOTIF_MIDDLE_SIDE_DEFAULT), - readIntArrayFromBundle( - bundle, - SbtSettings::layoutAodNotifVerticalOffsetKey, - SbtDefaults.LAYOUT_NOTIF_VERTICAL_OFFSET_PX_DEFAULT), - bundle.getString(KEY_LAYOUT_STATUS_POSITION, SbtDefaults.LAYOUT_STATUS_POSITION_DEFAULT), - bundle.getBoolean(KEY_LAYOUT_STATUS_ENABLED_AOD, SbtDefaults.LAYOUT_STATUS_ENABLED_AOD_DEFAULT), - bundle.getBoolean(KEY_LAYOUT_STATUS_ENABLED_LOCKSCREEN, SbtDefaults.LAYOUT_STATUS_ENABLED_LOCKSCREEN_DEFAULT), - bundle.getBoolean(KEY_LAYOUT_STATUS_ENABLED_UNLOCKED, SbtDefaults.LAYOUT_STATUS_ENABLED_UNLOCKED_DEFAULT), - bundle.getString(KEY_LAYOUT_STATUS_MIDDLE_SIDE, SbtDefaults.LAYOUT_STATUS_MIDDLE_SIDE_DEFAULT), - clampInt(bundle.getInt(KEY_LAYOUT_STATUS_VERTICAL_OFFSET_PX, - SbtDefaults.LAYOUT_STATUS_VERTICAL_OFFSET_PX_DEFAULT), - SbtDefaults.CLOCK_VERTICAL_OFFSET_PX_MIN, - SbtDefaults.CLOCK_VERTICAL_OFFSET_PX_MAX), - clampInt(bundle.getInt(KEY_LAYOUT_STATUS_ICON_HEIGHT_STEPS, - SbtDefaults.LAYOUT_STATUS_ICON_HEIGHT_STEPS_DEFAULT), - SbtDefaults.LAYOUT_ICON_HEIGHT_STEPS_MIN, - SbtDefaults.LAYOUT_ICON_HEIGHT_STEPS_MAX), - clampInt(bundle.getInt(layoutLockStatusIconHeightKey(), - SbtDefaults.LAYOUT_STATUS_ICON_HEIGHT_STEPS_DEFAULT), - SbtDefaults.LAYOUT_ICON_HEIGHT_STEPS_MIN, - SbtDefaults.LAYOUT_ICON_HEIGHT_STEPS_MAX), - clampInt(bundle.getInt(layoutAodStatusIconHeightKey(), - SbtDefaults.LAYOUT_STATUS_ICON_HEIGHT_STEPS_DEFAULT), - SbtDefaults.LAYOUT_ICON_HEIGHT_STEPS_MIN, - SbtDefaults.LAYOUT_ICON_HEIGHT_STEPS_MAX), - readIconContainerCount( - bundle, - KEY_LAYOUT_STATUS_UNLOCKED_COUNT, - SbtDefaults.LAYOUT_STATUS_UNLOCKED_COUNT_DEFAULT), - readStringArrayFromBundle( - bundle, - SbtSettings::layoutStatusPositionKey, - SbtDefaults.LAYOUT_STATUS_POSITION_DEFAULT), - readStringArrayFromBundle( - bundle, - SbtSettings::layoutStatusMiddleSideKey, - SbtDefaults.LAYOUT_STATUS_MIDDLE_SIDE_DEFAULT), - readIntArrayFromBundle( - bundle, - SbtSettings::layoutStatusVerticalOffsetKey, - SbtDefaults.LAYOUT_STATUS_VERTICAL_OFFSET_PX_DEFAULT), - readIconContainerCount( - bundle, - KEY_LAYOUT_STATUS_LOCK_COUNT, - SbtDefaults.LAYOUT_STATUS_UNLOCKED_COUNT_DEFAULT), - readStringArrayFromBundle( - bundle, - SbtSettings::layoutLockStatusPositionKey, - SbtDefaults.LAYOUT_STATUS_POSITION_DEFAULT), - readStringArrayFromBundle( - bundle, - SbtSettings::layoutLockStatusMiddleSideKey, - SbtDefaults.LAYOUT_STATUS_MIDDLE_SIDE_DEFAULT), - readIntArrayFromBundle( - bundle, - SbtSettings::layoutLockStatusVerticalOffsetKey, - SbtDefaults.LAYOUT_STATUS_VERTICAL_OFFSET_PX_DEFAULT), - readIconContainerCount( - bundle, - KEY_LAYOUT_STATUS_AOD_COUNT, - SbtDefaults.LAYOUT_STATUS_UNLOCKED_COUNT_DEFAULT), - readStringArrayFromBundle( - bundle, - SbtSettings::layoutAodStatusPositionKey, - SbtDefaults.LAYOUT_STATUS_POSITION_DEFAULT), - readStringArrayFromBundle( - bundle, - SbtSettings::layoutAodStatusMiddleSideKey, - SbtDefaults.LAYOUT_STATUS_MIDDLE_SIDE_DEFAULT), - readIntArrayFromBundle( - bundle, - SbtSettings::layoutAodStatusVerticalOffsetKey, - SbtDefaults.LAYOUT_STATUS_VERTICAL_OFFSET_PX_DEFAULT), - ClockCameraTypeSupport.parseOverrides(readStringSetFromBundle(bundle, KEY_CLOCK_CAMERA_TYPE_OVERRIDES)), - systemIconBlockedModes, - readSystemIconDualSimSignalMode(bundle.getString( - KEY_SYSTEM_ICON_DUAL_SIM_SIGNAL_MODE, - SbtDefaults.SYSTEM_ICON_DUAL_SIM_SIGNAL_MODE_DEFAULT)), - bundle.getBoolean(KEY_STATUS_CHIPS_HIDE_ALL, false), - bundle.getBoolean(KEY_STATUS_CHIPS_HIDE_MEDIA_UNLOCKED, false), - bundle.getBoolean(KEY_STATUS_CHIPS_HIDE_NAV_UNLOCKED, false), - bundle.getBoolean(KEY_STATUS_CHIPS_HIDE_CALL, false), - bundle.getBoolean(KEY_STATUS_CHIPS_HIDE_BATTERY, false), - AppIconRules.parseBlockedModes(readStringSetFromBundle( - bundle, - KEY_APP_ICON_BLOCKED_MODES)), - AppIconRules.parseExceptionRules(readStringSetFromBundle( - bundle, - KEY_APP_ICON_EXCEPTION_RULES)), - bundle.getString(KEY_LOCKED_NOTIFICATION_MODE, "dot"), - bundle.getBoolean( - KEY_DEBUG_VISUALIZE_NOTIFICATION_CONTAINER, - SbtDefaults.DEBUG_VISUALIZE_NOTIFICATION_CONTAINER_DEFAULT), - bundle.getBoolean( - KEY_DEBUG_VISUALIZE_STATUS_CONTAINER, - SbtDefaults.DEBUG_VISUALIZE_STATUS_CONTAINER_DEFAULT), - bundle.getBoolean( - KEY_DEBUG_VISUALIZE_CLOCK_CONTAINER, - SbtDefaults.DEBUG_VISUALIZE_CLOCK_CONTAINER_DEFAULT), - bundle.getBoolean( - KEY_DEBUG_VISUALIZE_CHIP_CONTAINER, - SbtDefaults.DEBUG_VISUALIZE_CHIP_CONTAINER_DEFAULT), - bundle.getBoolean( - KEY_DEBUG_VISUALIZE_CAMERA_CUTOUT, - SbtDefaults.DEBUG_VISUALIZE_CAMERA_CUTOUT_DEFAULT), - bundle.getBoolean( - KEY_DEBUG_VISUALIZE_AOD_STOCK_CONTAINERS, - SbtDefaults.DEBUG_VISUALIZE_AOD_STOCK_CONTAINERS_DEFAULT), - bundle.getBoolean( - KEY_DEBUG_EXPERIMENTAL_AOD_STATUSBAR_ROOT, - SbtDefaults.DEBUG_EXPERIMENTAL_AOD_STATUSBAR_ROOT_DEFAULT) - ); - } - - private static int clampInt(int value, int min, int max) { + private static int clampAtLeast(int value, int min) { if (value < min) { return min; } @@ -1817,7 +1549,7 @@ public final class SbtSettings { } private static int readIconContainerCount( - SharedPreferences prefs, + SettingsSource prefs, String countKey, int defaultCount ) { @@ -1825,17 +1557,8 @@ public final class SbtSettings { return clampIconContainerCount(value); } - private static int readIconContainerCount( - Bundle bundle, - String countKey, - int defaultCount - ) { - int value = bundle.getInt(countKey, defaultCount); - return clampIconContainerCount(value); - } - - private static String[] readStringArrayFromPrefs( - SharedPreferences prefs, + private static String[] readStringArray( + SettingsSource prefs, IndexedKey key, String fallback ) { @@ -1848,7 +1571,7 @@ public final class SbtSettings { return result; } - private static int[] readIntArrayFromPrefs(SharedPreferences prefs, IndexedKey key, int fallback) { + private static int[] readIntArray(SettingsSource prefs, IndexedKey key, int fallback) { int[] result = new int[SbtDefaults.LAYOUT_ICON_CONTAINER_COUNT_MAX]; int previous = fallback; for (int i = 0; i < result.length; i++) { @@ -1858,26 +1581,6 @@ public final class SbtSettings { return result; } - private static String[] readStringArrayFromBundle(Bundle bundle, IndexedKey key, String fallback) { - String[] result = new String[SbtDefaults.LAYOUT_ICON_CONTAINER_COUNT_MAX]; - String previous = fallback; - for (int i = 0; i < result.length; i++) { - previous = bundle.containsKey(key.key(i)) ? bundle.getString(key.key(i), previous) : previous; - result[i] = previous; - } - return result; - } - - private static int[] readIntArrayFromBundle(Bundle bundle, IndexedKey key, int fallback) { - int[] result = new int[SbtDefaults.LAYOUT_ICON_CONTAINER_COUNT_MAX]; - int previous = fallback; - for (int i = 0; i < result.length; i++) { - previous = bundle.containsKey(key.key(i)) ? bundle.getInt(key.key(i), previous) : previous; - result[i] = previous; - } - return result; - } - private static String[] sanitizeStringArray(String[] source, String fallback, int length) { String[] result = new String[Math.max(0, length)]; for (int i = 0; i < result.length; i++) { @@ -1891,34 +1594,23 @@ public final class SbtSettings { int[] result = new int[Math.max(0, length)]; for (int i = 0; i < result.length; i++) { int value = source != null && i < source.length ? source[i] : fallback; - result[i] = clampInt(value, min, max); + result[i] = clampAtLeast(value, min); } return result; } - private static Set readStringSetFromPrefs(SharedPreferences prefs, String key) { + private static Set readStringSet(SettingsSource prefs, String key) { if (prefs == null) { return Collections.emptySet(); } - Set source = prefs.getStringSet(key, Collections.emptySet()); + Set source = prefs.getStringSet(key); if (source == null || source.isEmpty()) { return Collections.emptySet(); } return new HashSet<>(source); } - private static Set readStringSetFromBundle(Bundle bundle, String key) { - if (bundle == null) { - return Collections.emptySet(); - } - ArrayList list = bundle.getStringArrayList(key); - if (list == null || list.isEmpty()) { - return Collections.emptySet(); - } - return new HashSet<>(list); - } - - private static Set readBatteryBarScenarioSetFromPrefs(SharedPreferences prefs) { + private static Set readBatteryBarScenarioSet(SettingsSource prefs) { if (prefs == null) { return Collections.emptySet(); } @@ -1931,20 +1623,7 @@ public final class SbtSettings { return result; } - private static Set readBatteryBarScenarioSetFromBundle(Bundle bundle) { - if (bundle == null) { - return Collections.emptySet(); - } - HashSet result = new HashSet<>(); - for (BatteryBarGeometry.Scenario scenario : BatteryBarGeometry.Scenario.values()) { - if (bundle.getBoolean(batteryBarGeometryOverrideEnabledKey(scenario.id), false)) { - result.add(scenario.id); - } - } - return result; - } - - private static Map readBatteryBarScenarioMapFromPrefs(SharedPreferences prefs) { + private static Map readBatteryBarScenarioMap(SettingsSource prefs) { if (prefs == null) { return Collections.emptyMap(); } @@ -1958,21 +1637,7 @@ public final class SbtSettings { return result; } - private static Map readBatteryBarScenarioMapFromBundle(Bundle bundle) { - if (bundle == null) { - return Collections.emptyMap(); - } - HashMap result = new HashMap<>(); - for (BatteryBarGeometry.Scenario scenario : BatteryBarGeometry.Scenario.values()) { - String value = bundle.getString(batteryBarGeometryKey(scenario.id), null); - if (value != null && !value.isEmpty()) { - result.put(scenario.id, value); - } - } - return result; - } - - private static Map readBatteryBarScenarioEnabledMapFromPrefs(SharedPreferences prefs) { + private static Map readBatteryBarScenarioEnabledMap(SettingsSource prefs) { if (prefs == null) { return Collections.emptyMap(); } @@ -1986,20 +1651,6 @@ public final class SbtSettings { return result; } - private static Map readBatteryBarScenarioEnabledMapFromBundle(Bundle bundle) { - if (bundle == null) { - return Collections.emptyMap(); - } - HashMap result = new HashMap<>(); - for (BatteryBarGeometry.Scenario scenario : BatteryBarGeometry.Scenario.values()) { - String key = batteryBarScenarioEnabledKey(scenario.id); - if (bundle.containsKey(key)) { - result.put(scenario.id, bundle.getBoolean(key, true)); - } - } - return result; - } - private static Set sanitizeBatteryBarScenarioSet(Set source) { if (source == null || source.isEmpty()) { return Collections.emptySet(); @@ -2055,21 +1706,12 @@ public final class SbtSettings { return false; } - private static Map readSystemIconBlockedModesFromPrefs(SharedPreferences prefs) { + private static Map readSystemIconBlockedModes(SettingsSource prefs) { if (prefs == null) { return Collections.emptyMap(); } Map parsed = SystemIconRules.parseBlockedModes( - readStringSetFromPrefs(prefs, KEY_SYSTEM_ICON_BLOCKED_MODES)); - return parsed.isEmpty() ? Collections.emptyMap() : parsed; - } - - private static Map readSystemIconBlockedModesFromBundle(Bundle bundle) { - if (bundle == null) { - return Collections.emptyMap(); - } - Map parsed = SystemIconRules.parseBlockedModes( - readStringSetFromBundle(bundle, KEY_SYSTEM_ICON_BLOCKED_MODES)); + readStringSet(prefs, KEY_SYSTEM_ICON_BLOCKED_MODES)); return parsed.isEmpty() ? Collections.emptyMap() : parsed; } diff --git a/app/src/main/java/se/ajpanton/statusbartweak/shell/ui/LayoutFragment.java b/app/src/main/java/se/ajpanton/statusbartweak/shell/ui/LayoutFragment.java index 3c1dd7f..20a0640 100644 --- a/app/src/main/java/se/ajpanton/statusbartweak/shell/ui/LayoutFragment.java +++ b/app/src/main/java/se/ajpanton/statusbartweak/shell/ui/LayoutFragment.java @@ -40,7 +40,7 @@ public final class LayoutFragment extends Fragment { View root = inflater.inflate(R.layout.fragment_layout, container, false); SharedPreferences prefs = requireContext() .getSharedPreferences(SbtSettings.PREFS_NAME, Context.MODE_PRIVATE); - hideUnlockedSubpageObsoleteControls(root); + configureUnlockedOnlyModeControls(root); reorderItemCards(root, prefs); setupPositionSection(root, @@ -508,7 +508,7 @@ public final class LayoutFragment extends Fragment { } } - private void hideUnlockedSubpageObsoleteControls(View root) { + private void configureUnlockedOnlyModeControls(View root) { hide(root, R.id.clock_position_mode_lockscreen); hide(root, R.id.notif_position_mode_aod); hide(root, R.id.notif_position_mode_lockscreen); diff --git a/app/src/test/java/se/ajpanton/statusbartweak/shell/settings/SbtSettingsTest.java b/app/src/test/java/se/ajpanton/statusbartweak/shell/settings/SbtSettingsTest.java new file mode 100644 index 0000000..08247ba --- /dev/null +++ b/app/src/test/java/se/ajpanton/statusbartweak/shell/settings/SbtSettingsTest.java @@ -0,0 +1,105 @@ +package se.ajpanton.statusbartweak.shell.settings; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; + +import org.junit.Test; + +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +public final class SbtSettingsTest { + @Test + public void emptySourceMatchesRepresentativeDefaults() { + SbtSettings defaults = SbtSettings.defaults(); + SbtSettings decoded = SbtSettings.fromSource(new MapSource()); + + assertEquals(defaults.clockEnabled, decoded.clockEnabled); + assertEquals(defaults.clockCustomFormat, decoded.clockCustomFormat); + assertEquals(defaults.batteryBarPosition, decoded.batteryBarPosition); + assertEquals(defaults.batteryBarThicknessDp, decoded.batteryBarThicknessDp); + assertEquals(defaults.layoutNotifUnlockedCount, decoded.layoutNotifUnlockedCount); + assertEquals(defaults.layoutStatusUnlockedCount, decoded.layoutStatusUnlockedCount); + assertEquals(defaults.systemIconBlockedModes, decoded.systemIconBlockedModes); + } + + @Test + public void sourceDecodingPreservesSettingsNormalization() { + MapSource source = new MapSource(); + source.put(SbtSettings.KEY_CLOCK_ENABLED, false); + source.put(SbtSettings.KEY_CLOCK_CUSTOM_FORMAT, "H:mm:ss"); + source.put(SbtSettings.KEY_UNLOCKED_MAX_ICONS_PER_ROW, 0); + source.put(SbtSettings.KEY_CLOCK_VERTICAL_OFFSET_PX, 500); + source.put(SbtSettings.KEY_BATTERY_BAR_CURVED_GEOMETRY_MODE, "unsupported"); + source.put(SbtSettings.KEY_LAYOUT_NOTIF_UNLOCKED_COUNT, 100); + source.put(SbtSettings.KEY_SYSTEM_ICON_DUAL_SIM_SIGNAL_MODE, "unsupported"); + source.put( + SystemIconRules.PREF_KEY_BLOCKED_MODES, + setOf("wifi|5", "invalid", "wifi|not-a-number")); + source.put( + SbtSettings.KEY_APP_ICON_BLOCKED_MODES, + setOf("app.example|1|0|1", "bad-entry")); + + SbtSettings decoded = SbtSettings.fromSource(source); + + assertFalse(decoded.clockEnabled); + assertEquals("H:mm:ss", decoded.clockCustomFormat); + assertEquals(SbtDefaults.UNLOCKED_MAX_ICONS_PER_ROW_MIN, decoded.unlockedMaxIconsPerRow); + assertEquals(500, decoded.clockVerticalOffsetPx); + assertEquals(SbtSettings.BATTERY_BAR_CURVED_GEOMETRY_OFF, decoded.batteryBarCurvedGeometryMode); + assertEquals(SbtDefaults.LAYOUT_ICON_CONTAINER_COUNT_MAX, decoded.layoutNotifUnlockedCount); + assertEquals( + SbtDefaults.SYSTEM_ICON_DUAL_SIM_SIGNAL_MODE_DEFAULT, + decoded.systemIconDualSimSignalMode); + assertEquals(Integer.valueOf(5), decoded.systemIconBlockedModes.get("wifi")); + assertEquals(Integer.valueOf(AppIconRules.MODE_AOD | AppIconRules.MODE_UNLOCK), + decoded.appIconBlockedModes.get("app.example")); + } + + private static Set setOf(String... values) { + HashSet result = new HashSet<>(); + Collections.addAll(result, values); + return result; + } + + private static final class MapSource implements SbtSettings.SettingsSource { + private final Map values = new HashMap<>(); + + void put(String key, Object value) { + values.put(key, value); + } + + @Override + public boolean getBoolean(String key, boolean defaultValue) { + Object value = values.get(key); + return value instanceof Boolean ? (Boolean) value : defaultValue; + } + + @Override + public int getInt(String key, int defaultValue) { + Object value = values.get(key); + return value instanceof Integer ? (Integer) value : defaultValue; + } + + @Override + public String getString(String key, String defaultValue) { + Object value = values.get(key); + return value instanceof String ? (String) value : defaultValue; + } + + @Override + @SuppressWarnings("unchecked") + public Set getStringSet(String key) { + Object value = values.get(key); + return value instanceof Set ? (Set) value : Collections.emptySet(); + } + + @Override + public boolean contains(String key) { + return values.containsKey(key); + } + } +}