1package eu.siacs.conversations.ui.fragment.settings;
2
3import android.content.Context;
4import android.content.SharedPreferences;
5import android.util.Log;
6
7import androidx.annotation.NonNull;
8import androidx.annotation.Nullable;
9import androidx.preference.ListPreference;
10import androidx.preference.Preference;
11import androidx.preference.PreferenceFragmentCompat;
12
13import com.google.common.base.Strings;
14import com.google.common.primitives.Ints;
15
16import eu.siacs.conversations.Config;
17import eu.siacs.conversations.R;
18import eu.siacs.conversations.entities.Account;
19import eu.siacs.conversations.services.XmppConnectionService;
20import eu.siacs.conversations.ui.XmppActivity;
21import eu.siacs.conversations.utils.TimeFrameUtils;
22
23public abstract class XmppPreferenceFragment extends PreferenceFragmentCompat {
24
25 private final SharedPreferences.OnSharedPreferenceChangeListener
26 sharedPreferenceChangeListener =
27 (sharedPreferences, key) -> {
28 if (key == null) {
29 return;
30 }
31 if (isAdded()) {
32 onSharedPreferenceChanged(key);
33 }
34 };
35
36 protected void onSharedPreferenceChanged(@NonNull String key) {
37 Log.d(Config.LOGTAG, "onSharedPreferenceChanged(" + key + ")");
38 }
39
40 public void onBackendConnected() {}
41
42 @Override
43 public void onResume() {
44 super.onResume();
45 final var sharedPreferences = getPreferenceManager().getSharedPreferences();
46 if (sharedPreferences != null) {
47 sharedPreferences.registerOnSharedPreferenceChangeListener(
48 this.sharedPreferenceChangeListener);
49 }
50 final var xmppActivity = requireXmppActivity();
51 if (xmppActivity.xmppConnectionService != null) {
52 this.onBackendConnected();
53 }
54 }
55
56 @Override
57 public void onPause() {
58 super.onPause();
59 final var sharedPreferences = getPreferenceManager().getSharedPreferences();
60 if (sharedPreferences != null) {
61 sharedPreferences.unregisterOnSharedPreferenceChangeListener(
62 this.sharedPreferenceChangeListener);
63 }
64 }
65
66 protected void reconnectAccounts() {
67 final var service = requireService();
68 for (final Account account : service.getAccounts()) {
69 if (account.isEnabled()) {
70 service.reconnectAccountInBackground(account);
71 }
72 }
73 }
74
75 protected XmppActivity requireXmppActivity() {
76 final var activity = requireActivity();
77 if (activity instanceof XmppActivity xmppActivity) {
78 return xmppActivity;
79 }
80 throw new IllegalStateException();
81 }
82
83 protected XmppConnectionService requireService() {
84 final var xmppActivity = requireXmppActivity();
85 final var service = xmppActivity.xmppConnectionService;
86 if (service != null) {
87 return service;
88 }
89 throw new IllegalStateException();
90 }
91
92 protected void runOnUiThread(final Runnable runnable) {
93 requireActivity().runOnUiThread(runnable);
94 }
95
96 protected static String timeframeValueToName(final Context context, final int value) {
97 if (value == 0) {
98 return context.getString(R.string.never);
99 } else {
100 return TimeFrameUtils.resolve(context, 1000L * value);
101 }
102 }
103
104 protected static class TimeframeSummaryProvider
105 implements Preference.SummaryProvider<ListPreference> {
106
107 @Nullable
108 @Override
109 public CharSequence provideSummary(@NonNull ListPreference preference) {
110 final Integer value = Ints.tryParse(Strings.nullToEmpty(preference.getValue()));
111 return timeframeValueToName(preference.getContext(), value == null ? 0 : value);
112 }
113 }
114}