diff --git a/android/java/org/chromium/chrome/browser/settings/AppearancePreferences.java b/android/java/org/chromium/chrome/browser/settings/AppearancePreferences.java index 90bd88e1c92..9931be3c1a2 100644 --- a/android/java/org/chromium/chrome/browser/settings/AppearancePreferences.java +++ b/android/java/org/chromium/chrome/browser/settings/AppearancePreferences.java @@ -52,18 +52,17 @@ import java.util.Map; public class AppearancePreferences extends AppearanceSettingsFragment implements Preference.OnPreferenceChangeListener, BraveRewardsObserver { - public static final String PREF_HIDE_BRAVE_REWARDS_ICON = "hide_brave_rewards_icon"; - public static final String PREF_HIDE_BRAVE_REWARDS_ICON_MIGRATION = - "hide_brave_rewards_icon_migration"; public static final String PREF_SHOW_BRAVE_REWARDS_ICON = "show_brave_rewards_icon"; - public static final String PREF_ADS_SWITCH = "ads_switch"; - public static final String PREF_BRAVE_NIGHT_MODE_ENABLED = "brave_night_mode_enabled_key"; - public static final String PREF_BRAVE_DISABLE_SHARING_HUB = "brave_disable_sharing_hub"; - public static final String PREF_BRAVE_ENABLE_TAB_GROUPS = "brave_enable_tab_groups"; - public static final String PREF_ENABLE_MULTI_WINDOWS = "enable_multi_windows"; - public static final String PREF_SHOW_UNDO_WHEN_TABS_CLOSED = "show_undo_when_tabs_closed"; public static final String PREF_ADDRESS_BAR = "address_bar"; - private static final String PREF_BRAVE_CUSTOMIZE_MENU = "brave_customize_menu"; + /* package */ static final String PREF_ADS_SWITCH = "ads_switch"; + /* package */ static final String PREF_BRAVE_NIGHT_MODE_ENABLED = + "brave_night_mode_enabled_key"; + /* package */ static final String PREF_BRAVE_DISABLE_SHARING_HUB = "brave_disable_sharing_hub"; + /* package */ static final String PREF_BRAVE_ENABLE_TAB_GROUPS = "brave_enable_tab_groups"; + /* package */ static final String PREF_ENABLE_MULTI_WINDOWS = "enable_multi_windows"; + /* package */ static final String PREF_SHOW_UNDO_WHEN_TABS_CLOSED = + "show_undo_when_tabs_closed"; + /* package */ static final String PREF_BRAVE_CUSTOMIZE_MENU = "brave_customize_menu"; private BraveRewardsNativeWorker mBraveRewardsNativeWorker; @@ -97,10 +96,7 @@ public class AppearancePreferences extends AppearanceSettingsFragment removePreferenceIfPresent(PREF_ADDRESS_BAR); } - // Correct the order of the preferences. - setPreferenceOrder(AppearanceSettingsFragment.PREF_UI_THEME, 0); - setPreferenceOrder(PREF_BRAVE_CUSTOMIZE_MENU, 1); - setPreferenceOrder(PREF_ADDRESS_BAR, 2); + applyOrdering(); } private void removePreferenceIfPresent(String key) { @@ -360,6 +356,24 @@ public class AppearancePreferences extends AppearanceSettingsFragment } } + // Both XMLs (upstream and brave) independently assign sequential order values starting from 0, + // causing collisions. Setting all preferences to explicit unique values prevents alphabetical + // tie-breaking, which would otherwise produce language-dependent ordering. + private void applyOrdering() { + setPreferenceOrder(AppearanceSettingsFragment.PREF_UI_THEME, 0); + setPreferenceOrder(PREF_BRAVE_CUSTOMIZE_MENU, 1); + setPreferenceOrder(AppearanceSettingsFragment.PREF_TOOLBAR_SHORTCUT, 2); + setPreferenceOrder(PREF_ADDRESS_BAR, 3); + setPreferenceOrder(BravePreferenceKeys.BRAVE_BOTTOM_TOOLBAR_ENABLED_KEY, 4); + setPreferenceOrder(PREF_SHOW_BRAVE_REWARDS_ICON, 5); + setPreferenceOrder(PREF_ADS_SWITCH, 6); + setPreferenceOrder(PREF_BRAVE_NIGHT_MODE_ENABLED, 7); + setPreferenceOrder(PREF_BRAVE_DISABLE_SHARING_HUB, 8); + setPreferenceOrder(PREF_BRAVE_ENABLE_TAB_GROUPS, 9); + setPreferenceOrder(PREF_ENABLE_MULTI_WINDOWS, 10); + setPreferenceOrder(PREF_SHOW_UNDO_WHEN_TABS_CLOSED, 11); + } + private void setPreferenceOrder(String key, int order) { Preference preference = findPreference(key); if (preference != null) { diff --git a/android/javatests/org/chromium/chrome/browser/settings/BraveAppearancePreferencesTest.java b/android/javatests/org/chromium/chrome/browser/settings/BraveAppearancePreferencesTest.java new file mode 100644 index 00000000000..6d06897add9 --- /dev/null +++ b/android/javatests/org/chromium/chrome/browser/settings/BraveAppearancePreferencesTest.java @@ -0,0 +1,92 @@ +/* Copyright (c) 2026 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at https://mozilla.org/MPL/2.0/. */ + +package org.chromium.chrome.browser.settings; + +import static org.junit.Assert.assertTrue; + +import android.os.Looper; + +import androidx.annotation.Nullable; +import androidx.preference.Preference; +import androidx.test.filters.SmallTest; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.chromium.base.BravePreferenceKeys; +import org.chromium.base.test.util.DoNotBatch; +import org.chromium.chrome.browser.appearance.settings.AppearanceSettingsFragment; +import org.chromium.chrome.test.ChromeJUnit4ClassRunner; + +/** Test for {@link AppearancePreferences}. */ +@RunWith(ChromeJUnit4ClassRunner.class) +@DoNotBatch(reason = "Tests cannot run batched because they launch a Settings activity.") +public class BraveAppearancePreferencesTest { + + @Rule + public final SettingsActivityTestRule mSettingsActivityTestRule = + new SettingsActivityTestRule<>(AppearancePreferences.class); + + private AppearancePreferences mAppearancePreferences; + + @Before + public void setup() { + Looper.prepare(); + } + + // Verifies that all appearance preferences appear in the correct order. When two preferences + // share the same order value the AndroidX Preference framework falls back to alphabetical title + // comparison, producing locale-dependent ordering. This test catches regressions in English; + // the test infrastructure does not support switching the app locale to reproduce e.g. French + // or Portuguese failures directly. + @Test + @SmallTest + public void testAppearancePreferencesOrder() { + startSettings(); + + // All keys from applyOrdering() listed in expected display order. Preferences that are + // conditionally absent (e.g. address_bar on older devices, toolbar_shortcut when adaptive + // toolbar is disabled, show_brave_rewards_icon when Rewards is unsupported) are skipped in + // the comparison when null. + final String[] sortedPrefKeys = { + AppearanceSettingsFragment.PREF_UI_THEME, + AppearancePreferences.PREF_BRAVE_CUSTOMIZE_MENU, + AppearanceSettingsFragment.PREF_TOOLBAR_SHORTCUT, + AppearancePreferences.PREF_ADDRESS_BAR, + BravePreferenceKeys.BRAVE_BOTTOM_TOOLBAR_ENABLED_KEY, + AppearancePreferences.PREF_SHOW_BRAVE_REWARDS_ICON, + AppearancePreferences.PREF_ADS_SWITCH, + AppearancePreferences.PREF_BRAVE_NIGHT_MODE_ENABLED, + AppearancePreferences.PREF_BRAVE_DISABLE_SHARING_HUB, + AppearancePreferences.PREF_BRAVE_ENABLE_TAB_GROUPS, + AppearancePreferences.PREF_ENABLE_MULTI_WINDOWS, + AppearancePreferences.PREF_SHOW_UNDO_WHEN_TABS_CLOSED, + }; + + @Nullable Preference prevPref = null; + for (String key : sortedPrefKeys) { + Preference pref = mAppearancePreferences.findPreference(key); + if (pref == null) continue; + if (prevPref == null) { + prevPref = pref; + continue; + } + assertTrue( + "\"" + prevPref.getTitle() + "\" should precede \"" + pref.getTitle() + "\"", + pref.getOrder() > prevPref.getOrder()); + prevPref = pref; + } + } + + private void startSettings() { + mSettingsActivityTestRule.startSettingsActivity(); + mAppearancePreferences = mSettingsActivityTestRule.getFragment(); + Assert.assertNotNull("SettingsActivity failed to launch.", mAppearancePreferences); + } +} diff --git a/test/BUILD.gn b/test/BUILD.gn index 91a71fbea04..1766f17bcc1 100644 --- a/test/BUILD.gn +++ b/test/BUILD.gn @@ -1541,6 +1541,7 @@ if (is_android) { "//brave/android/javatests/org/chromium/chrome/browser/privacy/settings/BravePrivacySettingsTest.java", "//brave/android/javatests/org/chromium/chrome/browser/safe_browsing/settings/BraveSafeBrowsingSettingsFragmentTest.java", "//brave/android/javatests/org/chromium/chrome/browser/settings/BackgroundImagesPreferencesTest.java", + "//brave/android/javatests/org/chromium/chrome/browser/settings/BraveAppearancePreferencesTest.java", "//brave/android/javatests/org/chromium/chrome/browser/settings/BraveMainSettingsFragmentTest.java", "//brave/android/javatests/org/chromium/chrome/browser/sync/BraveManageSyncSettingsTest.java", ]