Skip to content

Commit e3c3d01

Browse files
Merge pull request #66 from MihaiCristianCondrea/codex/refactor-shared-preferences-access-methods
Refactor settings SharedPreferences access
2 parents 96351f6 + a21eb75 commit e3c3d01

File tree

10 files changed

+159
-40
lines changed

10 files changed

+159
-40
lines changed

app/src/main/java/com/d4rk/androidtutorials/java/data/repository/SettingsRepository.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,10 @@ public interface SettingsRepository {
66
void handlePreferenceChange(String key);
77
boolean applyTheme();
88
void applyConsent();
9-
SharedPreferences getSharedPreferences();
9+
10+
void registerPreferenceChangeListener(SharedPreferences.OnSharedPreferenceChangeListener listener);
11+
void unregisterPreferenceChangeListener(SharedPreferences.OnSharedPreferenceChangeListener listener);
12+
13+
String getDarkMode();
14+
void setConsentAccepted(boolean accepted);
1015
}

app/src/main/java/com/d4rk/androidtutorials/java/di/AppModule.java

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,10 @@
3636
import com.d4rk.androidtutorials.java.domain.main.ShouldShowStartupScreenUseCase;
3737
import com.d4rk.androidtutorials.java.domain.quiz.LoadQuizQuestionsUseCase;
3838
import com.d4rk.androidtutorials.java.domain.settings.ApplyConsentUseCase;
39-
import com.d4rk.androidtutorials.java.domain.settings.GetSharedPreferencesUseCase;
39+
import com.d4rk.androidtutorials.java.domain.settings.GetDarkModeUseCase;
40+
import com.d4rk.androidtutorials.java.domain.settings.RegisterPreferenceChangeListenerUseCase;
41+
import com.d4rk.androidtutorials.java.domain.settings.UnregisterPreferenceChangeListenerUseCase;
42+
import com.d4rk.androidtutorials.java.domain.settings.SetConsentAcceptedUseCase;
4043
import com.d4rk.androidtutorials.java.domain.settings.OnPreferenceChangedUseCase;
4144
import com.d4rk.androidtutorials.java.domain.startup.LoadConsentFormUseCase;
4245
import com.d4rk.androidtutorials.java.domain.startup.RequestConsentInfoUseCase;
@@ -183,13 +186,28 @@ public OnPreferenceChangedUseCase provideOnPreferenceChangedUseCase(SettingsRepo
183186
}
184187

