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
 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}