androiddeployqt: Use correct package name when uninstalling
authorAlessandro Portale <alessandro.portale@theqtcompany.com>
Thu, 23 Apr 2015 10:59:55 +0000 (12:59 +0200)
committerNiels Weber <niels.weber@theqtcompany.com>
Mon, 4 May 2015 09:35:55 +0000 (09:35 +0000)
When calling androiddeployqt with "--install --no-build", it will try to
uninstall a package with a wrong package name. This patch attempts to
read a valid package name from the AndroidManifest.xml before
uninstalling.

Task-number: QTBUG-45433
Change-Id: If2bc788753a24dd752492464c985de70c67b8f72
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@theqtcompany.com>
src/androiddeployqt/main.cpp

index 9b26c09..4e0414e 100644 (file)
@@ -668,6 +668,26 @@ QString detectLatestAndroidPlatform(const QString &sdkPath)
     return latestPlatform.baseName();
 }
 
+QString androidManifestPathFromOptions(const Options &options)
+{
+    return options.androidSourceDirectory + QLatin1String("/AndroidManifest.xml");
+}
+
+QString packageNameFromAndroidManifest(const QString &androidManifestPath)
+{
+    QFile androidManifestXml(androidManifestPath);
+    if (androidManifestXml.open(QIODevice::ReadOnly)) {
+        QXmlStreamReader reader(&androidManifestXml);
+        while (!reader.atEnd()) {
+            reader.readNext();
+            if (reader.isStartElement() && reader.name() == QLatin1String("manifest"))
+                return cleanPackageName(
+                            reader.attributes().value(QLatin1String("package")).toString());
+        }
+    }
+    return QString();
+}
+
 bool readInputFile(Options *options)
 {
     QFile file(options->inputFileName);
@@ -821,7 +841,9 @@ bool readInputFile(Options *options)
         options->ndkHost = ndkHost.toString();
     }
 
-    options->packageName = cleanPackageName(QString::fromLatin1("org.qtproject.example.%1").arg(QFileInfo(options->applicationBinary).baseName().mid(sizeof("lib") - 1)));
+    options->packageName = packageNameFromAndroidManifest(androidManifestPathFromOptions(*options));
+    if (options->packageName.isEmpty())
+        options->packageName = cleanPackageName(QString::fromLatin1("org.qtproject.example.%1").arg(QFileInfo(options->applicationBinary).baseName().mid(sizeof("lib") - 1)));
 
     {
         QJsonValue extraLibs = jsonObject.value("android-extra-libs");
@@ -1281,7 +1303,7 @@ bool updateAndroidManifest(Options &options)
 
     replacements[QLatin1String("<!-- %%INSERT_FEATURES -->")] = features;
 
-    QString androidManifestPath = options.outputDirectory + QLatin1String("/AndroidManifest.xml");
+    QString androidManifestPath = androidManifestPathFromOptions(options);
     if (!updateFile(androidManifestPath, replacements))
         return false;