diff --git a/_locales/en/messages.json b/_locales/en/messages.json index ac70a33fb..adf54dd88 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -1079,6 +1079,18 @@ "message": "Enable the sending and receiving of read receipts", "description": "Description of the read receipts setting" }, + "messageTTL": { + "message": "Message TTL", + "description": "Title of the Message TTL setting" + }, + "messageTTLSettingDescription": { + "message": "Time to live (how long the recipient will have to collect their messages)", + "description": "Description of the time to live setting" + }, + "messageTTLSettingWarning": { + "message": "Warning! Lowering the TTL could result in messages being lost if the recipient doesn't collect them in time!", + "description": "Warning for the time to live setting" + }, "notificationSettingsDialog": { "message": "When messages arrive, display notifications that reveal:", "description": "Explain the purpose of the notification settings" diff --git a/js/background.js b/js/background.js index 48437d2c1..54079c6fc 100644 --- a/js/background.js +++ b/js/background.js @@ -236,6 +236,14 @@ window.setMenuBarVisibility(!value); }, + getMessageTTL: () => storage.get('message-ttl', 24), + setMessageTTL: value => { + // Make sure the ttl is between a given range and is valid + const intValue = parseInt(value, 10); + const ttl = Number.isNaN(intValue) ? 24 : intValue; + storage.put('message-ttl', ttl); + }, + getReadReceiptSetting: () => storage.get('read-receipt-setting'), setReadReceiptSetting: value => diff --git a/js/settings_start.js b/js/settings_start.js index 01c47aa5c..02b842456 100644 --- a/js/settings_start.js +++ b/js/settings_start.js @@ -18,6 +18,7 @@ const getInitialData = async () => ({ themeSetting: await window.getThemeSetting(), hideMenuBar: await window.getHideMenuBar(), + messageTTL: await window.getMessageTTL(), readReceiptSetting: await window.getReadReceiptSetting(), notificationSetting: await window.getNotificationSetting(), audioNotification: await window.getAudioNotification(), diff --git a/js/views/settings_view.js b/js/views/settings_view.js index cc18b8b08..323ebba89 100644 --- a/js/views/settings_view.js +++ b/js/views/settings_view.js @@ -50,6 +50,30 @@ }, }); + const MessageTTLSettingView = Whisper.View.extend({ + initialize(options) { + this.value = options.value; + this.setFn = options.setFn; + this.populate(); + }, + events: { + change: 'change', + input: 'input', + }, + change(e) { + this.value = e.target.value; + this.setFn(this.value); + window.log.info('message-ttl-setting changed to', this.value); + }, + input(e) { + this.value = e.target.value; + this.$('label').html(`${this.value} Hours`); + }, + populate() { + this.$('input').val(this.value); + }, + }); + const ReadReceiptSettingView = Whisper.View.extend({ initialize(options) { this.value = options.value; @@ -141,6 +165,11 @@ value: window.initialData.readReceiptSetting, setFn: window.setReadReceiptSetting, }); + new MessageTTLSettingView({ + el: this.$('.message-ttl-setting'), + value: window.initialData.messageTTL, + setFn: window.setMessageTTL, + }); const blockedNumberView = new Whisper.BlockedNumberView().render(); this.$('.blocked-user-setting').append(blockedNumberView.el); @@ -176,6 +205,9 @@ permissions: i18n('permissions'), mediaPermissionsDescription: i18n('mediaPermissionsDescription'), readReceiptSettingDescription: i18n('readReceiptSettingDescription'), + messageTTL: i18n('messageTTL'), + messageTTLSettingDescription: i18n('messageTTLSettingDescription'), + messageTTLSettingWarning: i18n('messageTTLSettingWarning'), spellCheckHeader: i18n('spellCheck'), spellCheckDescription: i18n('spellCheckDescription'), blockedHeader: 'Blocked Users', diff --git a/libtextsecure/outgoing_message.js b/libtextsecure/outgoing_message.js index 9ab24570c..79426037a 100644 --- a/libtextsecure/outgoing_message.js +++ b/libtextsecure/outgoing_message.js @@ -345,11 +345,11 @@ OutgoingMessage.prototype = { const outgoingObject = outgoingObjects[0]; const socketMessage = await this.wrapInWebsocketMessage(outgoingObject); let ttl; - // TODO: Allow user to set ttl manually if (outgoingObject.type === textsecure.protobuf.Envelope.Type.FRIEND_REQUEST) { ttl = 4 * 24 * 60 * 60; // 4 days for friend request message } else { - ttl = 24 * 60 * 60; // 1 day default for any other message + const hours = window.getMessageTTL() || 24; // 1 day default for any other message + ttl = hours * 60 * 60; } await this.transmitMessage(number, socketMessage, this.timestamp, ttl); this.successfulNumbers[this.successfulNumbers.length] = number; diff --git a/main.js b/main.js index 5c26db5fe..c29c01ca5 100644 --- a/main.js +++ b/main.js @@ -1053,6 +1053,9 @@ installSettingsSetter('theme-setting'); installSettingsGetter('hide-menu-bar'); installSettingsSetter('hide-menu-bar'); +installSettingsGetter('message-ttl'); +installSettingsSetter('message-ttl'); + installSettingsGetter('read-receipt-setting'); installSettingsSetter('read-receipt-setting'); installSettingsGetter('notification-setting'); diff --git a/preload.js b/preload.js index e6942138a..189f41cd3 100644 --- a/preload.js +++ b/preload.js @@ -154,6 +154,11 @@ installSetter('theme-setting', 'setThemeSetting'); installGetter('hide-menu-bar', 'getHideMenuBar'); installSetter('hide-menu-bar', 'setHideMenuBar'); +// Get the message TTL setting +window.getMessageTTL = () => window.storage.get('message-ttl', 24) +installGetter('message-ttl', 'getMessageTTL'); +installSetter('message-ttl', 'setMessageTTL'); + installGetter('read-receipt-setting', 'getReadReceiptSetting'); installSetter('read-receipt-setting', 'setReadReceiptSetting'); installGetter('notification-setting', 'getNotificationSetting'); diff --git a/settings.html b/settings.html index 96bbfb556..db6c57fbd 100644 --- a/settings.html +++ b/settings.html @@ -112,6 +112,42 @@

+
+

{{ messageTTL }}

+
{{ messageTTLSettingDescription }}
+
{{ messageTTLSettingWarning }}
+
+ + + + +
+
+

{{ clearDataHeader }}

diff --git a/settings_preload.js b/settings_preload.js index 1e20e8717..d772fec4e 100644 --- a/settings_preload.js +++ b/settings_preload.js @@ -41,6 +41,9 @@ window.setHideMenuBar = makeSetter('hide-menu-bar'); window.getSpellCheck = makeGetter('spell-check'); window.setSpellCheck = makeSetter('spell-check'); +window.getMessageTTL = makeGetter('message-ttl'); +window.setMessageTTL = makeSetter('message-ttl'); + window.getReadReceiptSetting = makeGetter('read-receipt-setting'); window.setReadReceiptSetting = makeSetter('read-receipt-setting'); window.getNotificationSetting = makeGetter('notification-setting'); diff --git a/stylesheets/_settings.scss b/stylesheets/_settings.scss index 973b7f90b..f8d55493a 100644 --- a/stylesheets/_settings.scss +++ b/stylesheets/_settings.scss @@ -90,4 +90,20 @@ color: white; } } + + .message-ttl-setting { + .inputs { + display: flex; + padding-top: 18px; + } + + #warning { + padding-top: 12px; + font-weight: 300; + color: red; + } + + input { flex: 1; } + label { padding-left: 12px; } + } }