diff options
author | Jarek Kobus <[email protected]> | 2024-05-14 09:32:37 +0200 |
---|---|---|
committer | Jarek Kobus <[email protected]> | 2024-05-21 08:58:54 +0000 |
commit | 60f4822d5f91dfc0f8f565c0e57ea233557fe1b2 (patch) | |
tree | 93a7dd5cc9597f02b8b73d0e8bc990e2bfa68231 | |
parent | dda9234255bf4e5ce94d0ae29ff4b985fef5de73 (diff) |
Android: Supply newly created device with path
Otherwise, the newly created device is going to be removed
and recreated on subsequent HandleAvdsListChange()
causing flickering of the devices combobox in settings.
Change-Id: Idcf58f24eb7f4d4200881cfa912d0866f54d362a
Reviewed-by: <[email protected]>
Reviewed-by: Alessandro Portale <[email protected]>
-rw-r--r-- | src/plugins/android/androiddevice.cpp | 52 | ||||
-rw-r--r-- | src/plugins/android/androiddevice.h | 2 | ||||
-rw-r--r-- | src/plugins/android/avddialog.cpp | 17 | ||||
-rw-r--r-- | src/plugins/android/avddialog.h | 2 |
4 files changed, 42 insertions, 31 deletions
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<AndroidDevice *>(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; |