diff options
author | Stefan Niedermann <info@niedermann.it> | 2023-03-01 14:43:53 +0300 |
---|---|---|
committer | Stefan Niedermann <info@niedermann.it> | 2023-03-09 11:53:19 +0300 |
commit | 3ea462ca9e2ae18ba9d869125da8d8d07f2c7854 (patch) | |
tree | 30257c67768325d5972ec499a6eb41e11017ac6d /app/src/main/java/it/niedermann/nextcloud/deck/ui/settings | |
parent | bfab286b0bc6dbfac1211eec64d74b66b2ce1e6d (diff) |
refactor: Unidirectional data flow and single point of truth for current state
Signed-off-by: Stefan Niedermann <info@niedermann.it>
Diffstat (limited to 'app/src/main/java/it/niedermann/nextcloud/deck/ui/settings')
3 files changed, 82 insertions, 23 deletions
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/settings/PreferencesViewModel.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/settings/PreferencesViewModel.java new file mode 100644 index 000000000..298beebb4 --- /dev/null +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/settings/PreferencesViewModel.java @@ -0,0 +1,39 @@ +package it.niedermann.nextcloud.deck.ui.settings; + +import android.app.Application; + +import androidx.annotation.NonNull; +import androidx.lifecycle.LiveData; + +import it.niedermann.nextcloud.deck.persistence.PreferencesRepository; +import it.niedermann.nextcloud.deck.ui.viewmodel.BaseViewModel; + +public class PreferencesViewModel extends BaseViewModel { + + private final PreferencesRepository preferencesRepository; + + public PreferencesViewModel(@NonNull Application application) { + this(application, new PreferencesRepository(application)); + } + + public PreferencesViewModel(@NonNull Application application, @NonNull PreferencesRepository preferencesRepository) { + super(application); + this.preferencesRepository = preferencesRepository; + } + + public LiveData<Long> getCurrentAccountId$() { + return baseRepository.getCurrentAccountId$(); + } + + public LiveData<Integer> getAccountColor(long accountId) { + return baseRepository.getAccountColor(accountId); + } + + public void setAppTheme(int setting) { + preferencesRepository.setAppTheme(setting); + } + + public LiveData<Boolean> isDebugModeEnabled$() { + return preferencesRepository.isDebugModeEnabled$(); + } +} diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/settings/SettingsActivity.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/settings/SettingsActivity.java index 07df2ac20..172b31fd1 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/settings/SettingsActivity.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/settings/SettingsActivity.java @@ -8,12 +8,15 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; -import it.niedermann.nextcloud.deck.R; import it.niedermann.nextcloud.deck.databinding.ActivitySettingsBinding; +import it.niedermann.nextcloud.deck.model.Account; import it.niedermann.nextcloud.deck.ui.exception.ExceptionHandler; +import it.niedermann.nextcloud.deck.ui.theme.ThemeUtils; +import it.niedermann.nextcloud.deck.ui.theme.Themed; -public class SettingsActivity extends AppCompatActivity { +public class SettingsActivity extends AppCompatActivity implements Themed { + private static final String KEY_ACCOUNT = "account"; private ActivitySettingsBinding binding; @Override @@ -21,16 +24,18 @@ public class SettingsActivity extends AppCompatActivity { super.onCreate(savedInstanceState); Thread.currentThread().setUncaughtExceptionHandler(new ExceptionHandler(this)); + if (!getIntent().hasExtra(KEY_ACCOUNT)) { + throw new IllegalArgumentException(KEY_ACCOUNT + " must be provided"); + } + + final var account = (Account) getIntent().getSerializableExtra(KEY_ACCOUNT); + binding = ActivitySettingsBinding.inflate(getLayoutInflater()); - setContentView(binding.getRoot()); + applyTheme(account.getColor()); setSupportActionBar(binding.toolbar); - - setResult(RESULT_OK); - getSupportFragmentManager() - .beginTransaction() - .add(R.id.settings_layout, new SettingsFragment()) - .commit(); + setContentView(binding.getRoot()); + setResult(RESULT_CANCELED); } @Override @@ -45,8 +50,17 @@ public class SettingsActivity extends AppCompatActivity { this.binding = null; } + @Override + public void applyTheme(int color) { + final var utils = ThemeUtils.of(color, this); + +// utils.platform.themeStatusBar(this); +// utils.material.themeToolbar(binding.toolbar); + } + @NonNull - public static Intent createIntent(@NonNull Context context) { - return new Intent(context, SettingsActivity.class); + public static Intent createIntent(@NonNull Context context, @NonNull Account account) { + return new Intent(context, SettingsActivity.class) + .putExtra(KEY_ACCOUNT, account); } } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/settings/SettingsFragment.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/settings/SettingsFragment.java index cc01781e6..79a03ab71 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/settings/SettingsFragment.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/settings/SettingsFragment.java @@ -1,7 +1,5 @@ package it.niedermann.nextcloud.deck.ui.settings; -import static it.niedermann.nextcloud.deck.DeckApplication.setAppTheme; - import android.app.Activity; import android.os.Bundle; import android.view.View; @@ -9,10 +7,13 @@ import android.view.View; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.app.ActivityCompat; +import androidx.lifecycle.ViewModelProvider; import androidx.preference.Preference; import androidx.preference.PreferenceFragmentCompat; -import it.niedermann.nextcloud.deck.DeckApplication; +import java.util.stream.Stream; + +import it.niedermann.android.reactivelivedata.ReactiveLiveData; import it.niedermann.nextcloud.deck.DeckLog; import it.niedermann.nextcloud.deck.R; import it.niedermann.nextcloud.deck.persistence.sync.SyncWorker; @@ -20,6 +21,7 @@ import it.niedermann.nextcloud.deck.ui.theme.ThemedSwitchPreference; public class SettingsFragment extends PreferenceFragmentCompat { + private PreferencesViewModel preferencesViewModel; private ThemedSwitchPreference wifiOnlyPref; private ThemedSwitchPreference compactPref; private ThemedSwitchPreference coverImagesPref; @@ -31,6 +33,8 @@ public class SettingsFragment extends PreferenceFragmentCompat { public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { setPreferencesFromResource(R.xml.settings, rootKey); + preferencesViewModel = new ViewModelProvider(requireActivity()).get(PreferencesViewModel.class); + wifiOnlyPref = findPreference(getString(R.string.pref_key_wifi_only)); coverImagesPref = findPreference(getString(R.string.pref_key_cover_images)); compactPref = findPreference(getString(R.string.pref_key_compact)); @@ -61,7 +65,7 @@ public class SettingsFragment extends PreferenceFragmentCompat { final var themePref = findPreference(getString(R.string.pref_key_dark_theme)); if (themePref != null) { themePref.setOnPreferenceChangeListener((Preference preference, Object newValue) -> { - setAppTheme(Integer.parseInt((String) newValue)); + preferencesViewModel.setAppTheme(Integer.parseInt((String) newValue)); requireActivity().setResult(Activity.RESULT_OK); ActivityCompat.recreate(requireActivity()); return true; @@ -75,13 +79,15 @@ public class SettingsFragment extends PreferenceFragmentCompat { public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - DeckApplication.readCurrentAccountColor().observe(getViewLifecycleOwner(), (mainColor) -> { - wifiOnlyPref.applyTheme(mainColor); - compactPref.applyTheme(mainColor); - coverImagesPref.applyTheme(mainColor); - compressImageAttachmentsPref.applyTheme(mainColor); - debuggingPref.applyTheme(mainColor); - eTagPref.applyTheme(mainColor); - }); + new ReactiveLiveData<>(preferencesViewModel.getCurrentAccountId$()) + .flatMap(preferencesViewModel::getAccountColor) + .observe(getViewLifecycleOwner(), color -> Stream.of( + wifiOnlyPref, + compactPref, + coverImagesPref, + compressImageAttachmentsPref, + debuggingPref, + eTagPref) + .forEach(pref -> pref.applyTheme(color))); } } |