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