diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp index e836ba8c3f3..764a6586570 100644 --- a/src/plugins/android/androidconfigurations.cpp +++ b/src/plugins/android/androidconfigurations.cpp @@ -1159,25 +1159,14 @@ AndroidDeviceInfo AndroidConfigurations::showDeviceDialog(Project *project, Options options) { QString serialNumber = defaultDevice(project, abi); - if (!serialNumber.isEmpty()) { - // search for that device - foreach (const AndroidDeviceInfo &info, AndroidConfigurations::currentConfig().connectedDevices()) - if (info.serialNumber == serialNumber - && info.sdk >= apiLevel) - return info; - - foreach (const AndroidDeviceInfo &info, AndroidConfigurations::currentConfig().androidVirtualDevices()) - if (info.serialNumber == serialNumber - && info.sdk >= apiLevel) - return info; - } - - AndroidDeviceDialog dialog(apiLevel, abi, options, Core::ICore::mainWindow()); + AndroidDeviceDialog dialog(apiLevel, abi, options, serialNumber, Core::ICore::mainWindow()); if (dialog.exec() == QDialog::Accepted) { AndroidDeviceInfo info = dialog.device(); if (dialog.saveDeviceSelection()) { - if (!info.serialNumber.isEmpty()) - AndroidConfigurations::setDefaultDevice(project, abi, info.serialNumber); + const QString serialNumber = info.type == AndroidDeviceInfo::Hardware ? + info.serialNumber : info.avdname; + if (!serialNumber.isEmpty()) + AndroidConfigurations::setDefaultDevice(project, abi, serialNumber); } return info; } diff --git a/src/plugins/android/androiddevicedialog.cpp b/src/plugins/android/androiddevicedialog.cpp index d9f2a2155e4..f26e7bc24d2 100644 --- a/src/plugins/android/androiddevicedialog.cpp +++ b/src/plugins/android/androiddevicedialog.cpp @@ -420,12 +420,14 @@ static inline QString msgAdbListDevices() return AndroidDeviceDialog::tr("

The adb tool in the Android SDK lists all connected devices if run via "adb devices".

"); } -AndroidDeviceDialog::AndroidDeviceDialog(int apiLevel, const QString &abi, AndroidConfigurations::Options options, QWidget *parent) : +AndroidDeviceDialog::AndroidDeviceDialog(int apiLevel, const QString &abi, AndroidConfigurations::Options options, + const QString &serialNumber, QWidget *parent) : QDialog(parent), m_model(new AndroidDeviceModel(apiLevel, abi, options)), m_ui(new Ui::AndroidDeviceDialog), m_apiLevel(apiLevel), - m_abi(abi) + m_abi(abi), + m_defaultDevice(serialNumber) { m_ui->setupUi(this); m_ui->deviceView->setModel(m_model); @@ -466,6 +468,19 @@ AndroidDeviceDialog::AndroidDeviceDialog(int apiLevel, const QString &abi, Andro m_progressIndicator = new Utils::ProgressIndicator(Utils::ProgressIndicator::Large, this); m_progressIndicator->attachToWidget(m_ui->deviceView); + + if (serialNumber.isEmpty()) { + m_ui->lookingForDevice->setVisible(false); + m_ui->lookingForDeviceCancel->setVisible(false); + } else { + m_ui->lookingForDevice->setVisible(true); + m_ui->lookingForDevice->setText(tr("Looking for default device %1.").arg(serialNumber)); + m_ui->lookingForDeviceCancel->setVisible(true); + } + + connect(m_ui->lookingForDeviceCancel, &QPushButton::clicked, + this, &AndroidDeviceDialog::defaultDeviceClear); + m_defaultDeviceTimer.start(); } AndroidDeviceDialog::~AndroidDeviceDialog() @@ -523,17 +538,11 @@ void AndroidDeviceDialog::devicesRefreshed() m_progressIndicator->hide(); QString serialNumber; AndroidDeviceInfo::AndroidDeviceType deviceType; - if (!m_avdNameFromAdd.isEmpty()) { - serialNumber = m_avdNameFromAdd; - m_avdNameFromAdd.clear(); - deviceType = AndroidDeviceInfo::Emulator; - } else { - QModelIndex currentIndex = m_ui->deviceView->currentIndex(); - if (currentIndex.isValid()) { - AndroidDeviceInfo info = m_model->device(currentIndex); - deviceType = info.type; - serialNumber = deviceType == AndroidDeviceInfo::Hardware ? info.serialNumber : info.avdname; - } + QModelIndex currentIndex = m_ui->deviceView->currentIndex(); + if (currentIndex.isValid()) { // save currently selected index + AndroidDeviceInfo info = m_model->device(currentIndex); + deviceType = info.type; + serialNumber = deviceType == AndroidDeviceInfo::Hardware ? info.serialNumber : info.avdname; } QVector devices = m_futureWatcherRefreshDevices.result(); @@ -545,7 +554,20 @@ void AndroidDeviceDialog::devicesRefreshed() // Smartly select a index QModelIndex newIndex; - if (!serialNumber.isEmpty()) + if (!m_defaultDevice.isEmpty()) { + newIndex = m_model->indexFor(AndroidDeviceInfo::Hardware, m_defaultDevice); + if (!newIndex.isValid()) + newIndex = m_model->indexFor(AndroidDeviceInfo::Emulator, m_defaultDevice); + if (!newIndex.isValid()) // not found the default device + defaultDeviceClear(); + } + + if (!newIndex.isValid() && !m_avdNameFromAdd.isEmpty()) { + newIndex = m_model->indexFor(AndroidDeviceInfo::Emulator, m_avdNameFromAdd); + m_avdNameFromAdd.clear(); + } + + if (!newIndex.isValid() && !serialNumber.isEmpty()) newIndex = m_model->indexFor(deviceType, serialNumber); if (!newIndex.isValid() && !devices.isEmpty()) { @@ -559,6 +581,26 @@ void AndroidDeviceDialog::devicesRefreshed() m_ui->stackedWidget->setCurrentIndex(devices.isEmpty() ? 1 : 0); m_ui->refreshDevicesButton->setEnabled(true); + + 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() @@ -614,3 +656,10 @@ void AndroidDeviceDialog::showHelp() pos = m_ui->missingLabel->parentWidget()->mapToGlobal(pos); QToolTip::showText(pos, msgConnect() + msgAdbListDevices(), this); } + +void AndroidDeviceDialog::defaultDeviceClear() +{ + m_ui->lookingForDevice->setVisible(false); + m_ui->lookingForDeviceCancel->setVisible(false); + m_defaultDevice.clear(); +} diff --git a/src/plugins/android/androiddevicedialog.h b/src/plugins/android/androiddevicedialog.h index 51e18959302..2317c4e2c23 100644 --- a/src/plugins/android/androiddevicedialog.h +++ b/src/plugins/android/androiddevicedialog.h @@ -36,6 +36,7 @@ #include #include #include +#include QT_BEGIN_NAMESPACE class QModelIndex; @@ -54,7 +55,8 @@ class AndroidDeviceDialog : public QDialog Q_OBJECT public: - explicit AndroidDeviceDialog(int apiLevel, const QString &abi, AndroidConfigurations::Options opts, QWidget *parent = 0); + explicit AndroidDeviceDialog(int apiLevel, const QString &abi, AndroidConfigurations::Options opts, + const QString &serialNumber, QWidget *parent = 0); ~AndroidDeviceDialog(); AndroidDeviceInfo device(); @@ -74,6 +76,8 @@ private: const Utils::Environment &environment); void devicesRefreshed(); void enableOkayButton(); + void useDefaultDevice(); + void defaultDeviceClear(); AndroidDeviceModel *m_model; Ui::AndroidDeviceDialog *m_ui; @@ -81,6 +85,8 @@ private: int m_apiLevel; QString m_abi; QString m_avdNameFromAdd; + QString m_defaultDevice; + QTime m_defaultDeviceTimer; QFutureWatcher m_futureWatcherAddDevice; QFutureWatcher> m_futureWatcherRefreshDevices; }; diff --git a/src/plugins/android/androiddevicedialog.ui b/src/plugins/android/androiddevicedialog.ui index f480a9d54ee..625d6657fc9 100644 --- a/src/plugins/android/androiddevicedialog.ui +++ b/src/plugins/android/androiddevicedialog.ui @@ -6,53 +6,54 @@ 0 0 - 636 - 438 + 788 + 466 Select Android Device - + + + + Qt::Horizontal + + + + 40 + 20 + + + + + Always use this device for architecture %1 - - - - Create Android Virtual Device - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - Refresh Device List - - - - + 0 - + + 0 + + + 0 + + + 0 + + + 0 + + @@ -62,7 +63,7 @@ - + <html><head/><body><p><a href="aaa"><span style=" text-decoration: underline; color:#0057ae;">My device is missing</span></a></p></body></html> @@ -72,10 +73,42 @@ + + + + + + + + + + + + 0 + 0 + + + + Cancel + + + + + 0 + + + 0 + + + 0 + + + 0 + @@ -96,6 +129,42 @@ + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + 0 + 0 + + + + Create Android Virtual Device + + + + + + + + 0 + 0 + + + + Refresh Device List + + +