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)
|
||||
|
||||
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,
|
||||
this, &AndroidRunner::qmlServerPortReady);
|
||||
|
||||
m_thread.start();
|
||||
}
|
||||
|
||||
AndroidRunner::~AndroidRunner()
|
||||
@@ -71,13 +52,19 @@ AndroidRunner::~AndroidRunner()
|
||||
|
||||
void AndroidRunner::start()
|
||||
{
|
||||
QString deviceSerialNumber;
|
||||
int apiLevel = -1;
|
||||
|
||||
if (!projectExplorerSettings().deployBeforeRun && m_target && m_target->project()) {
|
||||
qCDebug(androidRunnerLog) << "Run without deployment";
|
||||
|
||||
const IDevice::ConstPtr device = DeviceKitAspect::device(m_target->kit());
|
||||
AndroidDeviceInfo info = AndroidDevice::androidDeviceInfoFromIDevice(device.get());
|
||||
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()) {
|
||||
const Storage<QString> serialNumberStorage;
|
||||
@@ -87,14 +74,17 @@ void AndroidRunner::start()
|
||||
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)
|
||||
emit asyncStart();
|
||||
startImpl(deviceSerialNumber, apiLevel);
|
||||
});
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
deviceSerialNumber = AndroidManager::deviceSerialNumber(m_target);
|
||||
apiLevel = AndroidManager::deviceApiLevel(m_target);
|
||||
}
|
||||
emit asyncStart();
|
||||
startImpl(deviceSerialNumber, apiLevel);
|
||||
}
|
||||
|
||||
void AndroidRunner::stop()
|
||||
@@ -108,6 +98,29 @@ void AndroidRunner::stop()
|
||||
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)
|
||||
{
|
||||
// FIXME: Note that the passed is nonsense, as the port is on the
|
||||
|
@@ -34,13 +34,12 @@ public:
|
||||
void stop() override;
|
||||
|
||||
signals:
|
||||
void asyncStart();
|
||||
void asyncStop();
|
||||
void qmlServerReady(const QUrl &serverUrl);
|
||||
void androidDeviceInfoChanged(const Android::AndroidDeviceInfo &deviceInfo);
|
||||
void avdDetected();
|
||||
|
||||
private:
|
||||
void startImpl(const QString &deviceSerialNumber, int apiLevel);
|
||||
void qmlServerPortReady(Utils::Port port);
|
||||
void remoteOutput(const QString &output);
|
||||
void remoteErrorOutput(const QString &output);
|
||||
|
@@ -130,7 +130,8 @@ static FilePath debugServer(bool useLldb, const Target *target)
|
||||
return {};
|
||||
}
|
||||
|
||||
AndroidRunnerWorker::AndroidRunnerWorker(RunWorker *runner)
|
||||
AndroidRunnerWorker::AndroidRunnerWorker(RunWorker *runner, const QString &deviceSerialNumber,
|
||||
int apiLevel)
|
||||
{
|
||||
auto runControl = runner->runControl();
|
||||
m_useLldb = Debugger::DebuggerKitAspect::engineType(runControl->kit())
|
||||
@@ -162,8 +163,8 @@ AndroidRunnerWorker::AndroidRunnerWorker(RunWorker *runner)
|
||||
auto target = runControl->target();
|
||||
m_packageName = AndroidManager::packageName(target);
|
||||
m_intentName = m_packageName + '/' + AndroidManager::activityName(target);
|
||||
m_deviceSerialNumber = AndroidManager::deviceSerialNumber(target);
|
||||
m_apiLevel = AndroidManager::deviceApiLevel(target);
|
||||
m_deviceSerialNumber = deviceSerialNumber;
|
||||
m_apiLevel = apiLevel;
|
||||
qCDebug(androidRunWorkerLog) << "Intent name:" << m_intentName
|
||||
<< "Package name:" << m_packageName;
|
||||
qCDebug(androidRunWorkerLog) << "Device API:" << m_apiLevel;
|
||||
@@ -224,14 +225,6 @@ QStringList AndroidRunnerWorker::selector() const
|
||||
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 cmd{AndroidConfig::adbToolPath(), args};
|
||||
|
@@ -21,10 +21,10 @@ class AndroidRunnerWorker : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
AndroidRunnerWorker(ProjectExplorer::RunWorker *runner);
|
||||
AndroidRunnerWorker(ProjectExplorer::RunWorker *runner, const QString &deviceSerialNumber,
|
||||
int apiLevel);
|
||||
~AndroidRunnerWorker() override;
|
||||
|
||||
void setAndroidDeviceInfo(const AndroidDeviceInfo &info);
|
||||
void asyncStart();
|
||||
void asyncStop();
|
||||
|
||||
|
Reference in New Issue
Block a user