forked from qt-creator/qt-creator
Android: Delay creation of AndroidRunnerWorker
Pass device serial number and api level directly to the c'tor. Change-Id: I16c16e1f599714383e5e4bd7f41875889e156276 Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
@@ -40,27 +40,8 @@ AndroidRunner::AndroidRunner(RunControl *runControl)
|
|||||||
};
|
};
|
||||||
Q_UNUSED(metaTypes)
|
Q_UNUSED(metaTypes)
|
||||||
|
|
||||||
m_worker = new AndroidRunnerWorker(this);
|
|
||||||
m_worker->moveToThread(&m_thread);
|
|
||||||
QObject::connect(&m_thread, &QThread::finished, m_worker, &QObject::deleteLater);
|
|
||||||
|
|
||||||
connect(this, &AndroidRunner::asyncStart, m_worker, &AndroidRunnerWorker::asyncStart);
|
|
||||||
connect(this, &AndroidRunner::asyncStop, m_worker, &AndroidRunnerWorker::asyncStop);
|
|
||||||
connect(this, &AndroidRunner::androidDeviceInfoChanged,
|
|
||||||
m_worker, &AndroidRunnerWorker::setAndroidDeviceInfo);
|
|
||||||
|
|
||||||
connect(m_worker, &AndroidRunnerWorker::remoteProcessStarted,
|
|
||||||
this, &AndroidRunner::handleRemoteProcessStarted);
|
|
||||||
connect(m_worker, &AndroidRunnerWorker::remoteProcessFinished,
|
|
||||||
this, &AndroidRunner::handleRemoteProcessFinished);
|
|
||||||
connect(m_worker, &AndroidRunnerWorker::remoteOutput, this, &AndroidRunner::remoteOutput);
|
|
||||||
connect(m_worker, &AndroidRunnerWorker::remoteErrorOutput,
|
|
||||||
this, &AndroidRunner::remoteErrorOutput);
|
|
||||||
|
|
||||||
connect(&m_outputParser, &QmlDebug::QmlOutputParser::waitingForConnectionOnPort,
|
connect(&m_outputParser, &QmlDebug::QmlOutputParser::waitingForConnectionOnPort,
|
||||||
this, &AndroidRunner::qmlServerPortReady);
|
this, &AndroidRunner::qmlServerPortReady);
|
||||||
|
|
||||||
m_thread.start();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
AndroidRunner::~AndroidRunner()
|
AndroidRunner::~AndroidRunner()
|
||||||
@@ -71,13 +52,19 @@ AndroidRunner::~AndroidRunner()
|
|||||||
|
|
||||||
void AndroidRunner::start()
|
void AndroidRunner::start()
|
||||||
{
|
{
|
||||||
|
QString deviceSerialNumber;
|
||||||
|
int apiLevel = -1;
|
||||||
|
|
||||||
if (!projectExplorerSettings().deployBeforeRun && m_target && m_target->project()) {
|
if (!projectExplorerSettings().deployBeforeRun && m_target && m_target->project()) {
|
||||||
qCDebug(androidRunnerLog) << "Run without deployment";
|
qCDebug(androidRunnerLog) << "Run without deployment";
|
||||||
|
|
||||||
const IDevice::ConstPtr device = DeviceKitAspect::device(m_target->kit());
|
const IDevice::ConstPtr device = DeviceKitAspect::device(m_target->kit());
|
||||||
AndroidDeviceInfo info = AndroidDevice::androidDeviceInfoFromIDevice(device.get());
|
AndroidDeviceInfo info = AndroidDevice::androidDeviceInfoFromIDevice(device.get());
|
||||||
AndroidManager::setDeviceSerialNumber(m_target, info.serialNumber);
|
AndroidManager::setDeviceSerialNumber(m_target, info.serialNumber);
|
||||||
emit androidDeviceInfoChanged(info);
|
deviceSerialNumber = info.serialNumber;
|
||||||
|
apiLevel = info.sdk;
|
||||||
|
qCDebug(androidRunnerLog) << "Android Device Info changed" << deviceSerialNumber
|
||||||
|
<< apiLevel;
|
||||||
|
|
||||||
if (!info.avdName.isEmpty()) {
|
if (!info.avdName.isEmpty()) {
|
||||||
const Storage<QString> serialNumberStorage;
|
const Storage<QString> serialNumberStorage;
|
||||||
@@ -87,14 +74,17 @@ void AndroidRunner::start()
|
|||||||
AndroidAvdManager::startAvdRecipe(info.avdName, serialNumberStorage)
|
AndroidAvdManager::startAvdRecipe(info.avdName, serialNumberStorage)
|
||||||
};
|
};
|
||||||
|
|
||||||
m_startAvdRunner.start(recipe, {}, [this](DoneWith result) {
|
m_startAvdRunner.start(recipe, {}, [this, deviceSerialNumber, apiLevel](DoneWith result) {
|
||||||
if (result == DoneWith::Success)
|
if (result == DoneWith::Success)
|
||||||
emit asyncStart();
|
startImpl(deviceSerialNumber, apiLevel);
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
deviceSerialNumber = AndroidManager::deviceSerialNumber(m_target);
|
||||||
|
apiLevel = AndroidManager::deviceApiLevel(m_target);
|
||||||
}
|
}
|
||||||
emit asyncStart();
|
startImpl(deviceSerialNumber, apiLevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AndroidRunner::stop()
|
void AndroidRunner::stop()
|
||||||
@@ -108,6 +98,29 @@ void AndroidRunner::stop()
|
|||||||
emit asyncStop();
|
emit asyncStop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AndroidRunner::startImpl(const QString &deviceSerialNumber, int apiLevel)
|
||||||
|
{
|
||||||
|
if (m_worker)
|
||||||
|
m_worker->deleteLater();
|
||||||
|
|
||||||
|
m_worker = new AndroidRunnerWorker(this, deviceSerialNumber, apiLevel);
|
||||||
|
m_worker->moveToThread(&m_thread);
|
||||||
|
QObject::connect(&m_thread, &QThread::finished, m_worker, &QObject::deleteLater);
|
||||||
|
|
||||||
|
connect(this, &AndroidRunner::asyncStop, m_worker, &AndroidRunnerWorker::asyncStop);
|
||||||
|
|
||||||
|
connect(m_worker, &AndroidRunnerWorker::remoteProcessStarted,
|
||||||
|
this, &AndroidRunner::handleRemoteProcessStarted);
|
||||||
|
connect(m_worker, &AndroidRunnerWorker::remoteProcessFinished,
|
||||||
|
this, &AndroidRunner::handleRemoteProcessFinished);
|
||||||
|
connect(m_worker, &AndroidRunnerWorker::remoteOutput, this, &AndroidRunner::remoteOutput);
|
||||||
|
connect(m_worker, &AndroidRunnerWorker::remoteErrorOutput,
|
||||||
|
this, &AndroidRunner::remoteErrorOutput);
|
||||||
|
|
||||||
|
m_thread.start();
|
||||||
|
QMetaObject::invokeMethod(m_worker, &AndroidRunnerWorker::asyncStart);
|
||||||
|
}
|
||||||
|
|
||||||
void AndroidRunner::qmlServerPortReady(Port port)
|
void AndroidRunner::qmlServerPortReady(Port port)
|
||||||
{
|
{
|
||||||
// FIXME: Note that the passed is nonsense, as the port is on the
|
// FIXME: Note that the passed is nonsense, as the port is on the
|
||||||
|
@@ -34,13 +34,12 @@ public:
|
|||||||
void stop() override;
|
void stop() override;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void asyncStart();
|
|
||||||
void asyncStop();
|
void asyncStop();
|
||||||
void qmlServerReady(const QUrl &serverUrl);
|
void qmlServerReady(const QUrl &serverUrl);
|
||||||
void androidDeviceInfoChanged(const Android::AndroidDeviceInfo &deviceInfo);
|
|
||||||
void avdDetected();
|
void avdDetected();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void startImpl(const QString &deviceSerialNumber, int apiLevel);
|
||||||
void qmlServerPortReady(Utils::Port port);
|
void qmlServerPortReady(Utils::Port port);
|
||||||
void remoteOutput(const QString &output);
|
void remoteOutput(const QString &output);
|
||||||
void remoteErrorOutput(const QString &output);
|
void remoteErrorOutput(const QString &output);
|
||||||
|
@@ -130,7 +130,8 @@ static FilePath debugServer(bool useLldb, const Target *target)
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
AndroidRunnerWorker::AndroidRunnerWorker(RunWorker *runner)
|
AndroidRunnerWorker::AndroidRunnerWorker(RunWorker *runner, const QString &deviceSerialNumber,
|
||||||
|
int apiLevel)
|
||||||
{
|
{
|
||||||
auto runControl = runner->runControl();
|
auto runControl = runner->runControl();
|
||||||
m_useLldb = Debugger::DebuggerKitAspect::engineType(runControl->kit())
|
m_useLldb = Debugger::DebuggerKitAspect::engineType(runControl->kit())
|
||||||
@@ -162,8 +163,8 @@ AndroidRunnerWorker::AndroidRunnerWorker(RunWorker *runner)
|
|||||||
auto target = runControl->target();
|
auto target = runControl->target();
|
||||||
m_packageName = AndroidManager::packageName(target);
|
m_packageName = AndroidManager::packageName(target);
|
||||||
m_intentName = m_packageName + '/' + AndroidManager::activityName(target);
|
m_intentName = m_packageName + '/' + AndroidManager::activityName(target);
|
||||||
m_deviceSerialNumber = AndroidManager::deviceSerialNumber(target);
|
m_deviceSerialNumber = deviceSerialNumber;
|
||||||
m_apiLevel = AndroidManager::deviceApiLevel(target);
|
m_apiLevel = apiLevel;
|
||||||
qCDebug(androidRunWorkerLog) << "Intent name:" << m_intentName
|
qCDebug(androidRunWorkerLog) << "Intent name:" << m_intentName
|
||||||
<< "Package name:" << m_packageName;
|
<< "Package name:" << m_packageName;
|
||||||
qCDebug(androidRunWorkerLog) << "Device API:" << m_apiLevel;
|
qCDebug(androidRunWorkerLog) << "Device API:" << m_apiLevel;
|
||||||
@@ -224,14 +225,6 @@ QStringList AndroidRunnerWorker::selector() const
|
|||||||
return AndroidDeviceInfo::adbSelector(m_deviceSerialNumber);
|
return AndroidDeviceInfo::adbSelector(m_deviceSerialNumber);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AndroidRunnerWorker::setAndroidDeviceInfo(const AndroidDeviceInfo &info)
|
|
||||||
{
|
|
||||||
m_deviceSerialNumber = info.serialNumber;
|
|
||||||
m_apiLevel = info.sdk;
|
|
||||||
qCDebug(androidRunWorkerLog) << "Android Device Info changed"
|
|
||||||
<< m_deviceSerialNumber << m_apiLevel;
|
|
||||||
}
|
|
||||||
|
|
||||||
CommandLine AndroidRunnerWorker::adbCommand(std::initializer_list<CommandLine::ArgRef> args) const
|
CommandLine AndroidRunnerWorker::adbCommand(std::initializer_list<CommandLine::ArgRef> args) const
|
||||||
{
|
{
|
||||||
CommandLine cmd{AndroidConfig::adbToolPath(), args};
|
CommandLine cmd{AndroidConfig::adbToolPath(), args};
|
||||||
|
@@ -21,10 +21,10 @@ class AndroidRunnerWorker : public QObject
|
|||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
AndroidRunnerWorker(ProjectExplorer::RunWorker *runner);
|
AndroidRunnerWorker(ProjectExplorer::RunWorker *runner, const QString &deviceSerialNumber,
|
||||||
|
int apiLevel);
|
||||||
~AndroidRunnerWorker() override;
|
~AndroidRunnerWorker() override;
|
||||||
|
|
||||||
void setAndroidDeviceInfo(const AndroidDeviceInfo &info);
|
|
||||||
void asyncStart();
|
void asyncStart();
|
||||||
void asyncStop();
|
void asyncStop();
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user