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}