diff --git a/src/plugins/android/androiddevice.cpp b/src/plugins/android/androiddevice.cpp index 0c1b29b46b6..997c0ced0af 100644 --- a/src/plugins/android/androiddevice.cpp +++ b/src/plugins/android/androiddevice.cpp @@ -644,6 +644,18 @@ QString AndroidDeviceManager::getRunningAvdsSerialNumber(const QString &name) co return {}; } +static FilePath avdFilePath() +{ + QString avdEnvVar = qtcEnvironmentVariable("ANDROID_AVD_HOME"); + if (avdEnvVar.isEmpty()) { + avdEnvVar = qtcEnvironmentVariable("ANDROID_SDK_HOME"); + if (avdEnvVar.isEmpty()) + avdEnvVar = qtcEnvironmentVariable("HOME"); + avdEnvVar.append("/.android/avd"); + } + return FilePath::fromUserInput(avdEnvVar); +} + void AndroidDeviceManager::setupDevicesWatcher() { if (!androidConfig().adbToolPath().exists()) { @@ -686,15 +698,7 @@ void AndroidDeviceManager::setupDevicesWatcher() // Setup AVD filesystem watcher to listen for changes when an avd is created/deleted, // or started/stopped - QString avdEnvVar = qtcEnvironmentVariable("ANDROID_AVD_HOME"); - if (avdEnvVar.isEmpty()) { - avdEnvVar = qtcEnvironmentVariable("ANDROID_SDK_HOME"); - if (avdEnvVar.isEmpty()) - avdEnvVar = qtcEnvironmentVariable("HOME"); - avdEnvVar.append("/.android/avd"); - } - const FilePath avdPath = FilePath::fromUserInput(avdEnvVar); - m_avdFileSystemWatcher.addPath(avdPath.toString()); + m_avdFileSystemWatcher.addPath(avdFilePath().toString()); connect(&m_avdsFutureWatcher, &QFutureWatcherBase::finished, this, &AndroidDeviceManager::HandleAvdsListChange); connect(&m_avdFileSystemWatcher, &QFileSystemWatcher::directoryChanged, this, [this] { @@ -708,6 +712,25 @@ void AndroidDeviceManager::setupDevicesWatcher() updateAvdsList(); } +IDevice::Ptr AndroidDeviceManager::createDeviceFromInfo(const CreateAvdInfo &info) +{ + if (info.apiLevel < 0) { + qCWarning(androidDeviceLog) << "System image of the created AVD is nullptr"; + return IDevice::Ptr(); + } + AndroidDevice *dev = new AndroidDevice; + const Utils::Id deviceId = AndroidDevice::idFromAvdInfo(info); + dev->setupId(IDevice::AutoDetected, deviceId); + dev->setMachineType(IDevice::Emulator); + dev->settings()->displayName.setValue(info.name); + dev->setDeviceState(IDevice::DeviceConnected); + dev->setAvdPath(avdFilePath() / (info.name + ".avd")); + dev->setExtraData(Constants::AndroidAvdName, info.name); + dev->setExtraData(Constants::AndroidCpuAbi, {info.abi}); + dev->setExtraData(Constants::AndroidSdk, info.apiLevel); + return IDevice::Ptr(dev); +} + void AndroidDeviceManager::HandleAvdsListChange() { DeviceManager *const devMgr = DeviceManager::instance(); @@ -892,16 +915,15 @@ public: if (dialog.exec() != QDialog::Accepted) return IDevice::Ptr(); - const IDevice::Ptr dev = dialog.device(); + const IDevice::Ptr dev = AndroidDeviceManager::createDeviceFromInfo(dialog.avdInfo()); if (const auto androidDev = static_cast(dev.get())) { qCDebug(androidDeviceLog, "Created new Android AVD id \"%s\".", qPrintable(androidDev->avdName())); - } else { - AndroidDeviceWidget::criticalDialog( - Tr::tr("The device info returned from AvdDialog is invalid.")); + return dev; } - - return IDevice::Ptr(dev); + AndroidDeviceWidget::criticalDialog( + Tr::tr("The device info returned from AvdDialog is invalid.")); + return IDevice::Ptr(); }); } }; diff --git a/src/plugins/android/androiddevice.h b/src/plugins/android/androiddevice.h index 70729533f64..b21958d1d16 100644 --- a/src/plugins/android/androiddevice.h +++ b/src/plugins/android/androiddevice.h @@ -89,6 +89,8 @@ public: QString getRunningAvdsSerialNumber(const QString &name) const; + static ProjectExplorer::IDevice::Ptr createDeviceFromInfo(const CreateAvdInfo &info); + private: explicit AndroidDeviceManager(QObject *parent); ~AndroidDeviceManager(); diff --git a/src/plugins/android/avddialog.cpp b/src/plugins/android/avddialog.cpp index 14064b3204d..0f92d4bef6b 100644 --- a/src/plugins/android/avddialog.cpp +++ b/src/plugins/android/avddialog.cpp @@ -151,22 +151,9 @@ bool AvdDialog::isValid() const return !name().isEmpty() && systemImage() && systemImage()->isValid() && !abi().isEmpty(); } -IDevice::Ptr AvdDialog::device() const +CreateAvdInfo AvdDialog::avdInfo() const { - if (m_createdAvdInfo.apiLevel < 0) { - qCWarning(avdDialogLog) << "System image of the created AVD is nullptr"; - return IDevice::Ptr(); - } - AndroidDevice *dev = new AndroidDevice; - const Utils::Id deviceId = AndroidDevice::idFromAvdInfo(m_createdAvdInfo); - dev->setupId(IDevice::AutoDetected, deviceId); - dev->setMachineType(IDevice::Emulator); - dev->settings()->displayName.setValue(m_createdAvdInfo.name); - dev->setDeviceState(IDevice::DeviceConnected); - dev->setExtraData(Constants::AndroidAvdName, m_createdAvdInfo.name); - dev->setExtraData(Constants::AndroidCpuAbi, {m_createdAvdInfo.abi}); - dev->setExtraData(Constants::AndroidSdk, m_createdAvdInfo.apiLevel); - return IDevice::Ptr(dev); + return m_createdAvdInfo; } AvdDialog::DeviceType AvdDialog::tagToDeviceType(const QString &type_tag) diff --git a/src/plugins/android/avddialog.h b/src/plugins/android/avddialog.h index bdcddc52438..95e78f98343 100644 --- a/src/plugins/android/avddialog.h +++ b/src/plugins/android/avddialog.h @@ -35,7 +35,7 @@ public: enum DeviceType { Phone, Tablet, Automotive, TV, Wear, Desktop, PhoneOrTablet }; - ProjectExplorer::IDevice::Ptr device() const; + CreateAvdInfo avdInfo() const; const SystemImage *systemImage() const; QString name() const;