AppSettings.java

  1package eu.siacs.conversations;
  2
  3import android.content.Context;
  4import android.content.SharedPreferences;
  5import android.net.Uri;
  6import androidx.annotation.BoolRes;
  7import androidx.annotation.NonNull;
  8import androidx.preference.PreferenceManager;
  9import com.google.common.base.Strings;
 10import java.security.SecureRandom;
 11
 12public class AppSettings {
 13
 14    public static final String KEEP_FOREGROUND_SERVICE = "enable_foreground_service";
 15    public static final String AWAY_WHEN_SCREEN_IS_OFF = "away_when_screen_off";
 16    public static final String TREAT_VIBRATE_AS_SILENT = "treat_vibrate_as_silent";
 17    public static final String DND_ON_SILENT_MODE = "dnd_on_silent_mode";
 18    public static final String MANUALLY_CHANGE_PRESENCE = "manually_change_presence";
 19    public static final String BLIND_TRUST_BEFORE_VERIFICATION = "btbv";
 20    public static final String AUTOMATIC_MESSAGE_DELETION = "automatic_message_deletion";
 21    public static final String BROADCAST_LAST_ACTIVITY = "last_activity";
 22    public static final String THEME = "theme";
 23    public static final String DYNAMIC_COLORS = "dynamic_colors";
 24    public static final String SHOW_DYNAMIC_TAGS = "show_dynamic_tags";
 25    public static final String OMEMO = "omemo";
 26    public static final String ALLOW_SCREENSHOTS = "allow_screenshots";
 27    public static final String RINGTONE = "call_ringtone";
 28    public static final String BTBV = "btbv";
 29
 30    public static final String CONFIRM_MESSAGES = "confirm_messages";
 31    public static final String ALLOW_MESSAGE_CORRECTION = "allow_message_correction";
 32
 33    public static final String TRUST_SYSTEM_CA_STORE = "trust_system_ca_store";
 34    public static final String REQUIRE_CHANNEL_BINDING = "channel_binding_required";
 35    public static final String NOTIFICATION_RINGTONE = "notification_ringtone";
 36    public static final String NOTIFICATION_HEADS_UP = "notification_headsup";
 37    public static final String NOTIFICATION_VIBRATE = "vibrate_on_notification";
 38    public static final String NOTIFICATION_LED = "led";
 39    public static final String SHOW_CONNECTION_OPTIONS = "show_connection_options";
 40    public static final String USE_TOR = "use_tor";
 41    public static final String CHANNEL_DISCOVERY_METHOD = "channel_discovery_method";
 42    public static final String SEND_CRASH_REPORTS = "send_crash_reports";
 43    public static final String COLORFUL_CHAT_BUBBLES = "use_green_background";
 44    public static final String LARGE_FONT = "large_font";
 45    public static final String SHOW_AVATARS = "show_avatars";
 46    public static final String CALL_INTEGRATION = "call_integration";
 47    public static final String ALIGN_START = "align_start";
 48
 49    private static final String ACCEPT_INVITES_FROM_STRANGERS = "accept_invites_from_strangers";
 50    private static final String INSTALLATION_ID = "im.conversations.android.install_id";
 51
 52    private final Context context;
 53
 54    public AppSettings(final Context context) {
 55        this.context = context;
 56    }
 57
 58    public Uri getRingtone() {
 59        final SharedPreferences sharedPreferences =
 60                PreferenceManager.getDefaultSharedPreferences(context);
 61        final String incomingCallRingtone =
 62                sharedPreferences.getString(
 63                        RINGTONE, context.getString(R.string.incoming_call_ringtone));
 64        return Strings.isNullOrEmpty(incomingCallRingtone) ? null : Uri.parse(incomingCallRingtone);
 65    }
 66
 67    public void setRingtone(final Uri uri) {
 68        final SharedPreferences sharedPreferences =
 69                PreferenceManager.getDefaultSharedPreferences(context);
 70        sharedPreferences.edit().putString(RINGTONE, uri == null ? null : uri.toString()).apply();
 71    }
 72
 73    public Uri getNotificationTone() {
 74        final SharedPreferences sharedPreferences =
 75                PreferenceManager.getDefaultSharedPreferences(context);
 76        final String incomingCallRingtone =
 77                sharedPreferences.getString(
 78                        NOTIFICATION_RINGTONE, context.getString(R.string.notification_ringtone));
 79        return Strings.isNullOrEmpty(incomingCallRingtone) ? null : Uri.parse(incomingCallRingtone);
 80    }
 81
 82    public void setNotificationTone(final Uri uri) {
 83        final SharedPreferences sharedPreferences =
 84                PreferenceManager.getDefaultSharedPreferences(context);
 85        sharedPreferences
 86                .edit()
 87                .putString(NOTIFICATION_RINGTONE, uri == null ? null : uri.toString())
 88                .apply();
 89    }
 90
 91    public boolean isBTBVEnabled() {
 92        return getBooleanPreference(BTBV, R.bool.btbv);
 93    }
 94
 95    public boolean isTrustSystemCAStore() {
 96        return getBooleanPreference(TRUST_SYSTEM_CA_STORE, R.bool.trust_system_ca_store);
 97    }
 98
 99    public boolean isAllowScreenshots() {
100        return getBooleanPreference(ALLOW_SCREENSHOTS, R.bool.allow_screenshots);
101    }
102
103    public boolean isColorfulChatBubbles() {
104        return getBooleanPreference(COLORFUL_CHAT_BUBBLES, R.bool.use_green_background);
105    }
106
107    public boolean isLargeFont() {
108        return getBooleanPreference(LARGE_FONT, R.bool.large_font);
109    }
110
111    public boolean isShowAvatars() {
112        return getBooleanPreference(SHOW_AVATARS, R.bool.show_avatars);
113    }
114
115    public boolean isCallIntegration() {
116        return getBooleanPreference(CALL_INTEGRATION, R.bool.call_integration);
117    }
118
119    public boolean isAlignStart() {
120        return getBooleanPreference(ALIGN_START, R.bool.align_start);
121    }
122
123    public boolean isUseTor() {
124        return getBooleanPreference(USE_TOR, R.bool.use_tor);
125    }
126
127    public boolean isAcceptInvitesFromStrangers() {
128        return getBooleanPreference(
129                ACCEPT_INVITES_FROM_STRANGERS, R.bool.accept_invites_from_strangers);
130    }
131
132    private boolean getBooleanPreference(@NonNull final String name, @BoolRes int res) {
133        final SharedPreferences sharedPreferences =
134                PreferenceManager.getDefaultSharedPreferences(context);
135        return sharedPreferences.getBoolean(name, context.getResources().getBoolean(res));
136    }
137
138    public String getOmemo() {
139        final SharedPreferences sharedPreferences =
140                PreferenceManager.getDefaultSharedPreferences(context);
141        return sharedPreferences.getString(
142                OMEMO, context.getString(R.string.omemo_setting_default));
143    }
144
145    public boolean isSendCrashReports() {
146        return getBooleanPreference(SEND_CRASH_REPORTS, R.bool.send_crash_reports);
147    }
148
149    public void setSendCrashReports(boolean value) {
150        final SharedPreferences sharedPreferences =
151                PreferenceManager.getDefaultSharedPreferences(context);
152        sharedPreferences.edit().putBoolean(SEND_CRASH_REPORTS, value).apply();
153    }
154
155    public boolean isRequireChannelBinding() {
156        return getBooleanPreference(REQUIRE_CHANNEL_BINDING, R.bool.require_channel_binding);
157    }
158
159    public synchronized long getInstallationId() {
160        final var sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
161        final long existing = sharedPreferences.getLong(INSTALLATION_ID, 0);
162        if (existing != 0) {
163            return existing;
164        }
165        final var secureRandom = new SecureRandom();
166        final var installationId = secureRandom.nextLong();
167        sharedPreferences.edit().putLong(INSTALLATION_ID, installationId).apply();
168        return installationId;
169    }
170
171    public synchronized void resetInstallationId() {
172        final var secureRandom = new SecureRandom();
173        final var installationId = secureRandom.nextLong();
174        PreferenceManager.getDefaultSharedPreferences(context)
175                .edit()
176                .putLong(INSTALLATION_ID, installationId)
177                .apply();
178    }
179}