1package eu.siacs.conversations.ui.fragment.settings;
2
3import android.os.Bundle;
4import android.os.Build;
5
6import androidx.annotation.NonNull;
7import androidx.annotation.Nullable;
8
9import com.google.android.material.color.DynamicColors;
10
11import eu.siacs.conversations.AppSettings;
12import eu.siacs.conversations.Conversations;
13import eu.siacs.conversations.R;
14import eu.siacs.conversations.ui.activity.SettingsActivity;
15import eu.siacs.conversations.ui.util.SettingsUtils;
16import eu.siacs.conversations.utils.ThemeHelper;
17
18public class InterfaceSettingsFragment extends XmppPreferenceFragment {
19
20 @Override
21 public void onCreatePreferences(@Nullable Bundle savedInstanceState, @Nullable String rootKey) {
22 setPreferencesFromResource(R.xml.preferences_interface, rootKey);
23 final var themePreference = findPreference("theme");
24 final var dynamicColors = findPreference("dynamic_colors");
25 if (themePreference == null || dynamicColors == null) {
26 throw new IllegalStateException(
27 "The preference resource file did not contain theme or color preferences");
28 }
29 themePreference.setOnPreferenceChangeListener(
30 (preference, newValue) -> {
31 if (newValue instanceof final String theme) {
32 requireSettingsActivity().recreate();
33 }
34 updateCustomVisibility("custom".equals(newValue));
35 return true;
36 });
37 updateCustomVisibility("Custom".equals(themePreference.getSummary()));
38 dynamicColors.setOnPreferenceChangeListener(
39 (preference, newValue) -> {
40 requireSettingsActivity().setDynamicColors(Boolean.TRUE.equals(newValue));
41 return true;
42 });
43 }
44
45 protected void updateCustomVisibility(boolean custom) {
46 custom = custom && (Build.VERSION.SDK_INT >= 30);
47
48 final var dark = requireSettingsActivity().isDark();
49 final var sharedPreferences = getPreferenceManager().getSharedPreferences();
50 findPreference("custom_theme_automatic").setVisible(custom);
51 findPreference("custom_theme_dark").setVisible(custom && !sharedPreferences.getBoolean("custom_theme_automatic", true));
52
53 findPreference("custom_theme_primary").setVisible(custom && !dark);
54 findPreference("custom_theme_primary_dark").setVisible(custom && !dark);
55 findPreference("custom_theme_accent").setVisible(custom && !dark);
56 findPreference("custom_theme_background_primary").setVisible(custom && !dark);
57
58 findPreference("custom_dark_theme_primary").setVisible(custom && dark);
59 findPreference("custom_dark_theme_primary_dark").setVisible(custom && dark);
60 findPreference("custom_dark_theme_accent").setVisible(custom && dark);
61 findPreference("custom_dark_theme_background_primary").setVisible(custom && dark);
62
63 findPreference("dynamic_colors").setVisible(DynamicColors.isDynamicColorAvailable() && !custom);
64 }
65
66 @Override
67 protected void onSharedPreferenceChanged(@NonNull String key) {
68 super.onSharedPreferenceChanged(key);
69 if (key.equals(AppSettings.ALLOW_SCREENSHOTS)) {
70 SettingsUtils.applyScreenshotSetting(requireActivity());
71 }
72
73 if (
74 key.equals("custom_theme_automatic") ||
75 key.equals("custom_theme_dark") ||
76 key.equals("custom_theme_primary") ||
77 key.equals("custom_theme_primary_dark") ||
78 key.equals("custom_theme_accent") ||
79 key.equals("custom_theme_background_primary") ||
80 key.equals("custom_dark_theme_primary") ||
81 key.equals("custom_dark_theme_primary_dark") ||
82 key.equals("custom_dark_theme_accent") ||
83 key.equals("custom_dark_theme_background_primary"))
84 {
85 ThemeHelper.applyCustomColors(requireService());
86 new Thread(() -> runOnUiThread(() -> requireActivity().recreate())).start();
87 }
88 }
89
90 @Override
91 public void onStart() {
92 super.onStart();
93 requireActivity().setTitle(R.string.pref_title_interface);
94 }
95
96 public SettingsActivity requireSettingsActivity() {
97 final var activity = requireActivity();
98 if (activity instanceof SettingsActivity settingsActivity) {
99 return settingsActivity;
100 }
101 throw new IllegalStateException(
102 String.format(
103 "%s is not %s",
104 activity.getClass().getName(), SettingsActivity.class.getName()));
105 }
106}