diff --git a/selfdrive/ui/qt/widgets/ssh_keys.cc b/selfdrive/ui/qt/widgets/ssh_keys.cc index 64c1a67b02..0e988f5af3 100644 --- a/selfdrive/ui/qt/widgets/ssh_keys.cc +++ b/selfdrive/ui/qt/widgets/ssh_keys.cc @@ -1,12 +1,20 @@ +#include +#include #include #include #include #include #include -#include "common/params.h" #include "widgets/ssh_keys.hpp" #include "widgets/input_field.hpp" +#include "common/params.h" + +QWidget* layout_to_widget(QLayout* l){ + QWidget* q = new QWidget; + q->setLayout(l); + return q; +} SSH::SSH(QWidget* parent) : QWidget(parent){ // init variables @@ -16,24 +24,37 @@ SSH::SSH(QWidget* parent) : QWidget(parent){ networkTimer->setInterval(5000); connect(networkTimer, SIGNAL(timeout()), this, SLOT(timeout())); - // Layout on entering - QVBoxLayout* main_layout = new QVBoxLayout; - main_layout->setMargin(50); + // Construct the layouts to display + slayout = new QStackedLayout(this); // Initial screen, input, waiting for response + + //Layout on entering + QVBoxLayout* initialLayout = new QVBoxLayout; + initialLayout->setContentsMargins(80, 80, 80, 80); + + QHBoxLayout* header = new QHBoxLayout; QPushButton* exitButton = new QPushButton("BACK", this); exitButton->setFixedSize(500, 100); - main_layout->addWidget(exitButton, 0, Qt::AlignLeft | Qt::AlignTop); - connect(exitButton, SIGNAL(released()), this, SIGNAL(closeSSHSettings())); + header->addWidget(exitButton, 0, Qt::AlignLeft | Qt::AlignTop); + initialLayout->addWidget(layout_to_widget(header)); - QLabel* wallOfText = new QLabel("Warning: This grants SSH access to all public keys in your GitHub settings. Never enter a GitHub username other than your own."); - wallOfText->setAlignment(Qt::AlignHCenter); + QLabel* title = new QLabel("Authorize SSH keys"); + title->setStyleSheet(R"(font-size: 75px;)"); + header->addWidget(title, 0, Qt::AlignRight | Qt::AlignTop); + + QLabel* wallOfText = new QLabel("Warning: This grants SSH access to all public keys in your GitHub settings. Never enter a GitHub username other than your own. A Comma employee will NEVER ask you to add their GitHub username."); wallOfText->setWordWrap(true); wallOfText->setStyleSheet(R"(font-size: 60px;)"); - main_layout->addWidget(wallOfText, 0); + initialLayout->addWidget(wallOfText, 0); QPushButton* actionButton = new QPushButton; actionButton->setFixedHeight(100); - main_layout->addWidget(actionButton, 0, Qt::AlignBottom); + initialLayout->addWidget(actionButton, 0, Qt::AlignBottom); + + slayout->addWidget(layout_to_widget(initialLayout)); + + QLabel* loading = new QLabel("Loading SSH keys from GitHub."); + slayout->addWidget(loading); setStyleSheet(R"( QPushButton { @@ -45,61 +66,66 @@ SSH::SSH(QWidget* parent) : QWidget(parent){ background-color: #444444; } )"); - setLayout(main_layout); + setLayout(slayout); - // Initialize the state machine and states + + //Initialize the state machine and states QStateMachine* state = new QStateMachine(this); QState* initialState = new QState(); //State when entering the widget QState* initialStateNoGithub = new QState(); //Starting state, key not connected QState* initialStateConnected = new QState(); //Starting state, ssh connected - QState* removeSSH_State = new QState(); // State when user wants to remove the SSH keys + QState* quitState = new QState(); // State when exiting the widget + QState* removeSSH_State = new QState(); // State when user wants to remove the SSH keys + QState* defaultInputFieldState = new QState(); // State when we want the user to give us the username QState* loadingState = new QState(); // State while waiting for the network response + // Adding states to the state machine and adding the transitions state->addState(initialState); - connect(initialState, &QState::entered, [=](){ - checkForSSHKey(); - }); + connect(initialState, &QState::entered, [=](){checkForSSHKey(); slayout->setCurrentIndex(0);}); initialState->addTransition(this, &SSH::NoSSHAdded, initialStateNoGithub); initialState->addTransition(this, &SSH::SSHAdded, initialStateConnected); + + + state->addState(quitState); + connect(quitState, &QState::entered, [=](){emit closeSSHSettings();}); + quitState->addTransition(quitState, &QState::entered, initialState); state->addState(initialStateConnected); - connect(initialStateConnected, &QState::entered, [=](){ - actionButton->setText("Clear SSH keys"); - actionButton->setStyleSheet(R"(background-color: #750c0c;)"); - }); + connect(initialStateConnected, &QState::entered, [=](){actionButton->setText("Remove GitHub SSH keys"); actionButton->setStyleSheet(R"(background-color: #750c0c;)");}); + initialStateConnected->addTransition(exitButton, &QPushButton::released, quitState); initialStateConnected->addTransition(actionButton, &QPushButton::released, removeSSH_State); state->addState(removeSSH_State); - connect(removeSSH_State, &QState::entered, [=](){ - Params().delete_db_value("GithubSshKeys"); - }); + connect(removeSSH_State, &QState::entered, [=](){Params().delete_db_value("GithubSshKeys");}); removeSSH_State->addTransition(removeSSH_State, &QState::entered, initialState); state->addState(initialStateNoGithub); - connect(initialStateNoGithub, &QState::entered, [=](){ - actionButton->setText("Link GitHub SSH keys"); - actionButton->setStyleSheet(R"(background-color: #444444;)"); + connect(initialStateNoGithub, &QState::entered, [=](){actionButton->setText("Link GitHub SSH keys"); actionButton->setStyleSheet(R"(background-color: #444444;)");}); + initialStateNoGithub->addTransition(exitButton, &QPushButton::released, quitState); + initialStateNoGithub->addTransition(actionButton, &QPushButton::released, defaultInputFieldState); + connect(actionButton, &QPushButton::released, [=](){inputFieldMessage = "Enter your GitHub username";}); + + state->addState(defaultInputFieldState); + connect(defaultInputFieldState, &QState::entered, [=](){ + QString user = InputDialog::getText(inputFieldMessage); + if (user.length()) { + emit inputFieldEmitText(user); + } else { + emit inputFieldCancelled(); + } }); - initialStateNoGithub->addTransition(actionButton, &QPushButton::released, loadingState); + connect(this, &SSH::inputFieldEmitText, [=](QString a){usernameGitHub = a;}); // Store the string the user provided + defaultInputFieldState->addTransition(this, &SSH::inputFieldCancelled, initialState); + defaultInputFieldState->addTransition(this, &SSH::inputFieldEmitText, loadingState); state->addState(loadingState); - connect(loadingState, &QState::entered, [=](){ - QString user = InputDialog::getText("Enter your GitHub username"); - if (user.size()) { - getSSHKeys(user); - } - }); - connect(this, &SSH::failedResponse, [=](QString message){ - QString user = InputDialog::getText(message); - if (user.size()) { - getSSHKeys(user); - } - }); - loadingState->addTransition(loadingState, &QState::entered, initialState); - loadingState->addTransition(this, &SSH::failedResponse, initialState); + connect(loadingState, &QState::entered, [=](){slayout->setCurrentIndex(1); getSSHKeys();}); + connect(this, &SSH::failedResponse, [=](QString message){inputFieldMessage = message;}); + loadingState->addTransition(this, &SSH::failedResponse, defaultInputFieldState); loadingState->addTransition(this, &SSH::gotSSHKeys, initialState); + state->setInitialState(initialState); state->start(); } @@ -113,8 +139,8 @@ void SSH::checkForSSHKey(){ } } -void SSH::getSSHKeys(QString username){ - QString url = "https://github.com/" + username + ".keys"; +void SSH::getSSHKeys(){ + QString url = "https://github.com/" + usernameGitHub + ".keys"; aborted = false; reply = manager->get(QNetworkRequest(QUrl(url))); connect(reply, SIGNAL(finished()), this, SLOT(parseResponse())); @@ -134,9 +160,9 @@ void SSH::parseResponse(){ Params().write_db_value("GithubSshKeys", response.toStdString()); emit gotSSHKeys(); } else { - emit failedResponse("Username doesn't exist"); + emit failedResponse("Username "+usernameGitHub+" doesn't exist"); } - } else { + }else{ emit failedResponse("Request timed out"); } reply->deleteLater(); diff --git a/selfdrive/ui/qt/widgets/ssh_keys.hpp b/selfdrive/ui/qt/widgets/ssh_keys.hpp index 3082a43d6c..309f1300f7 100644 --- a/selfdrive/ui/qt/widgets/ssh_keys.hpp +++ b/selfdrive/ui/qt/widgets/ssh_keys.hpp @@ -1,8 +1,14 @@ #pragma once -#include #include +#include +#include +#include +#include +#include #include +#include + class SSH : public QWidget { Q_OBJECT @@ -11,22 +17,29 @@ public: explicit SSH(QWidget* parent = 0); private: + QStackedLayout* slayout; + QString usernameGitHub; + QString inputFieldMessage; QNetworkAccessManager* manager; QNetworkReply* reply; QTimer* networkTimer; bool aborted; - void getSSHKeys(QString user); - signals: + void closeSSHSettings(); + void openKeyboard(); + void closeKeyboard(); void NoSSHAdded(); void SSHAdded(); + void inputFieldCancelled(); + void inputFieldEmitText(QString GitHubUsername); void failedResponse(QString errorString); void gotSSHKeys(); - void closeSSHSettings(); private slots: void checkForSSHKey(); + void getSSHKeys(); void timeout(); void parseResponse(); }; +