From a21eb75676a1dbf4751764745d8df7db2b0c9ab0 Mon Sep 17 00:00:00 2001 From: Mihai-Cristian Condrea Date: Sun, 31 Aug 2025 15:33:40 +0300 Subject: [PATCH] add settings pref use cases --- .../data/repository/SettingsRepository.java | 7 +++- .../androidtutorials/java/di/AppModule.java | 28 ++++++++++--- .../domain/settings/GetDarkModeUseCase.java | 16 ++++++++ .../settings/GetSharedPreferencesUseCase.java | 17 -------- ...gisterPreferenceChangeListenerUseCase.java | 17 ++++++++ .../settings/SetConsentAcceptedUseCase.java | 16 ++++++++ ...gisterPreferenceChangeListenerUseCase.java | 17 ++++++++ .../ui/screens/settings/SettingsActivity.java | 17 ++++---- .../screens/settings/SettingsViewModel.java | 40 +++++++++++++++---- .../repository/SettingsRepository.java | 24 ++++++++++- 10 files changed, 159 insertions(+), 40 deletions(-) create mode 100644 app/src/main/java/com/d4rk/androidtutorials/java/domain/settings/GetDarkModeUseCase.java delete mode 100644 app/src/main/java/com/d4rk/androidtutorials/java/domain/settings/GetSharedPreferencesUseCase.java create mode 100644 app/src/main/java/com/d4rk/androidtutorials/java/domain/settings/RegisterPreferenceChangeListenerUseCase.java create mode 100644 app/src/main/java/com/d4rk/androidtutorials/java/domain/settings/SetConsentAcceptedUseCase.java create mode 100644 app/src/main/java/com/d4rk/androidtutorials/java/domain/settings/UnregisterPreferenceChangeListenerUseCase.java diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/data/repository/SettingsRepository.java b/app/src/main/java/com/d4rk/androidtutorials/java/data/repository/SettingsRepository.java index 7ad0a23e..5a8a8b5a 100644 --- a/app/src/main/java/com/d4rk/androidtutorials/java/data/repository/SettingsRepository.java +++ b/app/src/main/java/com/d4rk/androidtutorials/java/data/repository/SettingsRepository.java @@ -6,5 +6,10 @@ public interface SettingsRepository { void handlePreferenceChange(String key); boolean applyTheme(); void applyConsent(); - SharedPreferences getSharedPreferences(); + + void registerPreferenceChangeListener(SharedPreferences.OnSharedPreferenceChangeListener listener); + void unregisterPreferenceChangeListener(SharedPreferences.OnSharedPreferenceChangeListener listener); + + String getDarkMode(); + void setConsentAccepted(boolean accepted); } diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/di/AppModule.java b/app/src/main/java/com/d4rk/androidtutorials/java/di/AppModule.java index 099e6521..1b1988f1 100644 --- a/app/src/main/java/com/d4rk/androidtutorials/java/di/AppModule.java +++ b/app/src/main/java/com/d4rk/androidtutorials/java/di/AppModule.java @@ -36,7 +36,10 @@ import com.d4rk.androidtutorials.java.domain.main.ShouldShowStartupScreenUseCase; import com.d4rk.androidtutorials.java.domain.quiz.LoadQuizQuestionsUseCase; import com.d4rk.androidtutorials.java.domain.settings.ApplyConsentUseCase; -import com.d4rk.androidtutorials.java.domain.settings.GetSharedPreferencesUseCase; +import com.d4rk.androidtutorials.java.domain.settings.GetDarkModeUseCase; +import com.d4rk.androidtutorials.java.domain.settings.RegisterPreferenceChangeListenerUseCase; +import com.d4rk.androidtutorials.java.domain.settings.UnregisterPreferenceChangeListenerUseCase; +import com.d4rk.androidtutorials.java.domain.settings.SetConsentAcceptedUseCase; import com.d4rk.androidtutorials.java.domain.settings.OnPreferenceChangedUseCase; import com.d4rk.androidtutorials.java.domain.startup.LoadConsentFormUseCase; import com.d4rk.androidtutorials.java.domain.startup.RequestConsentInfoUseCase; @@ -183,13 +186,28 @@ public OnPreferenceChangedUseCase provideOnPreferenceChangedUseCase(SettingsRepo } @Provides - public GetSharedPreferencesUseCase provideGetSharedPreferencesUseCase(SettingsRepository repository) { - return new GetSharedPreferencesUseCase(repository); + public ApplyConsentUseCase provideApplyConsentUseCase(SettingsRepository repository) { + return new ApplyConsentUseCase(repository); } @Provides - public ApplyConsentUseCase provideApplyConsentUseCase(SettingsRepository repository) { - return new ApplyConsentUseCase(repository); + public RegisterPreferenceChangeListenerUseCase provideRegisterPreferenceChangeListenerUseCase(SettingsRepository repository) { + return new RegisterPreferenceChangeListenerUseCase(repository); + } + + @Provides + public UnregisterPreferenceChangeListenerUseCase provideUnregisterPreferenceChangeListenerUseCase(SettingsRepository repository) { + return new UnregisterPreferenceChangeListenerUseCase(repository); + } + + @Provides + public GetDarkModeUseCase provideGetDarkModeUseCase(SettingsRepository repository) { + return new GetDarkModeUseCase(repository); + } + + @Provides + public SetConsentAcceptedUseCase provideSetConsentAcceptedUseCase(SettingsRepository repository) { + return new SetConsentAcceptedUseCase(repository); } @Provides diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/domain/settings/GetDarkModeUseCase.java b/app/src/main/java/com/d4rk/androidtutorials/java/domain/settings/GetDarkModeUseCase.java new file mode 100644 index 00000000..10d5f3e5 --- /dev/null +++ b/app/src/main/java/com/d4rk/androidtutorials/java/domain/settings/GetDarkModeUseCase.java @@ -0,0 +1,16 @@ +package com.d4rk.androidtutorials.java.domain.settings; + +import com.d4rk.androidtutorials.java.data.repository.SettingsRepository; + +/** Returns the stored dark mode preference value. */ +public class GetDarkModeUseCase { + private final SettingsRepository repository; + + public GetDarkModeUseCase(SettingsRepository repository) { + this.repository = repository; + } + + public String invoke() { + return repository.getDarkMode(); + } +} diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/domain/settings/GetSharedPreferencesUseCase.java b/app/src/main/java/com/d4rk/androidtutorials/java/domain/settings/GetSharedPreferencesUseCase.java deleted file mode 100644 index 2d363eba..00000000 --- a/app/src/main/java/com/d4rk/androidtutorials/java/domain/settings/GetSharedPreferencesUseCase.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.d4rk.androidtutorials.java.domain.settings; - -import android.content.SharedPreferences; -import com.d4rk.androidtutorials.java.data.repository.SettingsRepository; - -/** Provides shared preferences used by the settings screen. */ -public class GetSharedPreferencesUseCase { - private final SettingsRepository repository; - - public GetSharedPreferencesUseCase(SettingsRepository repository) { - this.repository = repository; - } - - public SharedPreferences invoke() { - return repository.getSharedPreferences(); - } -} diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/domain/settings/RegisterPreferenceChangeListenerUseCase.java b/app/src/main/java/com/d4rk/androidtutorials/java/domain/settings/RegisterPreferenceChangeListenerUseCase.java new file mode 100644 index 00000000..d2d8bd30 --- /dev/null +++ b/app/src/main/java/com/d4rk/androidtutorials/java/domain/settings/RegisterPreferenceChangeListenerUseCase.java @@ -0,0 +1,17 @@ +package com.d4rk.androidtutorials.java.domain.settings; + +import android.content.SharedPreferences; +import com.d4rk.androidtutorials.java.data.repository.SettingsRepository; + +/** Registers a listener for preference changes. */ +public class RegisterPreferenceChangeListenerUseCase { + private final SettingsRepository repository; + + public RegisterPreferenceChangeListenerUseCase(SettingsRepository repository) { + this.repository = repository; + } + + public void invoke(SharedPreferences.OnSharedPreferenceChangeListener listener) { + repository.registerPreferenceChangeListener(listener); + } +} diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/domain/settings/SetConsentAcceptedUseCase.java b/app/src/main/java/com/d4rk/androidtutorials/java/domain/settings/SetConsentAcceptedUseCase.java new file mode 100644 index 00000000..e0d39597 --- /dev/null +++ b/app/src/main/java/com/d4rk/androidtutorials/java/domain/settings/SetConsentAcceptedUseCase.java @@ -0,0 +1,16 @@ +package com.d4rk.androidtutorials.java.domain.settings; + +import com.d4rk.androidtutorials.java.data.repository.SettingsRepository; + +/** Writes whether the user has accepted analytics consent. */ +public class SetConsentAcceptedUseCase { + private final SettingsRepository repository; + + public SetConsentAcceptedUseCase(SettingsRepository repository) { + this.repository = repository; + } + + public void invoke(boolean accepted) { + repository.setConsentAccepted(accepted); + } +} diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/domain/settings/UnregisterPreferenceChangeListenerUseCase.java b/app/src/main/java/com/d4rk/androidtutorials/java/domain/settings/UnregisterPreferenceChangeListenerUseCase.java new file mode 100644 index 00000000..10fe4b35 --- /dev/null +++ b/app/src/main/java/com/d4rk/androidtutorials/java/domain/settings/UnregisterPreferenceChangeListenerUseCase.java @@ -0,0 +1,17 @@ +package com.d4rk.androidtutorials.java.domain.settings; + +import android.content.SharedPreferences; +import com.d4rk.androidtutorials.java.data.repository.SettingsRepository; + +/** Unregisters a listener for preference changes. */ +public class UnregisterPreferenceChangeListenerUseCase { + private final SettingsRepository repository; + + public UnregisterPreferenceChangeListenerUseCase(SettingsRepository repository) { + this.repository = repository; + } + + public void invoke(SharedPreferences.OnSharedPreferenceChangeListener listener) { + repository.unregisterPreferenceChangeListener(listener); + } +} diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/settings/SettingsActivity.java b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/settings/SettingsActivity.java index b19b092f..2d52301d 100644 --- a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/settings/SettingsActivity.java +++ b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/settings/SettingsActivity.java @@ -46,8 +46,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { supportActionBar.setDisplayHomeAsUpEnabled(true); } - SharedPreferences prefs = settingsViewModel.getSharedPreferences(); - prefs.registerOnSharedPreferenceChangeListener(this); + settingsViewModel.registerPreferenceChangeListener(this); } @Override @@ -64,9 +63,14 @@ public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, Strin @Override public CharSequence provideSummary(ListPreference preference) { String key = preference.getKey(); - if (key != null) { - if (key.equals(getString(R.string.dark_mode))) { - return preference.getEntry(); + if (key != null && key.equals(getString(R.string.dark_mode))) { + String value = settingsViewModel.getDarkMode(); + int index = preference.findIndexOfValue(value); + if (index >= 0) { + CharSequence[] entries = preference.getEntries(); + if (entries != null && index < entries.length) { + return entries[index]; + } } } return null; @@ -75,7 +79,6 @@ public CharSequence provideSummary(ListPreference preference) { @Override protected void onDestroy() { super.onDestroy(); - SharedPreferences prefs = settingsViewModel.getSharedPreferences(); - prefs.unregisterOnSharedPreferenceChangeListener(this); + settingsViewModel.unregisterPreferenceChangeListener(this); } } \ No newline at end of file diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/settings/SettingsViewModel.java b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/settings/SettingsViewModel.java index 42ca6f44..eb56cad7 100644 --- a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/settings/SettingsViewModel.java +++ b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/settings/SettingsViewModel.java @@ -5,7 +5,10 @@ import androidx.lifecycle.ViewModel; import com.d4rk.androidtutorials.java.domain.settings.OnPreferenceChangedUseCase; -import com.d4rk.androidtutorials.java.domain.settings.GetSharedPreferencesUseCase; +import com.d4rk.androidtutorials.java.domain.settings.RegisterPreferenceChangeListenerUseCase; +import com.d4rk.androidtutorials.java.domain.settings.UnregisterPreferenceChangeListenerUseCase; +import com.d4rk.androidtutorials.java.domain.settings.GetDarkModeUseCase; +import com.d4rk.androidtutorials.java.domain.settings.SetConsentAcceptedUseCase; import com.d4rk.androidtutorials.java.domain.settings.ApplyConsentUseCase; import dagger.hilt.android.lifecycle.HiltViewModel; @@ -20,15 +23,24 @@ public class SettingsViewModel extends ViewModel { private final OnPreferenceChangedUseCase onPreferenceChangedUseCase; - private final GetSharedPreferencesUseCase getSharedPreferencesUseCase; + private final RegisterPreferenceChangeListenerUseCase registerPreferenceChangeListenerUseCase; + private final UnregisterPreferenceChangeListenerUseCase unregisterPreferenceChangeListenerUseCase; + private final GetDarkModeUseCase getDarkModeUseCase; + private final SetConsentAcceptedUseCase setConsentAcceptedUseCase; private final ApplyConsentUseCase applyConsentUseCase; @Inject public SettingsViewModel(OnPreferenceChangedUseCase onPreferenceChangedUseCase, - GetSharedPreferencesUseCase getSharedPreferencesUseCase, + RegisterPreferenceChangeListenerUseCase registerPreferenceChangeListenerUseCase, + UnregisterPreferenceChangeListenerUseCase unregisterPreferenceChangeListenerUseCase, + GetDarkModeUseCase getDarkModeUseCase, + SetConsentAcceptedUseCase setConsentAcceptedUseCase, ApplyConsentUseCase applyConsentUseCase) { this.onPreferenceChangedUseCase = onPreferenceChangedUseCase; - this.getSharedPreferencesUseCase = getSharedPreferencesUseCase; + this.registerPreferenceChangeListenerUseCase = registerPreferenceChangeListenerUseCase; + this.unregisterPreferenceChangeListenerUseCase = unregisterPreferenceChangeListenerUseCase; + this.getDarkModeUseCase = getDarkModeUseCase; + this.setConsentAcceptedUseCase = setConsentAcceptedUseCase; this.applyConsentUseCase = applyConsentUseCase; } @@ -41,11 +53,23 @@ public boolean onPreferenceChanged(String key) { return onPreferenceChangedUseCase.invoke(key); } - public SharedPreferences getSharedPreferences() { - return getSharedPreferencesUseCase.invoke(); - } - public void applyConsent() { applyConsentUseCase.invoke(); } + + public void registerPreferenceChangeListener(SharedPreferences.OnSharedPreferenceChangeListener listener) { + registerPreferenceChangeListenerUseCase.invoke(listener); + } + + public void unregisterPreferenceChangeListener(SharedPreferences.OnSharedPreferenceChangeListener listener) { + unregisterPreferenceChangeListenerUseCase.invoke(listener); + } + + public String getDarkMode() { + return getDarkModeUseCase.invoke(); + } + + public void setConsentAccepted(boolean accepted) { + setConsentAcceptedUseCase.invoke(accepted); + } } \ No newline at end of file diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/settings/repository/SettingsRepository.java b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/settings/repository/SettingsRepository.java index 03301579..f4a8d5eb 100644 --- a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/settings/repository/SettingsRepository.java +++ b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/settings/repository/SettingsRepository.java @@ -112,7 +112,27 @@ public void applyConsent() { FirebaseAnalytics.getInstance(context).setConsent(map); } - public SharedPreferences getSharedPreferences() { - return sharedPreferences; + @Override + public void registerPreferenceChangeListener(SharedPreferences.OnSharedPreferenceChangeListener listener) { + sharedPreferences.registerOnSharedPreferenceChangeListener(listener); + } + + @Override + public void unregisterPreferenceChangeListener(SharedPreferences.OnSharedPreferenceChangeListener listener) { + sharedPreferences.unregisterOnSharedPreferenceChangeListener(listener); + } + + @Override + public String getDarkMode() { + String preferenceKey = context.getString(R.string.key_theme); + String defaultThemeValue = context.getString(R.string.default_value_theme); + return sharedPreferences.getString(preferenceKey, defaultThemeValue); + } + + @Override + public void setConsentAccepted(boolean accepted) { + sharedPreferences.edit() + .putBoolean(context.getString(R.string.key_consent_analytics), accepted) + .apply(); } } \ No newline at end of file