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}