Skip to content

Commit

Permalink
Merge pull request #490 from deXol/developImplementBLECommands
Browse files Browse the repository at this point in the history
[BLE] Add keyboard layout and languages settings
  • Loading branch information
raoulh authored Nov 14, 2019
2 parents f5a4c99 + a3a668f commit a7a4c21
Show file tree
Hide file tree
Showing 24 changed files with 623 additions and 66 deletions.
73 changes: 73 additions & 0 deletions src/MPDeviceBleImpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -557,6 +557,79 @@ QList<QByteArray> MPDeviceBleImpl::getFavorites(const QByteArray &data)
return res;
}

void MPDeviceBleImpl::readLanguages()
{
m_deviceLanguages = QJsonObject{};
m_keyboardLayouts = QJsonObject{};
AsyncJobs *jobs = new AsyncJobs(
"Read languages",
this);
jobs->append(new MPCommandJob(mpDev,
MPCmd::GET_LANG_NUM,
[this, jobs] (const QByteArray &data, bool &)
{
const auto payload = bleProt->getFullPayload(data);
const int langNum = bleProt->toIntFromLittleEndian(payload[0], payload[1]);
qDebug() << "Language number: " << langNum;
for (int i = 0; i < langNum; ++i)
{
jobs->append(new MPCommandJob(mpDev,
MPCmd::GET_LANG_DESC,
QByteArray(1, static_cast<char>(i)),
[this, i, langNum] (const QByteArray &data, bool &)
{
const QString lang = bleProt->toQString(bleProt->getFullPayload(data));
if (AppDaemon::isDebugDev())
{
qDebug() << i << " lang desc: " << lang;
}
m_deviceLanguages[lang] = i;
if (i == (langNum - 1))
{
emit bleDeviceLanguage(m_deviceLanguages);
}
return true;
}
));
}
return true;
}
));
jobs->append(new MPCommandJob(mpDev,
MPCmd::GET_KEYB_LAYOUT_NUM,
[this, jobs] (const QByteArray &data, bool &)
{
const auto payload = bleProt->getFullPayload(data);
const auto layoutNum = bleProt->toIntFromLittleEndian(payload[0], payload[1]);
qDebug() << "Keyboard layout number: " << layoutNum;
for (int i = 0; i < layoutNum; ++i)
{
jobs->append(new MPCommandJob(mpDev,
MPCmd::GET_LAYOUT_DESC,
QByteArray(1, static_cast<char>(i)),
[this, i, layoutNum] (const QByteArray &data, bool &)
{
const QString layout = bleProt->toQString(bleProt->getFullPayload(data));
if (AppDaemon::isDebugDev())
{
qDebug() << i << " layout desc: " << layout;
}
m_keyboardLayouts[layout] = i;
if (i == (layoutNum - 1))
{
emit bleKeyboardLayout(m_keyboardLayouts);
}
return true;
}
));
}
return true;
}
));

mpDev->enqueueAndRunJob(jobs);
}

