/*
* Copyright (C) 2015 Actor LLC. <https://actor.im>
*/
package im.actor.core.modules.settings;
import im.actor.core.entity.Peer;
import im.actor.core.entity.PeerType;
import im.actor.core.events.SettingsChanged;
import im.actor.core.modules.AbsModule;
import im.actor.core.modules.ModuleContext;
import im.actor.runtime.actors.ActorRef;
import im.actor.runtime.actors.ActorSystem;
import im.actor.runtime.eventbus.EventBus;
public class SettingsModule extends AbsModule {
private final String STORAGE_PREFIX = "app.settings.";
private final String KEY_SOUND_EFFECTS;
private final String KEY_CHAT_SEND_BY_ENTER;
private final String KEY_NOTIFICATION_ENABLED;
private final String KEY_NOTIFICATION_SOUND;
private final String KEY_NOTIFICATION_SOUND_ENABLED;
private final String KEY_NOTIFICATION_VIBRATION;
private final String KEY_NOTIFICATION_IN_APP_ENABLED;
private final String KEY_NOTIFICATION_IN_APP_SOUND;
private final String KEY_NOTIFICATION_IN_APP_VIBRATION;
private final String KEY_NOTIFICATION_TEXT;
private final String KEY_NOTIFICATION_CHAT_PREFIX;
private final String KEY_NOTIFICATION_GROUP_ENABLED;
private final String KEY_NOTIFICATION_GROUP_ONLY_MENTIONS;
private final String KEY_MARKDOWN_ENABLED;
private final String KEY_RENAME_HINT_SHOWN;
private final String KEY_WALLPAPPER;
private final String KEY_PRIVACY;
private final String KEY_CHAT_TEXT_SIZE;
private final String KEY_ANIMATION_AUTO_PLAY;
private final String KEY_DOC_AUTO_DOWNLOAD;
private final String KEY_IMAGE_AUTO_DOWNLOAD;
private final String KEY_VIDEO_AUTO_DOWNLOAD;
private final String KEY_ANIMATION_AUTO_DOWNLOAD;
private final String KEY_AUDIO_AUTO_DOWNLOAD;
private final String KEY_NOTIFICATION_PEER_SOUND;
private ActorRef settingsSync;
private EventBus eventBus;
public SettingsModule(ModuleContext context) {
super(context);
eventBus = context.getEvents();
String platformType;
switch (context.getConfiguration().getPlatformType()) {
case ANDROID:
platformType = "android";
break;
case IOS:
platformType = "ios";
break;
case WEB:
platformType = "web";
break;
default:
case GENERIC:
platformType = "generic";
break;
}
String deviceType;
switch (context.getConfiguration().getDeviceCategory()) {
case TABLET:
deviceType = "tablet";
break;
case DESKTOP:
deviceType = "desktop";
break;
case MOBILE:
deviceType = "mobile";
break;
default:
deviceType = "generic";
break;
}
// Platform+Device specific settings
KEY_SOUND_EFFECTS = "app." + platformType + "" + deviceType + ".tones_enabled";
KEY_CHAT_SEND_BY_ENTER = "app." + platformType + "" + deviceType + ".send_by_enter";
KEY_MARKDOWN_ENABLED = "app." + platformType + "" + deviceType + ".use_markdown";
KEY_CHAT_TEXT_SIZE = "app." + platformType + "." + deviceType + ".text_size";
KEY_NOTIFICATION_PEER_SOUND = "app." + platformType + "." + deviceType + ".notification.chat.sound.";
// Device-type notification settings
KEY_NOTIFICATION_ENABLED = "category." + deviceType + ".notification.enabled";
KEY_NOTIFICATION_SOUND_ENABLED = "category." + deviceType + ".notification.sound.enabled";
KEY_NOTIFICATION_VIBRATION = "category." + deviceType + ".notification.vibration.enabled";
KEY_NOTIFICATION_TEXT = "category." + deviceType + ".notification.show_text";
KEY_NOTIFICATION_CHAT_PREFIX = "category." + deviceType + ".notification.chat.";
KEY_NOTIFICATION_IN_APP_ENABLED = "category." + deviceType + ".in_app.enabled";
KEY_NOTIFICATION_IN_APP_SOUND = "category." + deviceType + ".in_app.sound.enabled";
KEY_NOTIFICATION_IN_APP_VIBRATION = "category." + deviceType + ".in_app.vibration.enabled";
KEY_ANIMATION_AUTO_PLAY = "category." + deviceType + ".auto_play.enabled";
KEY_ANIMATION_AUTO_DOWNLOAD = "category." + deviceType + ".auto_download_animation.enabled";
KEY_VIDEO_AUTO_DOWNLOAD = "category." + deviceType + ".auto_download_video.enabled";
KEY_IMAGE_AUTO_DOWNLOAD = "category." + deviceType + ".auto_download_image.enabled";
KEY_AUDIO_AUTO_DOWNLOAD = "category." + deviceType + ".auto_download_audio.enabled";
KEY_DOC_AUTO_DOWNLOAD = "category." + deviceType + ".auto_download_doc.enabled";
// Account-wide notification settings
KEY_NOTIFICATION_SOUND = "account.notification.sound";
KEY_NOTIFICATION_GROUP_ENABLED = "account.notifications.group.enabled";
KEY_NOTIFICATION_GROUP_ONLY_MENTIONS = "account.notifications.group.mentions";
// Hints
KEY_RENAME_HINT_SHOWN = "hint.contact.rename";
KEY_WALLPAPPER = "wallpaper.uri";
KEY_PRIVACY = "privacy.last_seen";
}
public void run() {
settingsSync = ActorSystem.system().actorOf("actor/settings", () -> new SettingsSyncActor(context()));
}
// Sound Effects
public boolean isConversationTonesEnabled() {
return getBooleanValue(KEY_SOUND_EFFECTS, true);
}
public void changeConversationTonesEnabled(boolean val) {
setBooleanValue(KEY_SOUND_EFFECTS, val);
}
// Notifications
public boolean isNotificationsEnabled() {
return getBooleanValue(KEY_NOTIFICATION_ENABLED, true);
}
public void changeNotificationsEnabled(boolean val) {
setBooleanValue(KEY_NOTIFICATION_ENABLED, val);
}
public boolean isNotificationSoundEnabled() {
return getBooleanValue(KEY_NOTIFICATION_SOUND_ENABLED, true);
}
public void changeNotificationSoundEnabled(boolean val) {
setBooleanValue(KEY_NOTIFICATION_SOUND_ENABLED, val);
}
public String getNotificationSound() {
return readValue(KEY_NOTIFICATION_SOUND);
}
public void changeNotificationSound(String sound) {
setStringValue(KEY_NOTIFICATION_SOUND, sound);
}
public String getNotificationPeerSound(Peer peer) {
return readValue(KEY_NOTIFICATION_PEER_SOUND + getChatKey(peer));
}
public void changeNotificationPeerSound(Peer peer, String sound) {
setStringValue(KEY_NOTIFICATION_PEER_SOUND + getChatKey(peer), sound);
}
public boolean isVibrationEnabled() {
return getBooleanValue(KEY_NOTIFICATION_VIBRATION, true);
}
public void changeNotificationVibrationEnabled(boolean val) {
setBooleanValue(KEY_NOTIFICATION_VIBRATION, val);
}
public boolean isShowNotificationsText() {
return getBooleanValue(KEY_NOTIFICATION_TEXT, true);
}
public void changeShowNotificationTextEnabled(boolean val) {
setBooleanValue(KEY_NOTIFICATION_TEXT, val);
}
// Group Notifications
public boolean isGroupNotificationsEnabled() {
return getBooleanValue(KEY_NOTIFICATION_GROUP_ENABLED, true);
}
public void changeGroupNotificationsEnabled(boolean val) {
setBooleanValue(KEY_NOTIFICATION_GROUP_ENABLED, val);
}
public boolean isGroupNotificationsOnlyMentionsEnabled() {
return getBooleanValue(KEY_NOTIFICATION_GROUP_ONLY_MENTIONS, false);
}
public void changeGroupNotificationsOnlyMentionsEnabled(boolean val) {
setBooleanValue(KEY_NOTIFICATION_GROUP_ONLY_MENTIONS, val);
}
// In-App notifications
public boolean isInAppEnabled() {
return getBooleanValue(KEY_NOTIFICATION_IN_APP_ENABLED, true);
}
public void changeInAppEnabled(boolean val) {
setBooleanValue(KEY_NOTIFICATION_IN_APP_ENABLED, val);
}
public boolean isInAppSoundEnabled() {
return getBooleanValue(KEY_NOTIFICATION_IN_APP_SOUND, true);
}
public void changeInAppSoundEnabled(boolean val) {
setBooleanValue(KEY_NOTIFICATION_IN_APP_SOUND, val);
}
public boolean isInAppVibrationEnabled() {
return getBooleanValue(KEY_NOTIFICATION_IN_APP_VIBRATION, true);
}
public void changeInAppVibrationEnabled(boolean val) {
setBooleanValue(KEY_NOTIFICATION_IN_APP_VIBRATION, val);
}
// Chat settings
public boolean isSendByEnterEnabled() {
return getBooleanValue(KEY_CHAT_SEND_BY_ENTER, true);
}
public void changeSendByEnter(boolean val) {
setBooleanValue(KEY_CHAT_SEND_BY_ENTER, val);
}
public boolean isMarkdownEnabled() {
return getBooleanValue(KEY_MARKDOWN_ENABLED, false);
}
public void changeMarkdown(boolean val) {
setBooleanValue(KEY_MARKDOWN_ENABLED, val);
}
public int getTextSize() {
return getInt(KEY_CHAT_TEXT_SIZE, 15);
}
public void changeTextSize(int textSize) {
setInt(KEY_CHAT_TEXT_SIZE, textSize);
}
// Auto download settings
public boolean isImageAutoDownloadEnabled() {
return getBooleanValue(KEY_IMAGE_AUTO_DOWNLOAD, true);
}
public void setImageAutoDownloadEnabled(boolean enabled) {
setBooleanValue(KEY_IMAGE_AUTO_DOWNLOAD, enabled);
}
public boolean isAnimationAutoDownloadEnabled() {
return getBooleanValue(KEY_ANIMATION_AUTO_DOWNLOAD, true);
}
public void setAnimationAutoDownloadEnabled(boolean enabled) {
setBooleanValue(KEY_ANIMATION_AUTO_DOWNLOAD, enabled);
}
public boolean isVideoAutoDownloadEnabled() {
return getBooleanValue(KEY_VIDEO_AUTO_DOWNLOAD, false);
}
public void setVideoAutoDownloadEnabled(boolean enabled) {
setBooleanValue(KEY_VIDEO_AUTO_DOWNLOAD, enabled);
}
public boolean isDocAutoDownloadEnabled() {
return getBooleanValue(KEY_DOC_AUTO_DOWNLOAD, true);
}
public void setDocAutoDownloadEnabled(boolean enabled) {
setBooleanValue(KEY_DOC_AUTO_DOWNLOAD, enabled);
}
public boolean isAudioAutoDownloadEnabled() {
return getBooleanValue(KEY_AUDIO_AUTO_DOWNLOAD, true);
}
public void setAudioAutoDownloadEnabled(boolean enabled) {
setBooleanValue(KEY_AUDIO_AUTO_DOWNLOAD, enabled);
}
// Peer settings
public boolean isNotificationsEnabled(Peer peer) {
return getBooleanValue(KEY_NOTIFICATION_CHAT_PREFIX + getChatKey(peer) + ".enabled", true);
}
public void changeNotificationsEnabled(Peer peer, boolean val) {
setBooleanValue(KEY_NOTIFICATION_CHAT_PREFIX + getChatKey(peer) + ".enabled", val);
}
public String getNotificationSound(Peer peer) {
return readValue(KEY_NOTIFICATION_CHAT_PREFIX + getChatKey(peer) + ".sound");
}
public void changeNotificationSound(Peer peer, String sound) {
setStringValue(KEY_NOTIFICATION_CHAT_PREFIX + getChatKey(peer) + ".sound", sound);
}
// Hint
public boolean isRenameHintShown() {
boolean res = getBooleanValue(KEY_RENAME_HINT_SHOWN, false);
if (!res) {
setBooleanValue(KEY_RENAME_HINT_SHOWN, true);
}
return res;
}
// Wallpaper
public String getSelectedWallpapper() {
return readValue(KEY_WALLPAPPER);
}
public void changeSelectedWallpapper(String uri) {
changeValue(KEY_WALLPAPPER, uri);
}
//Privacy
public String getPrivacy() {
String privacy = readValue(KEY_PRIVACY);
return privacy != null ? privacy : "always";
}
public void setPrivacy(String privacy) {
changeValue(KEY_PRIVACY, privacy);
}
//Animation
public boolean isAnimationAutoPlayEnabled() {
return getBooleanValue(KEY_ANIMATION_AUTO_PLAY, true);
}
public void setAnimationAutoPlayEnabled(boolean val) {
setBooleanValue(KEY_ANIMATION_AUTO_PLAY, val);
}
// Common
public boolean getBooleanValue(String key, boolean defaultVal) {
String sValue = readValue(key);
boolean res = defaultVal;
if (sValue != null) {
if ("true".equals(sValue)) {
res = true;
} else if ("false".equals(sValue)) {
res = false;
}
}
return res;
}
public boolean getBooleanValue(String key) {
return getBooleanValue(key, false);
}
public void setBooleanValue(String key, boolean val) {
String sVal = val ? "true" : "false";
changeValue(key, sVal);
}
public String getStringValue(String key, String defaultVal) {
String sValue = readValue(key);
if (sValue == null) {
return defaultVal;
}
return sValue;
}
private void setInt(String key, int val) {
changeValue(key, Integer.toString(val));
}
private int getInt(String key, int defaultVal) {
String sValue = readValue(key);
int res = defaultVal;
if (sValue != null) {
try {
res = Integer.parseInt(sValue);
} catch (Exception e) {
e.printStackTrace();
}
}
return res;
}
private byte[] getBytes(String key) {
return preferences().getBytes(STORAGE_PREFIX + key);
}
private void setBytes(String key, byte[] val) {
preferences().putBytes(STORAGE_PREFIX + key, val);
}
public String getStringValue(String key) {
return getStringValue(key, null);
}
public void setStringValue(String key, String val) {
changeValue(key, val);
}
// Sync methods
private void changeValue(String key, String val) {
String s = readValue(key);
if (s == null && val == null) {
return;
}
if (s != null && val != null && s.equals(val)) {
return;
}
settingsSync.send(new SettingsSyncActor.ChangeSettings(key, val));
onUpdatedSetting(key, val);
notifySettingsChanged();
}
private String readValue(String key) {
return preferences().getString(STORAGE_PREFIX + key);
}
public void onUpdatedSetting(String key, String value) {
preferences().putString(STORAGE_PREFIX + key, value);
}
public void notifySettingsChanged() {
eventBus.post(new SettingsChanged());
}
private String getChatKey(Peer peer) {
if (peer.getPeerType() == PeerType.PRIVATE) {
return "PRIVATE_" + peer.getPeerId();
} else if (peer.getPeerType() == PeerType.GROUP) {
return "GROUP_" + peer.getPeerId();
} else {
throw new RuntimeException("Unsupported peer");
}
}
public void resetModule() {
// TODO: Implement
}
}