Android: Use task tree for startAvd() action

As a drive-by, lower some timeouts from 2s into 1s.

Change-Id: I495ad20058b0f97b6cdd5271a390b779c66b4864
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
Jarek Kobus
2024-06-26 14:51:27 +02:00
parent a7dec9f327
commit 2d480f45da
6 changed files with 224 additions and 27 deletions

View File

@@ -16,6 +16,7 @@
#include <coreplugin/icore.h>
#include <projectexplorer/devicesupport/devicemanager.h>
#include <projectexplorer/devicesupport/idevicefactory.h>
#include <projectexplorer/devicesupport/idevicewidget.h>
#include <projectexplorer/kitaspects.h>
#include <projectexplorer/projectexplorerconstants.h>
@@ -23,13 +24,12 @@
#include <projectexplorer/projectmanager.h>
#include <projectexplorer/target.h>
#include <solutions/tasking/tasktree.h>
#include <utils/async.h>
#include <utils/guard.h>
#include <utils/qtcprocess.h>
#include <utils/qtcassert.h>
#include <utils/url.h>
#include <QFileSystemWatcher>
#include <QFormLayout>
#include <QInputDialog>
#include <QLoggingCategory>
@@ -105,22 +105,6 @@ static void updateDeviceState(const IDevice::ConstPtr &device)
devMgr->setDeviceState(id, IDevice::DeviceConnected);
}
static void startAvd(const IDevice::Ptr &device, QWidget *parent)
{
Q_UNUSED(parent)
const AndroidDevice *androidDev = static_cast<const AndroidDevice *>(device.get());
const QString name = androidDev->avdName();
qCDebug(androidDeviceLog, "Starting Android AVD id \"%s\".", qPrintable(name));
Utils::futureSynchronizer()->addFuture(Utils::asyncRun([name, device](QPromise<void> &promise) {
const QString serialNumber = AndroidAvdManager::startAvd(name, promise.future());
// Mark the AVD as ReadyToUse once we know it's started
if (!serialNumber.isEmpty()) {
DeviceManager *const devMgr = DeviceManager::instance();
devMgr->setDeviceState(device->id(), IDevice::DeviceReadyToUse);
}
}));
}
static void setEmulatorArguments(QWidget *parent)
{
const QString helpUrl =
@@ -401,8 +385,8 @@ void AndroidDevice::addActionsIfNotFound()
if (machineType() == Emulator) {
if (!hasStartAction) {
addDeviceAction({startAvdAction, [](const IDevice::Ptr &device, QWidget *parent) {
startAvd(device, parent);
addDeviceAction({startAvdAction, [](const IDevice::Ptr &device, QWidget *) {
static_cast<AndroidDevice *>(device.get())->startAvd();
}});
}
@@ -581,6 +565,24 @@ QString AndroidDevice::openGLStatus() const
return openGL.isEmpty() ? Tr::tr("Unknown") : openGL;
}
void AndroidDevice::startAvd()
{
const Storage<QString> serialNumberStorage;
const auto onDone = [this, serialNumberStorage] {
if (!serialNumberStorage->isEmpty())
DeviceManager::instance()->setDeviceState(id(), IDevice::DeviceReadyToUse);
};
const Group root {
serialNumberStorage,
AndroidAvdManager::startAvdRecipe(avdName(), serialNumberStorage),
onGroupDone(onDone, CallDoneIf::Success)
};
m_taskTreeRunner.start(root);
}
IDevice::DeviceInfo AndroidDevice::deviceInformation() const
{
return IDevice::DeviceInfo();