diff --git a/_locales/en/messages.json b/_locales/en/messages.json
index 1a3cc802e74..9d5e246850e 100644
--- a/_locales/en/messages.json
+++ b/_locales/en/messages.json
@@ -139,10 +139,6 @@
"message": "Toggle Developer Tools",
"description": "View menu command to show or hide the developer tools"
},
- "menuSetupWithImport": {
- "message": "Set Up with Import",
- "description": "When the application is not yet set up, menu option to start up the import sequence"
- },
"menuSetupAsNewDevice": {
"message": "Set Up as New Device",
"description": "When the application is not yet set up, menu option to start up the set up as fresh device"
diff --git a/app/menu.js b/app/menu.js
index 74bc4ed1b55..a87d16ab202 100644
--- a/app/menu.js
+++ b/app/menu.js
@@ -14,7 +14,6 @@ exports.createTemplate = (options, messages) => {
platform,
setupAsNewDevice,
setupAsStandalone,
- setupWithImport,
showAbout,
showDebugLog,
showKeyboardShortcuts,
@@ -190,10 +189,6 @@ exports.createTemplate = (options, messages) => {
label: messages.menuSetupAsNewDevice.message,
click: setupAsNewDevice,
});
- fileMenu.submenu.unshift({
- label: messages.menuSetupWithImport.message,
- click: setupWithImport,
- });
}
if (platform === 'darwin') {
diff --git a/background.html b/background.html
index 9d3731b71d6..2b6e6aebcfa 100644
--- a/background.html
+++ b/background.html
@@ -219,82 +219,6 @@
{{/isStep2}}
-
-
-
diff --git a/js/background.js b/js/background.js
index baf7a53ad2a..c97defeff49 100644
--- a/js/background.js
+++ b/js/background.js
@@ -382,10 +382,7 @@
showStickerPack: async (packId, key) => {
// We can get these events even if the user has never linked this instance.
- if (
- Whisper.Import.isIncomplete() ||
- !window.Signal.Util.Registration.everDone()
- ) {
+ if (!window.Signal.Util.Registration.everDone()) {
return;
}
@@ -1287,13 +1284,6 @@
});
}
- Whisper.events.on('setupWithImport', () => {
- const { appView } = window.owsDesktopApp;
- if (appView) {
- appView.openImporter();
- }
- });
-
Whisper.events.on('setupAsNewDevice', () => {
const { appView } = window.owsDesktopApp;
if (appView) {
@@ -1382,10 +1372,7 @@
Whisper.ExpiringMessagesListener.init(Whisper.events);
Whisper.TapToViewMessagesListener.init(Whisper.events);
- if (Whisper.Import.isIncomplete()) {
- window.log.info('Import was interrupted, showing import error screen');
- appView.openImporter();
- } else if (window.Signal.Util.Registration.everDone()) {
+ if (window.Signal.Util.Registration.everDone()) {
// listeners
Whisper.RotateSignedPreKeyListener.init(Whisper.events, newVersion);
window.Signal.RefreshSenderCertificate.initialize({
@@ -1399,8 +1386,6 @@
appView.openInbox({
initialLoadComplete,
});
- } else if (window.isImportMode()) {
- appView.openImporter();
} else {
appView.openInstaller();
}
@@ -1513,9 +1498,6 @@
if (!window.Signal.Util.Registration.everDone()) {
return;
}
- if (Whisper.Import.isIncomplete()) {
- return;
- }
if (messageReceiver) {
await messageReceiver.stopProcessing();
@@ -1685,17 +1667,6 @@
);
});
}
-
- if (Whisper.Import.isComplete()) {
- wrap(
- textsecure.messaging.sendRequestConfigurationSyncMessage(sendOptions)
- ).catch(error => {
- window.log.error(
- 'Import complete, but failed to send sync message',
- error && error.stack ? error.stack : error
- );
- });
- }
}
storage.onready(async () => {
diff --git a/js/modules/backup.js b/js/modules/backup.js
index 46dde74f74b..4c8e4a24588 100644
--- a/js/modules/backup.js
+++ b/js/modules/backup.js
@@ -866,25 +866,25 @@ async function exportConversations(options) {
window.log.info('Done exporting conversations!');
}
-function getDirectory(options = {}) {
- return new Promise((resolve, reject) => {
- const browserWindow = BrowserWindow.getFocusedWindow();
- const dialogOptions = {
- title: options.title,
- properties: ['openDirectory'],
- buttonLabel: options.buttonLabel,
- };
+async function getDirectory(options = {}) {
+ const browserWindow = BrowserWindow.getFocusedWindow();
+ const dialogOptions = {
+ title: options.title,
+ properties: ['openDirectory'],
+ buttonLabel: options.buttonLabel,
+ };
- dialog.showOpenDialog(browserWindow, dialogOptions, directory => {
- if (!directory || !directory[0]) {
- const error = new Error('Error choosing directory');
- error.name = 'ChooseError';
- return reject(error);
- }
+ const { canceled, filePaths } = await dialog.showOpenDialog(
+ browserWindow,
+ dialogOptions
+ );
+ if (canceled || !filePaths || !filePaths[0]) {
+ const error = new Error('Error choosing directory');
+ error.name = 'ChooseError';
+ throw error;
+ }
- return resolve(directory[0]);
- });
- });
+ return filePaths[0];
}
function getDirContents(dir) {
diff --git a/js/views/app_view.js b/js/views/app_view.js
index e616cc5e711..71be3fd4b1a 100644
--- a/js/views/app_view.js
+++ b/js/views/app_view.js
@@ -66,40 +66,8 @@
this.debugLogView = null;
}
},
- openImporter() {
- window.addSetupMenuItems();
- this.resetViews();
-
- const importView = new Whisper.ImportView();
- this.importView = importView;
-
- this.listenTo(
- importView,
- 'light-import',
- this.finishLightImport.bind(this)
- );
- this.openView(this.importView);
- },
- finishLightImport() {
- const options = {
- hasExistingData: true,
- };
- this.openInstaller(options);
- },
- closeImporter() {
- if (this.importView) {
- this.importView.remove();
- this.importView = null;
- }
- },
openInstaller(options = {}) {
- // If we're in the middle of import, we don't want to show the menu options
- // allowing the user to switch to other ways to set up the app. If they
- // switched back and forth in the middle of a light import, they'd lose all
- // that imported data.
- if (!options.hasExistingData) {
- window.addSetupMenuItems();
- }
+ window.addSetupMenuItems();
this.resetViews();
const installView = new Whisper.InstallView(options);
@@ -129,7 +97,6 @@
},
resetViews() {
this.closeInstaller();
- this.closeImporter();
this.closeStandalone();
},
openInbox(options = {}) {
diff --git a/js/views/import_view.js b/js/views/import_view.js
deleted file mode 100644
index ee1d88cbbc2..00000000000
--- a/js/views/import_view.js
+++ /dev/null
@@ -1,212 +0,0 @@
-/* global Whisper, storage, i18n, ConversationController */
-
-/* eslint-disable more/no-then */
-
-// eslint-disable-next-line func-names
-(function() {
- 'use strict';
-
- window.Whisper = window.Whisper || {};
-
- const State = {
- IMPORTING: 1,
- COMPLETE: 2,
- LIGHT_COMPLETE: 3,
- };
-
- const IMPORT_STARTED = 'importStarted';
- const IMPORT_COMPLETE = 'importComplete';
- const IMPORT_LOCATION = 'importLocation';
-
- Whisper.Import = {
- isStarted() {
- return Boolean(storage.get(IMPORT_STARTED));
- },
- isComplete() {
- return Boolean(storage.get(IMPORT_COMPLETE));
- },
- isIncomplete() {
- return this.isStarted() && !this.isComplete();
- },
- start() {
- return storage.put(IMPORT_STARTED, true);
- },
- complete() {
- return storage.put(IMPORT_COMPLETE, true);
- },
- saveLocation(location) {
- return storage.put(IMPORT_LOCATION, location);
- },
- reset() {
- return window.Signal.Data.removeAll();
- },
- };
-
- Whisper.ImportView = Whisper.View.extend({
- templateName: 'import-flow-template',
- className: 'full-screen-flow',
- events: {
- 'click .choose': 'onImport',
- 'click .restart': 'onRestart',
- 'click .cancel': 'onCancel',
- 'click .register': 'onRegister',
- },
- initialize() {
- if (Whisper.Import.isIncomplete()) {
- this.error = true;
- }
-
- this.render();
- this.pending = Promise.resolve();
- },
- render_attributes() {
- if (this.error) {
- return {
- isError: true,
- errorHeader: i18n('importErrorHeader'),
- errorMessageFirst: i18n('importErrorFirst'),
- errorMessageSecond: i18n('importErrorSecond'),
- chooseButton: i18n('importAgain'),
- };
- }
-
- let restartButton = i18n('importCompleteStartButton');
- let registerButton = i18n('importCompleteLinkButton');
- let step = 'step2';
-
- if (this.state === State.IMPORTING) {
- step = 'step3';
- } else if (this.state === State.COMPLETE) {
- registerButton = null;
- step = 'step4';
- } else if (this.state === State.LIGHT_COMPLETE) {
- restartButton = null;
- step = 'step4';
- }
-
- return {
- isStep2: step === 'step2',
- chooseHeader: i18n('loadDataHeader'),
- choose: i18n('loadDataDescription'),
- chooseButton: i18n('chooseDirectory'),
-
- isStep3: step === 'step3',
- importingHeader: i18n('importingHeader'),
-
- isStep4: step === 'step4',
- completeHeader: i18n('importCompleteHeader'),
- restartButton,
- registerButton,
- };
- },
- onRestart() {
- return window.restart();
- },
- onCancel() {
- this.trigger('cancel');
- },
- onImport() {
- window.Signal.Backup.getDirectoryForImport().then(
- directory => {
- this.doImport(directory);
- },
- error => {
- if (error.name !== 'ChooseError') {
- window.log.error(
- 'Error choosing directory:',
- error && error.stack ? error.stack : error
- );
- }
- }
- );
- },
- onRegister() {
- // AppView listens for this, and opens up InstallView to the QR code step to
- // finish setting this device up.
- this.trigger('light-import');
- },
-
- doImport(directory) {
- window.removeSetupMenuItems();
-
- this.error = null;
- this.state = State.IMPORTING;
- this.render();
-
- // Wait for prior database interaction to complete
- this.pending = this.pending
- .then(() =>
- // For resilience to interruption, clear database both before and on failure
- Whisper.Import.reset()
- )
- .then(() =>
- Promise.all([
- Whisper.Import.start(),
- window.Signal.Backup.importFromDirectory(directory),
- ])
- )
- .then(results => {
- const importResult = results[1];
-
- // A full import changes so much we need a restart of the app
- if (importResult.fullImport) {
- return this.finishFullImport(directory);
- }
-
- // A light import just brings in contacts, groups, and messages. And we need a
- // normal link to finish the process.
- return this.finishLightImport(directory);
- })
- .catch(error => {
- window.log.error(
- 'Error importing:',
- error && error.stack ? error.stack : error
- );
-
- this.error = error || new Error('Something went wrong!');
- this.state = null;
- this.render();
-
- return Whisper.Import.reset();
- });
- },
- finishLightImport(directory) {
- ConversationController.reset();
-
- return ConversationController.load()
- .then(() =>
- Promise.all([
- Whisper.Import.saveLocation(directory),
- Whisper.Import.complete(),
- ])
- )
- .then(() => {
- this.state = State.LIGHT_COMPLETE;
- this.render();
- });
- },
- finishFullImport(directory) {
- // Catching in-memory cache up with what's in indexeddb now...
- // NOTE: this fires storage.onready, listened to across the app. We'll restart
- // to complete the install to start up cleanly with everything now in the DB.
- return storage
- .fetch()
- .then(() =>
- Promise.all([
- // Clearing any migration-related state inherited from the Chrome App
- storage.remove('migrationState'),
- storage.remove('migrationEnabled'),
- storage.remove('migrationEverCompleted'),
- storage.remove('migrationStorageLocation'),
-
- Whisper.Import.saveLocation(directory),
- Whisper.Import.complete(),
- ])
- )
- .then(() => {
- this.state = State.COMPLETE;
- this.render();
- });
- },
- });
-})();
diff --git a/main.js b/main.js
index c8e26757a9a..8e413526b84 100644
--- a/main.js
+++ b/main.js
@@ -468,12 +468,6 @@ function showKeyboardShortcuts() {
}
}
-function setupWithImport() {
- if (mainWindow) {
- mainWindow.webContents.send('set-up-with-import');
- }
-}
-
function setupAsNewDevice() {
if (mainWindow) {
mainWindow.webContents.send('set-up-as-new-device');
@@ -890,7 +884,6 @@ function setupMenu(options) {
openSupportPage,
openForums,
platform,
- setupWithImport,
setupAsNewDevice,
setupAsStandalone,
};
diff --git a/preload.js b/preload.js
index 22876cceb8f..c2f4f05cec8 100644
--- a/preload.js
+++ b/preload.js
@@ -30,7 +30,6 @@ try {
window.getEnvironment = () => config.environment;
window.getAppInstance = () => config.appInstance;
window.getVersion = () => config.version;
- window.isImportMode = () => config.importMode;
window.getExpiration = () => config.buildExpiration;
window.getNodeVersion = () => config.node_version;
window.getHostName = () => config.hostname;
@@ -106,10 +105,6 @@ try {
window.updateTrayIcon = unreadCount =>
ipc.send('update-tray-icon', unreadCount);
- ipc.on('set-up-with-import', () => {
- Whisper.events.trigger('setupWithImport');
- });
-
ipc.on('set-up-as-new-device', () => {
Whisper.events.trigger('setupAsNewDevice');
});
diff --git a/prepare_import_build.js b/prepare_import_build.js
deleted file mode 100644
index 4fb59e55a7e..00000000000
--- a/prepare_import_build.js
+++ /dev/null
@@ -1,74 +0,0 @@
-/* eslint-disable no-console */
-
-const fs = require('fs');
-const _ = require('lodash');
-
-const packageJson = require('./package.json');
-const defaultConfig = require('./config/default.json');
-
-function checkValue(object, objectPath, expected) {
- const actual = _.get(object, objectPath);
- if (actual !== expected) {
- throw new Error(`${objectPath} was ${actual}; expected ${expected}`);
- }
-}
-
-// You might be wondering why this file is necessary. We have some very specific
-// requirements around our import-flavor builds. They need to look exactly the same as
-// normal builds, but they must immediately open into import mode. So they need a
-// slight config tweak, and then a change to the .app/.exe name (note: we do NOT want to
-// change where data is stored or anything, since that would make these builds
-// incompatible with the mainline builds) So we just change the artifact name.
-//
-// Another key thing to know about these builds is that we should not upload the
-// latest.yml (windows) and latest-mac.yml (mac) that go along with the executables.
-// This would interrupt the normal install flow for users installing from
-// signal.org/download. So any release script will need to upload these files manually
-// instead of relying on electron-builder, which will upload everything.
-
-// -------
-
-console.log('prepare_import_build: updating config/default.json');
-
-const IMPORT_PATH = 'import';
-const IMPORT_START_VALUE = false;
-const IMPORT_END_VALUE = true;
-
-checkValue(defaultConfig, IMPORT_PATH, IMPORT_START_VALUE);
-
-_.set(defaultConfig, IMPORT_PATH, IMPORT_END_VALUE);
-
-// -------
-
-console.log('prepare_import_build: updating package.json');
-
-const MAC_ASSET_PATH = 'build.mac.artifactName';
-// eslint-disable-next-line no-template-curly-in-string
-const MAC_ASSET_START_VALUE = '${name}-mac-${version}.${ext}';
-// eslint-disable-next-line no-template-curly-in-string
-const MAC_ASSET_END_VALUE = '${name}-mac-${version}-import.${ext}';
-
-const WIN_ASSET_PATH = 'build.win.artifactName';
-// eslint-disable-next-line no-template-curly-in-string
-const WIN_ASSET_START_VALUE = '${name}-win-${version}.${ext}';
-// eslint-disable-next-line no-template-curly-in-string
-const WIN_ASSET_END_VALUE = '${name}-win-${version}-import.${ext}';
-
-checkValue(packageJson, MAC_ASSET_PATH, MAC_ASSET_START_VALUE);
-checkValue(packageJson, WIN_ASSET_PATH, WIN_ASSET_START_VALUE);
-
-_.set(packageJson, MAC_ASSET_PATH, MAC_ASSET_END_VALUE);
-_.set(packageJson, WIN_ASSET_PATH, WIN_ASSET_END_VALUE);
-
-const MAC_BUILD_TARGET = 'build.mac.target';
-const MAC_BUILD_TARGET_END_VALUE = ['dmg'];
-
-_.set(packageJson, MAC_BUILD_TARGET, MAC_BUILD_TARGET_END_VALUE);
-
-// ---
-
-fs.writeFileSync(
- './config/default.json',
- JSON.stringify(defaultConfig, null, ' ')
-);
-fs.writeFileSync('./package.json', JSON.stringify(packageJson, null, ' '));
diff --git a/test/app/fixtures/menu-mac-os-setup.json b/test/app/fixtures/menu-mac-os-setup.json
index aa619394f56..aab31348004 100644
--- a/test/app/fixtures/menu-mac-os-setup.json
+++ b/test/app/fixtures/menu-mac-os-setup.json
@@ -41,10 +41,6 @@
{
"label": "&File",
"submenu": [
- {
- "label": "Set Up with Import",
- "click": null
- },
{
"label": "Set Up as New Device",
"click": null
diff --git a/test/app/fixtures/menu-windows-linux-setup.json b/test/app/fixtures/menu-windows-linux-setup.json
index 258130862cf..34802bc692b 100644
--- a/test/app/fixtures/menu-windows-linux-setup.json
+++ b/test/app/fixtures/menu-windows-linux-setup.json
@@ -2,10 +2,6 @@
{
"label": "&File",
"submenu": [
- {
- "label": "Set Up with Import",
- "click": null
- },
{
"label": "Set Up as New Device",
"click": null
diff --git a/test/app/menu_test.js b/test/app/menu_test.js
index 17660564796..013c4bfab3e 100644
--- a/test/app/menu_test.js
+++ b/test/app/menu_test.js
@@ -54,7 +54,6 @@ describe('SignalMenu', () => {
includeSetup,
setupAsNewDevice: null,
setupAsStandalone: null,
- setupWithImport: null,
showAbout: null,
showDebugLog: null,
showKeyboardShortcuts: null,
diff --git a/test/index.html b/test/index.html
index 1b5aae59275..8a0174a9030 100644
--- a/test/index.html
+++ b/test/index.html
@@ -229,82 +229,6 @@
{{/isStep2}}
-
-