From e0bb7b839b81d2655c5e32bd8e2c2347acfacaf9 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Mon, 4 Nov 2024 15:53:43 +0100 Subject: [PATCH] Android: Fix freeze when showing Devices settings category It looks like executing blocking process from inside AndroidDevice::createWidget(), which is executed from show event, may interferre with GUI. The fix is to execute the blocking process with a delay. Fixes: QTCREATORBUG-31912 Change-Id: Id5a065364e0992c31e586547fc520f76a89f95cf Reviewed-by: Alessandro Portale --- src/plugins/android/androiddevice.cpp | 21 +++++++++++---------- src/plugins/android/androiddevice.h | 1 - 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/plugins/android/androiddevice.cpp b/src/plugins/android/androiddevice.cpp index fb614130d7f..8b819ff48fa 100644 --- a/src/plugins/android/androiddevice.cpp +++ b/src/plugins/android/androiddevice.cpp @@ -295,16 +295,14 @@ AndroidDeviceWidget::AndroidDeviceWidget(const IDevice::Ptr &device) setLayout(formLayout); formLayout->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow); - if (!dev->isValid()) + if (dev->avdName().isEmpty()) return; formLayout->addRow(Tr::tr("Device name:"), new QLabel(dev->displayName())); formLayout->addRow(Tr::tr("Device type:"), new QLabel(dev->deviceTypeName())); - const QString serialNumber = dev->serialNumber(); - const QString printableSerialNumber = serialNumber.isEmpty() ? Tr::tr("Unknown") - : serialNumber; - formLayout->addRow(Tr::tr("Serial number:"), new QLabel(printableSerialNumber)); + QLabel *serialNumberLabel = new QLabel; + formLayout->addRow(Tr::tr("Serial number:"), serialNumberLabel); const QString abis = dev->supportedAbis().join(", "); formLayout->addRow(Tr::tr("CPU architecture:"), new QLabel(abis)); @@ -327,6 +325,14 @@ AndroidDeviceWidget::AndroidDeviceWidget(const IDevice::Ptr &device) const QString openGlStatus = dev->openGLStatus(); formLayout->addRow(Tr::tr("OpenGL status:"), new QLabel(openGlStatus)); } + + // See QTCREATORBUG-31912 why this needs to be delayed. + QTimer::singleShot(0, this, [serialNumberLabel, dev] { + const QString serialNumber = dev->serialNumber(); // This executes a blocking process. + const QString printableSerialNumber = serialNumber.isEmpty() ? Tr::tr("Unknown") + : serialNumber; + serialNumberLabel->setText(printableSerialNumber); + }); } QString AndroidDeviceWidget::dialogTitle() @@ -522,11 +528,6 @@ bool AndroidDevice::canHandleDeployments() const return true; } -bool AndroidDevice::isValid() const -{ - return !serialNumber().isEmpty() || !avdName().isEmpty(); -} - QString AndroidDevice::serialNumber() const { const QString serialNumber = extraData(Constants::AndroidSerialNumber).toString(); diff --git a/src/plugins/android/androiddevice.h b/src/plugins/android/androiddevice.h index c262bf1aa67..3ae700e6347 100644 --- a/src/plugins/android/androiddevice.h +++ b/src/plugins/android/androiddevice.h @@ -31,7 +31,6 @@ public: bool canHandleDeployments() const; - bool isValid() const; QString serialNumber() const; QString avdName() const; int sdkLevel() const;