From 4c9f7197eded99821b46f9e9f5d4c453aab910b7 Mon Sep 17 00:00:00 2001 From: Mihai-Cristian Condrea Date: Tue, 11 Nov 2025 08:28:50 +0200 Subject: [PATCH] Ensure settings updates trigger main UI recreation --- .../java/data/repository/DefaultMainRepository.java | 13 ++++++++++++- .../java/data/repository/MainRepository.java | 2 +- .../domain/main/ApplyLanguageSettingsUseCase.java | 4 ++-- .../java/ui/screens/main/MainUiState.java | 4 ++-- .../java/ui/screens/main/MainViewModel.java | 6 ++++-- 5 files changed, 21 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/data/repository/DefaultMainRepository.java b/app/src/main/java/com/d4rk/androidtutorials/java/data/repository/DefaultMainRepository.java index 839bf23c..27168de0 100644 --- a/app/src/main/java/com/d4rk/androidtutorials/java/data/repository/DefaultMainRepository.java +++ b/app/src/main/java/com/d4rk/androidtutorials/java/data/repository/DefaultMainRepository.java @@ -100,12 +100,23 @@ public void markStartupScreenShown() { /** * Applies the language setting from SharedPreferences. */ - public void applyLanguageSettings() { + public boolean applyLanguageSettings() { String languageKey = context.getString(R.string.key_language); String defaultLanguageValue = context.getString(R.string.default_value_language); String languageCode = defaultSharedPrefs.getString(languageKey, defaultLanguageValue); + if (languageCode == null) { + languageCode = defaultLanguageValue; + } + + LocaleListCompat currentLocales = AppCompatDelegate.getApplicationLocales(); + String currentLanguageTags = currentLocales.toLanguageTags(); + if (languageCode.equals(currentLanguageTags)) { + return false; + } + AppCompatDelegate.setApplicationLocales(LocaleListCompat.forLanguageTags(languageCode)); + return true; } /** diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/data/repository/MainRepository.java b/app/src/main/java/com/d4rk/androidtutorials/java/data/repository/MainRepository.java index e2935ca2..0679d1b0 100644 --- a/app/src/main/java/com/d4rk/androidtutorials/java/data/repository/MainRepository.java +++ b/app/src/main/java/com/d4rk/androidtutorials/java/data/repository/MainRepository.java @@ -13,7 +13,7 @@ public interface MainRepository { void markStartupScreenShown(); - void applyLanguageSettings(); + boolean applyLanguageSettings(); AppUpdateManager getAppUpdateManager(); } diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/domain/main/ApplyLanguageSettingsUseCase.java b/app/src/main/java/com/d4rk/androidtutorials/java/domain/main/ApplyLanguageSettingsUseCase.java index ee9a3e57..4850f157 100644 --- a/app/src/main/java/com/d4rk/androidtutorials/java/domain/main/ApplyLanguageSettingsUseCase.java +++ b/app/src/main/java/com/d4rk/androidtutorials/java/domain/main/ApplyLanguageSettingsUseCase.java @@ -12,7 +12,7 @@ public ApplyLanguageSettingsUseCase(MainRepository repository) { this.repository = repository; } - public void invoke() { - repository.applyLanguageSettings(); + public boolean invoke() { + return repository.applyLanguageSettings(); } } diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/main/MainUiState.java b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/main/MainUiState.java index 0b4a6b2b..594b224d 100644 --- a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/main/MainUiState.java +++ b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/main/MainUiState.java @@ -4,8 +4,8 @@ /** * UI state for {@link MainActivity}. Holds values related to the main screen such as - * bottom navigation visibility, the default navigation destination, and whether the theme - * has changed requiring a recreation of the activity. + * bottom navigation visibility, the default navigation destination, and whether the configuration + * has changed (e.g., theme or language) requiring a recreation of the activity. */ public record MainUiState(@NavigationBarView.LabelVisibility int bottomNavVisibility, int defaultNavDestination, boolean themeChanged) { diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/main/MainViewModel.java b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/main/MainViewModel.java index 9a14bf8f..9114a853 100644 --- a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/main/MainViewModel.java +++ b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/main/MainViewModel.java @@ -91,8 +91,10 @@ public void applySettings(String[] themeValues, startFragmentId = R.id.navigation_home; } - uiState.setValue(new MainUiState(visibilityMode, startFragmentId, changedTheme)); - applyLanguageSettingsUseCase.invoke(); + boolean changedLanguage = applyLanguageSettingsUseCase.invoke(); + boolean requiresRecreation = changedTheme || changedLanguage; + + uiState.setValue(new MainUiState(visibilityMode, startFragmentId, requiresRecreation)); isLoading.setValue(false); }