diff options
author | Alessandro Portale <alessandro.portale@qt.io> | 2022-11-25 19:43:34 +0100 |
---|---|---|
committer | Alessandro Portale <alessandro.portale@qt.io> | 2023-01-04 10:46:14 +0000 |
commit | 9441865714e541b1e2a9f0e1ecc516a1320d850e (patch) | |
tree | df228839012b2726cb81aefdaf8d750da5115d0c | |
parent | 34c206c7004bafaadc0891e4a66d841775eee4eb (diff) | |
download | qt-creator-9441865714e541b1e2a9f0e1ecc516a1320d850e.tar.gz |
Android: FilePath-ify AVD handling code
Change-Id: Id08414f8fb9ce7f4fac5221cd24392e25f02f00d
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Artem Sokolovskii <artem.sokolovskii@qt.io>
Reviewed-by: hjk <hjk@qt.io>
-rw-r--r-- | src/plugins/android/androidavdmanager.cpp | 55 | ||||
-rw-r--r-- | src/plugins/android/avdmanageroutputparser.cpp | 6 | ||||
-rw-r--r-- | src/plugins/android/avdmanageroutputparser.h | 2 | ||||
-rw-r--r-- | tests/auto/android/tst_avdmanageroutputparser.cpp | 12 |
4 files changed, 38 insertions, 37 deletions
diff --git a/src/plugins/android/androidavdmanager.cpp b/src/plugins/android/androidavdmanager.cpp index d866faf5c1..dc9c8aeae6 100644 --- a/src/plugins/android/androidavdmanager.cpp +++ b/src/plugins/android/androidavdmanager.cpp @@ -158,29 +158,30 @@ bool AndroidAvdManager::removeAvd(const QString &name) const return proc.result() == ProcessResult::FinishedWithSuccess; } -static void avdConfigEditManufacturerTag(const QString &avdPathStr, bool recoverMode = false) +static void avdConfigEditManufacturerTag(const FilePath &avdPath, bool recoverMode = false) { - const FilePath avdPath = FilePath::fromString(avdPathStr); - if (avdPath.exists()) { - const QString configFilePath = avdPath.pathAppended("config.ini").toString(); - QFile configFile(configFilePath); - if (configFile.open(QIODevice::ReadWrite | QIODevice::Text)) { - QString newContent; - QTextStream textStream(&configFile); - while (!textStream.atEnd()) { - QString line = textStream.readLine(); - if (!line.contains("hw.device.manufacturer")) - newContent.append(line + "\n"); - else if (recoverMode) - newContent.append(line.replace("#", "") + "\n"); - else - newContent.append("#" + line + "\n"); - } - configFile.resize(0); - textStream << newContent; - configFile.close(); + if (!avdPath.exists()) + return; + + const FilePath configFilePath = avdPath / "config.ini"; + FileReader reader; + if (!reader.fetch(configFilePath, QIODevice::ReadOnly | QIODevice::Text)) + return; + + FileSaver saver(configFilePath); + QTextStream textStream(reader.data()); + while (!textStream.atEnd()) { + QString line = textStream.readLine(); + if (line.contains("hw.device.manufacturer")) { + if (recoverMode) + line.replace("#", ""); + else + line.prepend("#"); } + line.append("\n"); + saver.write(line.toUtf8()); } + saver.finalize(); } static AndroidDeviceInfoList listVirtualDevices(const AndroidConfig &config) @@ -195,8 +196,8 @@ static AndroidDeviceInfoList listVirtualDevices(const AndroidConfig &config) otherwise, Android Studio would give an error during parsing also. So this fix aim to keep support for Qt Creator and Android Studio. */ - QStringList allAvdErrorPaths; - QStringList avdErrorPaths; + FilePaths allAvdErrorPaths; + FilePaths avdErrorPaths; do { if (!AndroidAvdManager::avdManagerCommand(config, {"list", "avd"}, &output)) { @@ -208,12 +209,12 @@ static AndroidDeviceInfoList listVirtualDevices(const AndroidConfig &config) avdErrorPaths.clear(); avdList = parseAvdList(output, &avdErrorPaths); allAvdErrorPaths << avdErrorPaths; - for (const QString &avdPathStr : std::as_const(avdErrorPaths)) - avdConfigEditManufacturerTag(avdPathStr); // comment out manufacturer tag - } while (!avdErrorPaths.isEmpty()); // try again + for (const FilePath &avdPath : std::as_const(avdErrorPaths)) + avdConfigEditManufacturerTag(avdPath); // comment out manufacturer tag + } while (!avdErrorPaths.isEmpty()); // try again - for (const QString &avdPathStr : std::as_const(allAvdErrorPaths)) - avdConfigEditManufacturerTag(avdPathStr, true); // re-add manufacturer tag + for (const FilePath &avdPath : std::as_const(allAvdErrorPaths)) + avdConfigEditManufacturerTag(avdPath, true); // re-add manufacturer tag return avdList; } diff --git a/src/plugins/android/avdmanageroutputparser.cpp b/src/plugins/android/avdmanageroutputparser.cpp index 325f4fa230..266366f857 100644 --- a/src/plugins/android/avdmanageroutputparser.cpp +++ b/src/plugins/android/avdmanageroutputparser.cpp @@ -86,19 +86,19 @@ static std::optional<AndroidDeviceInfo> parseAvd(const QStringList &deviceInfo) return {}; } -AndroidDeviceInfoList parseAvdList(const QString &output, QStringList *avdErrorPaths) +AndroidDeviceInfoList parseAvdList(const QString &output, Utils::FilePaths *avdErrorPaths) { QTC_CHECK(avdErrorPaths); AndroidDeviceInfoList avdList; QStringList avdInfo; - using ErrorPath = QString; + using ErrorPath = Utils::FilePath; using AvdResult = std::variant<std::monostate, AndroidDeviceInfo, ErrorPath>; const auto parseAvdInfo = [](const QStringList &avdInfo) { if (!avdInfo.filter(avdManufacturerError).isEmpty()) { for (const QString &line : avdInfo) { QString value; if (valueForKey(avdInfoPathKey, line, &value)) - return AvdResult(value); // error path + return AvdResult(Utils::FilePath::fromString(value)); // error path } } else if (std::optional<AndroidDeviceInfo> avd = parseAvd(avdInfo)) { // armeabi-v7a devices can also run armeabi code diff --git a/src/plugins/android/avdmanageroutputparser.h b/src/plugins/android/avdmanageroutputparser.h index bf89431ce1..dbeb6758c7 100644 --- a/src/plugins/android/avdmanageroutputparser.h +++ b/src/plugins/android/avdmanageroutputparser.h @@ -8,7 +8,7 @@ namespace Internal { const char avdManufacturerError[] = "no longer exists as a device"; -AndroidDeviceInfoList parseAvdList(const QString &output, QStringList *avdErrorPaths); +AndroidDeviceInfoList parseAvdList(const QString &output, Utils::FilePaths *avdErrorPaths); int platformNameToApiLevel(const QString &platformName); } // namespace Internal diff --git a/tests/auto/android/tst_avdmanageroutputparser.cpp b/tests/auto/android/tst_avdmanageroutputparser.cpp index fa2c2ca020..5ee6afc8fd 100644 --- a/tests/auto/android/tst_avdmanageroutputparser.cpp +++ b/tests/auto/android/tst_avdmanageroutputparser.cpp @@ -21,10 +21,10 @@ void tst_AvdManagerOutputParser::parse_data() { QTest::addColumn<QString>("input"); QTest::addColumn<AndroidDeviceInfoList>("output"); - QTest::addColumn<QStringList>("errorPaths"); + QTest::addColumn<Utils::FilePaths>("errorPaths"); QTest::newRow("none") << "Available Android Virtual Devices:\n" - << AndroidDeviceInfoList() << QStringList(); + << AndroidDeviceInfoList() << Utils::FilePaths(); QTest::newRow("one") << "Available Android Virtual Devices:\n" " Name: Test\n" @@ -40,7 +40,7 @@ void tst_AvdManagerOutputParser::parse_data() IDevice::DeviceConnected, IDevice::Emulator, Utils::FilePath::fromString(":/Test.avd")}}) - << QStringList(); + << Utils::FilePaths(); QTest::newRow("two") << "Available Android Virtual Devices:\n" " Name: Test\n" @@ -71,16 +71,16 @@ void tst_AvdManagerOutputParser::parse_data() IDevice::Emulator, Utils::FilePath::fromString(":/TestTablet.avd")}} ) - << QStringList(); + << Utils::FilePaths(); } void tst_AvdManagerOutputParser::parse() { QFETCH(QString, input); QFETCH(AndroidDeviceInfoList, output); - QFETCH(QStringList, errorPaths); + QFETCH(Utils::FilePaths, errorPaths); - QStringList avdErrorPaths; + Utils::FilePaths avdErrorPaths; const auto result = parseAvdList(input, &avdErrorPaths); QCOMPARE(result, output); QCOMPARE(avdErrorPaths, errorPaths); |