diff --git a/client/core/controllers/serverController.cpp b/client/core/controllers/serverController.cpp index 6bcb890e..7f3b240b 100644 --- a/client/core/controllers/serverController.cpp +++ b/client/core/controllers/serverController.cpp @@ -634,9 +634,9 @@ QString ServerController::checkSshConnection(const ServerCredentials &credential return stdOut; } -void ServerController::setCancelInstallation(const bool cancel) +void ServerController::cancelInstallation() { - m_cancelInstallation = cancel; + m_cancelInstallation = true; } ErrorCode ServerController::setupServerFirewall(const ServerCredentials &credentials) @@ -737,6 +737,7 @@ ErrorCode ServerController::isUserInSudo(const ServerCredentials &credentials, D ErrorCode ServerController::isServerDpkgBusy(const ServerCredentials &credentials, DockerContainer container) { + m_cancelInstallation = false; QString stdOut; auto cbReadStdOut = [&](const QString &data, libssh::Client &) { stdOut += data + "\n"; @@ -784,7 +785,6 @@ ErrorCode ServerController::isServerDpkgBusy(const ServerCredentials &credential watcher.setFuture(future); wait.exec(); - m_cancelInstallation = false; emit serverIsBusy(false); return future.result(); diff --git a/client/core/controllers/serverController.h b/client/core/controllers/serverController.h index ea6fd001..175d96da 100644 --- a/client/core/controllers/serverController.h +++ b/client/core/controllers/serverController.h @@ -56,7 +56,7 @@ public: QString checkSshConnection(const ServerCredentials &credentials, ErrorCode *errorCode = nullptr); - void setCancelInstallation(const bool cancel); + void cancelInstallation(); ErrorCode getDecryptedPrivateKey(const ServerCredentials &credentials, QString &decryptedPrivateKey, const std::function &callback); diff --git a/client/ui/controllers/connectionController.cpp b/client/ui/controllers/connectionController.cpp index 81bba3bf..25bebfb1 100644 --- a/client/ui/controllers/connectionController.cpp +++ b/client/ui/controllers/connectionController.cpp @@ -108,6 +108,8 @@ void ConnectionController::onCurrentContainerUpdated() if (m_isConnected || m_isConnectionInProgress) { emit reconnectWithUpdatedContainer(tr("Settings updated successfully, Reconnnection...")); openConnection(); + } else { + emit reconnectWithUpdatedContainer(tr("Settings updated successfully")); } } diff --git a/client/ui/controllers/installController.cpp b/client/ui/controllers/installController.cpp index 77e25f43..d4582429 100644 --- a/client/ui/controllers/installController.cpp +++ b/client/ui/controllers/installController.cpp @@ -130,6 +130,7 @@ void InstallController::installServer(DockerContainer container, QJsonObject &co { ServerController serverController(m_settings); connect(&serverController, &ServerController::serverIsBusy, this, &InstallController::serverIsBusy); + connect(this, &InstallController::cancelInstallation, &serverController, &ServerController::cancelInstallation); QMap installedContainers; ErrorCode errorCode = @@ -181,6 +182,7 @@ void InstallController::installContainer(DockerContainer container, QJsonObject ServerController serverController(m_settings); connect(&serverController, &ServerController::serverIsBusy, this, &InstallController::serverIsBusy); + connect(this, &InstallController::cancelInstallation, &serverController, &ServerController::cancelInstallation); QMap installedContainers; ErrorCode errorCode = serverController.getAlreadyInstalledContainers(serverCredentials, installedContainers); @@ -274,6 +276,7 @@ void InstallController::updateContainer(QJsonObject config) ServerController serverController(m_settings); connect(&serverController, &ServerController::serverIsBusy, this, &InstallController::serverIsBusy); + connect(this, &InstallController::cancelInstallation, &serverController, &ServerController::cancelInstallation); auto errorCode = serverController.updateContainer(serverCredentials, container, oldContainerConfig, config); if (errorCode == ErrorCode::NoError) { diff --git a/client/ui/controllers/installController.h b/client/ui/controllers/installController.h index a5fd2875..cd0e6b22 100644 --- a/client/ui/controllers/installController.h +++ b/client/ui/controllers/installController.h @@ -65,6 +65,7 @@ signals: void passphraseRequestFinished(); void serverIsBusy(const bool isBusy); + void cancelInstallation(); void currentContainerUpdated(); diff --git a/client/ui/qml/Pages2/PageProtocolAwgSettings.qml b/client/ui/qml/Pages2/PageProtocolAwgSettings.qml index 237a8b46..a4f5abe3 100644 --- a/client/ui/qml/Pages2/PageProtocolAwgSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolAwgSettings.qml @@ -312,9 +312,8 @@ PageType { onClicked: { forceActiveFocus() - PageController.showBusyIndicator(true) + PageController.goToPage(PageEnum.PageSetupWizardInstalling); InstallController.updateContainer(AwgConfigModel.getConfig()) - PageController.showBusyIndicator(false) } } } diff --git a/client/ui/qml/Pages2/PageProtocolCloakSettings.qml b/client/ui/qml/Pages2/PageProtocolCloakSettings.qml index 78e666a7..98e9c28f 100644 --- a/client/ui/qml/Pages2/PageProtocolCloakSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolCloakSettings.qml @@ -4,6 +4,8 @@ import QtQuick.Layouts import SortFilterProxyModel 0.2 +import PageEnum 1.0 + import "./" import "../Controls2" import "../Controls2/TextTypes" @@ -160,9 +162,8 @@ PageType { onClicked: { forceActiveFocus() - PageController.showBusyIndicator(true) + PageController.goToPage(PageEnum.PageSetupWizardInstalling); InstallController.updateContainer(CloakConfigModel.getConfig()) - PageController.showBusyIndicator(false) } } } diff --git a/client/ui/qml/Pages2/PageProtocolOpenVpnSettings.qml b/client/ui/qml/Pages2/PageProtocolOpenVpnSettings.qml index 55cdcf04..971f9f39 100644 --- a/client/ui/qml/Pages2/PageProtocolOpenVpnSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolOpenVpnSettings.qml @@ -390,9 +390,8 @@ PageType { onClicked: { forceActiveFocus() - PageController.showBusyIndicator(true) + PageController.goToPage(PageEnum.PageSetupWizardInstalling); InstallController.updateContainer(OpenVpnConfigModel.getConfig()) - PageController.showBusyIndicator(false) } } } diff --git a/client/ui/qml/Pages2/PageProtocolShadowSocksSettings.qml b/client/ui/qml/Pages2/PageProtocolShadowSocksSettings.qml index 2453281f..573aca06 100644 --- a/client/ui/qml/Pages2/PageProtocolShadowSocksSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolShadowSocksSettings.qml @@ -4,6 +4,8 @@ import QtQuick.Layouts import SortFilterProxyModel 0.2 +import PageEnum 1.0 + import "./" import "../Controls2" import "../Controls2/TextTypes" @@ -138,9 +140,8 @@ PageType { onClicked: { forceActiveFocus() - PageController.showBusyIndicator(true) + PageController.goToPage(PageEnum.PageSetupWizardInstalling); InstallController.updateContainer(ShadowSocksConfigModel.getConfig()) - PageController.showBusyIndicator(false) } } } diff --git a/client/ui/qml/Pages2/PageSetupWizardInstalling.qml b/client/ui/qml/Pages2/PageSetupWizardInstalling.qml index f7e82692..9811d87d 100644 --- a/client/ui/qml/Pages2/PageSetupWizardInstalling.qml +++ b/client/ui/qml/Pages2/PageSetupWizardInstalling.qml @@ -19,6 +19,7 @@ PageType { property bool isTimerRunning: true property string progressBarText: qsTr("Usually it takes no more than 5 minutes") + property bool isCancelButtonVisible: false Connections { target: InstallController @@ -61,11 +62,13 @@ PageType { function onServerIsBusy(isBusy) { if (isBusy) { + root.isCancelButtonVisible = true root.progressBarText = qsTr("Amnezia has detected that your server is currently ") + qsTr("busy installing other software. Amnezia installation ") + qsTr("will pause until the server finishes installing other software") root.isTimerRunning = false } else { + root.isCancelButtonVisible = false root.progressBarText = qsTr("Usually it takes no more than 5 minutes") root.isTimerRunning = true } @@ -150,6 +153,22 @@ PageType { text: root.progressBarText } + + BasicButtonType { + id: cancelIntallationButton + + Layout.fillWidth: true + Layout.topMargin: 24 + + visible: root.isCancelButtonVisible + + text: qsTr("Cancel installation") + + onClicked: { + InstallController.cancelInstallation() + PageController.showBusyIndicator(true) + } + } } } } diff --git a/client/ui/qml/Pages2/PageSetupWizardStart.qml b/client/ui/qml/Pages2/PageSetupWizardStart.qml index 994ec200..2f89bc57 100644 --- a/client/ui/qml/Pages2/PageSetupWizardStart.qml +++ b/client/ui/qml/Pages2/PageSetupWizardStart.qml @@ -60,6 +60,7 @@ PageType { target: InstallController function onInstallationErrorOccurred(errorMessage) { + PageController.showBusyIndicator(false) PageController.showErrorMessage(errorMessage) var currentPageName = stackView.currentItem.objectName diff --git a/client/ui/qml/Pages2/PageStart.qml b/client/ui/qml/Pages2/PageStart.qml index ab02ace4..3afdf73a 100644 --- a/client/ui/qml/Pages2/PageStart.qml +++ b/client/ui/qml/Pages2/PageStart.qml @@ -82,6 +82,7 @@ PageType { target: InstallController function onInstallationErrorOccurred(errorMessage) { + PageController.showBusyIndicator(false) PageController.showErrorMessage(errorMessage) var needCloseCurrentPage = false @@ -99,6 +100,7 @@ PageType { function onUpdateContainerFinished(message) { PageController.showNotificationMessage(message) + PageController.closePage() } } @@ -107,6 +109,7 @@ PageType { function onReconnectWithUpdatedContainer(message) { PageController.showNotificationMessage(message) + PageController.closePage() } }