Android: Replace QFutureInterfaceBase with QFuture<void>

In case a passed future interface is used only for checking for
cancel, use QFuture<void> instead. This will properly integrate
with QPromise API.

Change-Id: I33e5e9c62dbcfb1f7aa71eace6158e5b7c0a7098
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
Jarek Kobus
2023-03-09 12:04:09 +01:00
parent 301f66f190
commit bf059bff7d
3 changed files with 15 additions and 17 deletions

View File

@@ -14,21 +14,17 @@
#include <utils/qtcprocess.h>
#include <utils/runextensions.h>
#include <QApplication>
#include <QLoggingCategory>
#include <QMainWindow>
#include <QMessageBox>
#include <QSettings>
#include <chrono>
#include <functional>
using namespace Utils;
using namespace std;
namespace Android::Internal {
using namespace std;
const int avdCreateTimeoutMs = 30000;
static Q_LOGGING_CATEGORY(avdManagerLog, "qtc.android.avdManager", QtWarningMsg)
@@ -228,7 +224,7 @@ QString AndroidAvdManager::startAvd(const QString &name) const
{
if (!findAvd(name).isEmpty() || startAvdAsync(name))
return waitForAvd(name);
return QString();
return {};
}
static bool is32BitUserSpace()
@@ -301,21 +297,21 @@ QString AndroidAvdManager::findAvd(const QString &avdName) const
if (device.avdName == avdName)
return device.serialNumber;
}
return QString();
return {};
}
QString AndroidAvdManager::waitForAvd(const QString &avdName,
const QFutureInterfaceBase &fi) const
const std::optional<QFuture<void>> &future) const
{
// we cannot use adb -e wait-for-device, since that doesn't work if a emulator is already running
// 60 rounds of 2s sleeping, two minutes for the avd to start
QString serialNumber;
for (int i = 0; i < 60; ++i) {
if (fi.isCanceled())
if (future && future->isCanceled())
return {};
serialNumber = findAvd(avdName);
if (!serialNumber.isEmpty())
return waitForBooted(serialNumber, fi) ? serialNumber : QString();
return waitForBooted(serialNumber, future) ? serialNumber : QString();
QThread::sleep(2);
}
return {};
@@ -339,11 +335,11 @@ bool AndroidAvdManager::isAvdBooted(const QString &device) const
}
bool AndroidAvdManager::waitForBooted(const QString &serialNumber,
const QFutureInterfaceBase &fi) const
const std::optional<QFuture<void>> &future) const
{
// found a serial number, now wait until it's done booting...
for (int i = 0; i < 60; ++i) {
if (fi.isCanceled())
if (future && future->isCanceled())
return false;
if (isAvdBooted(serialNumber))
return true;

View File

@@ -4,8 +4,9 @@
#include "androidconfigurations.h"
#include <functional>
#include <memory>
#include <QFuture>
#include <optional>
namespace Android::Internal {
@@ -22,14 +23,14 @@ public:
QString startAvd(const QString &name) const;
bool startAvdAsync(const QString &avdName) const;
QString findAvd(const QString &avdName) const;
QString waitForAvd(const QString &avdName, const QFutureInterfaceBase &fi = {}) const;
QString waitForAvd(const QString &avdName, const std::optional<QFuture<void>> &future = {}) const;
bool isAvdBooted(const QString &device) const;
static bool avdManagerCommand(const AndroidConfig &config,
const QStringList &args,
QString *output);
private:
bool waitForBooted(const QString &serialNumber, const QFutureInterfaceBase &fi = {}) const;
bool waitForBooted(const QString &serialNumber, const std::optional<QFuture<void>> &future = {}) const;
private:
const AndroidConfig &m_config;

View File

@@ -404,7 +404,8 @@ void AndroidDeployQtStep::slotAskForUninstall(DeployErrorCode errorCode)
void AndroidDeployQtStep::runImpl(QFutureInterface<bool> &fi)
{
if (!m_avdName.isEmpty()) {
QString serialNumber = AndroidAvdManager().waitForAvd(m_avdName, fi);
const QString serialNumber = AndroidAvdManager().waitForAvd(m_avdName,
QFuture<void>(fi.future()));
qCDebug(deployStepLog) << "Deploying to AVD:" << m_avdName << serialNumber;
if (serialNumber.isEmpty()) {
reportWarningOrError(Tr::tr("The deployment AVD \"%1\" cannot be started.")