QByteArray MPDeviceBleImpl::createStoreCredMessage(const BleCredential &cred)
{
return createCredentialMessage(cred.getAttributes());
Expand Down
6 changes: 6 additions & 0 deletions src/MPDeviceBleImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,12 @@ class MPDeviceBleImpl: public QObject

QList<QByteArray> getFavorites(const QByteArray& data);

void readLanguages();

signals:
void userSettingsChanged(QJsonObject settings);
void bleDeviceLanguage(const QJsonObject& langs);
void bleKeyboardLayout(const QJsonObject& layouts);

private:
void checkDataFlash(const QByteArray &data, QElapsedTimer *timer, AsyncJobs *jobs, QString filePath, const MPDeviceProgressCb &cbProgress);
Expand All @@ -115,6 +119,8 @@ class MPDeviceBleImpl: public QObject

MPBLEFreeAddressProvider freeAddressProv;
QJsonObject m_categories;
QJsonObject m_deviceLanguages;
QJsonObject m_keyboardLayouts;

static constexpr quint8 MESSAGE_FLIP_BIT = 0x80;
static constexpr quint8 MESSAGE_ACK_AND_PAYLOAD_LENGTH = 0x7F;
Expand Down
42 changes: 36 additions & 6 deletions src/MainWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,11 @@
#include "qtcsv/stringdata.h"
#include "qtcsv/reader.h"

const QString MainWindow::NONE_STRING = tr("None");
const QString MainWindow::TAB_STRING = tr("Tab");
const QString MainWindow::ENTER_STRING = tr("Enter");
const QString MainWindow::SPACE_STRING = tr("Space");

void MainWindow::initHelpLabels()
{
auto getFontAwesomeIconPixmap = [=](int character, QSize size = QSize(20, 20))
Expand Down Expand Up @@ -254,12 +259,6 @@ MainWindow::MainWindow(WSClient *client, DbMasterController *mc, QWidget *parent
ui->comboBoxKnock->addItem(tr("Low"), 1);
ui->comboBoxKnock->addItem(tr("Medium"), 2);
ui->comboBoxKnock->addItem(tr("High"), 3);
ui->comboBoxLoginOutput->addItem(tr("Tab"), 43);
ui->comboBoxLoginOutput->addItem(tr("Enter"), 40);
ui->comboBoxLoginOutput->addItem(tr("Space"), 44);
ui->comboBoxPasswordOutput->addItem(tr("Tab"), 43);
ui->comboBoxPasswordOutput->addItem(tr("Enter"), 40);
ui->comboBoxPasswordOutput->addItem(tr("Space"), 44);

// Close behavior
#ifdef Q_OS_MAC
Expand Down Expand Up @@ -348,6 +347,23 @@ MainWindow::MainWindow(WSClient *client, DbMasterController *mc, QWidget *parent
ui->cbCredentialPrompt->setChecked(settings["storage_prompt"].toBool());
});

connect(wsClient, &WSClient::updateBLEDeviceLanguage,
[this](const QJsonObject& langs)
{
updateBLEComboboxItems(ui->comboBoxDeviceLang, langs);
updateBLEComboboxItems(ui->comboBoxUserLanguage, langs);
}
);
connect(wsClient, &WSClient::updateBLEKeyboardLayout,
[this](const QJsonObject& layouts)
{
updateBLEComboboxItems(ui->comboBoxUsbLayout, layouts);
updateBLEComboboxItems(ui->comboBoxBtLayout, layouts);
wsClient->settingsHelper()->resetSettings();
}
);


//When device has new parameters, update the GUI
connect(wsClient, &WSClient::mpHwVersionChanged, [=]()
{
Expand Down Expand Up @@ -1378,6 +1394,20 @@ void MainWindow::displayMCUVersion(bool visible)
ui->labelAboutMainMCUValue->setText(wsClient->get_mainMCUVersion());
}

void MainWindow::updateBLEComboboxItems(QComboBox *cb, const QJsonObject& items)
{
cb->clear();
for (auto it = items.begin(); it != items.end(); ++it)
{
cb->addItem(it.key(), it.value().toInt());
}
QSortFilterProxyModel* proxy = new QSortFilterProxyModel(cb);
proxy->setSourceModel( cb->model());
cb->model()->setParent(proxy);
cb->setModel(proxy);
cb->model()->sort(0);
}

void MainWindow::on_toolButton_clearBackupFilePath_released()
{
ui->lineEdit_dbBackupFilePath->clear();
Expand Down
9 changes: 8 additions & 1 deletion src/MainWindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,12 @@ class MainWindow : public QMainWindow

void updateBackupControlsVisibility(bool visible);


const static QString NONE_STRING;
const static QString TAB_STRING;
const static QString ENTER_STRING;
const static QString SPACE_STRING;

friend class SettingsGuiHelper;
friend class SettingsGuiMini;
friend class SettingsGuiBLE;
Expand Down Expand Up @@ -174,6 +180,8 @@ private slots:

void displayMCUVersion(bool visible = true);

void updateBLEComboboxItems(QComboBox *cb, const QJsonObject& items);

Ui::MainWindow *ui = nullptr;
QtAwesome* awesome;

Expand Down Expand Up @@ -203,7 +211,6 @@ private slots:
SystemEventHandler eventHandler;

const QString HIBP_URL = "https://haveibeenpwned.com/Passwords";
const QString NONE_STRING = tr("None");
};

#endif // MAINWINDOW_H
Loading

0 comments on commit a7a4c21

Please sign in to comment.