1package eu.siacs.conversations.ui.fragment.settings;
2
3import android.content.SharedPreferences;
4import android.util.Log;
5
6import androidx.annotation.NonNull;
7import androidx.preference.PreferenceFragmentCompat;
8import androidx.preference.Preference;
9
10import com.rarepebble.colorpicker.ColorPreference;
11
12import eu.siacs.conversations.Config;
13import eu.siacs.conversations.entities.Account;
14import eu.siacs.conversations.services.XmppConnectionService;
15import eu.siacs.conversations.ui.XmppActivity;
16
17public abstract class XmppPreferenceFragment extends PreferenceFragmentCompat {
18
19 private final SharedPreferences.OnSharedPreferenceChangeListener
20 sharedPreferenceChangeListener =
21 (sharedPreferences, key) -> {
22 if (key == null) {
23 return;
24 }
25 if (isAdded()) {
26 onSharedPreferenceChanged(key);
27 }
28 };
29
30 protected void onSharedPreferenceChanged(@NonNull String key) {
31 Log.d(Config.LOGTAG,"onSharedPreferenceChanged("+key+")");
32 }
33
34 public void onBackendConnected() {}
35
36 @Override
37 public void onDisplayPreferenceDialog(Preference preference) {
38 if (preference instanceof ColorPreference) {
39 ((ColorPreference) preference).showDialog(this, 0);
40 } else super.onDisplayPreferenceDialog(preference);
41 }
42
43 @Override
44 public void onResume() {
45 super.onResume();
46 final var sharedPreferences = getPreferenceManager().getSharedPreferences();
47 if (sharedPreferences != null) {
48 sharedPreferences.registerOnSharedPreferenceChangeListener(
49 this.sharedPreferenceChangeListener);
50 }
51 final var xmppActivity = requireXmppActivity();
52 if (xmppActivity.xmppConnectionService != null) {
53 this.onBackendConnected();
54 }
55 }
56
57 @Override
58 public void onPause() {
59 super.onPause();
60 final var sharedPreferences = getPreferenceManager().getSharedPreferences();
61 if (sharedPreferences != null) {
62 sharedPreferences.unregisterOnSharedPreferenceChangeListener(
63 this.sharedPreferenceChangeListener);
64 }
65 }
66
67 protected void reconnectAccounts() {
68 final var service = requireService();
69 for (final Account account : service.getAccounts()) {
70 if (account.isEnabled()) {
71 service.reconnectAccountInBackground(account);
72 }
73 }
74 }
75
76 protected XmppActivity requireXmppActivity() {
77 final var activity = requireActivity();
78 if (activity instanceof XmppActivity xmppActivity) {
79 return xmppActivity;
80 }
81 throw new IllegalStateException();
82 }
83
84 protected XmppConnectionService requireService() {
85 final var xmppActivity = requireXmppActivity();
86 final var service = xmppActivity.xmppConnectionService;
87 if (service != null) {
88 return service;
89 }
90 throw new IllegalStateException();
91 }
92
93 protected void runOnUiThread(final Runnable runnable) {
94 requireActivity().runOnUiThread(runnable);
95 }
96}