From 805d12c62e13b953109eb8a7ae802affa2528a09 Mon Sep 17 00:00:00 2001 From: ajp_anton Date: Mon, 8 Jun 2026 00:10:37 +0000 Subject: [PATCH] Modernize settings UI --- app/src/main/AndroidManifest.xml | 2 +- .../render/NotificationSeenAppReporter.java | 2 + .../shell/settings/AppIconRules.java | 23 ++ .../shell/settings/SbtSettings.java | 32 +++ .../shell/settings/SbtSettingsProvider.java | 12 + .../shell/ui/BatteryBarFragment.java | 207 ++++++++++++------ .../ui/BlockAppNotificationIconsFragment.java | 9 +- .../shell/ui/HiddenAppsUiSupport.java | 27 ++- .../shell/ui/IconsDebugFragment.java | 8 + .../shell/ui/LayoutFragment.java | 16 ++ .../shell/ui/LayoutOrderingUi.java | 4 +- .../shell/ui/LayoutSectionCopySupport.java | 2 + .../shell/ui/SystemIconsFragment.java | 5 +- .../shell/ui/ViewTreeSupport.java | 94 +++++++- .../main/res/color/drawer_item_text_color.xml | 4 +- .../res/drawable/drawer_item_background.xml | 6 +- .../drawable/sbt_drawer_header_background.xml | 9 + .../res/drawable/sbt_toolbar_background.xml | 8 + .../res/drawable/sbt_window_background.xml | 7 + app/src/main/res/layout/activity_main.xml | 6 +- .../res/layout/dialog_hidden_app_config.xml | 1 + app/src/main/res/layout/drawer_header.xml | 17 +- .../main/res/layout/fragment_battery_bar.xml | 29 ++- app/src/main/res/layout/fragment_clock.xml | 106 +++++++-- .../main/res/layout/fragment_icons_debug.xml | 22 ++ app/src/main/res/layout/fragment_layout.xml | 88 ++++---- .../layout/item_hidden_app_exception_rule.xml | 1 + app/src/main/res/values-night/colors.xml | 14 ++ app/src/main/res/values-night/themes.xml | 33 +-- app/src/main/res/values/colors.xml | 20 +- app/src/main/res/values/strings.xml | 28 +-- app/src/main/res/values/themes.xml | 94 ++++++-- 32 files changed, 713 insertions(+), 223 deletions(-) create mode 100644 app/src/main/res/drawable/sbt_drawer_header_background.xml create mode 100644 app/src/main/res/drawable/sbt_toolbar_background.xml create mode 100644 app/src/main/res/drawable/sbt_window_background.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 52115d9..dc5e2d1 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -17,7 +17,7 @@ + android:theme="@style/Theme.StatusBarTweak.NoActionBar"> diff --git a/app/src/main/java/se/ajpanton/statusbartweak/runtime/render/NotificationSeenAppReporter.java b/app/src/main/java/se/ajpanton/statusbartweak/runtime/render/NotificationSeenAppReporter.java index 367218a..582bc6c 100644 --- a/app/src/main/java/se/ajpanton/statusbartweak/runtime/render/NotificationSeenAppReporter.java +++ b/app/src/main/java/se/ajpanton/statusbartweak/runtime/render/NotificationSeenAppReporter.java @@ -19,6 +19,7 @@ final class NotificationSeenAppReporter { void report(Context context, ArrayList placements) { if (context == null || placements == null || placements.isEmpty()) { activeKeysByPackage.clear(); + SbtSettings.setActiveIconApps(context, java.util.Collections.emptySet()); return; } long now = System.currentTimeMillis(); @@ -45,6 +46,7 @@ final class NotificationSeenAppReporter { } activeKeysByPackage.clear(); activeKeysByPackage.putAll(currentKeysByPackage); + SbtSettings.setActiveIconApps(context, currentKeysByPackage.keySet()); } private boolean wasAlreadyActive(String packageName, String key) { diff --git a/app/src/main/java/se/ajpanton/statusbartweak/shell/settings/AppIconRules.java b/app/src/main/java/se/ajpanton/statusbartweak/shell/settings/AppIconRules.java index 2a7473a..cc12dc0 100644 --- a/app/src/main/java/se/ajpanton/statusbartweak/shell/settings/AppIconRules.java +++ b/app/src/main/java/se/ajpanton/statusbartweak/shell/settings/AppIconRules.java @@ -22,6 +22,7 @@ public final class AppIconRules { public static final String PREF_KEY_BLOCKED_MODES = "app_icon_blocked_modes"; public static final String PREF_KEY_EXCEPTION_RULES = "app_icon_exception_rules"; public static final String PREF_KEY_SEEN_SESSION = "app_icon_seen_session"; + public static final String PREF_KEY_ACTIVE_SESSION = "app_icon_active_session"; public static final String EXTRA_PACKAGE = "package"; public static final String EXTRA_FIRST_SEEN_MS = "first_seen_ms"; @@ -93,6 +94,28 @@ public final class AppIconRules { prefs.edit().remove(PREF_KEY_SEEN_SESSION).apply(); } + public static Set loadActiveSession(SharedPreferences prefs) { + HashSet out = new HashSet<>(); + for (String pkg : readStringSet(prefs, PREF_KEY_ACTIVE_SESSION)) { + if (isValidPackageName(pkg)) { + out.add(pkg); + } + } + return out; + } + + public static void saveActiveSession(SharedPreferences prefs, Set packages) { + HashSet out = new HashSet<>(); + if (packages != null) { + for (String pkg : packages) { + if (isValidPackageName(pkg)) { + out.add(pkg); + } + } + } + writeStringSet(prefs, PREF_KEY_ACTIVE_SESSION, out); + } + private static Set readStringSet(SharedPreferences prefs, String key) { if (prefs == null) { return Collections.emptySet(); 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 2ade2e3..22b1005 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 @@ -1082,6 +1082,38 @@ public final class SbtSettings { } } + public static void setActiveIconApps(Context context, Set packageNames) { + if (context == null) { + return; + } + HashSet safePackages = new HashSet<>(); + if (packageNames != null) { + for (String packageName : packageNames) { + if (AppIconRules.isValidPackageName(packageName)) { + safePackages.add(packageName); + } + } + } + try { + if (!MODULE_PACKAGE.equals(context.getPackageName()) && hasSettingsProvider(context)) { + Bundle extras = new Bundle(); + extras.putStringArrayList( + SbtSettingsProvider.EXTRA_VALUE, + new ArrayList<>(safePackages)); + context.getContentResolver() + .call(settingsProviderUri(), + SbtSettingsProvider.METHOD_SET_ACTIVE_ICON_APPS, + null, + extras); + return; + } + SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE); + AppIconRules.saveActiveSession(prefs, safePackages); + } catch (Throwable ignored) { + // This list is advisory UI state; rendering should never fail because it cannot be updated. + } + } + private static boolean hasSettingsProvider(Context context) { if (context == null) { return false; diff --git a/app/src/main/java/se/ajpanton/statusbartweak/shell/settings/SbtSettingsProvider.java b/app/src/main/java/se/ajpanton/statusbartweak/shell/settings/SbtSettingsProvider.java index 930d171..43d20cb 100644 --- a/app/src/main/java/se/ajpanton/statusbartweak/shell/settings/SbtSettingsProvider.java +++ b/app/src/main/java/se/ajpanton/statusbartweak/shell/settings/SbtSettingsProvider.java @@ -19,6 +19,7 @@ public class SbtSettingsProvider extends ContentProvider { public static final String METHOD_GET_ALL = "get_all"; public static final String METHOD_SET_CLOCK_CAMERA_DEBUG_STATE = "set_clock_camera_debug_state"; public static final String METHOD_NOTE_SEEN_ICON_APP = "note_seen_icon_app"; + public static final String METHOD_SET_ACTIVE_ICON_APPS = "set_active_icon_apps"; public static final String EXTRA_VALUE = "value"; private static final Object LOCK = new Object(); @@ -441,6 +442,17 @@ public class SbtSettingsProvider extends ContentProvider { } return Bundle.EMPTY; } + if (METHOD_SET_ACTIVE_ICON_APPS.equals(method)) { + ArrayList packages = extras != null + ? extras.getStringArrayList(EXTRA_VALUE) + : null; + synchronized (LOCK) { + AppIconRules.saveActiveSession( + prefs, + packages != null ? new java.util.HashSet<>(packages) : Collections.emptySet()); + } + return Bundle.EMPTY; + } if (METHOD_SET_CLOCK_CAMERA_DEBUG_STATE.equals(method)) { String cameraId = extras != null ? extras.getString(SbtSettings.KEY_DEBUG_CURRENT_CAMERA_ID, "") : ""; String autoType = extras != null ? extras.getString(SbtSettings.KEY_DEBUG_CURRENT_CAMERA_AUTO_TYPE, "") : ""; diff --git a/app/src/main/java/se/ajpanton/statusbartweak/shell/ui/BatteryBarFragment.java b/app/src/main/java/se/ajpanton/statusbartweak/shell/ui/BatteryBarFragment.java index 5ed1731..2117b23 100644 --- a/app/src/main/java/se/ajpanton/statusbartweak/shell/ui/BatteryBarFragment.java +++ b/app/src/main/java/se/ajpanton/statusbartweak/shell/ui/BatteryBarFragment.java @@ -2,6 +2,7 @@ package se.ajpanton.statusbartweak.shell.ui; import android.content.Context; import android.content.SharedPreferences; +import android.content.res.ColorStateList; import android.os.Bundle; import android.text.Editable; import android.text.InputType; @@ -20,6 +21,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import com.google.android.material.button.MaterialButton; @@ -283,6 +285,7 @@ public final class BatteryBarFragment extends Fragment { if (button == null) { return; } + ViewTreeSupport.styleStepperButton(button); button.setMinHeight(0); button.setMinimumHeight(0); button.setPadding(button.getPaddingLeft(), 0, button.getPaddingRight(), 0); @@ -329,6 +332,8 @@ public final class BatteryBarFragment extends Fragment { int max, int fallback) { final boolean[] updating = new boolean[]{false}; + ViewTreeSupport.styleStepperButton(minus); + ViewTreeSupport.styleStepperButton(plus); if (minus != null) { minus.setOnClickListener(v -> { int current = ViewTreeSupport.parseInt(input, prefs.getInt(key, fallback)); @@ -379,16 +384,27 @@ public final class BatteryBarFragment extends Fragment { return; } container.removeAllViews(); - for (BatteryBarGeometry.Scenario scenario : BatteryBarGeometry.Scenario.values()) { - addScenarioOverrideRow(container, prefs, scenario, scenarioLabelRes(scenario)); - } + addScenarioOverrideRow(container, prefs, new ScenarioGroup( + R.string.battery_bar_scenario_group_unlocked, + BatteryBarGeometry.Scenario.UNLOCKED_PORTRAIT, + BatteryBarGeometry.Scenario.UNLOCKED_LANDSCAPE)); + addScenarioOverrideRow(container, prefs, new ScenarioGroup( + R.string.battery_bar_scenario_group_transparent, + BatteryBarGeometry.Scenario.TRANSPARENT_PORTRAIT, + BatteryBarGeometry.Scenario.TRANSPARENT_LANDSCAPE)); + addScenarioOverrideRow(container, prefs, new ScenarioGroup( + R.string.battery_bar_scenario_group_fullscreen, + BatteryBarGeometry.Scenario.FULLSCREEN_PORTRAIT, + BatteryBarGeometry.Scenario.FULLSCREEN_LANDSCAPE)); + addScenarioOverrideRow(container, prefs, new ScenarioGroup( + R.string.battery_bar_lockscreen_override, + BatteryBarGeometry.Scenario.LOCKSCREEN)); } private void addScenarioOverrideRow( LinearLayout container, SharedPreferences prefs, - BatteryBarGeometry.Scenario scenario, - int labelRes + ScenarioGroup scenarioGroup ) { Context context = container.getContext(); LinearLayout row = new LinearLayout(context); @@ -408,7 +424,7 @@ public final class BatteryBarFragment extends Fragment { 1f)); SwitchMaterial enabledSwitch = new SwitchMaterial(context); - enabledSwitch.setText(labelRes); + enabledSwitch.setText(scenarioGroup.labelRes()); enabledSwitch.setLayoutParams(new LinearLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); @@ -425,80 +441,57 @@ public final class BatteryBarFragment extends Fragment { row.addView(textColumn); row.addView(editButton); container.addView(row); - bindScenarioOverride(scenario, labelRes, enabledSwitch, editButton, summary, prefs); - } - - private int scenarioLabelRes(BatteryBarGeometry.Scenario scenario) { - if (scenario == BatteryBarGeometry.Scenario.UNLOCKED_LANDSCAPE) { - return R.string.battery_bar_unlocked_landscape_override; - } - if (scenario == BatteryBarGeometry.Scenario.TRANSPARENT_PORTRAIT) { - return R.string.battery_bar_transparent_portrait_override; - } - if (scenario == BatteryBarGeometry.Scenario.TRANSPARENT_LANDSCAPE) { - return R.string.battery_bar_transparent_landscape_override; - } - if (scenario == BatteryBarGeometry.Scenario.FULLSCREEN_PORTRAIT) { - return R.string.battery_bar_fullscreen_portrait_override; - } - if (scenario == BatteryBarGeometry.Scenario.FULLSCREEN_LANDSCAPE) { - return R.string.battery_bar_fullscreen_landscape_override; - } - if (scenario == BatteryBarGeometry.Scenario.LOCKSCREEN) { - return R.string.battery_bar_lockscreen_override; - } - return R.string.battery_bar_unlocked_portrait_override; + bindScenarioOverride(scenarioGroup, enabledSwitch, editButton, summary, prefs); } private void bindScenarioOverride( - BatteryBarGeometry.Scenario scenario, - int labelRes, + ScenarioGroup scenarioGroup, SwitchMaterial enabledSwitch, MaterialButton editButton, TextView summary, SharedPreferences prefs ) { - if (scenario == null || prefs == null) { + if (scenarioGroup == null || prefs == null) { return; } - String enabledKey = BatteryBarGeometry.enabledKey(scenario); - boolean enabled = prefs.getBoolean(enabledKey, false); + boolean enabled = scenarioGroupEnabled(prefs, scenarioGroup); if (enabledSwitch != null) { enabledSwitch.setChecked(enabled); enabledSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> { - SharedPreferences.Editor editor = prefs.edit().putBoolean(enabledKey, isChecked); - if (isChecked && !prefs.contains(BatteryBarGeometry.valueKey(scenario))) { - editor.putString( - BatteryBarGeometry.valueKey(scenario), - globalGeometryFromPrefs(prefs).encode()); + SharedPreferences.Editor editor = prefs.edit(); + BatteryBarGeometry geometry = scenarioGroupGeometryFromPrefs(prefs, scenarioGroup); + for (BatteryBarGeometry.Scenario scenario : scenarioGroup.scenarios()) { + editor.putBoolean(BatteryBarGeometry.enabledKey(scenario), isChecked); + if (isChecked) { + editor.putString(BatteryBarGeometry.valueKey(scenario), geometry.encode()); + } } editor.apply(); SbtSettings.ensureReadable(requireContext()); - updateScenarioSummary(scenario, summary, editButton, prefs); + updateScenarioSummary(scenarioGroup, summary, editButton, prefs); }); } if (editButton != null) { editButton.setOnClickListener(v -> showScenarioGeometryDialog( - scenario, - labelRes, + scenarioGroup, prefs, summary, editButton)); } - updateScenarioSummary(scenario, summary, editButton, prefs); + updateScenarioSummary(scenarioGroup, summary, editButton, prefs); } private void updateScenarioSummary( - BatteryBarGeometry.Scenario scenario, + ScenarioGroup scenarioGroup, TextView summary, MaterialButton editButton, SharedPreferences prefs ) { - if (scenario == null || prefs == null) { + if (scenarioGroup == null || prefs == null) { return; } - boolean enabled = prefs.getBoolean(BatteryBarGeometry.enabledKey(scenario), false); - BatteryBarGeometry geometry = scenarioGeometryFromPrefs(prefs, scenario); + boolean enabled = scenarioGroupEnabled(prefs, scenarioGroup); + BatteryBarGeometry geometry = scenarioGroupGeometryFromPrefs(prefs, scenarioGroup); if (summary != null) { summary.setText(getString( R.string.battery_bar_override_summary, @@ -512,6 +505,18 @@ public final class BatteryBarFragment extends Fragment { } } + private boolean scenarioGroupEnabled(SharedPreferences prefs, ScenarioGroup scenarioGroup) { + if (prefs == null || scenarioGroup == null) { + return false; + } + for (BatteryBarGeometry.Scenario scenario : scenarioGroup.scenarios()) { + if (prefs.getBoolean(BatteryBarGeometry.enabledKey(scenario), false)) { + return true; + } + } + return false; + } + private BatteryBarGeometry globalGeometryFromPrefs(SharedPreferences prefs) { return new BatteryBarGeometry( prefs.getString( @@ -534,14 +539,28 @@ public final class BatteryBarFragment extends Fragment { globalGeometryFromPrefs(prefs)); } + private BatteryBarGeometry scenarioGroupGeometryFromPrefs( + SharedPreferences prefs, + ScenarioGroup scenarioGroup + ) { + if (prefs == null || scenarioGroup == null) { + return globalGeometryFromPrefs(prefs); + } + for (BatteryBarGeometry.Scenario scenario : scenarioGroup.scenarios()) { + if (prefs.contains(BatteryBarGeometry.valueKey(scenario))) { + return scenarioGeometryFromPrefs(prefs, scenario); + } + } + return globalGeometryFromPrefs(prefs); + } + private void showScenarioGeometryDialog( - BatteryBarGeometry.Scenario scenario, - int labelRes, + ScenarioGroup scenarioGroup, SharedPreferences prefs, TextView summary, MaterialButton editButton ) { - BatteryBarGeometry current = scenarioGeometryFromPrefs(prefs, scenario); + BatteryBarGeometry current = scenarioGroupGeometryFromPrefs(prefs, scenarioGroup); LinearLayout content = new LinearLayout(requireContext()); content.setOrientation(LinearLayout.VERTICAL); int padding = Math.round(20 * getResources().getDisplayMetrics().density); @@ -574,11 +593,11 @@ public final class BatteryBarFragment extends Fragment { content.addView(dialogLabel(R.string.battery_bar_thickness_title)); content.addView(thicknessInput); - new MaterialAlertDialogBuilder(requireContext()) - .setTitle(getString(R.string.battery_bar_override_dialog_title, getString(labelRes))) + androidx.appcompat.app.AlertDialog dialog = new MaterialAlertDialogBuilder(requireContext()) + .setTitle(getString(R.string.battery_bar_override_dialog_title, getString(scenarioGroup.labelRes()))) .setView(content) .setNegativeButton(android.R.string.cancel, null) - .setPositiveButton(android.R.string.ok, (dialog, which) -> { + .setPositiveButton(android.R.string.ok, (dialogInterface, which) -> { BatteryBarGeometry updated = new BatteryBarGeometry( positionBottom.isChecked() ? "bottom" : "top", alignmentRtl.isChecked() @@ -588,13 +607,22 @@ public final class BatteryBarFragment extends Fragment { ViewTreeSupport.parseInt(thicknessInput, current.thicknessDp), SbtDefaults.BATTERY_BAR_THICKNESS_DP_MIN, SbtDefaults.BATTERY_BAR_THICKNESS_DP_MAX)); - prefs.edit() - .putString(BatteryBarGeometry.valueKey(scenario), updated.encode()) - .apply(); + SharedPreferences.Editor editor = prefs.edit(); + for (BatteryBarGeometry.Scenario scenario : scenarioGroup.scenarios()) { + editor.putString(BatteryBarGeometry.valueKey(scenario), updated.encode()); + } + editor.apply(); SbtSettings.ensureReadable(requireContext()); - updateScenarioSummary(scenario, summary, editButton, prefs); + updateScenarioSummary(scenarioGroup, summary, editButton, prefs); }) .show(); + tintDialogButtons(dialog, requireContext()); + } + + private record ScenarioGroup( + int labelRes, + BatteryBarGeometry.Scenario... scenarios + ) { } private TextView dialogLabel(int resId) { @@ -745,12 +773,13 @@ public final class BatteryBarFragment extends Fragment { rowParams.topMargin = ViewTreeSupport.dp(context, 12); row.setLayoutParams(rowParams); - TextView title = new TextView(context); - title.setText(getString(R.string.battery_bar_threshold_label, threshold.percent)); - row.addView(title); + LinearLayout headerRow = new LinearLayout(context); + headerRow.setOrientation(LinearLayout.HORIZONTAL); + headerRow.setGravity(Gravity.CENTER_VERTICAL); + row.addView(headerRow); MaterialButton percentButton = createRowButton(context); - percentButton.setText(getString(R.string.battery_bar_threshold_change_percent)); + percentButton.setText(getString(R.string.battery_bar_threshold_label, threshold.percent)); percentButton.setOnClickListener(v -> showThresholdPercentDialog( threshold, prefs, @@ -771,7 +800,27 @@ public final class BatteryBarFragment extends Fragment { showMessageDialog(R.string.battery_bar_threshold_reordered); } })); - row.addView(percentButton); + headerRow.addView(percentButton, new LinearLayout.LayoutParams( + 0, + ViewGroup.LayoutParams.WRAP_CONTENT, + 1f)); + + MaterialButton removeButton = createRowButton(context); + removeButton.setText("X"); + removeButton.setTextColor(ContextCompat.getColor(context, android.R.color.white)); + removeButton.setBackgroundTintList(ColorStateList.valueOf( + ContextCompat.getColor(context, R.color.sbt_danger))); + removeButton.setOnClickListener(v -> { + ArrayList updated = loadThresholds(prefs); + removeThreshold(updated, originalPercent); + persistThresholds(prefs, updated); + renderThresholdRows(container, prefs); + }); + LinearLayout.LayoutParams removeParams = new LinearLayout.LayoutParams( + ViewTreeSupport.dp(context, 44), + ViewGroup.LayoutParams.WRAP_CONTENT); + removeParams.leftMargin = ViewTreeSupport.dp(context, 8); + headerRow.addView(removeButton, removeParams); MaterialButton dischargeButton = createRowButton(context); updateColourButtonLabel( @@ -799,16 +848,6 @@ public final class BatteryBarFragment extends Fragment { container)); row.addView(chargeButton); - MaterialButton removeButton = createRowButton(context); - removeButton.setText(getString(R.string.battery_bar_threshold_remove)); - removeButton.setOnClickListener(v -> { - ArrayList updated = loadThresholds(prefs); - removeThreshold(updated, originalPercent); - persistThresholds(prefs, updated); - renderThresholdRows(container, prefs); - }); - row.addView(removeButton); - container.addView(row); } } @@ -988,6 +1027,7 @@ public final class BatteryBarFragment extends Fragment { consumer.accept(BatteryBarStyle.normalizeColor(raw)); }) .show(); + tintDialogButtons(dialog, context); if (sameAsDischargeButton != null) { MaterialButton finalSameAsDischargeButton = sameAsDischargeButton; finalSameAsDischargeButton.setOnClickListener(v -> { @@ -1031,14 +1071,35 @@ public final class BatteryBarFragment extends Fragment { consumer.accept(percent); }) .show(); + tintDialogButtons(dialog, context); focusInput(dialog, input); } private void showMessageDialog(int messageRes) { - new MaterialAlertDialogBuilder(requireContext()) + androidx.appcompat.app.AlertDialog dialog = new MaterialAlertDialogBuilder(requireContext()) .setMessage(messageRes) .setPositiveButton(android.R.string.ok, null) .show(); + tintDialogButtons(dialog, requireContext()); + } + + private void tintDialogButtons(androidx.appcompat.app.AlertDialog dialog, Context context) { + if (dialog == null || context == null) { + return; + } + int color = ContextCompat.getColor(context, R.color.sbt_accent_dark); + android.widget.Button positive = dialog.getButton(androidx.appcompat.app.AlertDialog.BUTTON_POSITIVE); + android.widget.Button negative = dialog.getButton(androidx.appcompat.app.AlertDialog.BUTTON_NEGATIVE); + android.widget.Button neutral = dialog.getButton(androidx.appcompat.app.AlertDialog.BUTTON_NEUTRAL); + if (positive != null) { + positive.setTextColor(color); + } + if (negative != null) { + negative.setTextColor(color); + } + if (neutral != null) { + neutral.setTextColor(color); + } } private void setIntInput(EditText input, int value) { diff --git a/app/src/main/java/se/ajpanton/statusbartweak/shell/ui/BlockAppNotificationIconsFragment.java b/app/src/main/java/se/ajpanton/statusbartweak/shell/ui/BlockAppNotificationIconsFragment.java index 95a9f10..512148e 100644 --- a/app/src/main/java/se/ajpanton/statusbartweak/shell/ui/BlockAppNotificationIconsFragment.java +++ b/app/src/main/java/se/ajpanton/statusbartweak/shell/ui/BlockAppNotificationIconsFragment.java @@ -19,6 +19,9 @@ import androidx.fragment.app.Fragment; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import java.util.ArrayList; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; import se.ajpanton.statusbartweak.R; import se.ajpanton.statusbartweak.shell.settings.AppIconRules; @@ -100,7 +103,11 @@ public class BlockAppNotificationIconsFragment extends Fragment { if (prefs == null) { return; } - AppIconRules.clearSeenSession(prefs); + Map seen = AppIconRules.loadSeenSession(prefs); + Set keep = new HashSet<>(AppIconRules.loadBlockedModes(prefs).keySet()); + keep.addAll(AppIconRules.loadActiveSession(prefs)); + seen.keySet().removeIf(pkg -> !keep.contains(pkg)); + AppIconRules.saveSeenSession(prefs, seen); SbtSettings.ensureReadable(requireContext()); } diff --git a/app/src/main/java/se/ajpanton/statusbartweak/shell/ui/HiddenAppsUiSupport.java b/app/src/main/java/se/ajpanton/statusbartweak/shell/ui/HiddenAppsUiSupport.java index 744e504..21a5d2e 100644 --- a/app/src/main/java/se/ajpanton/statusbartweak/shell/ui/HiddenAppsUiSupport.java +++ b/app/src/main/java/se/ajpanton/statusbartweak/shell/ui/HiddenAppsUiSupport.java @@ -256,18 +256,19 @@ final class HiddenAppsUiSupport { exceptionsList.post(() -> exceptionsList.scrollToPosition(pos)); }); + Runnable revertDefaults = () -> { + if (row.blockAod != originalModes[MODE_INDEX_AOD] + || row.blockLock != originalModes[MODE_INDEX_LOCK] + || row.blockUnlock != originalModes[MODE_INDEX_UNLOCK]) { + row.blockAod = originalModes[MODE_INDEX_AOD]; + row.blockLock = originalModes[MODE_INDEX_LOCK]; + row.blockUnlock = originalModes[MODE_INDEX_UNLOCK]; + notifyRowChanged(rowChangedListener, row); + } + }; androidx.appcompat.app.AlertDialog dialog = new MaterialAlertDialogBuilder(context) .setView(content) - .setNegativeButton(android.R.string.cancel, (d, w) -> { - if (row.blockAod != originalModes[MODE_INDEX_AOD] - || row.blockLock != originalModes[MODE_INDEX_LOCK] - || row.blockUnlock != originalModes[MODE_INDEX_UNLOCK]) { - row.blockAod = originalModes[MODE_INDEX_AOD]; - row.blockLock = originalModes[MODE_INDEX_LOCK]; - row.blockUnlock = originalModes[MODE_INDEX_UNLOCK]; - notifyRowChanged(rowChangedListener, row); - } - }) + .setNegativeButton(android.R.string.cancel, (d, w) -> revertDefaults.run()) .setPositiveButton(android.R.string.ok, (dlg, which) -> { row.blockAod = defaultModes[MODE_INDEX_AOD]; row.blockLock = defaultModes[MODE_INDEX_LOCK]; @@ -276,7 +277,8 @@ final class HiddenAppsUiSupport { notifyRowChanged(rowChangedListener, row); }) .show(); - dialog.setCanceledOnTouchOutside(false); + dialog.setCanceledOnTouchOutside(true); + dialog.setOnCancelListener(d -> revertDefaults.run()); if (dialog.getWindow() != null) { dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); dialog.getWindow().setSoftInputMode( @@ -879,15 +881,18 @@ final class HiddenAppsUiSupport { int small = Math.round(2f * context.getResources().getDisplayMetrics().density); Button pos = dialog.getButton(androidx.appcompat.app.AlertDialog.BUTTON_POSITIVE); Button neg = dialog.getButton(androidx.appcompat.app.AlertDialog.BUTTON_NEGATIVE); + int actionColor = ContextCompat.getColor(context, R.color.sbt_accent_dark); if (pos != null) { pos.setMinHeight(0); pos.setMinimumHeight(0); pos.setPadding(pos.getPaddingLeft(), small, pos.getPaddingRight(), small); + pos.setTextColor(actionColor); } if (neg != null) { neg.setMinHeight(0); neg.setMinimumHeight(0); neg.setPadding(neg.getPaddingLeft(), small, neg.getPaddingRight(), small); + neg.setTextColor(actionColor); } if (pos != null) { ViewParent p = pos.getParent(); diff --git a/app/src/main/java/se/ajpanton/statusbartweak/shell/ui/IconsDebugFragment.java b/app/src/main/java/se/ajpanton/statusbartweak/shell/ui/IconsDebugFragment.java index e2962d1..7c3fc8c 100644 --- a/app/src/main/java/se/ajpanton/statusbartweak/shell/ui/IconsDebugFragment.java +++ b/app/src/main/java/se/ajpanton/statusbartweak/shell/ui/IconsDebugFragment.java @@ -75,6 +75,10 @@ public class IconsDebugFragment extends Fragment { currentCount = DebugNotifications.getDesiredCount(requireContext()); updateCountLabel(); bindCycleSwitch(cycleIconsSwitch); + styleCompactCounterButton(minus10); + styleCompactCounterButton(minus1); + styleCompactCounterButton(plus1); + styleCompactCounterButton(plus10); minus10.setOnClickListener(v -> adjustCount(-10)); minus1.setOnClickListener(v -> adjustCount(-1)); @@ -183,6 +187,10 @@ public class IconsDebugFragment extends Fragment { return root; } + private void styleCompactCounterButton(MaterialButton button) { + ViewTreeSupport.styleCompactButtonText(button, 13f); + } + private void bindRestartSystemUiButton(MaterialButton restartButton) { if (restartButton == null) { return; 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 2fd8396..66618e0 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 @@ -530,9 +530,14 @@ public final class LayoutFragment extends Fragment { return; } + group.setSaveEnabled(false); + group.setSaveFromParentEnabled(false); + ViewTreeSupport.balanceHorizontalRadioGroup(requireContext(), group); group.check(positionIdForValue(groupId, prefs.getString(positionKey, positionDefault))); boolean autoNearestAvailable = autoNearestKey != null && autoNearest != null; if (autoNearestAvailable) { + autoNearest.setSaveEnabled(false); + autoNearest.setSaveFromParentEnabled(false); autoNearest.setChecked(prefs.getBoolean(autoNearestKey, true)); } else if (autoNearest != null) { autoNearest.setChecked(false); @@ -556,6 +561,9 @@ public final class LayoutFragment extends Fragment { RadioGroup sideGroup = resolveMiddleSideGroup(root, groupId); if (sideGroup != null) { + sideGroup.setSaveEnabled(false); + sideGroup.setSaveFromParentEnabled(false); + ViewTreeSupport.balanceHorizontalRadioGroup(requireContext(), sideGroup); sideGroup.check(sideIdForValue(sideGroup, prefs.getString(middleSideKey, "left"))); sideGroup.setOnCheckedChangeListener((g, checkedId) -> { prefs.edit().putString(middleSideKey, checkedId == resolveRightSideId(g) ? "right" : "left").apply(); @@ -634,10 +642,18 @@ public final class LayoutFragment extends Fragment { return; } int startValue = ViewTreeSupport.clamp(key != null ? prefs.getInt(key, initialValue) : initialValue, minValue, maxValue); + input.setSaveEnabled(false); + input.setSaveFromParentEnabled(false); input.setFilters(new InputFilter[]{new InputFilter.LengthFilter(4)}); setNumericText(input, startValue); final boolean[] updating = new boolean[]{false}; + ViewTreeSupport.styleStepperButton(minusFastButton); + ViewTreeSupport.styleStepperButton(minusButton); + ViewTreeSupport.styleStepperButton(plusButton); + ViewTreeSupport.styleStepperButton(plusFastButton); + ViewTreeSupport.styleStepperButton(resetButton); + bindStepperButton(prefs, key, input, updating, minusFastButton, -5, minValue, maxValue); bindStepperButton(prefs, key, input, updating, minusButton, -1, minValue, maxValue); bindStepperButton(prefs, key, input, updating, plusButton, 1, minValue, maxValue); diff --git a/app/src/main/java/se/ajpanton/statusbartweak/shell/ui/LayoutOrderingUi.java b/app/src/main/java/se/ajpanton/statusbartweak/shell/ui/LayoutOrderingUi.java index 66cae98..3acea00 100644 --- a/app/src/main/java/se/ajpanton/statusbartweak/shell/ui/LayoutOrderingUi.java +++ b/app/src/main/java/se/ajpanton/statusbartweak/shell/ui/LayoutOrderingUi.java @@ -56,6 +56,7 @@ final class LayoutOrderingUi { addSortButton(context, sortGroup, R.string.layout_sort_icons_stock, "stock"); addSortButton(context, sortGroup, R.string.layout_sort_icons_reversed, "reversed"); addSortButton(context, sortGroup, R.string.layout_sort_icons_automatic, "automatic"); + ViewTreeSupport.balanceHorizontalRadioGroup(context, sortGroup); sortGroup.check(idForTag(sortGroup, prefs.getString( SbtSettings.KEY_LAYOUT_NOTIF_SORT_ORDER, SbtDefaults.LAYOUT_NOTIF_SORT_ORDER_DEFAULT))); @@ -206,9 +207,8 @@ final class LayoutOrderingUi { button.setSingleLine(true); button.setMaxLines(1); group.addView(button, new RadioGroup.LayoutParams( - 0, ViewGroup.LayoutParams.WRAP_CONTENT, - 1f)); + ViewGroup.LayoutParams.WRAP_CONTENT)); } private static int idForTag(RadioGroup group, @Nullable String tag) { diff --git a/app/src/main/java/se/ajpanton/statusbartweak/shell/ui/LayoutSectionCopySupport.java b/app/src/main/java/se/ajpanton/statusbartweak/shell/ui/LayoutSectionCopySupport.java index 25f7dcc..3bb6f67 100644 --- a/app/src/main/java/se/ajpanton/statusbartweak/shell/ui/LayoutSectionCopySupport.java +++ b/app/src/main/java/se/ajpanton/statusbartweak/shell/ui/LayoutSectionCopySupport.java @@ -439,11 +439,13 @@ final class LayoutSectionCopySupport { LinearLayout.LayoutParams spinnerParams = new LinearLayout.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); + spinnerParams.gravity = android.view.Gravity.CENTER_VERTICAL; row.addView(spinner, spinnerParams); LinearLayout.LayoutParams rowParams = new LinearLayout.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); rowParams.leftMargin = ViewTreeSupport.dp(context, 12); + rowParams.gravity = android.view.Gravity.CENTER_VERTICAL; if (parent.getOrientation() == LinearLayout.HORIZONTAL) { parent.addView(row, rowParams); } else { diff --git a/app/src/main/java/se/ajpanton/statusbartweak/shell/ui/SystemIconsFragment.java b/app/src/main/java/se/ajpanton/statusbartweak/shell/ui/SystemIconsFragment.java index b523935..deedf44 100644 --- a/app/src/main/java/se/ajpanton/statusbartweak/shell/ui/SystemIconsFragment.java +++ b/app/src/main/java/se/ajpanton/statusbartweak/shell/ui/SystemIconsFragment.java @@ -205,6 +205,7 @@ public class SystemIconsFragment extends Fragment { TextView selected = new TextView(context); selected.setText(labels[indexForDualSimSignalMode(current)]); selected.setTextAppearance(com.google.android.material.R.style.TextAppearance_MaterialComponents_Body1); + selected.setGravity(Gravity.END | Gravity.CENTER_VERTICAL); selected.setSingleLine(true); selected.setEllipsize(TextUtils.TruncateAt.END); LinearLayout.LayoutParams selectedParams = new LinearLayout.LayoutParams( @@ -260,9 +261,9 @@ public class SystemIconsFragment extends Fragment { item.setTextAppearance(com.google.android.material.R.style.TextAppearance_MaterialComponents_Body1); item.setSingleLine(true); item.setPadding( - 0, ViewTreeSupport.dp(context, 12), - 0, + ViewTreeSupport.dp(context, 12), + ViewTreeSupport.dp(context, 8), ViewTreeSupport.dp(context, 12)); content.addView(item, new LinearLayout.LayoutParams( Math.max(anchor.getWidth(), ViewTreeSupport.dp(context, MODE_TOGGLE_COLUMN_DP)), diff --git a/app/src/main/java/se/ajpanton/statusbartweak/shell/ui/ViewTreeSupport.java b/app/src/main/java/se/ajpanton/statusbartweak/shell/ui/ViewTreeSupport.java index 6f8dad3..f7263a6 100644 --- a/app/src/main/java/se/ajpanton/statusbartweak/shell/ui/ViewTreeSupport.java +++ b/app/src/main/java/se/ajpanton/statusbartweak/shell/ui/ViewTreeSupport.java @@ -9,6 +9,9 @@ import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.EditText; import android.widget.LinearLayout; +import android.widget.RadioButton; +import android.widget.RadioGroup; +import android.widget.Space; import android.widget.TextView; import com.google.android.material.button.MaterialButton; @@ -20,6 +23,8 @@ import se.ajpanton.statusbartweak.R; import se.ajpanton.statusbartweak.shell.settings.SbtSettings; final class ViewTreeSupport { + static final String DEFAULT_SYMBOL = "\u21ba"; + private ViewTreeSupport() { } @@ -123,9 +128,54 @@ final class ViewTreeSupport { button.setMinWidth(dp(context, 40)); button.setMinHeight(dp(context, 40)); button.setPadding(0, button.getPaddingTop(), 0, button.getPaddingBottom()); + styleStepperButton(button); return button; } + static void styleStepperButton(MaterialButton button) { + if (button == null) { + return; + } + button.setGravity(android.view.Gravity.CENTER); + button.setIncludeFontPadding(false); + button.setSingleLine(true); + button.setMinWidth(0); + button.setMinimumWidth(0); + button.setInsetTop(0); + button.setInsetBottom(0); + tryInvokeIntMethod(button, "setInsetLeft", 0); + tryInvokeIntMethod(button, "setInsetRight", 0); + button.setPadding(0, 0, 0, 0); + button.setTextSize(20f); + button.setAllCaps(false); + } + + static void styleCompactButtonText(MaterialButton button, float textSizeSp) { + if (button == null) { + return; + } + button.setAllCaps(false); + button.setSingleLine(true); + button.setIncludeFontPadding(false); + button.setMinWidth(0); + button.setMinimumWidth(0); + tryInvokeIntMethod(button, "setInsetLeft", 0); + tryInvokeIntMethod(button, "setInsetRight", 0); + button.setPadding(0, button.getPaddingTop(), 0, button.getPaddingBottom()); + button.setTextSize(textSizeSp); + } + + private static void tryInvokeIntMethod(Object target, String methodName, int value) { + if (target == null || methodName == null) { + return; + } + try { + java.lang.reflect.Method method = target.getClass().getMethod(methodName, int.class); + method.invoke(target, value); + } catch (Exception ignored) { + } + } + static LinearLayout.LayoutParams stepperButtonParams(Context context) { return new LinearLayout.LayoutParams(dp(context, 40), ViewGroup.LayoutParams.WRAP_CONTENT); } @@ -139,6 +189,41 @@ final class ViewTreeSupport { return params; } + static void balanceHorizontalRadioGroup(Context context, RadioGroup group) { + if (context == null || group == null || group.getOrientation() != RadioGroup.HORIZONTAL) { + return; + } + int count = group.getChildCount(); + if (count == 0) { + return; + } + for (int i = 0; i < count; i++) { + if (!(group.getChildAt(i) instanceof RadioButton)) { + return; + } + } + RadioButton[] buttons = new RadioButton[count]; + for (int i = 0; i < count; i++) { + buttons[i] = (RadioButton) group.getChildAt(i); + } + group.removeAllViews(); + for (int i = 0; i <= count; i++) { + group.addView(new Space(context), new RadioGroup.LayoutParams( + 0, + 1, + 1f)); + if (i < count) { + RadioButton button = buttons[i]; + button.setSingleLine(true); + button.setMaxLines(1); + button.setEllipsize(null); + group.addView(button, new RadioGroup.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT)); + } + } + } + static EditText numericInput(Context context, boolean signed, int maxLength) { EditText input = new EditText(context); input.setGravity(android.view.Gravity.CENTER); @@ -190,6 +275,8 @@ final class ViewTreeSupport { MaterialButton minus = outlinedStepperButton(context, "-"); MaterialButton plus = outlinedStepperButton(context, "+"); EditText input = numericInput(context, false, 1); + input.setSaveEnabled(false); + input.setSaveFromParentEnabled(false); input.setText(String.valueOf(current)); row.addView(minus, stepperButtonParams(context)); row.addView(input, stepperInputParams(context)); @@ -241,8 +328,10 @@ final class ViewTreeSupport { MaterialButton minus = outlinedStepperButton(context, "-"); MaterialButton plus = outlinedStepperButton(context, "+"); - MaterialButton reset = showDefaultButton ? outlinedStepperButton(context, "D") : null; + MaterialButton reset = showDefaultButton ? outlinedStepperButton(context, DEFAULT_SYMBOL) : null; EditText input = numericInput(context, signed, inputMaxLength); + input.setSaveEnabled(false); + input.setSaveFromParentEnabled(false); int current = clamp(prefs.getInt(key, defaultValue), min, max); int parseFallback = useCurrentAsParseFallback ? current : defaultValue; input.setText(String.valueOf(current)); @@ -343,6 +432,9 @@ final class ViewTreeSupport { cardParams.topMargin = dp(context, 16); card.setLayoutParams(cardParams); card.setUseCompatPadding(true); + card.setCardBackgroundColor(context.getColor(R.color.sbt_surface)); + card.setRadius(dp(context, 22)); + card.setCardElevation(dp(context, 2)); card.setStrokeColor(context.getColor(R.color.sbt_card_outline)); card.setStrokeWidth(dp(context, 1)); LinearLayout inner = verticalLayout(context); diff --git a/app/src/main/res/color/drawer_item_text_color.xml b/app/src/main/res/color/drawer_item_text_color.xml index e0d2aaa..8b44ce5 100644 --- a/app/src/main/res/color/drawer_item_text_color.xml +++ b/app/src/main/res/color/drawer_item_text_color.xml @@ -1,5 +1,5 @@ - - + + diff --git a/app/src/main/res/drawable/drawer_item_background.xml b/app/src/main/res/drawable/drawer_item_background.xml index f4c24b1..f7aab66 100644 --- a/app/src/main/res/drawable/drawer_item_background.xml +++ b/app/src/main/res/drawable/drawer_item_background.xml @@ -2,11 +2,11 @@ - + - + android:color="@color/sbt_accent_dark" /> + diff --git a/app/src/main/res/drawable/sbt_drawer_header_background.xml b/app/src/main/res/drawable/sbt_drawer_header_background.xml new file mode 100644 index 0000000..05f924b --- /dev/null +++ b/app/src/main/res/drawable/sbt_drawer_header_background.xml @@ -0,0 +1,9 @@ + + + + diff --git a/app/src/main/res/drawable/sbt_toolbar_background.xml b/app/src/main/res/drawable/sbt_toolbar_background.xml new file mode 100644 index 0000000..6f050d8 --- /dev/null +++ b/app/src/main/res/drawable/sbt_toolbar_background.xml @@ -0,0 +1,8 @@ + + + + diff --git a/app/src/main/res/drawable/sbt_window_background.xml b/app/src/main/res/drawable/sbt_window_background.xml new file mode 100644 index 0000000..f3e2490 --- /dev/null +++ b/app/src/main/res/drawable/sbt_window_background.xml @@ -0,0 +1,7 @@ + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 5c0d0a3..600a798 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -5,6 +5,7 @@ android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" + android:background="@drawable/sbt_window_background" android:fitsSystemWindows="true"> diff --git a/app/src/main/res/layout/drawer_header.xml b/app/src/main/res/layout/drawer_header.xml index d76c1de..9817584 100644 --- a/app/src/main/res/layout/drawer_header.xml +++ b/app/src/main/res/layout/drawer_header.xml @@ -2,17 +2,26 @@ + android:padding="20dp"> + android:textColor="@color/sbt_on_primary" + android:textStyle="bold" /> + + diff --git a/app/src/main/res/layout/fragment_battery_bar.xml b/app/src/main/res/layout/fragment_battery_bar.xml index 3c5f5b5..c86d110 100644 --- a/app/src/main/res/layout/fragment_battery_bar.xml +++ b/app/src/main/res/layout/fragment_battery_bar.xml @@ -87,12 +87,14 @@ android:id="@+id/battery_bar_position_top" android:layout_width="match_parent" android:layout_height="wrap_content" + android:minHeight="36dp" android:text="@string/battery_bar_position_top" /> @@ -113,7 +115,7 @@ @@ -133,7 +135,7 @@ @@ -155,7 +157,7 @@ @@ -175,7 +177,7 @@ @@ -197,18 +199,21 @@ android:id="@+id/battery_bar_curved_geometry_off" android:layout_width="match_parent" android:layout_height="wrap_content" + android:minHeight="36dp" android:text="@string/battery_bar_curved_geometry_off" /> @@ -411,8 +416,8 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + android:textAppearance="?attr/textAppearanceBody1" + android:textColor="@color/sbt_accent_dark" /> diff --git a/app/src/main/res/layout/fragment_icons_debug.xml b/app/src/main/res/layout/fragment_icons_debug.xml index 01a0608..e7e5805 100644 --- a/app/src/main/res/layout/fragment_icons_debug.xml +++ b/app/src/main/res/layout/fragment_icons_debug.xml @@ -104,6 +104,7 @@ + android:text="↺" /> @@ -364,9 +364,9 @@ + android:text="↺" /> @@ -585,9 +585,9 @@ + android:text="↺" /> @@ -806,9 +806,9 @@ + android:text="↺" /> diff --git a/app/src/main/res/layout/item_hidden_app_exception_rule.xml b/app/src/main/res/layout/item_hidden_app_exception_rule.xml index 4e13ec8..99c7dc9 100644 --- a/app/src/main/res/layout/item_hidden_app_exception_rule.xml +++ b/app/src/main/res/layout/item_hidden_app_exception_rule.xml @@ -44,6 +44,7 @@ android:insetBottom="0dp" android:paddingStart="6dp" android:paddingEnd="6dp" + android:textColor="@color/sbt_danger" android:text="@string/hidden_apps_delete_exception" /> diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml index 48015ae..e056226 100644 --- a/app/src/main/res/values-night/colors.xml +++ b/app/src/main/res/values-night/colors.xml @@ -1,4 +1,18 @@ + #FF3D2415 + #FF170B05 + #FF301A0D + #FFFF8A1C + #FFFFA03C + #FF110B07 + #FF1B0F08 + #FF20140D + #FF302012 + #FFFFFFFF + #FFEAF0F3 + #FFE3D3B6 + #30FFFFFF #66FFFFFF + #FFB71C1C diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml index 5f247a3..5c01363 100644 --- a/app/src/main/res/values-night/themes.xml +++ b/app/src/main/res/values-night/themes.xml @@ -1,16 +1,23 @@ - - - \ No newline at end of file + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index d87e8fa..1f42b53 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,14 +1,22 @@ - #FFBB86FC - #FF6200EE - #FF3700B3 - #FF03DAC5 - #FF018786 + #FF3D2415 + #FF241007 + #FFFFE3C2 + #FFFF8A1C + #FFD46500 + #FFFFF4E8 + #FFF5E5D2 + #FFFFFFFF + #FFFFF1E0 + #FFFFFFFF + #FF111820 + #FF62553F #FF000000 #FFFFFFFF - #33000000 + #24000000 #4D000000 #1AE65100 #CCB00020 + #FFB71C1C diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9e594b2..e8a5cbc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,13 +1,14 @@ StatusBarTweak Status bar and lockscreen layout tweaks for Samsung SystemUI. + Statusbar layout control Open navigation Close navigation Debugging Hide status icons     Hide notification icons     Hide status icons - Clock + Clock text Layout     Unlocked     Lockscreen @@ -149,12 +150,9 @@ On, actual curve length Scenario overrides Optional geometry overrides. Disabled scenarios use the default geometry above. - Unlocked portrait - Unlocked landscape - Transparent statusbar portrait - Transparent statusbar landscape - Fullscreen portrait - Fullscreen landscape + Unlocked + Transparent statusbar + Fullscreen Lockscreen Edit Edit %1$s geometry @@ -184,7 +182,7 @@ A threshold at that percentage already exists. That threshold moved to a new position in the list. Leave the field empty and press OK for \"Same as discharge\", or use the button below for \"Same as default\". - Clock + Clock text Layout Unlocked Master toggle @@ -236,16 +234,20 @@ Left side Right side Custom format - Use custom date/time pattern - Use custom drawer clock pattern - Use custom drawer date pattern + Statusbar clock + Drawer clock + Drawer date + Tools and instructions + Enable custom date/time pattern + Enable custom date/time pattern + Enable custom date/time pattern Examples: HH:mm, EEE d MMM HH:mm:ss, {color(#batterybar 1.2 * ; invRGB 0.5 *RGB) big @sans-serif-condensed}HH:mm Date/time patterns:\n\u2022 Uses Java SimpleDateFormat-style pattern letters\n\u2022 Common symbols: yyyy yy MMMM MMM MM EEEE EEE dd d HH hh mm ss a\n\nTags:\n\u2022 Supported tags: <i>, <u>, <small>, <big>, <font color=\'...\'>, <font face=\'...\'>\n\u2022 <b> is not supported\n\u2022 Custom font tags: <sans>, <serif>, <mono>, <condensed>\n\u2022 {/font} closes any open <font ...> tag\n\u2022 Opening a new colour or font face automatically closes the previous one Shorthand blocks:\n\u2022 {#FA0 big @sans-serif-condensed} is shorthand for opening multiple tags in order\n\u2022 {#FA0} is shorthand for {color(#FA0)}\n\u2022 In shorthand: / closes a tag, color(...) sets font colour, @ sets font face\n\u2022 Each whitespace-separated token inside {} becomes its own tag, except color(...) which may contain spaces\n\nLine breaks:\n\u2022 Use \\n, {\\n} or {\\n15}; the number is the line-height delta in px\n\u2022 Omit the number to use the default row spacing\n\u2022 { /\\n } style line breaks are written without spaces: {/\\n} or {/\\n15}\n\u2022 Normal line breaks propagate open tags onto the next row\n\u2022 A / line break ends all currently open tags before the next row starts\n\nPipes and grouping:\n\u2022 Maximum two pipes per row; more than two is a syntax error for that row only\n\u2022 Pipes inside single quotes or {} do not split the row\n\u2022 One pipe splits into left and right segments\n\u2022 Two pipes remove the middle section, then split using the outer pipes\n\u2022 Tags are logically continued across pipe splits, even if the middle section is ignored\n\u2022 Rows without pipes are independent; rows with pipes share one common pipe group\n\u2022 A syntax-error row becomes the text Syntax error, with no whole-clock fallback\n\nColours:\n\u2022 Supported operands: #RGB, #ARGB, #RRGGBB, #AARRGGBB, #batterybar, [R,G,B], [A,R,G,B], and numbers\n\u2022 Colour expressions use reverse Polish notation: operands first, operator last\n\u2022 Use ; to separate bright/dark variants; the dark side starts with the raw result from the bright side on the stack\n\u2022 Operators: + - * / ^ inv min max sqrt clip dup\n\u2022 Operators can be channel-filtered, for example +A, *RGB, invRGB, maxRGB, clipA\n\u2022 Final values are clipped to 0..255; a final number becomes opaque grayscale Examples:\n\u2022 <small>EEE d MMM</small> HH:mm\n\u2022 HH<small>:mm</small>\n\u2022 <font color=\'#FA0\'>ss</font>\n\u2022 {color(#FA0 ; invRGB 0.8 *RGB)}ss\n\u2022 {color(#batterybar 1.2 * ; invRGB 0.5 *RGB) big u @sans-serif-condensed}HH:mm\n\u2022 {color([255, 255, 170, 0] ; invRGB)}HH:mm\n\u2022 HH:mm{\\n12 small}EEE d MMM\n\u2022 HH|mm aligns the pipe position across every piped row\n\u2022 left||right removes the middle section before split alignment\n\u2022 {/font}{/\\n big}HH:mm starts a new row without carrying the previous font tags forward Browse font families - Show pattern instructions - Hide pattern instructions + ▾ Show pattern instructions + ▴ Hide pattern instructions Font families Search font family Copied: %1$s diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 2e06ef8..08f8f08 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -1,26 +1,82 @@ - - - + + + + + + + + + + + +