UpSettingsFragment.java

  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}