XmppPreferenceFragment.java

  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}