Immediately return the default device if is found

Task-number: QTCREATORBUG-15422
Change-Id: I7be44fbe43c320c171ffb724ffd25414e184fd9a
Reviewed-by: Tobias Hunger <tobias.hunger@theqtcompany.com>
This commit is contained in:
BogDan Vatra
2015-12-04 10:03:45 +02:00
parent 255611f3e7
commit 957c0af570
5 changed files with 45 additions and 75 deletions

View File

@@ -688,7 +688,7 @@ bool AndroidConfig::removeAVD(const QString &name) const
return !proc.exitCode(); return !proc.exitCode();
} }
QFuture<QVector<AndroidDeviceInfo>> AndroidConfig::androidVirtualDevicesFuture() QFuture<QVector<AndroidDeviceInfo>> AndroidConfig::androidVirtualDevicesFuture() const
{ {
return QtConcurrent::run(&AndroidConfig::androidVirtualDevices, androidToolPath().toString(), androidToolEnvironment()); return QtConcurrent::run(&AndroidConfig::androidVirtualDevices, androidToolPath().toString(), androidToolEnvironment());
} }
@@ -1177,9 +1177,8 @@ AndroidDeviceInfo AndroidConfigurations::showDeviceDialog(Project *project,
{ {
QString serialNumber = defaultDevice(project, abi); QString serialNumber = defaultDevice(project, abi);
AndroidDeviceDialog dialog(apiLevel, abi, options, serialNumber, Core::ICore::mainWindow()); AndroidDeviceDialog dialog(apiLevel, abi, options, serialNumber, Core::ICore::mainWindow());
if (dialog.exec() == QDialog::Accepted) {
AndroidDeviceInfo info = dialog.device(); AndroidDeviceInfo info = dialog.device();
if (dialog.saveDeviceSelection()) { if (dialog.saveDeviceSelection() && info.isValid()) {
const QString serialNumber = info.type == AndroidDeviceInfo::Hardware ? const QString serialNumber = info.type == AndroidDeviceInfo::Hardware ?
info.serialNumber : info.avdname; info.serialNumber : info.avdname;
if (!serialNumber.isEmpty()) if (!serialNumber.isEmpty())
@@ -1187,8 +1186,6 @@ AndroidDeviceInfo AndroidConfigurations::showDeviceDialog(Project *project,
} }
return info; return info;
} }
return AndroidDeviceInfo();
}
void AndroidConfigurations::clearDefaultDevices(Project *project) void AndroidConfigurations::clearDefaultDevices(Project *project)
{ {

View File

@@ -154,7 +154,7 @@ public:
QVector<AndroidDeviceInfo> connectedDevices(QString *error = 0) const; QVector<AndroidDeviceInfo> connectedDevices(QString *error = 0) const;
static QVector<AndroidDeviceInfo> connectedDevices(const QString &adbToolPath, QString *error = 0); static QVector<AndroidDeviceInfo> connectedDevices(const QString &adbToolPath, QString *error = 0);
QFuture<QVector<AndroidDeviceInfo> > androidVirtualDevicesFuture(); QFuture<QVector<AndroidDeviceInfo> > androidVirtualDevicesFuture() const;
static QVector<AndroidDeviceInfo> androidVirtualDevices(const QString &androidTool, const Utils::Environment &environment); static QVector<AndroidDeviceInfo> androidVirtualDevices(const QString &androidTool, const Utils::Environment &environment);
QString startAVD(const QString &name) const; QString startAVD(const QString &name) const;

View File

@@ -480,9 +480,8 @@ AndroidDeviceDialog::AndroidDeviceDialog(int apiLevel, const QString &abi, Andro
connect(m_ui->lookingForDeviceCancel, &QPushButton::clicked, connect(m_ui->lookingForDeviceCancel, &QPushButton::clicked,
this, &AndroidDeviceDialog::defaultDeviceClear); this, &AndroidDeviceDialog::defaultDeviceClear);
m_defaultDeviceTimer.start();
refreshDeviceList(); m_connectedDevices = AndroidConfig::connectedDevices(AndroidConfigurations::currentConfig().adbToolPath().toString());
} }
AndroidDeviceDialog::~AndroidDeviceDialog() AndroidDeviceDialog::~AndroidDeviceDialog()
@@ -494,17 +493,25 @@ AndroidDeviceDialog::~AndroidDeviceDialog()
AndroidDeviceInfo AndroidDeviceDialog::device() AndroidDeviceInfo AndroidDeviceDialog::device()
{ {
if (result() == QDialog::Accepted) if (!m_defaultDevice.isEmpty()) {
auto device = std::find_if(m_connectedDevices.begin(), m_connectedDevices.end(), [this](const AndroidDeviceInfo& info) {
return info.serialNumber == m_defaultDevice ||
info.avdname == m_defaultDevice;
});
if (device != m_connectedDevices.end())
return *device;
m_defaultDevice.clear();
}
refreshDeviceList();
if (exec() == QDialog::Accepted)
return m_model->device(m_ui->deviceView->currentIndex()); return m_model->device(m_ui->deviceView->currentIndex());
return AndroidDeviceInfo(); return AndroidDeviceInfo();
} }
void AndroidDeviceDialog::accept() bool AndroidDeviceDialog::saveDeviceSelection() const
{
QDialog::accept();
}
bool AndroidDeviceDialog::saveDeviceSelection()
{ {
return m_ui->defaultDeviceCheckBox->isChecked(); return m_ui->defaultDeviceCheckBox->isChecked();
} }
@@ -513,27 +520,8 @@ void AndroidDeviceDialog::refreshDeviceList()
{ {
m_ui->refreshDevicesButton->setEnabled(false); m_ui->refreshDevicesButton->setEnabled(false);
m_progressIndicator->show(); m_progressIndicator->show();
m_futureWatcherRefreshDevices.setFuture(QtConcurrent::run(&AndroidDeviceDialog::refreshDevices, m_connectedDevices = AndroidConfig::connectedDevices(AndroidConfigurations::currentConfig().adbToolPath().toString());
AndroidConfigurations::currentConfig().adbToolPath().toString(), m_futureWatcherRefreshDevices.setFuture(AndroidConfigurations::currentConfig().androidVirtualDevicesFuture());
AndroidConfigurations::currentConfig().androidToolPath().toString(),
AndroidConfigurations::currentConfig().androidToolEnvironment()));
}
QVector<AndroidDeviceInfo> AndroidDeviceDialog::refreshDevices(const QString &adbToolPath,
const QString &androidToolPath,
const Utils::Environment &environment)
{
QVector<AndroidDeviceInfo> devices = AndroidConfig::connectedDevices(adbToolPath);
QSet<QString> startedAvds = Utils::transform<QSet>(devices,
[] (const AndroidDeviceInfo &info) {
return info.avdname;
});
for (const AndroidDeviceInfo &dev : AndroidConfig::androidVirtualDevices(androidToolPath, environment))
if (!startedAvds.contains(dev.avdname))
devices << dev;
return devices;
} }
void AndroidDeviceDialog::devicesRefreshed() void AndroidDeviceDialog::devicesRefreshed()
@@ -549,7 +537,16 @@ void AndroidDeviceDialog::devicesRefreshed()
} }
QVector<AndroidDeviceInfo> devices = m_futureWatcherRefreshDevices.result(); QVector<AndroidDeviceInfo> devices = m_futureWatcherRefreshDevices.result();
m_model->setDevices(devices); QSet<QString> startedAvds = Utils::transform<QSet>(m_connectedDevices,
[] (const AndroidDeviceInfo &info) {
return info.avdname;
});
for (const AndroidDeviceInfo &dev : devices)
if (!startedAvds.contains(dev.avdname))
m_connectedDevices << dev;
m_model->setDevices(m_connectedDevices);
m_ui->deviceView->expand(m_model->index(0, 0)); m_ui->deviceView->expand(m_model->index(0, 0));
if (m_model->rowCount() > 1) // we have a incompatible device node if (m_model->rowCount() > 1) // we have a incompatible device node
@@ -573,37 +570,18 @@ void AndroidDeviceDialog::devicesRefreshed()
if (!newIndex.isValid() && !serialNumber.isEmpty()) if (!newIndex.isValid() && !serialNumber.isEmpty())
newIndex = m_model->indexFor(deviceType, serialNumber); newIndex = m_model->indexFor(deviceType, serialNumber);
if (!newIndex.isValid() && !devices.isEmpty()) { if (!newIndex.isValid() && !m_connectedDevices.isEmpty()) {
AndroidDeviceInfo info = devices.first(); AndroidDeviceInfo info = m_connectedDevices.first();
const QString &name = info.type == AndroidDeviceInfo::Hardware ? info.serialNumber : info.avdname; const QString &name = info.type == AndroidDeviceInfo::Hardware ? info.serialNumber : info.avdname;
newIndex = m_model->indexFor(info.type, name); newIndex = m_model->indexFor(info.type, name);
} }
m_ui->deviceView->setCurrentIndex(newIndex); m_ui->deviceView->setCurrentIndex(newIndex);
m_ui->stackedWidget->setCurrentIndex(devices.isEmpty() ? 1 : 0); m_ui->stackedWidget->setCurrentIndex(m_connectedDevices.isEmpty() ? 1 : 0);
m_ui->refreshDevicesButton->setEnabled(true); m_ui->refreshDevicesButton->setEnabled(true);
m_connectedDevices.clear();
if (!m_defaultDevice.isEmpty()) {
int elapsed = m_defaultDeviceTimer.elapsed();
if (elapsed > 4000)
accept();
else
QTimer::singleShot(4000 - elapsed, this, &AndroidDeviceDialog::useDefaultDevice);
}
}
void AndroidDeviceDialog::useDefaultDevice()
{
if (m_defaultDevice.isEmpty())
return;
AndroidDeviceInfo info = m_model->device(m_ui->deviceView->currentIndex());
if (info.serialNumber == m_defaultDevice
|| info.avdname == m_defaultDevice)
accept();
else // something different is selected
defaultDeviceClear();
} }
void AndroidDeviceDialog::createAvd() void AndroidDeviceDialog::createAvd()

