1package eu.siacs.conversations.ui.fragment.settings;
2
3import android.os.Bundle;
4import android.widget.Toast;
5import androidx.annotation.NonNull;
6import androidx.annotation.Nullable;
7import androidx.preference.EditTextPreference;
8import androidx.preference.ListPreference;
9import com.google.common.base.Strings;
10import com.google.common.collect.ImmutableList;
11import com.google.common.collect.Lists;
12import eu.siacs.conversations.R;
13import eu.siacs.conversations.receiver.UnifiedPushDistributor;
14import eu.siacs.conversations.xmpp.Jid;
15import java.net.URI;
16import java.net.URISyntaxException;
17import java.util.Arrays;
18import java.util.List;
19
20public class UpSettingsFragment extends XmppPreferenceFragment {
21
22 @Override
23 public void onCreatePreferences(@Nullable Bundle savedInstanceState, @Nullable String rootKey) {
24 setPreferencesFromResource(R.xml.preferences_up, rootKey);
25 }
26
27 @Override
28 public void onBackendConnected() {
29 final ListPreference upAccounts = findPreference(UnifiedPushDistributor.PREFERENCE_ACCOUNT);
30 final EditTextPreference pushServer =
31 findPreference(UnifiedPushDistributor.PREFERENCE_PUSH_SERVER);
32 if (upAccounts == null || pushServer == null) {
33 throw new IllegalStateException();
34 }
35 pushServer.setOnPreferenceChangeListener(
36 (preference, newValue) -> {
37 if (newValue instanceof String string) {
38 if (Strings.isNullOrEmpty(string)
39 || isJidInvalid(string)
40 || isHttpUri(string)) {
41 Toast.makeText(
42 requireActivity(),
43 R.string.invalid_jid,
44 Toast.LENGTH_LONG)
45 .show();
46 return false;
47 } else {
48 return true;
49 }
50 } else {
51 Toast.makeText(requireActivity(), R.string.invalid_jid, Toast.LENGTH_LONG)
52 .show();
53 return false;
54 }
55 });
56 reconfigureUpAccountPreference(upAccounts);
57 }
58
59 private static boolean isJidInvalid(final String input) {
60 try {
61 final var jid = Jid.ofUserInput(input);
62 return !jid.isBareJid();
63 } catch (final IllegalArgumentException e) {
64 return true;
65 }
66 }
67
68 private static boolean isHttpUri(final String input) {
69 final URI uri;
70 try {
71 uri = new URI(input);
72 } catch (final URISyntaxException e) {
73 return false;
74 }
75 return Arrays.asList("http", "https").contains(uri.getScheme());
76 }
77
78 private void reconfigureUpAccountPreference(final ListPreference listPreference) {
79 final List<CharSequence> accounts =
80 ImmutableList.copyOf(
81 Lists.transform(
82 requireService().getAccounts(),
83 a -> a.getJid().asBareJid().toString()));
84 final ImmutableList.Builder<CharSequence> entries = new ImmutableList.Builder<>();
85 final ImmutableList.Builder<CharSequence> entryValues = new ImmutableList.Builder<>();
86 entries.add(getString(R.string.no_account_deactivated));
87 entryValues.add("none");
88 entries.addAll(accounts);
89 entryValues.addAll(accounts);
90 listPreference.setEntries(entries.build().toArray(new CharSequence[0]));
91 listPreference.setEntryValues(entryValues.build().toArray(new CharSequence[0]));
92 if (!accounts.contains(listPreference.getValue())) {
93 listPreference.setValue("none");
94 }
95 }
96
97 @Override
98 protected void onSharedPreferenceChanged(@NonNull String key) {
99 super.onSharedPreferenceChanged(key);
100 if (UnifiedPushDistributor.PREFERENCES.contains(key)) {
101 final var service = requireService();
102 if (service.reconfigurePushDistributor()) {
103 service.renewUnifiedPushEndpoints();
104 }
105 }
106 }
107
108 @Override
109 public void onStart() {
110 super.onStart();
111 requireActivity().setTitle(R.string.unified_push_distributor);
112 }
113}