NotificationsSettingsFragment.java

  1package eu.siacs.conversations.ui.fragment.settings;
  2
  3import android.media.RingtoneManager;
  4import android.net.Uri;
  5import android.os.Bundle;
  6import android.util.Log;
  7
  8import androidx.activity.result.ActivityResultLauncher;
  9import androidx.annotation.NonNull;
 10import androidx.annotation.Nullable;
 11import androidx.preference.Preference;
 12
 13import eu.siacs.conversations.AppSettings;
 14import eu.siacs.conversations.Config;
 15import eu.siacs.conversations.R;
 16import eu.siacs.conversations.ui.activity.result.PickRingtone;
 17import eu.siacs.conversations.utils.Compatibility;
 18
 19public class NotificationsSettingsFragment extends XmppPreferenceFragment {
 20
 21    private final ActivityResultLauncher<Uri> pickNotificationToneLauncher =
 22            registerForActivityResult(
 23                    new PickRingtone(RingtoneManager.TYPE_NOTIFICATION),
 24                    result -> {
 25                        if (result == null) {
 26                            // do nothing. user aborted
 27                            return;
 28                        }
 29                        final Uri uri = PickRingtone.noneToNull(result);
 30                        appSettings().setNotificationTone(uri);
 31                        Log.i(Config.LOGTAG, "User set notification tone to " + uri);
 32                    });
 33    private final ActivityResultLauncher<Uri> pickRingtoneLauncher =
 34            registerForActivityResult(
 35                    new PickRingtone(RingtoneManager.TYPE_RINGTONE),
 36                    result -> {
 37                        if (result == null) {
 38                            // do nothing. user aborted
 39                            return;
 40                        }
 41                        final Uri uri = PickRingtone.noneToNull(result);
 42                        appSettings().setRingtone(uri);
 43                        Log.i(Config.LOGTAG, "User set ringtone to " + uri);
 44                    });
 45
 46    @Override
 47    public void onCreatePreferences(
 48            @Nullable final Bundle savedInstanceState, final @Nullable String rootKey) {
 49        setPreferencesFromResource(R.xml.preferences_notifications, rootKey);
 50        final var messageNotificationSettings = findPreference("message_notification_settings");
 51        final var notificationRingtone = findPreference(AppSettings.NOTIFICATION_RINGTONE);
 52        final var notificationHeadsUp = findPreference(AppSettings.NOTIFICATION_HEADS_UP);
 53        final var notificationVibrate = findPreference(AppSettings.NOTIFICATION_VIBRATE);
 54        final var notificationLed = findPreference(AppSettings.NOTIFICATION_LED);
 55        final var foregroundService = findPreference(AppSettings.KEEP_FOREGROUND_SERVICE);
 56        if (messageNotificationSettings == null
 57                || notificationRingtone == null
 58                || notificationHeadsUp == null
 59                || notificationVibrate == null
 60                || notificationLed == null
 61                || foregroundService == null) {
 62            throw new IllegalStateException("The preference resource file is missing preferences");
 63        }
 64        if (Compatibility.runsTwentySix()) {
 65            notificationRingtone.setVisible(false);
 66            notificationHeadsUp.setVisible(false);
 67            notificationVibrate.setVisible(false);
 68            notificationLed.setVisible(false);
 69            foregroundService.setVisible(false);
 70        } else {
 71            messageNotificationSettings.setVisible(false);
 72        }
 73    }
 74
 75    @Override
 76    protected void onSharedPreferenceChanged(@NonNull String key) {
 77        super.onSharedPreferenceChanged(key);
 78        if (key.equals(AppSettings.KEEP_FOREGROUND_SERVICE)) {
 79            requireService().toggleForegroundService();
 80        }
 81    }
 82
 83    @Override
 84    public void onStart() {
 85        super.onStart();
 86        requireActivity().setTitle(R.string.notifications);
 87    }
 88
 89    @Override
 90    public boolean onPreferenceTreeClick(final Preference preference) {
 91        final var key = preference.getKey();
 92        if (AppSettings.RINGTONE.equals(key)) {
 93            pickRingtone();
 94            return true;
 95        }
 96        if (AppSettings.NOTIFICATION_RINGTONE.equals(key)) {
 97            pickNotificationTone();
 98            return true;
 99        }
100        return super.onPreferenceTreeClick(preference);
101    }
102
103    private void pickNotificationTone() {
104        final Uri uri = appSettings().getNotificationTone();
105        Log.i(Config.LOGTAG, "current notification tone: " + uri);
106        this.pickNotificationToneLauncher.launch(uri);
107    }
108
109    private void pickRingtone() {
110        final Uri uri = appSettings().getRingtone();
111        Log.i(Config.LOGTAG, "current ringtone: " + uri);
112        this.pickRingtoneLauncher.launch(uri);
113    }
114
115
116    private AppSettings appSettings() {
117        return new AppSettings(requireContext());
118    }
119}