diff options
-rw-r--r-- | src/plugins/android/androiddevice.cpp | 36 | ||||
-rw-r--r-- | src/plugins/android/androiddevice.h | 9 | ||||
-rw-r--r-- | src/plugins/android/androidplugin.cpp | 13 | ||||
-rw-r--r-- | src/plugins/android/androidplugin.h | 3 |
4 files changed, 51 insertions, 10 deletions
diff --git a/src/plugins/android/androiddevice.cpp b/src/plugins/android/androiddevice.cpp index 4c550ef643b..dac30fd1446 100644 --- a/src/plugins/android/androiddevice.cpp +++ b/src/plugins/android/androiddevice.cpp @@ -35,6 +35,8 @@ #include <coreplugin/icore.h> +#include <extensionsystem/iplugin.h> + #include <projectexplorer/devicesupport/devicemanager.h> #include <projectexplorer/devicesupport/idevicewidget.h> #include <projectexplorer/kitinformation.h> @@ -594,6 +596,8 @@ void AndroidDeviceManager::setupDevicesWatcher() m_adbDeviceWatcherProcess->setCommand(command); m_adbDeviceWatcherProcess->setEnvironment(AndroidConfigurations::toolsEnvironment(m_androidConfig)); m_adbDeviceWatcherProcess->start(); + qCDebug(androidDeviceLog).noquote() << "ADB device watcher started:" + << command.toUserOutput(); // Setup AVD filesystem watcher to listen for changes when an avd is created/deleted, // or started/stopped @@ -617,6 +621,28 @@ void AndroidDeviceManager::setupDevicesWatcher() updateAvdsList(); } +void AndroidDeviceManager::shutdownDevicesWatcher() +{ + m_avdsFutureWatcher.waitForFinished(); + m_removeAvdFutureWatcher.waitForFinished(); + + if (m_adbDeviceWatcherProcess) { + m_adbDeviceWatcherProcess->terminate(); + m_adbDeviceWatcherProcess->waitForFinished(); + m_adbDeviceWatcherProcess.reset(); + + // Despite terminate/waitForFinished, the process may still + // be around and remain if Qt Creator finishes too early. + QTimer::singleShot(1000, this, [this] { emit devicesWatcherShutdownFinished(); }); + } +} + +ExtensionSystem::IPlugin::ShutdownFlag AndroidDeviceManager::devicesShutdownFlag() const +{ + return m_adbDeviceWatcherProcess ? ExtensionSystem::IPlugin::AsynchronousShutdown + : ExtensionSystem::IPlugin::SynchronousShutdown; +} + void AndroidDeviceManager::HandleAvdsListChange() { DeviceManager *const devMgr = DeviceManager::instance(); @@ -761,16 +787,6 @@ AndroidDeviceManager::AndroidDeviceManager(QObject *parent) m_androidConfig(AndroidConfigurations::currentConfig()), m_avdManager(m_androidConfig) { - connect(qApp, &QCoreApplication::aboutToQuit, this, [this]() { - if (m_adbDeviceWatcherProcess) { - m_adbDeviceWatcherProcess->terminate(); - m_adbDeviceWatcherProcess->waitForFinished(); - m_adbDeviceWatcherProcess.reset(); - } - m_avdsFutureWatcher.waitForFinished(); - m_removeAvdFutureWatcher.waitForFinished(); - }); - connect(&m_removeAvdFutureWatcher, &QFutureWatcherBase::finished, this, &AndroidDeviceManager::handleAvdRemoved); } diff --git a/src/plugins/android/androiddevice.h b/src/plugins/android/androiddevice.h index 8a8abe70ada..5ecf8101e07 100644 --- a/src/plugins/android/androiddevice.h +++ b/src/plugins/android/androiddevice.h @@ -30,6 +30,8 @@ #include "androidconfigurations.h" #include "androiddeviceinfo.h" +#include <extensionsystem/iplugin.h> + #include <projectexplorer/devicesupport/idevice.h> #include <projectexplorer/devicesupport/idevicefactory.h> @@ -98,9 +100,13 @@ private: class AndroidDeviceManager : public QObject { + Q_OBJECT + public: static AndroidDeviceManager *instance(); void setupDevicesWatcher(); + void shutdownDevicesWatcher(); + ExtensionSystem::IPlugin::ShutdownFlag devicesShutdownFlag() const; void updateAvdsList(); IDevice::DeviceState getDeviceState(const QString &serial, IDevice::MachineType type) const; void updateDeviceState(const ProjectExplorer::IDevice::ConstPtr &device); @@ -112,6 +118,9 @@ public: QString getRunningAvdsSerialNumber(const QString &name) const; +signals: + void devicesWatcherShutdownFinished(); + private: AndroidDeviceManager(QObject *parent = nullptr); void HandleDevicesListChange(const QString &serialNumber); diff --git a/src/plugins/android/androidplugin.cpp b/src/plugins/android/androidplugin.cpp index 3207b0c38a4..bda2f80587e 100644 --- a/src/plugins/android/androidplugin.cpp +++ b/src/plugins/android/androidplugin.cpp @@ -160,6 +160,19 @@ bool AndroidPlugin::initialize(const QStringList &arguments, QString *errorMessa return true; } +AndroidPlugin::ShutdownFlag AndroidPlugin::aboutToShutdown() +{ + AndroidDeviceManager *dm = AndroidDeviceManager::instance(); + const IPlugin::ShutdownFlag sf = dm->devicesShutdownFlag(); + + if (sf == AsynchronousShutdown) + connect(dm, &AndroidDeviceManager::devicesWatcherShutdownFinished, + this, &ExtensionSystem::IPlugin::asynchronousShutdownFinished); + + dm->shutdownDevicesWatcher(); + return sf; +} + void AndroidPlugin::kitsRestored() { const bool qtForAndroidInstalled diff --git a/src/plugins/android/androidplugin.h b/src/plugins/android/androidplugin.h index d4ad726cf05..3d46ca08674 100644 --- a/src/plugins/android/androidplugin.h +++ b/src/plugins/android/androidplugin.h @@ -44,6 +44,9 @@ class AndroidPlugin final : public ExtensionSystem::IPlugin class AndroidPluginPrivate *d = nullptr; +public: + ShutdownFlag aboutToShutdown() final; + #ifdef WITH_TESTS private slots: void testAndroidSdkManagerProgressParser_data(); |