diff --git a/debug_log_preload.js b/debug_log_preload.js index 158e602bd..ba4b99985 100644 --- a/debug_log_preload.js +++ b/debug_log_preload.js @@ -6,6 +6,7 @@ const config = url.parse(window.location.toString(), true).query; const { locale } = config; const localeMessages = ipcRenderer.sendSync('locale-data'); +window.theme = config.theme; window.i18n = i18n.setup(locale, localeMessages); // got.js appears to need this to successfully submit debug logs to the cloud diff --git a/js/background.js b/js/background.js index 43b11d5ef..0627797dc 100644 --- a/js/background.js +++ b/js/background.js @@ -134,7 +134,7 @@ }, getHideMenuBar: () => storage.get('hide-menu-bar'), setHideMenuBar: value => { - storage.get('hide-menu-bar', value); + storage.put('hide-menu-bar', value); window.setAutoHideMenuBar(value); window.setMenuBarVisibility(!value); }, @@ -142,7 +142,7 @@ getNotificationSetting: () => storage.get('notification-setting', 'message'), setNotificationSetting: value => - storage.get('notification-setting', value), + storage.put('notification-setting', value), getAudioNotification: () => storage.get('audio-notification'), setAudioNotification: value => storage.put('audio-notification', value), @@ -819,6 +819,7 @@ console.log('background onError:', Errors.toLogFormat(error)); if ( + error && error.name === 'HTTPError' && (error.code === 401 || error.code === 403) ) { @@ -847,7 +848,7 @@ return; } - if (error.name === 'HTTPError' && error.code === -1) { + if (error && error.name === 'HTTPError' && error.code === -1) { // Failed to connect to server if (navigator.onLine) { console.log('retrying in 1 minute'); @@ -859,7 +860,7 @@ } if (ev.proto) { - if (error.name === 'MessageCounterError') { + if (error && error.name === 'MessageCounterError') { if (ev.confirm) { ev.confirm(); } @@ -870,7 +871,7 @@ const envelope = ev.proto; const message = initIncomingMessage(envelope); - await message.saveErrors(error); + await message.saveErrors(error || new Error('Error was null')); const id = message.get('conversationId'); const conversation = await ConversationController.getOrCreateAndWait( id, diff --git a/js/debug_log_start.js b/js/debug_log_start.js index e17ab912e..77143076e 100644 --- a/js/debug_log_start.js +++ b/js/debug_log_start.js @@ -5,6 +5,7 @@ $(document).on('keyup', function(e) { }); const $body = $(document.body); +$body.addClass(window.theme); // got.js appears to need this to successfully submit debug logs to the cloud window.setImmediate = window.nodeSetImmediate; diff --git a/js/permissions_popup_start.js b/js/permissions_popup_start.js index 765f35b30..397f1626f 100644 --- a/js/permissions_popup_start.js +++ b/js/permissions_popup_start.js @@ -5,6 +5,7 @@ $(document).on('keyup', function(e) { }); const $body = $(document.body); +$body.addClass(window.theme); window.view = new Whisper.ConfirmationDialogView({ message: i18n('audioPermissionNeeded'), diff --git a/js/settings_start.js b/js/settings_start.js index d8ae874ab..2cf1cc97b 100644 --- a/js/settings_start.js +++ b/js/settings_start.js @@ -5,6 +5,7 @@ $(document).on('keyup', function(e) { }); const $body = $(document.body); +$body.addClass(window.theme); const getInitialData = async () => ({ deviceName: await window.getDeviceName(), diff --git a/js/views/message_view.js b/js/views/message_view.js index 3b4a48505..8972d8af5 100644 --- a/js/views/message_view.js +++ b/js/views/message_view.js @@ -101,7 +101,9 @@ let timerMessage; const timerUpdate = this.model.get('expirationTimerUpdate'); - const prettySeconds = Whisper.ExpirationTimerOptions.getName(seconds); + const prettySeconds = Whisper.ExpirationTimerOptions.getName( + seconds || 0 + ); if ( timerUpdate && diff --git a/js/views/settings_view.js b/js/views/settings_view.js index f3713a8d8..686b2ea7c 100644 --- a/js/views/settings_view.js +++ b/js/views/settings_view.js @@ -1,5 +1,6 @@ /* global i18n: false */ /* global Whisper: false */ +/* global $: false */ /* eslint-disable no-new */ @@ -82,7 +83,14 @@ el: this.$('.theme-settings'), name: 'theme-setting', value: window.initialData.themeSetting, - setFn: window.setThemeSetting, + setFn: theme => { + $(document.body) + .removeClass('android') + .removeClass('android-dark') + .removeClass('ios') + .addClass(theme); + window.setThemeSetting(theme); + }, }); if (Settings.isAudioNotificationSupported()) { new CheckboxView({ diff --git a/libtextsecure/message_receiver.js b/libtextsecure/message_receiver.js index 0d63a78b8..f56ca963d 100644 --- a/libtextsecure/message_receiver.js +++ b/libtextsecure/message_receiver.js @@ -503,7 +503,7 @@ MessageReceiver.prototype.extend({ .catch(error => { let errorToThrow = error; - if (error.message === 'Unknown identity key') { + if (error && error.message === 'Unknown identity key') { // create an error that the UI will pick up and ask the // user if they want to re-negotiate const buffer = dcodeIO.ByteBuffer.wrap(ciphertext); diff --git a/main.js b/main.js index f0a7f208b..589c56703 100644 --- a/main.js +++ b/main.js @@ -115,7 +115,7 @@ const loadLocale = require('./app/locale').load; let logger; let locale; -function prepareURL(pathSegments) { +function prepareURL(pathSegments, moreKeys) { return url.format({ pathname: path.join.apply(null, pathSegments), protocol: 'file:', @@ -134,6 +134,7 @@ function prepareURL(pathSegments) { appInstance: process.env.NODE_APP_INSTANCE, proxyUrl: process.env.HTTPS_PROXY || process.env.https_proxy, importMode: importMode ? true : undefined, // for stringify() + ...moreKeys, }, }); } @@ -428,7 +429,7 @@ function showAbout() { } let settingsWindow; -function showSettingsWindow() { +async function showSettingsWindow() { if (settingsWindow) { settingsWindow.show(); return; @@ -437,6 +438,7 @@ function showSettingsWindow() { return; } + const theme = await pify(getDataFromMainWindow)('theme-setting'); const size = mainWindow.getSize(); const options = { width: Math.min(500, size[0]), @@ -461,7 +463,7 @@ function showSettingsWindow() { captureClicks(settingsWindow); - settingsWindow.loadURL(prepareURL([__dirname, 'settings.html'])); + settingsWindow.loadURL(prepareURL([__dirname, 'settings.html'], { theme })); settingsWindow.on('closed', () => { removeDarkOverlay(); @@ -475,12 +477,13 @@ function showSettingsWindow() { } let debugLogWindow; -function showDebugLogWindow() { +async function showDebugLogWindow() { if (debugLogWindow) { debugLogWindow.show(); return; } + const theme = await pify(getDataFromMainWindow)('theme-setting'); const size = mainWindow.getSize(); const options = { width: Math.max(size[0] - 100, MIN_WIDTH), @@ -505,7 +508,7 @@ function showDebugLogWindow() { captureClicks(debugLogWindow); - debugLogWindow.loadURL(prepareURL([__dirname, 'debug_log.html'])); + debugLogWindow.loadURL(prepareURL([__dirname, 'debug_log.html'], { theme })); debugLogWindow.on('closed', () => { removeDarkOverlay(); @@ -519,7 +522,7 @@ function showDebugLogWindow() { } let permissionsPopupWindow; -function showPermissionsPopupWindow() { +async function showPermissionsPopupWindow() { if (permissionsPopupWindow) { permissionsPopupWindow.show(); return; @@ -528,6 +531,7 @@ function showPermissionsPopupWindow() { return; } + const theme = await pify(getDataFromMainWindow)('theme-setting'); const size = mainWindow.getSize(); const options = { width: Math.min(400, size[0]), @@ -553,7 +557,7 @@ function showPermissionsPopupWindow() { captureClicks(permissionsPopupWindow); permissionsPopupWindow.loadURL( - prepareURL([__dirname, 'permissions_popup.html']) + prepareURL([__dirname, 'permissions_popup.html'], { theme }) ); permissionsPopupWindow.on('closed', () => { @@ -832,13 +836,19 @@ ipc.on('delete-all-data', () => { } }); +function getDataFromMainWindow(name, callback) { + ipc.once(`get-success-${name}`, (_event, error, value) => + callback(error, value) + ); + mainWindow.webContents.send(`get-${name}`); +} + function installSettingsGetter(name) { ipc.on(`get-${name}`, event => { if (mainWindow && mainWindow.webContents) { - ipc.once(`get-success-${name}`, (_event, error, value) => + getDataFromMainWindow(name, (error, value) => event.sender.send(`get-success-${name}`, error, value) ); - mainWindow.webContents.send(`get-${name}`); } }); } diff --git a/package.json b/package.json index ceb200874..f933cacc5 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "productName": "Signal", "description": "Private messaging from your desktop", "repository": "https://github.com/signalapp/Signal-Desktop.git", - "version": "1.14.0", + "version": "1.14.1-beta.1", "license": "GPL-3.0", "author": { "name": "Open Whisper Systems", diff --git a/permissions_popup_preload.js b/permissions_popup_preload.js index 2d44f554b..ae7e26a54 100644 --- a/permissions_popup_preload.js +++ b/permissions_popup_preload.js @@ -6,6 +6,7 @@ const config = url.parse(window.location.toString(), true).query; const { locale } = config; const localeMessages = ipcRenderer.sendSync('locale-data'); +window.theme = config.theme; window.i18n = i18n.setup(locale, localeMessages); require('./js/logging'); diff --git a/preload.js b/preload.js index d271b51fb..32bd943db 100644 --- a/preload.js +++ b/preload.js @@ -70,10 +70,6 @@ window.closeAbout = () => ipc.send('close-about'); window.updateTrayIcon = unreadCount => ipc.send('update-tray-icon', unreadCount); -ipc.on('debug-log', () => { - Whisper.events.trigger('showDebugLog'); -}); - ipc.on('set-up-with-import', () => { Whisper.events.trigger('setupWithImport'); }); diff --git a/settings_preload.js b/settings_preload.js index 3f0b0ffd2..f020ad17f 100644 --- a/settings_preload.js +++ b/settings_preload.js @@ -6,6 +6,7 @@ const config = url.parse(window.location.toString(), true).query; const { locale } = config; const localeMessages = ipcRenderer.sendSync('locale-data'); +window.theme = config.theme; window.i18n = i18n.setup(locale, localeMessages); require('./js/logging'); diff --git a/stylesheets/android-dark.scss b/stylesheets/android-dark.scss index 7b5db886e..48c9cb3ec 100644 --- a/stylesheets/android-dark.scss +++ b/stylesheets/android-dark.scss @@ -6,6 +6,10 @@ $button-dark: #ccc; $text-dark: #cccccc; $text-dark_l2: darken($text-dark, 30%); +body.android-dark { + background-color: $grey-dark; +} + .android-dark { .app-loading-screen { background-color: $grey-dark;