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 findPreference("custom_theme_color_match").setVisible(custom);
53
54 findPreference("custom_theme_primary").setVisible(custom && !dark);
55 findPreference("custom_theme_primary_dark").setVisible(custom && !dark);
56 findPreference("custom_theme_accent").setVisible(custom && !dark);
57 findPreference("custom_theme_background_primary").setVisible(custom && !dark);
58
59 findPreference("custom_dark_theme_primary").setVisible(custom && dark);
60 findPreference("custom_dark_theme_primary_dark").setVisible(custom && dark);
61 findPreference("custom_dark_theme_accent").setVisible(custom && dark);
62 findPreference("custom_dark_theme_background_primary").setVisible(custom && dark);
63
64 findPreference("dynamic_colors").setVisible(DynamicColors.isDynamicColorAvailable() && !custom);
65 }
66
67 @Override
68 protected void onSharedPreferenceChanged(@NonNull String key) {
69 super.onSharedPreferenceChanged(key);
70 if (key.equals(AppSettings.ALLOW_SCREENSHOTS)) {
71 SettingsUtils.applyScreenshotSetting(requireActivity());
72 }
73
74 if (
75 key.equals("custom_theme_automatic") ||
76 key.equals("custom_theme_dark") ||
77 key.equals("custom_theme_color_match") ||
78 key.equals("custom_theme_primary") ||
79 key.equals("custom_theme_primary_dark") ||
80 key.equals("custom_theme_accent") ||
81 key.equals("custom_theme_background_primary") ||
82 key.equals("custom_dark_theme_primary") ||
83 key.equals("custom_dark_theme_primary_dark") ||
84 key.equals("custom_dark_theme_accent") ||
85 key.equals("custom_dark_theme_background_primary"))
86 {
87 ThemeHelper.applyCustomColors(requireService());
88 new Thread(() -> runOnUiThread(() -> requireActivity().recreate())).start();
89 }
90 }
91
92 @Override
93 public void onStart() {
94 super.onStart();
95 requireActivity().setTitle(R.string.pref_title_interface);
96 }
97
98 public SettingsActivity requireSettingsActivity() {
99 final var activity = requireActivity();
100 if (activity instanceof SettingsActivity settingsActivity) {
101 return settingsActivity;
102 }
103 throw new IllegalStateException(
104 String.format(
105 "%s is not %s",
106 activity.getClass().getName(), SettingsActivity.class.getName()));
107 }
108}