Hotspot password (#19854)
Now there is a possibility of changing a tethering password. The WiFi UI was also modified, so it should look nicer now.albatross
parent
efe8c54a2e
commit
24356b4a1e
|
@ -197,7 +197,8 @@ QWidget * developer_panel() {
|
|||
}
|
||||
|
||||
QWidget * network_panel(QWidget * parent) {
|
||||
WifiUI *w = new WifiUI();
|
||||
Networking *w = new Networking();
|
||||
QObject::connect(parent, SIGNAL(sidebarPressed()), w, SLOT(sidebarChange()));
|
||||
QObject::connect(w, SIGNAL(openKeyboard()), parent, SLOT(closeSidebar()));
|
||||
QObject::connect(w, SIGNAL(closeKeyboard()), parent, SLOT(openSidebar()));
|
||||
return w;
|
||||
|
@ -261,6 +262,7 @@ SettingsWindow::SettingsWindow(QWidget *parent) : QFrame(parent) {
|
|||
sidebar_layout->addWidget(btn, 0, Qt::AlignRight | Qt::AlignTop);
|
||||
panel_layout->addWidget(panel.second);
|
||||
QObject::connect(btn, SIGNAL(released()), this, SLOT(setActivePanel()));
|
||||
QObject::connect(btn, &QPushButton::released, [=](){emit sidebarPressed();});
|
||||
}
|
||||
qobject_cast<QPushButton *>(nav_btns->buttons()[0])->setChecked(true);
|
||||
sidebar_layout->addStretch();
|
||||
|
@ -301,9 +303,9 @@ SettingsWindow::SettingsWindow(QWidget *parent) : QFrame(parent) {
|
|||
}
|
||||
|
||||
void SettingsWindow::closeSidebar() {
|
||||
sidebar_widget->setVisible(false);
|
||||
sidebar_widget->setFixedWidth(0);
|
||||
}
|
||||
|
||||
void SettingsWindow::openSidebar() {
|
||||
sidebar_widget->setVisible(true);
|
||||
sidebar_widget->setFixedWidth(300);
|
||||
}
|
||||
|
|
|
@ -36,6 +36,7 @@ public:
|
|||
|
||||
signals:
|
||||
void closeSettings();
|
||||
void sidebarPressed();
|
||||
|
||||
private:
|
||||
QPushButton *sidebar_alert_widget;
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
#include <QPixmap>
|
||||
#include <QPushButton>
|
||||
#include <QLineEdit>
|
||||
#include <QRandomGenerator>
|
||||
|
||||
#include "wifi.hpp"
|
||||
#include "widgets/toggle.hpp"
|
||||
|
@ -20,9 +21,17 @@ void clearLayout(QLayout* layout) {
|
|||
}
|
||||
}
|
||||
|
||||
WifiUI::WifiUI(QWidget *parent, int page_length) : QWidget(parent), networks_per_page(page_length) {
|
||||
QWidget* layoutToWidget(QLayout* l, QWidget* parent){
|
||||
QWidget* q = new QWidget(parent);
|
||||
q->setLayout(l);
|
||||
return q;
|
||||
}
|
||||
|
||||
// Networking functions
|
||||
|
||||
Networking::Networking(QWidget* parent){
|
||||
try {
|
||||
wifi = new WifiManager;
|
||||
wifi = new WifiManager(this);
|
||||
} catch (std::exception &e) {
|
||||
QLabel* warning = new QLabel("Network manager is inactive!");
|
||||
warning->setStyleSheet(R"(font-size: 65px;)");
|
||||
|
@ -32,57 +41,231 @@ WifiUI::WifiUI(QWidget *parent, int page_length) : QWidget(parent), networks_per
|
|||
setLayout(warning_layout);
|
||||
return;
|
||||
}
|
||||
connect(wifi, SIGNAL(wrongPassword(QString)), this, SLOT(wrongPassword(QString)));
|
||||
connect(wifi, SIGNAL(successfulConnection(QString)), this, SLOT(successfulConnection(QString)));
|
||||
|
||||
|
||||
QObject::connect(wifi, SIGNAL(wrongPassword(QString)), this, SLOT(wrongPassword(QString)));
|
||||
s = new QStackedLayout(this);
|
||||
|
||||
QVBoxLayout * top_layout = new QVBoxLayout;
|
||||
top_layout->setSpacing(0);
|
||||
swidget = new QStackedWidget;
|
||||
inputField = new InputField(this, 8);
|
||||
connect(inputField, SIGNAL(emitText(QString)), this, SLOT(receiveText(QString)));
|
||||
connect(inputField, SIGNAL(cancel()), this, SLOT(abortTextInput()));
|
||||
s->addWidget(inputField);
|
||||
|
||||
// Networks page
|
||||
wifi_widget = new QWidget;
|
||||
QVBoxLayout* networkLayout = new QVBoxLayout;
|
||||
QHBoxLayout *tethering_field = new QHBoxLayout;
|
||||
tethering_field->addSpacing(50);
|
||||
QVBoxLayout* vlayout = new QVBoxLayout(this);
|
||||
QPushButton* advancedSettings = new QPushButton("Advanced");
|
||||
advancedSettings->setStyleSheet(R"(margin-right: 30px)");
|
||||
advancedSettings->setFixedSize(300, 100);
|
||||
connect(advancedSettings, &QPushButton::released, [=](){s->setCurrentIndex(2);});
|
||||
vlayout->addSpacing(10);
|
||||
vlayout->addWidget(advancedSettings, 0, Qt::AlignRight);
|
||||
vlayout->addSpacing(10);
|
||||
|
||||
ipv4 = new QLabel("");
|
||||
tethering_field->addWidget(ipv4);
|
||||
tethering_field->addWidget(new QLabel("Enable Tethering"));
|
||||
wifiWidget = new WifiUI(0, 5, wifi);
|
||||
connect(wifiWidget, SIGNAL(connectToNetwork(Network)), this, SLOT(connectToNetwork(Network)));
|
||||
vlayout->addWidget(wifiWidget, 1);
|
||||
|
||||
s->addWidget(layoutToWidget(vlayout, this));
|
||||
|
||||
an = new AdvancedNetworking(this, wifi);
|
||||
connect(an, &AdvancedNetworking::backPress, [=](){s->setCurrentIndex(1);});
|
||||
s->addWidget(an);
|
||||
|
||||
s->setCurrentIndex(1);
|
||||
|
||||
// Update network status
|
||||
QTimer* timer = new QTimer(this);
|
||||
QObject::connect(timer, SIGNAL(timeout()), this, SLOT(refresh()));
|
||||
timer->start(5000);
|
||||
|
||||
setStyleSheet(R"(
|
||||
QPushButton {
|
||||
font-size: 50px;
|
||||
margin: 0px;
|
||||
padding: 15px;
|
||||
border-radius: 25px;
|
||||
color: #dddddd;
|
||||
background-color: #444444;
|
||||
}
|
||||
QPushButton:disabled {
|
||||
padding: 20px;
|
||||
color: #777777;
|
||||
background-color: #222222;
|
||||
}
|
||||
)");
|
||||
}
|
||||
|
||||
void Networking::refresh(){
|
||||
wifiWidget->refresh();
|
||||
}
|
||||
|
||||
void Networking::connectToNetwork(Network n) {
|
||||
if (n.security_type == SecurityType::OPEN) {
|
||||
wifi->connect(n);
|
||||
} else if (n.security_type == SecurityType::WPA) {
|
||||
inputField->setPromptText("Enter password for \"" + n.ssid + "\"");
|
||||
s->setCurrentIndex(0);
|
||||
selectedNetwork = n;
|
||||
}
|
||||
}
|
||||
|
||||
void Networking::abortTextInput(){
|
||||
s->setCurrentIndex(1);
|
||||
}
|
||||
|
||||
void Networking::receiveText(QString text) {
|
||||
wifi->disconnect();
|
||||
wifi->connect(selectedNetwork, text);
|
||||
s->setCurrentIndex(1);
|
||||
}
|
||||
|
||||
void Networking::wrongPassword(QString ssid) {
|
||||
if(s->currentIndex()==0){
|
||||
qDebug()<<"Wrong password, but we are already trying a new network";
|
||||
return;
|
||||
}
|
||||
for (Network n : wifi->seen_networks) {
|
||||
if (n.ssid == ssid) {
|
||||
inputField->setPromptText("Wrong password for \"" + n.ssid +"\"");
|
||||
s->setCurrentIndex(0);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Networking::successfulConnection(QString ssid) {
|
||||
//Maybe we will want to do something here in the future.
|
||||
}
|
||||
|
||||
void Networking::sidebarChange(){
|
||||
s->setCurrentIndex(1);
|
||||
an->s->setCurrentIndex(1);
|
||||
refresh();
|
||||
}
|
||||
|
||||
QFrame* hline(QWidget* parent = 0){
|
||||
QFrame* line = new QFrame(parent);
|
||||
line->setFrameShape(QFrame::StyledPanel);
|
||||
line->setStyleSheet("margin-left: 40px; margin-right: 40px; border-width: 1px; border-bottom-style: solid; border-color: gray;");
|
||||
line->setFixedHeight(2);
|
||||
return line;
|
||||
}
|
||||
|
||||
// AdvancedNetworking functions
|
||||
|
||||
AdvancedNetworking::AdvancedNetworking(QWidget* parent, WifiManager* wifi): QWidget(parent), wifi(wifi){
|
||||
s = new QStackedLayout(this);// inputField and settings
|
||||
inputField = new InputField(this, 8);
|
||||
connect(inputField, SIGNAL(emitText(QString)), this, SLOT(receiveText(QString)));
|
||||
connect(inputField, SIGNAL(cancel()), this, SLOT(abortTextInput()));
|
||||
s->addWidget(inputField);
|
||||
|
||||
QVBoxLayout* vlayout = new QVBoxLayout(this);
|
||||
|
||||
//Back button
|
||||
QHBoxLayout* backLayout = new QHBoxLayout(this);
|
||||
QPushButton* back = new QPushButton("BACK");
|
||||
back->setFixedWidth(500);
|
||||
connect(back, &QPushButton::released, [=](){emit backPress();});
|
||||
backLayout->addWidget(back, 0, Qt::AlignLeft);
|
||||
vlayout->addWidget(layoutToWidget(backLayout, this), 0, Qt::AlignLeft);
|
||||
|
||||
//Enable tethering layout
|
||||
QHBoxLayout* tetheringToggleLayout = new QHBoxLayout(this);
|
||||
tetheringToggleLayout->addWidget(new QLabel("Enable tethering", this));
|
||||
Toggle* toggle_switch = new Toggle(this);
|
||||
toggle_switch->setFixedSize(150, 100);
|
||||
tethering_field->addWidget(toggle_switch);
|
||||
tetheringToggleLayout->addWidget(toggle_switch);
|
||||
tetheringToggleLayout->addSpacing(40);
|
||||
if (wifi->tetheringEnabled()) {
|
||||
toggle_switch->togglePosition();
|
||||
}
|
||||
QObject::connect(toggle_switch, SIGNAL(stateChanged(int)), this, SLOT(toggleTethering(int)));
|
||||
vlayout->addWidget(layoutToWidget(tetheringToggleLayout, this), 0);
|
||||
vlayout->addWidget(hline(this), 0);
|
||||
|
||||
//Change tethering password
|
||||
QHBoxLayout *tetheringPassword = new QHBoxLayout(this);
|
||||
tetheringPassword->addWidget(new QLabel("Edit tethering password", this), 1);
|
||||
editPasswordButton = new QPushButton("EDIT", this);
|
||||
editPasswordButton->setFixedWidth(500);
|
||||
connect(editPasswordButton, &QPushButton::released, [=](){inputField->setPromptText("Enter the new hotspot password"); s->setCurrentIndex(0);});
|
||||
tetheringPassword->addWidget(editPasswordButton, 1, Qt::AlignRight);
|
||||
vlayout->addWidget(layoutToWidget(tetheringPassword, this), 0);
|
||||
vlayout->addWidget(hline(this), 0);
|
||||
|
||||
//IP adress
|
||||
QHBoxLayout* IPlayout = new QHBoxLayout(this);
|
||||
IPlayout->addWidget(new QLabel("IP address: "), 0);
|
||||
ipLabel = new QLabel(wifi->ipv4_address);
|
||||
ipLabel->setStyleSheet("color: #aaaaaa");
|
||||
IPlayout->addWidget(ipLabel, 0, Qt::AlignRight);
|
||||
vlayout->addWidget(layoutToWidget(IPlayout, this), 0);
|
||||
vlayout->addWidget(hline(this), 0);
|
||||
vlayout->addSpacing(300);
|
||||
|
||||
QWidget* tetheringWidget = new QWidget;
|
||||
tetheringWidget->setLayout(tethering_field);
|
||||
tetheringWidget->setFixedHeight(150);
|
||||
networkLayout->addWidget(tetheringWidget);
|
||||
// //Enable SSH
|
||||
// QHBoxLayout* enableSSHLayout = new QHBoxLayout(this);
|
||||
// enableSSHLayout->addWidget(new QLabel("Enable SSH", this));
|
||||
// Toggle* toggle_switch_SSH = new Toggle(this);
|
||||
// toggle_switch_SSH->setFixedSize(150, 100);
|
||||
// enableSSHLayout->addWidget(toggle_switch_SSH);
|
||||
// vlayout->addWidget(layoutToWidget(enableSSHLayout, this));
|
||||
|
||||
vlayout = new QVBoxLayout;
|
||||
wifi_widget->setLayout(vlayout);
|
||||
networkLayout->addWidget(wifi_widget);
|
||||
// //Authorized SSH keys
|
||||
// QHBoxLayout* authSSHLayout = new QHBoxLayout(this);
|
||||
// authSSHLayout->addWidget(new QLabel("Authorized SSH keys", this));
|
||||
// QPushButton* editAuthSSHButton = new QPushButton("EDIT", this);
|
||||
// authSSHLayout->addWidget(editAuthSSHButton);
|
||||
// vlayout->addWidget(layoutToWidget(authSSHLayout, this));
|
||||
|
||||
QWidget* networkWidget = new QWidget;
|
||||
networkWidget->setLayout(networkLayout);
|
||||
swidget->addWidget(networkWidget);
|
||||
// //Disconnect or delete connections
|
||||
// QHBoxLayout* dangerZone = new QHBoxLayout(this);
|
||||
// QPushButton* disconnect = new QPushButton("Disconnect from WiFi", this);
|
||||
// dangerZone->addWidget(disconnect);
|
||||
// QPushButton* deleteAll = new QPushButton("DELETE ALL NETWORKS", this);
|
||||
// dangerZone->addWidget(deleteAll);
|
||||
// vlayout->addWidget(layoutToWidget(dangerZone, this));
|
||||
|
||||
// Keyboard page
|
||||
input_field = new InputField();
|
||||
QObject::connect(input_field, SIGNAL(emitText(QString)), this, SLOT(receiveText(QString)));
|
||||
swidget->addWidget(input_field);
|
||||
swidget->setCurrentIndex(0);
|
||||
//vlayout to widget
|
||||
QWidget* settingsWidget = layoutToWidget(vlayout, this);
|
||||
settingsWidget->setStyleSheet("margin-left: 40px; margin-right: 40px;");
|
||||
s->addWidget(settingsWidget);
|
||||
s->setCurrentIndex(1);
|
||||
setLayout(s);
|
||||
|
||||
top_layout->addWidget(swidget);
|
||||
setLayout(top_layout);
|
||||
|
||||
// Update network list
|
||||
timer = new QTimer(this);
|
||||
// Update network status
|
||||
QTimer* timer = new QTimer(this);
|
||||
QObject::connect(timer, SIGNAL(timeout()), this, SLOT(refresh()));
|
||||
timer->start(2000);
|
||||
timer->start(5000);
|
||||
}
|
||||
|
||||
void AdvancedNetworking::refresh(){
|
||||
ipLabel->setText(wifi->ipv4_address);
|
||||
}
|
||||
|
||||
void AdvancedNetworking::toggleTethering(int enable) {
|
||||
if (enable) {
|
||||
wifi->enableTethering();
|
||||
} else {
|
||||
wifi->disableTethering();
|
||||
}
|
||||
editPasswordButton->setEnabled(!enable);
|
||||
}
|
||||
|
||||
void AdvancedNetworking::receiveText(QString text){
|
||||
wifi->changeTetheringPassword(text);
|
||||
s->setCurrentIndex(1);
|
||||
}
|
||||
|
||||
void AdvancedNetworking::abortTextInput(){
|
||||
s->setCurrentIndex(1);
|
||||
}
|
||||
|
||||
// WifiUI functions
|
||||
|
||||
WifiUI::WifiUI(QWidget *parent, int page_length, WifiManager* wifi) : QWidget(parent), networks_per_page(page_length), wifi(wifi) {
|
||||
vlayout = new QVBoxLayout;
|
||||
|
||||
// Scan on startup
|
||||
QLabel *scanning = new QLabel("Scanning for networks");
|
||||
|
@ -90,22 +273,16 @@ WifiUI::WifiUI(QWidget *parent, int page_length) : QWidget(parent), networks_per
|
|||
vlayout->addWidget(scanning, 0, Qt::AlignCenter);
|
||||
vlayout->setSpacing(25);
|
||||
|
||||
wifi->request_scan();
|
||||
refresh();
|
||||
setLayout(vlayout);
|
||||
page = 0;
|
||||
}
|
||||
|
||||
void WifiUI::refresh() {
|
||||
if (!this->isVisible()) {
|
||||
return;
|
||||
}
|
||||
|
||||
wifi->request_scan();
|
||||
wifi->refreshNetworks();
|
||||
ipv4->setText(wifi->ipv4_address);
|
||||
clearLayout(vlayout);
|
||||
|
||||
connectButtons = new QButtonGroup(this);
|
||||
connectButtons = new QButtonGroup(this); // TODO check if this is a leak
|
||||
QObject::connect(connectButtons, SIGNAL(buttonClicked(QAbstractButton*)), this, SLOT(handleButton(QAbstractButton*)));
|
||||
|
||||
int i = 0;
|
||||
|
@ -116,7 +293,11 @@ void WifiUI::refresh() {
|
|||
if (page * networks_per_page <= i && i < (page + 1) * networks_per_page) {
|
||||
// SSID
|
||||
hlayout->addSpacing(50);
|
||||
hlayout->addWidget(new QLabel(QString::fromUtf8(network.ssid)));
|
||||
QString ssid = QString::fromUtf8(network.ssid);
|
||||
if(ssid.length() > 20){
|
||||
ssid = ssid.left(20)+"…";
|
||||
}
|
||||
hlayout->addWidget(new QLabel(ssid));
|
||||
|
||||
// strength indicator
|
||||
unsigned int strength_scale = network.strength / 17;
|
||||
|
@ -129,7 +310,7 @@ void WifiUI::refresh() {
|
|||
|
||||
// connect button
|
||||
QPushButton* btn = new QPushButton(network.connected == ConnectedType::CONNECTED ? "Connected" : (network.connected == ConnectedType::CONNECTING ? "Connecting" : "Connect"));
|
||||
btn->setFixedWidth(300);
|
||||
btn->setFixedWidth(350);
|
||||
btn->setFixedHeight(button_height);
|
||||
btn->setDisabled(network.connected == ConnectedType::CONNECTED || network.connected == ConnectedType::CONNECTING || network.security_type == SecurityType::UNSUPPORTED);
|
||||
hlayout->addWidget(btn);
|
||||
|
@ -140,20 +321,10 @@ void WifiUI::refresh() {
|
|||
QWidget * w = new QWidget;
|
||||
w->setLayout(hlayout);
|
||||
vlayout->addWidget(w);
|
||||
w->setStyleSheet(R"(
|
||||
QLabel {
|
||||
font-size: 50px;
|
||||
}
|
||||
QPushButton {
|
||||
padding: 0;
|
||||
font-size: 50px;
|
||||
border-radius: 10px;
|
||||
background-color: #114265;
|
||||
}
|
||||
QPushButton:disabled {
|
||||
background-color: #323C43;
|
||||
}
|
||||
)");
|
||||
// Don't add the last line
|
||||
if (page * networks_per_page <= i+1 && i+1 < (page + 1) * networks_per_page && i+1 < wifi->seen_networks.size()) {
|
||||
vlayout->addWidget(hline(this));
|
||||
}
|
||||
countWidgets++;
|
||||
}
|
||||
i++;
|
||||
|
@ -165,12 +336,13 @@ void WifiUI::refresh() {
|
|||
vlayout->addWidget(w);
|
||||
}
|
||||
|
||||
QHBoxLayout *prev_next_buttons = new QHBoxLayout;
|
||||
QHBoxLayout *prev_next_buttons = new QHBoxLayout;//Adding constructor exposes the qt bug
|
||||
QPushButton* prev = new QPushButton("Previous");
|
||||
prev->setEnabled(page);
|
||||
prev->setFixedHeight(button_height);
|
||||
prev->setFixedSize(400, button_height);
|
||||
|
||||
QPushButton* next = new QPushButton("Next");
|
||||
next->setFixedHeight(button_height);
|
||||
next->setFixedSize(400, button_height);
|
||||
|
||||
// If there are more visible networks then we can show, enable going to next page
|
||||
next->setEnabled(wifi->seen_networks.size() > (page + 1) * networks_per_page);
|
||||
|
@ -182,74 +354,13 @@ void WifiUI::refresh() {
|
|||
|
||||
QWidget *w = new QWidget;
|
||||
w->setLayout(prev_next_buttons);
|
||||
w->setStyleSheet(R"(
|
||||
QPushButton {
|
||||
padding: 0;
|
||||
background-color: #114265;
|
||||
}
|
||||
QPushButton:disabled {
|
||||
background-color: #323C43;
|
||||
}
|
||||
)");
|
||||
vlayout->addWidget(w);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void WifiUI::toggleTethering(int enable) {
|
||||
if (enable) {
|
||||
wifi->enableTethering();
|
||||
} else {
|
||||
wifi->disableTethering();
|
||||
}
|
||||
}
|
||||
|
||||
void WifiUI::handleButton(QAbstractButton* button) {
|
||||
QPushButton* btn = static_cast<QPushButton*>(button);
|
||||
Network n = wifi->seen_networks[connectButtons->id(btn)];
|
||||
connectToNetwork(n);
|
||||
}
|
||||
|
||||
void WifiUI::connectToNetwork(Network n) {
|
||||
timer->stop();
|
||||
if (n.security_type == SecurityType::OPEN) {
|
||||
wifi->connect(n);
|
||||
} else if (n.security_type == SecurityType::WPA) {
|
||||
input_field->setPromptText("Enter password for \"" + n.ssid + "\"");
|
||||
QString password = getStringFromUser();
|
||||
if (password.size()) {
|
||||
wifi->connect(n, password);
|
||||
}
|
||||
}
|
||||
refresh();
|
||||
timer->start();
|
||||
}
|
||||
|
||||
QString WifiUI::getStringFromUser() {
|
||||
emit openKeyboard();
|
||||
swidget->setCurrentIndex(1);
|
||||
loop.exec();
|
||||
emit closeKeyboard();
|
||||
swidget->setCurrentIndex(0);
|
||||
return text;
|
||||
}
|
||||
|
||||
void WifiUI::receiveText(QString t) {
|
||||
loop.quit();
|
||||
text = t;
|
||||
}
|
||||
|
||||
|
||||
void WifiUI::wrongPassword(QString ssid) {
|
||||
if (loop.isRunning()) {
|
||||
return;
|
||||
}
|
||||
for (Network n : wifi->seen_networks) {
|
||||
if (n.ssid == ssid) {
|
||||
input_field->setPromptText("Wrong password for \"" + n.ssid +"\"");
|
||||
connectToNetwork(n);
|
||||
}
|
||||
}
|
||||
emit connectToNetwork(n);
|
||||
}
|
||||
|
||||
void WifiUI::prevPage() {
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
#include <QButtonGroup>
|
||||
#include <QVBoxLayout>
|
||||
#include <QStackedWidget>
|
||||
#include <QPushButton>
|
||||
#include <QTimer>
|
||||
|
||||
#include "wifiManager.hpp"
|
||||
|
@ -15,38 +16,82 @@ class WifiUI : public QWidget {
|
|||
|
||||
public:
|
||||
int page;
|
||||
explicit WifiUI(QWidget *parent = 0, int page_length = 5);
|
||||
explicit WifiUI(QWidget *parent = 0, int page_length = 5, WifiManager* wifi = 0);
|
||||
|
||||
private:
|
||||
WifiManager *wifi = nullptr;
|
||||
const int networks_per_page;
|
||||
|
||||
QStackedWidget *swidget;
|
||||
int networks_per_page;
|
||||
QVBoxLayout *vlayout;
|
||||
QWidget *wifi_widget;
|
||||
|
||||
InputField *input_field;
|
||||
QEventLoop loop;
|
||||
QTimer *timer;
|
||||
QString text;
|
||||
QButtonGroup *connectButtons;
|
||||
bool tetheringEnabled;
|
||||
QLabel *ipv4;
|
||||
|
||||
void connectToNetwork(Network n);
|
||||
QString getStringFromUser();
|
||||
|
||||
private slots:
|
||||
void handleButton(QAbstractButton* m_button);
|
||||
void toggleTethering(int enable);
|
||||
void refresh();
|
||||
void receiveText(QString text);
|
||||
void wrongPassword(QString ssid);
|
||||
|
||||
void prevPage();
|
||||
void nextPage();
|
||||
|
||||
signals:
|
||||
void openKeyboard();
|
||||
void closeKeyboard();
|
||||
void connectToNetwork(Network n);
|
||||
|
||||
public slots:
|
||||
void handleButton(QAbstractButton* m_button);
|
||||
void refresh();
|
||||
|
||||
void prevPage();
|
||||
void nextPage();
|
||||
};
|
||||
|
||||
class AdvancedNetworking : public QWidget {
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit AdvancedNetworking(QWidget* parent = 0, WifiManager* wifi = 0);
|
||||
QStackedLayout* s;
|
||||
|
||||
private:
|
||||
InputField* inputField;
|
||||
QLabel* ipLabel;
|
||||
QPushButton* editPasswordButton;
|
||||
|
||||
|
||||
WifiManager* wifi = nullptr;
|
||||
|
||||
signals:
|
||||
void openKeyboard();
|
||||
void closeKeyboard();
|
||||
void backPress();
|
||||
|
||||
private slots:
|
||||
void receiveText(QString text);
|
||||
void abortTextInput();
|
||||
void toggleTethering(int enable);
|
||||
void refresh();
|
||||
};
|
||||
|
||||
class Networking : public QWidget {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit Networking(QWidget* parent = 0);
|
||||
|
||||
private:
|
||||
QStackedLayout* s;// keyboard, wifiScreen, advanced
|
||||
|
||||
Network selectedNetwork;
|
||||
|
||||
AdvancedNetworking* an;
|
||||
WifiUI* wifiWidget;
|
||||
WifiManager* wifi = nullptr;
|
||||
InputField* inputField;
|
||||
|
||||
signals:
|
||||
void openKeyboard();
|
||||
void closeKeyboard();
|
||||
|
||||
private slots:
|
||||
void connectToNetwork(Network n);
|
||||
void refresh();
|
||||
void receiveText(QString text);
|
||||
void abortTextInput();
|
||||
void wrongPassword(QString ssid);
|
||||
void successfulConnection(QString ssid);
|
||||
void sidebarChange();
|
||||
};
|
||||
|
||||
|
|
|
@ -57,7 +57,7 @@ bool compare_by_strength(const Network &a, const Network &b) {
|
|||
}
|
||||
|
||||
|
||||
WifiManager::WifiManager() {
|
||||
WifiManager::WifiManager(QWidget* parent) {
|
||||
qDBusRegisterMetaType<Connection>();
|
||||
qDBusRegisterMetaType<IpConfig>();
|
||||
connecting_to_network = "";
|
||||
|
@ -96,6 +96,7 @@ void WifiManager::refreshNetworks() {
|
|||
seen_ssids.push_back(network.ssid);
|
||||
seen_networks.push_back(network);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
QString WifiManager::get_ipv4_address(){
|
||||
|
@ -190,7 +191,7 @@ void WifiManager::connect(Network n, QString password) {
|
|||
|
||||
void WifiManager::connect(Network n, QString username, QString password) {
|
||||
connecting_to_network = n.ssid;
|
||||
disconnect();
|
||||
// disconnect();
|
||||
clear_connections(n.ssid); //Clear all connections that may already exist to the network we are connecting
|
||||
connect(n.ssid, username, password, n.security_type);
|
||||
}
|
||||
|
@ -216,6 +217,7 @@ void WifiManager::connect(QByteArray ssid, QString username, QString password, S
|
|||
|
||||
QDBusInterface nm_settings(nm_service, nm_settings_path, nm_settings_iface, bus);
|
||||
nm_settings.call("AddConnection", QVariant::fromValue(connection));
|
||||
activate_wifi_connection(QString(ssid));
|
||||
}
|
||||
|
||||
void WifiManager::deactivate_connections(QString ssid) {
|
||||
|
@ -226,7 +228,7 @@ void WifiManager::deactivate_connections(QString ssid) {
|
|||
QString Ssid = get_property(pth.path(), "Ssid");
|
||||
if (Ssid == ssid) {
|
||||
QDBusInterface nm2(nm_service, nm_path, nm_iface, bus);
|
||||
nm2.call("DeactivateConnection", QVariant::fromValue(active_connection_raw));
|
||||
nm2.call("DeactivateConnection", QVariant::fromValue(active_connection_raw));// TODO change to disconnect
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -248,14 +250,7 @@ QVector<QDBusObjectPath> WifiManager::get_active_connections() {
|
|||
}
|
||||
|
||||
void WifiManager::clear_connections(QString ssid) {
|
||||
QDBusInterface nm(nm_service, nm_settings_path, nm_settings_iface, bus);
|
||||
QDBusMessage response = nm.call("ListConnections");
|
||||
QVariant first = response.arguments().at(0);
|
||||
const QDBusArgument &args = first.value<QDBusArgument>();
|
||||
args.beginArray();
|
||||
while (!args.atEnd()) {
|
||||
QDBusObjectPath path;
|
||||
args >> path;
|
||||
for(QDBusObjectPath path : list_connections()){
|
||||
QDBusInterface nm2(nm_service, path.path(), nm_settings_conn_iface, bus);
|
||||
QDBusMessage response = nm2.call("GetSettings");
|
||||
|
||||
|
@ -336,11 +331,12 @@ QString WifiManager::get_adapter() {
|
|||
return adapter_path;
|
||||
}
|
||||
|
||||
void WifiManager::change(unsigned int new_state,unsigned int previous_state,unsigned int change_reason) {
|
||||
void WifiManager::change(unsigned int new_state, unsigned int previous_state, unsigned int change_reason) {
|
||||
raw_adapter_state = new_state;
|
||||
if (new_state == state_need_auth && change_reason == reason_wrong_password) {
|
||||
emit wrongPassword(connecting_to_network);
|
||||
} else if (new_state == state_connected) {
|
||||
emit successfulConnection(connecting_to_network);
|
||||
connecting_to_network = "";
|
||||
}
|
||||
}
|
||||
|
@ -352,15 +348,78 @@ void WifiManager::disconnect() {
|
|||
}
|
||||
}
|
||||
|
||||
//Functions for tethering
|
||||
QVector<QDBusObjectPath> WifiManager::list_connections(){
|
||||
QVector<QDBusObjectPath> connections;
|
||||
QDBusInterface nm(nm_service, nm_settings_path, nm_settings_iface, bus);
|
||||
QDBusMessage response = nm.call("ListConnections");
|
||||
QVariant first = response.arguments().at(0);
|
||||
const QDBusArgument &args = first.value<QDBusArgument>();
|
||||
args.beginArray();
|
||||
while (!args.atEnd()) {
|
||||
QDBusObjectPath path;
|
||||
args >> path;
|
||||
connections.push_back(path);
|
||||
}
|
||||
return connections;
|
||||
}
|
||||
bool WifiManager::activate_wifi_connection(QString ssid){
|
||||
QString devicePath = get_adapter();
|
||||
|
||||
void WifiManager::enableTethering() {
|
||||
disconnect();
|
||||
for(QDBusObjectPath path : list_connections()){
|
||||
QDBusInterface nm2(nm_service, path.path(), nm_settings_conn_iface, bus);
|
||||
QDBusMessage response = nm2.call("GetSettings");
|
||||
const QDBusArgument &dbusArg = response.arguments().at(0).value<QDBusArgument>();
|
||||
|
||||
QMap<QString, QMap<QString,QVariant>> map;
|
||||
dbusArg >> map;
|
||||
for (auto &inner : map) {
|
||||
for (auto &val : inner) {
|
||||
QString key = inner.key(val);
|
||||
if (key == "ssid") {
|
||||
if (val == ssid) {
|
||||
QDBusInterface nm3(nm_service, nm_path, nm_iface, bus);
|
||||
nm3.call("ActivateConnection", QVariant::fromValue(path), QVariant::fromValue(QDBusObjectPath(devicePath)), QVariant::fromValue(QDBusObjectPath("/")));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
//Functions for tethering
|
||||
bool WifiManager::activate_tethering_connection(){
|
||||
QString devicePath = get_adapter();
|
||||
|
||||
for(QDBusObjectPath path : list_connections()){
|
||||
QDBusInterface nm2(nm_service, path.path(), nm_settings_conn_iface, bus);
|
||||
QDBusMessage response = nm2.call("GetSettings");
|
||||
const QDBusArgument &dbusArg = response.arguments().at(0).value<QDBusArgument>();
|
||||
|
||||
QMap<QString, QMap<QString,QVariant>> map;
|
||||
dbusArg >> map;
|
||||
for (auto &inner : map) {
|
||||
for (auto &val : inner) {
|
||||
QString key = inner.key(val);
|
||||
if (key == "ssid") {
|
||||
if (val == tethering_ssid.toUtf8()) {
|
||||
QDBusInterface nm3(nm_service, nm_path, nm_iface, bus);
|
||||
nm3.call("ActivateConnection", QVariant::fromValue(path), QVariant::fromValue(QDBusObjectPath(devicePath)), QVariant::fromValue(QDBusObjectPath("/")));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
void WifiManager::addTetheringConnection(){
|
||||
Connection connection;
|
||||
connection["connection"]["id"] = "Hotspot";
|
||||
connection["connection"]["uuid"] = QUuid::createUuid().toString().remove('{').remove('}');
|
||||
connection["connection"]["type"] = "802-11-wireless";
|
||||
connection["connection"]["interface-name"] = "wlan0";
|
||||
connection["connection"]["autoconnect"] = false;
|
||||
|
||||
connection["802-11-wireless"]["band"] = "bg";
|
||||
connection["802-11-wireless"]["mode"] = "ap";
|
||||
|
@ -370,7 +429,7 @@ void WifiManager::enableTethering() {
|
|||
connection["802-11-wireless-security"]["key-mgmt"] = "wpa-psk";
|
||||
connection["802-11-wireless-security"]["pairwise"] = QStringList("ccmp");
|
||||
connection["802-11-wireless-security"]["proto"] = QStringList("rsn");
|
||||
connection["802-11-wireless-security"]["psk"] = "swagswagcomma";
|
||||
connection["802-11-wireless-security"]["psk"] = tetheringPassword;
|
||||
|
||||
connection["ipv4"]["method"] = "shared";
|
||||
QMap<QString,QVariant> address;
|
||||
|
@ -382,14 +441,27 @@ void WifiManager::enableTethering() {
|
|||
|
||||
QDBusInterface nm_settings(nm_service, nm_settings_path, nm_settings_iface, bus);
|
||||
nm_settings.call("AddConnection", QVariant::fromValue(connection));
|
||||
}
|
||||
|
||||
void WifiManager::enableTethering() {
|
||||
if(activate_tethering_connection()){
|
||||
return;
|
||||
}
|
||||
addTetheringConnection();
|
||||
activate_tethering_connection();
|
||||
}
|
||||
|
||||
void WifiManager::disableTethering() {
|
||||
clear_connections(tethering_ssid);
|
||||
deactivate_connections(tethering_ssid.toUtf8());
|
||||
}
|
||||
|
||||
bool WifiManager::tetheringEnabled() {
|
||||
QString active_ap = get_active_ap();
|
||||
return get_property(active_ap, "Ssid") == tethering_ssid;
|
||||
}
|
||||
|
||||
void WifiManager::changeTetheringPassword(QString newPassword){
|
||||
tetheringPassword = newPassword;
|
||||
clear_connections(tethering_ssid.toUtf8());
|
||||
addTetheringConnection();
|
||||
}
|
|
@ -28,7 +28,7 @@ struct Network {
|
|||
class WifiManager : public QWidget {
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit WifiManager();
|
||||
explicit WifiManager(QWidget* parent);
|
||||
|
||||
void request_scan();
|
||||
QVector<Network> seen_networks;
|
||||
|
@ -38,12 +38,18 @@ public:
|
|||
void connect(Network ssid);
|
||||
void connect(Network ssid, QString password);
|
||||
void connect(Network ssid, QString username, QString password);
|
||||
// Tethering functions
|
||||
void disconnect();
|
||||
|
||||
// Tethering functions
|
||||
void enableTethering();
|
||||
void disableTethering();
|
||||
bool tetheringEnabled();
|
||||
|
||||
bool activate_tethering_connection();
|
||||
void addTetheringConnection();
|
||||
bool activate_wifi_connection(QString ssid);
|
||||
void changeTetheringPassword(QString newPassword);
|
||||
|
||||
private:
|
||||
QVector<QByteArray> seen_ssids;
|
||||
QString adapter;//Path to network manager wifi-device
|
||||
|
@ -51,6 +57,7 @@ private:
|
|||
unsigned int raw_adapter_state;//Connection status https://developer.gnome.org/NetworkManager/1.26/nm-dbus-types.html#NMDeviceState
|
||||
QString connecting_to_network;
|
||||
QString tethering_ssid;
|
||||
QString tetheringPassword = "swagswagcommma";
|
||||
|
||||
QString get_adapter();
|
||||
QString get_ipv4_address();
|
||||
|
@ -64,11 +71,12 @@ private:
|
|||
QByteArray get_property(QString network_path, QString property);
|
||||
unsigned int get_ap_strength(QString network_path);
|
||||
SecurityType getSecurityType(QString ssid);
|
||||
void disconnect();
|
||||
QVector<QDBusObjectPath> list_connections();
|
||||
|
||||
private slots:
|
||||
void change(unsigned int new_state, unsigned int previous_state, unsigned int change_reason);
|
||||
signals:
|
||||
void wrongPassword(QString ssid);
|
||||
void successfulConnection(QString ssid);
|
||||
void refresh();
|
||||
};
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
#include "input_field.hpp"
|
||||
|
||||
InputField::InputField(QWidget *parent): QWidget(parent) {
|
||||
InputField::InputField(QWidget *parent, int minTextLength): QWidget(parent), minTextLength(minTextLength) {
|
||||
layout = new QGridLayout();
|
||||
layout->setSpacing(30);
|
||||
|
||||
|
@ -39,8 +39,8 @@ void InputField::setPromptText(QString text) {
|
|||
}
|
||||
|
||||
void InputField::emitEmpty() {
|
||||
emitText("");
|
||||
line->setText("");
|
||||
emit cancel();
|
||||
}
|
||||
|
||||
void InputField::getText(QString s) {
|
||||
|
@ -49,6 +49,10 @@ void InputField::getText(QString s) {
|
|||
}
|
||||
|
||||
if (!QString::compare(s,"⏎")) {
|
||||
if(line->text().length()<minTextLength){
|
||||
setPromptText("Need at least "+QString::number(minTextLength)+" characters!");
|
||||
return;
|
||||
}
|
||||
emitText(line->text());
|
||||
line->setText("");
|
||||
}
|
||||
|
|
|
@ -12,8 +12,9 @@ class InputField : public QWidget {
|
|||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit InputField(QWidget* parent = 0);
|
||||
explicit InputField(QWidget* parent = 0, int minTextLength = 0);
|
||||
void setPromptText(QString text);
|
||||
int minTextLength;
|
||||
|
||||
private:
|
||||
QLineEdit *line;
|
||||
|
@ -22,9 +23,10 @@ private:
|
|||
QGridLayout *layout;
|
||||
|
||||
public slots:
|
||||
void emitEmpty();
|
||||
void getText(QString s);
|
||||
void emitEmpty();
|
||||
|
||||
signals:
|
||||
void cancel();
|
||||
void emitText(QString s);
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue