UpSettingsFragment.java

 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}