View File

@@ -60,9 +60,8 @@ public:
~AndroidDeviceDialog(); ~AndroidDeviceDialog();
AndroidDeviceInfo device(); AndroidDeviceInfo device();
void accept();
bool saveDeviceSelection(); bool saveDeviceSelection() const;
private slots: private slots:
void refreshDeviceList(); void refreshDeviceList();
@@ -71,12 +70,8 @@ private slots:
void showHelp(); void showHelp();
void avdAdded(); void avdAdded();
private: private:
static QVector<AndroidDeviceInfo> refreshDevices(const QString &adbToolPath,
const QString &androidToolPath,
const Utils::Environment &environment);
void devicesRefreshed(); void devicesRefreshed();
void enableOkayButton(); void enableOkayButton();
void useDefaultDevice();
void defaultDeviceClear(); void defaultDeviceClear();
AndroidDeviceModel *m_model; AndroidDeviceModel *m_model;
@@ -86,7 +81,7 @@ private:
QString m_abi; QString m_abi;
QString m_avdNameFromAdd; QString m_avdNameFromAdd;
QString m_defaultDevice; QString m_defaultDevice;
QTime m_defaultDeviceTimer; QVector<AndroidDeviceInfo> m_connectedDevices;
QFutureWatcher<AndroidConfig::CreateAvdInfo> m_futureWatcherAddDevice; QFutureWatcher<AndroidConfig::CreateAvdInfo> m_futureWatcherAddDevice;
QFutureWatcher<QVector<AndroidDeviceInfo>> m_futureWatcherRefreshDevices; QFutureWatcher<QVector<AndroidDeviceInfo>> m_futureWatcherRefreshDevices;
}; };

