Android: Hide runAdbCommand in cpp file

Simplify SdkToolResult struct a bit.

Change-Id: I77c72216b94a64ace9bbc4cb342462ff2bf10e95
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
Jarek Kobus
2024-08-22 10:32:03 +02:00
parent 0202290283
commit f0ba53cd93
3 changed files with 38 additions and 54 deletions

View File

@@ -43,6 +43,8 @@ using namespace ProjectExplorer;
using namespace Tasking; using namespace Tasking;
using namespace Utils; using namespace Utils;
using namespace std::chrono_literals;
namespace { namespace {
static Q_LOGGING_CATEGORY(androidDeviceLog, "qtc.android.androiddevice", QtWarningMsg) static Q_LOGGING_CATEGORY(androidDeviceLog, "qtc.android.androiddevice", QtWarningMsg)
} }
@@ -56,6 +58,32 @@ static constexpr char wifiDevicePort[] = "5555";
enum TagModification { CommentOut, Uncomment }; enum TagModification { CommentOut, Uncomment };
static class AndroidDeviceManagerInstance *s_instance = nullptr; static class AndroidDeviceManagerInstance *s_instance = nullptr;
struct SdkToolResult
{
bool success = false;
QString stdOut;
QString stdErr;
QString exitMessage;
};
static SdkToolResult runAdbCommand(const QStringList &args)
{
Process process;
const CommandLine command{AndroidConfig::adbToolPath(), args};
qCDebug(androidDeviceLog) << "Running command (sync):" << command.toUserOutput();
process.setCommand(command);
process.runBlocking(30s, EventLoopMode::On);
const bool success = process.result() == ProcessResult::FinishedWithSuccess;
const SdkToolResult result = {success,
process.cleanedStdOut().trimmed(),
process.cleanedStdErr().trimmed(),
success ? QString() : process.exitMessage()};
qCDebug(androidDeviceLog) << "Command finshed (sync):" << command.toUserOutput()
<< "Success:" << success
<< "Output:" << process.allRawOutput();
return result;
}
class AndroidDeviceManagerInstance : public QObject class AndroidDeviceManagerInstance : public QObject
{ {
public: public:
@@ -86,10 +114,10 @@ static QString displayNameFromInfo(const AndroidDeviceInfo &info)
static IDevice::DeviceState getDeviceState(const QString &serial, IDevice::MachineType type) static IDevice::DeviceState getDeviceState(const QString &serial, IDevice::MachineType type)
{ {
const QStringList args = AndroidDeviceInfo::adbSelector(serial) << "shell" << "echo 1"; const QStringList args = AndroidDeviceInfo::adbSelector(serial) << "shell" << "echo 1";
const SdkToolResult result = AndroidManager::runAdbCommand(args); const SdkToolResult result = runAdbCommand(args);
if (result.success()) if (result.success)
return IDevice::DeviceReadyToUse; return IDevice::DeviceReadyToUse;
else if (type == IDevice::Emulator || result.stdErr().contains("unauthorized")) else if (type == IDevice::Emulator || result.stdErr.contains("unauthorized"))
return IDevice::DeviceConnected; return IDevice::DeviceConnected;
return IDevice::DeviceDisconnected; return IDevice::DeviceDisconnected;
} }
@@ -130,7 +158,7 @@ static void setEmulatorArguments(QWidget *parent)
static QString emulatorName(const QString &serialNumber) static QString emulatorName(const QString &serialNumber)
{ {
const QStringList args = AndroidDeviceInfo::adbSelector(serialNumber) << "emu" << "avd" << "name"; const QStringList args = AndroidDeviceInfo::adbSelector(serialNumber) << "emu" << "avd" << "name";
return AndroidManager::runAdbCommand(args).stdOut(); return runAdbCommand(args).stdOut;
} }
static QString getRunningAvdsSerialNumber(const QString &name) static QString getRunningAvdsSerialNumber(const QString &name)
@@ -213,11 +241,9 @@ static void setupWifiForDevice(const IDevice::Ptr &device, QWidget *parent)
// prepare port // prepare port
QStringList args = adbSelector; QStringList args = adbSelector;
args.append({"tcpip", wifiDevicePort}); args.append({"tcpip", wifiDevicePort});
const SdkToolResult result = AndroidManager::runAdbCommand(args); if (!runAdbCommand(args).success) {
if (!result.success()) {
AndroidDeviceWidget::criticalDialog( AndroidDeviceWidget::criticalDialog(
Tr::tr("Opening connection port %1 failed.").arg(wifiDevicePort), Tr::tr("Opening connection port %1 failed.").arg(wifiDevicePort), parent);
parent);
return; return;
} }
@@ -225,8 +251,8 @@ static void setupWifiForDevice(const IDevice::Ptr &device, QWidget *parent)
// Get device IP address // Get device IP address
QStringList args = adbSelector; QStringList args = adbSelector;
args.append({"shell", "ip", "route"}); args.append({"shell", "ip", "route"});
const SdkToolResult ipRes = AndroidManager::runAdbCommand(args); const SdkToolResult ipRes = runAdbCommand(args);
if (!ipRes.success()) { if (!ipRes.success) {
AndroidDeviceWidget::criticalDialog( AndroidDeviceWidget::criticalDialog(
Tr::tr("Retrieving the device IP address failed."), parent); Tr::tr("Retrieving the device IP address failed."), parent);
return; return;
@@ -235,7 +261,7 @@ static void setupWifiForDevice(const IDevice::Ptr &device, QWidget *parent)
// Expected output from "ip route" is: // Expected output from "ip route" is:
// 192.168.1.0/24 dev wlan0 proto kernel scope link src 192.168.1.190 // 192.168.1.0/24 dev wlan0 proto kernel scope link src 192.168.1.190
// where the ip of interest is at the end of the line // where the ip of interest is at the end of the line
const QStringList ipParts = ipRes.stdOut().split(" "); const QStringList ipParts = ipRes.stdOut.split(" ");
QString ip; QString ip;
if (!ipParts.isEmpty()) { if (!ipParts.isEmpty()) {
ip = ipParts.last(); ip = ipParts.last();
@@ -249,8 +275,7 @@ static void setupWifiForDevice(const IDevice::Ptr &device, QWidget *parent)
// Connect to device // Connect to device
args = adbSelector; args = adbSelector;
args.append({"connect", QString("%1:%2").arg(ip).arg(wifiDevicePort)}); args.append({"connect", QString("%1:%2").arg(ip).arg(wifiDevicePort)});
const SdkToolResult connectRes = AndroidManager::runAdbCommand(args); if (!runAdbCommand(args).success) {
if (!connectRes.success()) {
AndroidDeviceWidget::criticalDialog( AndroidDeviceWidget::criticalDialog(
Tr::tr("Connecting to the device IP \"%1\" failed.").arg(ip), Tr::tr("Connecting to the device IP \"%1\" failed.").arg(ip),
parent); parent);

View File

@@ -645,29 +645,4 @@ Process *startAdbProcess(const QStringList &args, QString *err)
return nullptr; return nullptr;
} }
static SdkToolResult runCommand(const CommandLine &command, const QByteArray &writeData,
int timeoutS)
{
Android::SdkToolResult cmdResult;
Process cmdProc;
cmdProc.setWriteData(writeData);
qCDebug(androidManagerLog) << "Running command (sync):" << command.toUserOutput();
cmdProc.setCommand(command);
cmdProc.runBlocking(std::chrono::seconds(timeoutS), EventLoopMode::On);
cmdResult.m_stdOut = cmdProc.cleanedStdOut().trimmed();
cmdResult.m_stdErr = cmdProc.cleanedStdErr().trimmed();
cmdResult.m_success = cmdProc.result() == ProcessResult::FinishedWithSuccess;
qCDebug(androidManagerLog) << "Command finshed (sync):" << command.toUserOutput()
<< "Success:" << cmdResult.m_success
<< "Output:" << cmdProc.allRawOutput();
if (!cmdResult.success())
cmdResult.m_exitMessage = cmdProc.exitMessage();
return cmdResult;
}
SdkToolResult runAdbCommand(const QStringList &args, const QByteArray &writeData, int timeoutS)
{
return runCommand({AndroidConfig::adbToolPath(), args}, writeData, timeoutS);
}
} // namespace Android::AndroidManager } // namespace Android::AndroidManager

View File

@@ -18,20 +18,6 @@ class Process;
namespace Android { namespace Android {
class SdkToolResult {
public:
SdkToolResult() = default;
bool success() const { return m_success; }
const QString &stdOut() const { return m_stdOut; }
const QString &stdErr() const { return m_stdErr; }
const QString &exitMessage() const { return m_exitMessage; }
bool m_success = false;
QString m_stdOut;
QString m_stdErr;
QString m_exitMessage;
};
namespace AndroidManager namespace AndroidManager
{ {
@@ -81,8 +67,6 @@ bool checkCertificateExists(const Utils::FilePath &keystorePath,
const QString &keystorePasswd, const QString &alias); const QString &keystorePasswd, const QString &alias);
Utils::Process *startAdbProcess(const QStringList &args, QString *err = nullptr); Utils::Process *startAdbProcess(const QStringList &args, QString *err = nullptr);
SdkToolResult runAdbCommand(const QStringList &args, const QByteArray &writeData = {},
int timeoutS = 30);
QJsonObject deploymentSettings(const ProjectExplorer::Target *target); QJsonObject deploymentSettings(const ProjectExplorer::Target *target);
bool isQtCreatorGenerated(const Utils::FilePath &deploymentFile); bool isQtCreatorGenerated(const Utils::FilePath &deploymentFile);