From cca9cd07e40bdeb37f1622ca87538f4e225ebb5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolt=C3=A1n=20Papp?= Date: Sun, 10 May 2026 16:29:51 +0200 Subject: [PATCH] Announce theme picker selection to screen readers Theme picker rows now expose: - contentDescription with the theme label - stateDescription "Selected" on the active row (Android R+) - isSelected=true on the active row for accessibility services After picking, announce " theme selected" on the sheet root so TalkBack confirms the change before the sheet dismisses. --- .../client/ui/advanced/ThemePickerSheet.java | 19 +++++++++++++++++++ app/src/main/res/values/strings.xml | 3 +++ 2 files changed, 22 insertions(+) diff --git a/app/src/main/java/io/netbird/client/ui/advanced/ThemePickerSheet.java b/app/src/main/java/io/netbird/client/ui/advanced/ThemePickerSheet.java index 02d5c65..9efc41d 100644 --- a/app/src/main/java/io/netbird/client/ui/advanced/ThemePickerSheet.java +++ b/app/src/main/java/io/netbird/client/ui/advanced/ThemePickerSheet.java @@ -46,12 +46,31 @@ public class ThemePickerSheet extends BottomSheetDialogFragment { binding.themeCheckSystem.setVisibility(mode == AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM ? View.VISIBLE : View.INVISIBLE); binding.themeCheckLight.setVisibility(mode == AppCompatDelegate.MODE_NIGHT_NO ? View.VISIBLE : View.INVISIBLE); binding.themeCheckDark.setVisibility(mode == AppCompatDelegate.MODE_NIGHT_YES ? View.VISIBLE : View.INVISIBLE); + + applyRowAccessibility(binding.themeRowSystem, mode == AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM, + getString(io.netbird.client.R.string.advanced_theme_system)); + applyRowAccessibility(binding.themeRowLight, mode == AppCompatDelegate.MODE_NIGHT_NO, + getString(io.netbird.client.R.string.advanced_theme_light)); + applyRowAccessibility(binding.themeRowDark, mode == AppCompatDelegate.MODE_NIGHT_YES, + getString(io.netbird.client.R.string.advanced_theme_dark)); + } + + private void applyRowAccessibility(View row, boolean selected, String label) { + row.setContentDescription(label); + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.R) { + row.setStateDescription(selected ? getString(io.netbird.client.R.string.theme_picker_selected) : null); + } + row.setSelected(selected); } private void pick(int mode) { SharedPreferences prefs = requireContext().getSharedPreferences("settings", 0); prefs.edit().putInt("theme_mode", mode).apply(); AppCompatDelegate.setDefaultNightMode(mode); + if (binding != null) { + binding.getRoot().announceForAccessibility( + getString(io.netbird.client.R.string.theme_picker_announce, labelFor(requireContext(), mode))); + } if (getParentFragment() instanceof OnThemeChangedListener) { ((OnThemeChangedListener) getParentFragment()).onThemeChanged(mode); } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index be447de..d19770d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -114,6 +114,9 @@ Network & Internet settings → Advanced → Check the gear icon for all the apps listed here on this page. Disable Always On for the apps that are not NetBird.]]> + Selected + %1$s theme selected + System Theme Mode Dark