Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/stefan-niedermann/nextcloud-deck.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Niedermann <info@niedermann.it>2023-03-01 14:43:53 +0300
committerStefan Niedermann <info@niedermann.it>2023-03-09 11:53:19 +0300
commit3ea462ca9e2ae18ba9d869125da8d8d07f2c7854 (patch)
tree30257c67768325d5972ec499a6eb41e11017ac6d /app/src/main/java/it/niedermann/nextcloud/deck/ui/settings
parentbfab286b0bc6dbfac1211eec64d74b66b2ce1e6d (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')
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/settings/PreferencesViewModel.java39
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/settings/SettingsActivity.java36
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/settings/SettingsFragment.java30
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)));
}
}