aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJarek Kobus <[email protected]>2024-05-14 09:32:37 +0200
committerJarek Kobus <[email protected]>2024-05-21 08:58:54 +0000
commit60f4822d5f91dfc0f8f565c0e57ea233557fe1b2 (patch)
tree93a7dd5cc9597f02b8b73d0e8bc990e2bfa68231
parentdda9234255bf4e5ce94d0ae29ff4b985fef5de73 (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.cpp52
-rw-r--r--src/plugins/android/androiddevice.h2
-rw-r--r--src/plugins/android/avddialog.cpp17
-rw-r--r--src/plugins/android/avddialog.h2
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;