ConnectionSettingsFragment.java

 1package eu.siacs.conversations.ui.fragment.settings;
 2
 3import android.os.Bundle;
 4import android.util.Log;
 5import android.widget.Toast;
 6import androidx.annotation.NonNull;
 7import androidx.annotation.Nullable;
 8import com.google.common.base.Strings;
 9import eu.siacs.conversations.AppSettings;
10import eu.siacs.conversations.Config;
11import eu.siacs.conversations.R;
12import eu.siacs.conversations.entities.Account;
13import eu.siacs.conversations.services.QuickConversationsService;
14import eu.siacs.conversations.utils.Resolver;
15import java.util.Arrays;
16
17public class ConnectionSettingsFragment extends XmppPreferenceFragment {
18
19    private static final String GROUPS_AND_CONFERENCES = "groups_and_conferences";
20
21    public static boolean hideChannelDiscovery() {
22        return QuickConversationsService.isQuicksy()
23                || QuickConversationsService.isPlayStoreFlavor()
24                || Strings.isNullOrEmpty(Config.CHANNEL_DISCOVERY);
25    }
26
27    @Override
28    public void onCreatePreferences(@Nullable Bundle savedInstanceState, @Nullable String rootKey) {
29        setPreferencesFromResource(R.xml.preferences_connection, rootKey);
30        final var connectionOptions = findPreference(AppSettings.SHOW_CONNECTION_OPTIONS);
31        final var channelDiscovery = findPreference(AppSettings.CHANNEL_DISCOVERY_METHOD);
32        final var groupsAndConferences = findPreference(GROUPS_AND_CONFERENCES);
33        if (connectionOptions == null || channelDiscovery == null || groupsAndConferences == null) {
34            throw new IllegalStateException();
35        }
36        if (QuickConversationsService.isQuicksy()) {
37            connectionOptions.setVisible(false);
38        }
39        if (hideChannelDiscovery()) {
40            groupsAndConferences.setVisible(false);
41            channelDiscovery.setVisible(false);
42        }
43    }
44
45    @Override
46    protected void onSharedPreferenceChanged(@NonNull String key) {
47        super.onSharedPreferenceChanged(key);
48        switch (key) {
49            case AppSettings.USE_TOR -> {
50                final var appSettings = new AppSettings(requireContext());
51                if (appSettings.isUseTor()) {
52                    runOnUiThread(
53                            () ->
54                                    Toast.makeText(
55                                                    requireActivity(),
56                                                    R.string.audio_video_disabled_tor,
57                                                    Toast.LENGTH_LONG)
58                                            .show());
59                }
60                reconnectAccounts();
61                requireService().reinitializeMuclumbusService();
62            }
63            case AppSettings.SHOW_CONNECTION_OPTIONS -> reconnectAccounts();
64        }
65        if (Arrays.asList(AppSettings.USE_TOR, AppSettings.SHOW_CONNECTION_OPTIONS).contains(key)) {
66            final var appSettings = new AppSettings(requireContext());
67            if (appSettings.isUseTor() || appSettings.isExtendedConnectionOptions()) {
68                return;
69            }
70            resetUserDefinedHostname();
71        }
72    }
73
74    private void resetUserDefinedHostname() {
75        final var service = requireService();
76        for (final Account account : service.getAccounts()) {
77            Log.d(
78                    Config.LOGTAG,
79                    account.getJid().asBareJid() + ": resetting hostname and port to defaults");
80            account.setHostname(null);
81            account.setPort(Resolver.XMPP_PORT_STARTTLS);
82            service.databaseBackend.updateAccount(account);
83        }
84    }
85
86    @Override
87    public void onStart() {
88        super.onStart();
89        requireActivity().setTitle(R.string.pref_connection_options);
90    }
91}