185188
@Provides
186-
public GetSharedPreferencesUseCase provideGetSharedPreferencesUseCase(SettingsRepository repository) {
187-
return new GetSharedPreferencesUseCase(repository);
189+
public ApplyConsentUseCase provideApplyConsentUseCase(SettingsRepository repository) {
190+
return new ApplyConsentUseCase(repository);
188191
}
189192

190193
@Provides
191-
public ApplyConsentUseCase provideApplyConsentUseCase(SettingsRepository repository) {
192-
return new ApplyConsentUseCase(repository);
194+
public RegisterPreferenceChangeListenerUseCase provideRegisterPreferenceChangeListenerUseCase(SettingsRepository repository) {
195+
return new RegisterPreferenceChangeListenerUseCase(repository);
196+
}
197+
198+
@Provides
199+
public UnregisterPreferenceChangeListenerUseCase provideUnregisterPreferenceChangeListenerUseCase(SettingsRepository repository) {
200+
return new UnregisterPreferenceChangeListenerUseCase(repository);
201+
}
202+
203+
@Provides
204+
public GetDarkModeUseCase provideGetDarkModeUseCase(SettingsRepository repository) {
205+
return new GetDarkModeUseCase(repository);
206+
}
207+
208+
@Provides
209+
public SetConsentAcceptedUseCase provideSetConsentAcceptedUseCase(SettingsRepository repository) {
210+
return new SetConsentAcceptedUseCase(repository);
193211
}
194212

195213
@Provides
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.d4rk.androidtutorials.java.domain.settings;
2+
3+
import com.d4rk.androidtutorials.java.data.repository.SettingsRepository;
4+
5+
/** Returns the stored dark mode preference value. */
6+
public class GetDarkModeUseCase {
7+
private final SettingsRepository repository;
8+
9+
public GetDarkModeUseCase(SettingsRepository repository) {
10+
this.repository = repository;
11+
}
12+
13+
public String invoke() {
14+
return repository.getDarkMode();
15+
}
16+
}

app/src/main/java/com/d4rk/androidtutorials/java/domain/settings/GetSharedPreferencesUseCase.java

Lines changed: 0 additions & 17 deletions
This file was deleted.
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.d4rk.androidtutorials.java.domain.settings;
2+
3+
import android.content.SharedPreferences;
4+
import com.d4rk.androidtutorials.java.data.repository.SettingsRepository;
5+
6+
/** Registers a listener for preference changes. */
7+
public class RegisterPreferenceChangeListenerUseCase {
8+
private final SettingsRepository repository;
9+
10+
public RegisterPreferenceChangeListenerUseCase(SettingsRepository repository) {
11+
this.repository = repository;
12+
}
13+
14+
public void invoke(SharedPreferences.OnSharedPreferenceChangeListener listener) {
15+
repository.registerPreferenceChangeListener(listener);
16+
}
17+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.d4rk.androidtutorials.java.domain.settings;
2+
3+
import com.d4rk.androidtutorials.java.data.repository.SettingsRepository;
4+
5+
/** Writes whether the user has accepted analytics consent. */
6+
public class SetConsentAcceptedUseCase {
7+
private final SettingsRepository repository;
8+
9+
public SetConsentAcceptedUseCase(SettingsRepository repository) {
10+
this.repository = repository;
11+
}
12+
13+
public void invoke(boolean accepted) {
14+
repository.setConsentAccepted(accepted);
15+
}
16+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.d4rk.androidtutorials.java.domain.settings;
2+
3+
import android.content.SharedPreferences;
4+
import com.d4rk.androidtutorials.java.data.repository.SettingsRepository;
5+
6+
/** Unregisters a listener for preference changes. */
7+
public class UnregisterPreferenceChangeListenerUseCase {
8+
private final SettingsRepository repository;
9+
10+
public UnregisterPreferenceChangeListenerUseCase(SettingsRepository repository) {
11+
this.repository = repository;
12+
}
13+
14+
public void invoke(SharedPreferences.OnSharedPreferenceChangeListener listener) {
15+
repository.unregisterPreferenceChangeListener(listener);
16+
}
17+
}

app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/settings/SettingsActivity.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
4646
supportActionBar.setDisplayHomeAsUpEnabled(true);
4747
}
4848

49-
SharedPreferences prefs = settingsViewModel.getSharedPreferences();
50-
prefs.registerOnSharedPreferenceChangeListener(this);
49+
settingsViewModel.registerPreferenceChangeListener(this);
5150
}
5251

5352
@Override
@@ -64,9 +63,14 @@ public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, Strin
6463
@Override
6564
public CharSequence provideSummary(ListPreference preference) {
6665
String key = preference.getKey();
67-
if (key != null) {
68-
if (key.equals(getString(R.string.dark_mode))) {
69-
return preference.getEntry();
66+
if (key != null && key.equals(getString(R.string.dark_mode))) {
67+
String value = settingsViewModel.getDarkMode();
68+
int index = preference.findIndexOfValue(value);
69+
if (index >= 0) {
70+
CharSequence[] entries = preference.getEntries();
71+
if (entries != null && index < entries.length) {
72+
return entries[index];
73+
}
7074
}
7175
}
7276
return null;
@@ -75,7 +79,6 @@ public CharSequence provideSummary(ListPreference preference) {
7579
@Override
7680
protected void onDestroy() {
7781
super.onDestroy();
78-
SharedPreferences prefs = settingsViewModel.getSharedPreferences();
79-
prefs.unregisterOnSharedPreferenceChangeListener(this);
82+
settingsViewModel.unregisterPreferenceChangeListener(this);
8083
}
8184
}

app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/settings/SettingsViewModel.java

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@
55
import androidx.lifecycle.ViewModel;
66

77
import com.d4rk.androidtutorials.java.domain.settings.OnPreferenceChangedUseCase;
8-
import com.d4rk.androidtutorials.java.domain.settings.GetSharedPreferencesUseCase;
8+
import com.d4rk.androidtutorials.java.domain.settings.RegisterPreferenceChangeListenerUseCase;
9+
import com.d4rk.androidtutorials.java.domain.settings.UnregisterPreferenceChangeListenerUseCase;
10+
import com.d4rk.androidtutorials.java.domain.settings.GetDarkModeUseCase;
11+
import com.d4rk.androidtutorials.java.domain.settings.SetConsentAcceptedUseCase;
912
import com.d4rk.androidtutorials.java.domain.settings.ApplyConsentUseCase;
1013

1114
import dagger.hilt.android.lifecycle.HiltViewModel;
@@ -20,15 +23,24 @@
2023
public class SettingsViewModel extends ViewModel {
2124

2225
private final OnPreferenceChangedUseCase onPreferenceChangedUseCase;
23-
private final GetSharedPreferencesUseCase getSharedPreferencesUseCase;
26+
private final RegisterPreferenceChangeListenerUseCase registerPreferenceChangeListenerUseCase;
27+
private final UnregisterPreferenceChangeListenerUseCase unregisterPreferenceChangeListenerUseCase;
28+
private final GetDarkModeUseCase getDarkModeUseCase;
29+
private final SetConsentAcceptedUseCase setConsentAcceptedUseCase;
2430
private final ApplyConsentUseCase applyConsentUseCase;
2531

2632
@Inject
2733
public SettingsViewModel(OnPreferenceChangedUseCase onPreferenceChangedUseCase,
28-
GetSharedPreferencesUseCase getSharedPreferencesUseCase,
34+
RegisterPreferenceChangeListenerUseCase registerPreferenceChangeListenerUseCase,
35+
UnregisterPreferenceChangeListenerUseCase unregisterPreferenceChangeListenerUseCase,
36+
GetDarkModeUseCase getDarkModeUseCase,
37+
SetConsentAcceptedUseCase setConsentAcceptedUseCase,
2938
ApplyConsentUseCase applyConsentUseCase) {
3039
this.onPreferenceChangedUseCase = onPreferenceChangedUseCase;
31-
this.getSharedPreferencesUseCase = getSharedPreferencesUseCase;
40+
this.registerPreferenceChangeListenerUseCase = registerPreferenceChangeListenerUseCase;
41+
this.unregisterPreferenceChangeListenerUseCase = unregisterPreferenceChangeListenerUseCase;
42+
this.getDarkModeUseCase = getDarkModeUseCase;
43+
this.setConsentAcceptedUseCase = setConsentAcceptedUseCase;
3244
this.applyConsentUseCase = applyConsentUseCase;
3345
}
3446

@@ -41,11 +53,23 @@ public boolean onPreferenceChanged(String key) {
4153
return onPreferenceChangedUseCase.invoke(key);
4254
}
4355

44-
public SharedPreferences getSharedPreferences() {
45-
return getSharedPreferencesUseCase.invoke();
46-
}
47-
4856
public void applyConsent() {
4957
applyConsentUseCase.invoke();
5058
}
59+
60+
public void registerPreferenceChangeListener(SharedPreferences.OnSharedPreferenceChangeListener listener) {
61+
registerPreferenceChangeListenerUseCase.invoke(listener);
62+
}
63+
64+
public void unregisterPreferenceChangeListener(SharedPreferences.OnSharedPreferenceChangeListener listener) {
65+
unregisterPreferenceChangeListenerUseCase.invoke(listener);
66+
}
67+
68+
public String getDarkMode() {
69+
return getDarkModeUseCase.invoke();
70+
}
71+
72+
public void setConsentAccepted(boolean accepted) {
73+
setConsentAcceptedUseCase.invoke(accepted);
74+
}
5175
}

app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/settings/repository/SettingsRepository.java

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,27 @@ public void applyConsent() {
112112
FirebaseAnalytics.getInstance(context).setConsent(map);
113113
}
114114

115-
public SharedPreferences getSharedPreferences() {
116-
return sharedPreferences;
115+
@Override
116+
public void registerPreferenceChangeListener(SharedPreferences.OnSharedPreferenceChangeListener listener) {
117+
sharedPreferences.registerOnSharedPreferenceChangeListener(listener);
118+
}
119+
120+
@Override
121+
public void unregisterPreferenceChangeListener(SharedPreferences.OnSharedPreferenceChangeListener listener) {
122+
sharedPreferences.unregisterOnSharedPreferenceChangeListener(listener);
123+
}
124+
125+
@Override
126+
public String getDarkMode() {
127+
String preferenceKey = context.getString(R.string.key_theme);
128+
String defaultThemeValue = context.getString(R.string.default_value_theme);
129+
return sharedPreferences.getString(preferenceKey, defaultThemeValue);
130+
}
131+
132+
@Override
133+
public void setConsentAccepted(boolean accepted) {
134+
sharedPreferences.edit()
135+
.putBoolean(context.getString(R.string.key_consent_analytics), accepted)
136+
.apply();
117137
}
118138
}

0 commit comments

Comments
 (0)