Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
28 changes: 23 additions & 5 deletions app/src/main/java/com/d4rk/androidtutorials/java/di/AppModule.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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();
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
supportActionBar.setDisplayHomeAsUpEnabled(true);
}

SharedPreferences prefs = settingsViewModel.getSharedPreferences();
prefs.registerOnSharedPreferenceChangeListener(this);
settingsViewModel.registerPreferenceChangeListener(this);
}

@Override
Expand All @@ -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;
Expand All @@ -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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
}

Expand All @@ -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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
}