View File

@@ -307,7 +307,7 @@ void AndroidManager::cleanLibsOnDevice(ProjectExplorer::Target *target)
return; return;
const int deviceAPILevel = AndroidManager::minimumSDK(target); const int deviceAPILevel = AndroidManager::minimumSDK(target);
AndroidDeviceInfo info = AndroidConfigurations::showDeviceDialog(target->project(), deviceAPILevel, targetArch, AndroidConfigurations::None); AndroidDeviceInfo info = AndroidConfigurations::showDeviceDialog(target->project(), deviceAPILevel, targetArch, AndroidConfigurations::None);
if (info.serialNumber.isEmpty() && info.avdname.isEmpty()) // aborted if (!info.isValid()) // aborted
return; return;
QString deviceSerialNumber = info.serialNumber; QString deviceSerialNumber = info.serialNumber;
@@ -336,7 +336,7 @@ void AndroidManager::installQASIPackage(ProjectExplorer::Target *target, const Q
return; return;
const int deviceAPILevel = AndroidManager::minimumSDK(target); const int deviceAPILevel = AndroidManager::minimumSDK(target);
AndroidDeviceInfo info = AndroidConfigurations::showDeviceDialog(target->project(), deviceAPILevel, targetArch, AndroidConfigurations::None); AndroidDeviceInfo info = AndroidConfigurations::showDeviceDialog(target->project(), deviceAPILevel, targetArch, AndroidConfigurations::None);
if (info.serialNumber.isEmpty() && info.avdname.isEmpty()) // aborted if (!info.isValid()) // aborted
return; return;
QString deviceSerialNumber = info.serialNumber; QString deviceSerialNumber = info.serialNumber;