InterfaceSettingsFragment.java

  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}