#include #include #include #include #include #include #include "config.h" #include "device.h" #include "dialog.h" #include "keymap.h" #include "ui_dialog.h" #include "videoform.h" Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog) { ui->setupUi(this); initUI(); connect(&m_adb, &AdbProcess::adbProcessResult, this, [this](AdbProcess::ADB_EXEC_RESULT processResult) { QString log = ""; bool newLine = true; QStringList args = m_adb.arguments(); switch (processResult) { case AdbProcess::AER_ERROR_START: break; case AdbProcess::AER_SUCCESS_START: log = "adb run"; newLine = false; break; case AdbProcess::AER_ERROR_EXEC: //log = m_adb.getErrorOut(); if (args.contains("ifconfig") && args.contains("wlan0")) { getIPbyIp(); } break; case AdbProcess::AER_ERROR_MISSING_BINARY: log = "adb not find"; break; case AdbProcess::AER_SUCCESS_EXEC: //log = m_adb.getStdOut(); if (args.contains("devices")) { QStringList devices = m_adb.getDevicesSerialFromStdOut(); ui->serialBox->clear(); for (auto &item : devices) { ui->serialBox->addItem(item); } } else if (args.contains("show") && args.contains("wlan0")) { QString ip = m_adb.getDeviceIPFromStdOut(); if (ip.isEmpty()) { log = "ip not find, connect to wifi?"; break; } ui->deviceIpEdt->setText(ip); } else if (args.contains("ifconfig") && args.contains("wlan0")) { QString ip = m_adb.getDeviceIPFromStdOut(); if (ip.isEmpty()) { log = "ip not find, connect to wifi?"; break; } ui->deviceIpEdt->setText(ip); } else if (args.contains("ip -o a")) { QString ip = m_adb.getDeviceIPByIpFromStdOut(); if (ip.isEmpty()) { log = "ip not find, connect to wifi?"; break; } ui->deviceIpEdt->setText(ip); } break; } if (!log.isEmpty()) { outLog(log, newLine); } }); } Dialog::~Dialog() { m_deviceManage.disconnectAllDevice(); delete ui; } void Dialog::initUI() { setAttribute(Qt::WA_DeleteOnClose); setWindowFlags(windowFlags() | Qt::WindowMinimizeButtonHint | Qt::WindowCloseButtonHint | Qt::CustomizeWindowHint); ui->bitRateBox->addItem("2000000"); ui->bitRateBox->addItem("6000000"); ui->bitRateBox->addItem("8000000"); ui->bitRateBox->addItem("10000000"); ui->bitRateBox->addItem("20000000"); ui->bitRateBox->addItem("50000000"); ui->bitRateBox->addItem("100000000"); ui->bitRateBox->addItem("200000000"); ui->bitRateBox->setCurrentIndex(Config::getInstance().getBitRateIndex()); ui->maxSizeBox->addItem("640"); ui->maxSizeBox->addItem("720"); ui->maxSizeBox->addItem("1080"); ui->maxSizeBox->addItem("1280"); ui->maxSizeBox->addItem("1920"); ui->maxSizeBox->addItem(tr("original")); ui->maxSizeBox->setCurrentIndex(Config::getInstance().getMaxSizeIndex()); ui->formatBox->addItem("mp4"); ui->formatBox->addItem("mkv"); ui->formatBox->setCurrentIndex(Config::getInstance().getRecordFormatIndex()); ui->lockOrientationBox->addItem(tr("no lock")); ui->lockOrientationBox->addItem("0"); ui->lockOrientationBox->addItem("90"); ui->lockOrientationBox->addItem("180"); ui->lockOrientationBox->addItem("270"); ui->lockOrientationBox->setCurrentIndex(0); ui->recordPathEdt->setText(Config::getInstance().getRecordPath()); ui->framelessCheck->setChecked(Config::getInstance().getFramelessWindow()); #ifdef Q_OS_OSX // mac need more width setFixedWidth(520); #endif #ifdef Q_OS_LINUX // linux need more width setFixedWidth(480); #endif } void Dialog::execAdbCmd() { if (checkAdbRun()) { return; } QString cmd = ui->adbCommandEdt->text().trimmed(); outLog("adb " + cmd, false); m_adb.execute(ui->serialBox->currentText().trimmed(), cmd.split(" ", QString::SkipEmptyParts)); } QString Dialog::getGameScript(const QString &fileName) { QFile loadFile(KeyMap::getKeyMapPath() + "/" + fileName); if (!loadFile.open(QIODevice::ReadOnly)) { outLog("open file failed:" + fileName, true); return ""; } QString ret = loadFile.readAll(); loadFile.close(); return ret; } void Dialog::on_updateDevice_clicked() { if (checkAdbRun()) { return; } outLog("update devices...", false); m_adb.execute("", QStringList() << "devices"); } void Dialog::on_startServerBtn_clicked() { outLog("start server...", false); QString absFilePath; if (ui->recordScreenCheck->isChecked()) { QString fileDir(ui->recordPathEdt->text().trimmed()); if (!fileDir.isEmpty()) { QDateTime dateTime = QDateTime::currentDateTime(); QString fileName = dateTime.toString("_yyyyMMdd_hhmmss_zzz"); QString ext = ui->formatBox->currentText().trimmed(); fileName = windowTitle() + fileName + "." + ext; QDir dir(fileDir); absFilePath = dir.absoluteFilePath(fileName); } } quint32 bitRate = ui->bitRateBox->currentText().trimmed().toUInt(); // this is ok that "native" toUshort is 0 quint16 videoSize = ui->maxSizeBox->currentText().trimmed().toUShort(); Device::DeviceParams params; params.serial = ui->serialBox->currentText().trimmed(); params.maxSize = videoSize; params.bitRate = bitRate; // on devices with Android >= 10, the capture frame rate can be limited params.maxFps = static_cast(Config::getInstance().getMaxFps()); params.recordFileName = absFilePath; params.closeScreen = ui->closeScreenCheck->isChecked(); params.useReverse = ui->useReverseCheck->isChecked(); params.display = !ui->notDisplayCheck->isChecked(); params.renderExpiredFrames = Config::getInstance().getRenderExpiredFrames(); params.lockVideoOrientation = ui->lockOrientationBox->currentIndex() - 1; params.stayAwake = ui->stayAwakeCheck->isChecked(); m_deviceManage.connectDevice(params); if (ui->alwaysTopCheck->isChecked()) { m_deviceManage.staysOnTop(params.serial); } m_deviceManage.showFPS(params.serial, ui->fpsCheck->isChecked()); } void Dialog::on_stopServerBtn_clicked() { if (m_deviceManage.disconnectDevice(ui->serialBox->currentText().trimmed())) { outLog("stop server"); } } void Dialog::on_wirelessConnectBtn_clicked() { if (checkAdbRun()) { return; } QString addr = ui->deviceIpEdt->text().trimmed(); if (!ui->devicePortEdt->text().isEmpty()) { addr += ":"; addr += ui->devicePortEdt->text().trimmed(); } else if (!ui->devicePortEdt->placeholderText().isEmpty()) { addr += ":"; addr += ui->devicePortEdt->placeholderText().trimmed(); } else { outLog("error: device port is null", false); return; } outLog("wireless connect...", false); QStringList adbArgs; adbArgs << "connect"; adbArgs << addr; m_adb.execute("", adbArgs); } void Dialog::on_startAdbdBtn_clicked() { if (checkAdbRun()) { return; } outLog("start devices adbd...", false); // adb tcpip 5555 QStringList adbArgs; adbArgs << "tcpip"; adbArgs << "5555"; m_adb.execute(ui->serialBox->currentText().trimmed(), adbArgs); } void Dialog::outLog(const QString &log, bool newLine) { // avoid sub thread update ui QString backLog = log; QTimer::singleShot(0, this, [this, backLog, newLine]() { ui->outEdit->append(backLog); if (newLine) { ui->outEdit->append("
"); } }); } bool Dialog::filterLog(const QString &log) { if (log.contains("app_proces")) { return true; } if (log.contains("Unable to set geometry")) { return true; } return false; } bool Dialog::checkAdbRun() { if (m_adb.isRuning()) { outLog("wait for the end of the current command to run"); } return m_adb.isRuning(); } void Dialog::on_getIPBtn_clicked() { if (checkAdbRun()) { return; } outLog("get ip...", false); // adb -s P7C0218510000537 shell ifconfig wlan0 // or // adb -s P7C0218510000537 shell ip -f inet addr show wlan0 QStringList adbArgs; #if 0 adbArgs << "shell"; adbArgs << "ip"; adbArgs << "-f"; adbArgs << "inet"; adbArgs << "addr"; adbArgs << "show"; adbArgs << "wlan0"; #else adbArgs << "shell"; adbArgs << "ifconfig"; adbArgs << "wlan0"; #endif m_adb.execute(ui->serialBox->currentText().trimmed(), adbArgs); } void Dialog::getIPbyIp() { if (checkAdbRun()) { return; } QStringList adbArgs; adbArgs << "shell"; adbArgs << "ip -o a"; m_adb.execute(ui->serialBox->currentText().trimmed(), adbArgs); } void Dialog::on_wirelessDisConnectBtn_clicked() { if (checkAdbRun()) { return; } QString addr = ui->deviceIpEdt->text().trimmed(); outLog("wireless disconnect...", false); QStringList adbArgs; adbArgs << "disconnect"; adbArgs << addr; m_adb.execute("", adbArgs); } void Dialog::on_selectRecordPathBtn_clicked() { QFileDialog::Options options = QFileDialog::DontResolveSymlinks | QFileDialog::ShowDirsOnly; QString directory = QFileDialog::getExistingDirectory(this, tr("select path"), "", options); ui->recordPathEdt->setText(directory); } void Dialog::on_recordPathEdt_textChanged(const QString &arg1) { Config::getInstance().setRecordPath(arg1); ui->recordPathEdt->setToolTip(arg1.trimmed()); ui->notDisplayCheck->setCheckable(!arg1.trimmed().isEmpty()); } void Dialog::on_adbCommandBtn_clicked() { execAdbCmd(); } void Dialog::on_stopAdbBtn_clicked() { m_adb.kill(); } void Dialog::on_clearOut_clicked() { ui->outEdit->clear(); } void Dialog::on_stopAllServerBtn_clicked() { m_deviceManage.disconnectAllDevice(); } void Dialog::on_refreshGameScriptBtn_clicked() { ui->gameBox->clear(); QDir dir(KeyMap::getKeyMapPath()); if (!dir.exists()) { outLog("keymap directory not find", true); return; } dir.setFilter(QDir::Files | QDir::NoSymLinks); QFileInfoList list = dir.entryInfoList(); QFileInfo fileInfo; int size = list.size(); for (int i = 0; i < size; ++i) { fileInfo = list.at(i); ui->gameBox->addItem(fileInfo.fileName()); } } void Dialog::on_applyScriptBtn_clicked() { m_deviceManage.updateScript(getGameScript(ui->gameBox->currentText())); } void Dialog::on_recordScreenCheck_clicked(bool checked) { if (!checked) { return; } QString fileDir(ui->recordPathEdt->text().trimmed()); if (fileDir.isEmpty()) { qWarning() << "please select record save path!!!"; ui->recordScreenCheck->setChecked(false); } } void Dialog::on_bitRateBox_activated(int index) { Config::getInstance().setBitRateIndex(index); } void Dialog::on_maxSizeBox_activated(int index) { Config::getInstance().setMaxSizeIndex(index); } void Dialog::on_formatBox_activated(int index) { Config::getInstance().setRecordFormatIndex(index); } void Dialog::on_framelessCheck_stateChanged(int arg1) { Q_UNUSED(arg1) Config::getInstance().setFramelessWindow(ui->framelessCheck->isChecked()); }