Skip to content

Commit

Permalink
avoid blocking and show a busy dialog when discovering token content
Browse files Browse the repository at this point in the history
use a secondary thread to do discovery of the USB token

display a busy dialog while we discover the list of certificates to get
user to understand that the client is busy

Signed-off-by: Matthieu Gallien <[email protected]>
  • Loading branch information
mgallien committed Nov 30, 2023
1 parent 8a8eadd commit 6bcada6
Show file tree
Hide file tree
Showing 9 changed files with 338 additions and 156 deletions.
1 change: 1 addition & 0 deletions resources.qrc
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
<file>src/gui/tray/TalkReplyTextField.qml</file>
<file>src/gui/tray/CallNotificationDialog.qml</file>
<file>src/gui/tray/EditFileLocallyLoadingDialog.qml</file>
<file>src/gui/tray/EncryptionTokenDiscoveryDialog.qml</file>
<file>src/gui/tray/NCBusyIndicator.qml</file>
<file>src/gui/tray/NCIconWithBackgroundImage.qml</file>
<file>src/gui/tray/NCToolTip.qml</file>
Expand Down
5 changes: 5 additions & 0 deletions src/gui/accountsettings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,11 @@ AccountSettings::AccountSettings(AccountState *accountState, QWidget *parent)
this, &AccountSettings::slotUpdateQuota);

customizeStyle();

connect(_accountState->account()->e2e(), &ClientSideEncryption::startingDiscoveryEncryptionUsbToken,
Systray::instance(), &Systray::createEncryptionTokenDiscoveryDialog);
connect(_accountState->account()->e2e(), &ClientSideEncryption::finishedDiscoveryEncryptionUsbToken,
Systray::instance(), &Systray::destroyEncryptionTokenDiscoveryDialog);
}

void AccountSettings::slotE2eEncryptionMnemonicReady()
Expand Down
28 changes: 28 additions & 0 deletions src/gui/systray.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -318,6 +318,34 @@ void Systray::createResolveConflictsDialog(const OCC::ActivityList &allConflicts
dialog.take();
}

void Systray::createEncryptionTokenDiscoveryDialog()

Check warning on line 321 in src/gui/systray.cpp

View workflow job for this annotation

GitHub Actions / build

/src/gui/systray.cpp:321:15 [readability-convert-member-functions-to-static]

method 'createEncryptionTokenDiscoveryDialog' can be made static
{
if (_encryptionTokenDiscoveryDialog) {
return;
}

qCDebug(lcSystray) << "Opening an encryption token discovery dialog...";

const auto encryptionTokenDiscoveryDialog = new QQmlComponent(_trayEngine, QStringLiteral("qrc:/qml/src/gui/tray/EncryptionTokenDiscoveryDialog.qml"));

if (encryptionTokenDiscoveryDialog->isError()) {
qCWarning(lcSystray) << encryptionTokenDiscoveryDialog->errorString();
return;
}

_encryptionTokenDiscoveryDialog = encryptionTokenDiscoveryDialog->createWithInitialProperties(QVariantMap{});
}

void Systray::destroyEncryptionTokenDiscoveryDialog()

Check warning on line 339 in src/gui/systray.cpp

View workflow job for this annotation

GitHub Actions / build

/src/gui/systray.cpp:339:15 [readability-convert-member-functions-to-static]

method 'destroyEncryptionTokenDiscoveryDialog' can be made static
{
if (!_encryptionTokenDiscoveryDialog) {
return;
}
qCDebug(lcSystray) << "Closing an encryption token discovery dialog...";
_encryptionTokenDiscoveryDialog->deleteLater();
_encryptionTokenDiscoveryDialog = nullptr;
}

bool Systray::raiseDialogs()
{
return raiseFileDetailDialogs();
Expand Down
3 changes: 3 additions & 0 deletions src/gui/systray.h
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,8 @@ public slots:
void createEditFileLocallyLoadingDialog(const QString &fileName);
void destroyEditFileLocallyLoadingDialog();
void createResolveConflictsDialog(const OCC::ActivityList &allConflicts);
void createEncryptionTokenDiscoveryDialog();
void destroyEncryptionTokenDiscoveryDialog();

void slotCurrentUserChanged();

Expand Down Expand Up @@ -188,6 +190,7 @@ private slots:

QSet<qlonglong> _callsAlreadyNotified;
QPointer<QObject> _editFileLocallyLoadingDialog;
QPointer<QObject> _encryptionTokenDiscoveryDialog;
QVector<QQuickWindow*> _fileDetailDialogs;
QQuickWindow* _tokenInitDialog = nullptr;
};
Expand Down
89 changes: 89 additions & 0 deletions src/gui/tray/EncryptionTokenDiscoveryDialog.qml
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
import QtQuick 2.15
import QtQuick.Window 2.15
import Style 1.0
import com.nextcloud.desktopclient 1.0
import QtQuick.Layouts 1.15
import QtQuick.Controls 2.15

ApplicationWindow {
id: root
flags: Qt.Dialog | Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint

color: "transparent"

width: 320
height: contentLayout.implicitHeight
modality: Qt.ApplicationModal

readonly property real fontPixelSize: Style.topLinePixelSize * 1.5
readonly property real iconWidth: fontPixelSize * 2

// TODO: Rather than setting all these palette colours manually,
// create a custom style and do it for all components globally
palette {
text: Style.ncTextColor
windowText: Style.ncTextColor
buttonText: Style.ncTextColor
brightText: Style.ncTextBrightColor
highlight: Style.lightHover
highlightedText: Style.ncTextColor
light: Style.lightHover
midlight: Style.ncSecondaryTextColor
mid: Style.darkerHover
dark: Style.menuBorder
button: Style.buttonBackgroundColor
window: Style.backgroundColor
base: Style.backgroundColor
toolTipBase: Style.backgroundColor
toolTipText: Style.ncTextColor
}

Component.onCompleted: {
Systray.forceWindowInit(root);
x = Screen.width / 2 - width / 2
y = Screen.height / 2 - height / 2
root.show();
root.raise();
root.requestActivate();
}

Rectangle {
id: windowBackground
color: Style.backgroundColor
radius: Style.trayWindowRadius
border.color: palette.dark
anchors.fill: parent
}

ColumnLayout {
id: contentLayout
anchors.left: parent.left
anchors.right: parent.right
anchors.leftMargin: Style.standardSpacing
anchors.rightMargin: Style.standardSpacing
spacing: Style.standardSpacing

NCBusyIndicator {
id: busyIndicator
Layout.topMargin: Style.standardSpacing
Layout.alignment: Qt.AlignHCenter
Layout.preferredWidth: root.iconWidth
Layout.preferredHeight: root.iconWidth
imageSourceSizeHeight: root.iconWidth
imageSourceSizeWidth: root.iconWidth
padding: 0
color: palette.windowText
running: true
}
EnforcedPlainTextLabel {
id: labelMessage
Layout.alignment: Qt.AlignHCenter
Layout.fillWidth: true
Layout.bottomMargin: Style.standardSpacing
text: qsTr("Discovering the certificates stored on your USB token")
elide: Text.ElideRight
font.pixelSize: root.fontPixelSize
horizontalAlignment: Text.AlignHCenter
}
}
}
Loading

0 comments on commit 6bcada6

Please sign in to comment.