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}