Fixes Permission model downgrade issue

Task-number: QTCREATORBUG-16630
Change-Id: I2ec8fbe186d9a78efa1457a5fbbbaf1fe4da80b5
Reviewed-by: Leena Miettinen <riitta-leena.miettinen@qt.io>
This commit is contained in:
Vikas Pachdha
2016-07-28 17:33:10 +02:00
parent 5cdff92c58
commit 7458d82a37
2 changed files with 48 additions and 25 deletions

View File

@@ -62,7 +62,8 @@ using namespace Android::Internal;
const QLatin1String UninstallPreviousPackageKey("UninstallPreviousPackage"); const QLatin1String UninstallPreviousPackageKey("UninstallPreviousPackage");
const QLatin1String InstallFailedInconsistentCertificatesString("INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES"); const QLatin1String InstallFailedInconsistentCertificatesString("INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES");
const QLatin1String InstallFailedInconsistentCertificatesString2("INSTALL_FAILED_UPDATE_INCOMPATIBLE"); const QLatin1String InstallFailedUpdateIncompatible("INSTALL_FAILED_UPDATE_INCOMPATIBLE");
const QLatin1String InstallFailedPermissionModelDowngrade("INSTALL_FAILED_PERMISSION_MODEL_DOWNGRADE");
const Core::Id AndroidDeployQtStep::Id("Qt4ProjectManager.AndroidDeployQtStep"); const Core::Id AndroidDeployQtStep::Id("Qt4ProjectManager.AndroidDeployQtStep");
////////////////// //////////////////
@@ -70,7 +71,6 @@ const Core::Id AndroidDeployQtStep::Id("Qt4ProjectManager.AndroidDeployQtStep");
///////////////// /////////////////
AndroidDeployQtStepFactory::AndroidDeployQtStepFactory(QObject *parent) AndroidDeployQtStepFactory::AndroidDeployQtStepFactory(QObject *parent)
: IBuildStepFactory(parent) : IBuildStepFactory(parent)
{ {
@@ -266,7 +266,7 @@ bool AndroidDeployQtStep::init(QList<const BuildStep *> &earlierSteps)
return true; return true;
} }
AndroidDeployQtStep::DeployResult AndroidDeployQtStep::runDeploy(QFutureInterface<bool> &fi) AndroidDeployQtStep::DeployErrorCode AndroidDeployQtStep::runDeploy(QFutureInterface<bool> &fi)
{ {
QString args; QString args;
if (m_useAndroiddeployqt) { if (m_useAndroiddeployqt) {
@@ -361,23 +361,43 @@ AndroidDeployQtStep::DeployResult AndroidDeployQtStep::runDeploy(QFutureInterfac
} }
if (exitCode == 0 && exitStatus == QProcess::NormalExit) { if (exitCode == 0 && exitStatus == QProcess::NormalExit) {
if (deployError != NoError) { if (deployError != NoError && m_uninstallPreviousPackageRun) {
if (!m_uninstallPreviousPackageRun) deployError = Failure;
return AskUinstall;
else
return Failure;
} }
return Success; } else {
deployError = Failure;
} }
return Failure;
return deployError;
} }
void AndroidDeployQtStep::slotAskForUninstall() void AndroidDeployQtStep::slotAskForUninstall(DeployErrorCode errorCode)
{ {
int button = QMessageBox::critical(0, tr("Install failed"), Q_ASSERT(errorCode > 0);
tr("Another application with the same package id but signed with "
"different certificate already exists.\n" QString uninstallMsg = tr("Deployment failed with the following errors:\n\n");
"Do you want to uninstall the existing package?"), uint errorCodeFlags = errorCode;
uint mask = 1;
while (errorCodeFlags) {
switch (errorCodeFlags & mask) {
case DeployErrorCode::PermissionModelDowngrade:
uninstallMsg += InstallFailedPermissionModelDowngrade+"\n";
break;
case InconsistentCertificates:
uninstallMsg += InstallFailedInconsistentCertificatesString+"\n";
break;
case UpdateIncompatible:
uninstallMsg += InstallFailedUpdateIncompatible+"\n";
break;
default:
break;
}
errorCodeFlags &= ~mask;
mask <<= 1;
}
uninstallMsg.append(tr("\nUninstalling the installed package may solve the issue.\nDo you want to uninstall the existing package?"));
int button = QMessageBox::critical(0, tr("Install failed"), uninstallMsg,
QMessageBox::Yes, QMessageBox::No); QMessageBox::Yes, QMessageBox::No);
m_askForUinstall = button == QMessageBox::Yes; m_askForUinstall = button == QMessageBox::Yes;
} }
@@ -399,9 +419,9 @@ void AndroidDeployQtStep::run(QFutureInterface<bool> &fi)
emit setSerialNumber(serialNumber); emit setSerialNumber(serialNumber);
} }
DeployResult returnValue = runDeploy(fi); DeployErrorCode returnValue = runDeploy(fi);
if (returnValue == AskUinstall) { if (returnValue > DeployErrorCode::NoError && returnValue < DeployErrorCode::Failure) {
emit askForUninstall(); emit askForUninstall(returnValue);
if (m_askForUinstall) { if (m_askForUinstall) {
m_uninstallPreviousPackageRun = true; m_uninstallPreviousPackageRun = true;
returnValue = runDeploy(fi); returnValue = runDeploy(fi);
@@ -434,7 +454,7 @@ void AndroidDeployQtStep::run(QFutureInterface<bool> &fi)
<< QLatin1String("/system/") + m_libdir + QLatin1String("/libc.so") << QLatin1String("/system/") + m_libdir + QLatin1String("/libc.so")
<< QString::fromLatin1("%1/libc.so").arg(m_buildDirectory)); << QString::fromLatin1("%1/libc.so").arg(m_buildDirectory));
reportRunResult(fi, returnValue == Success); reportRunResult(fi, returnValue == NoError);
} }
void AndroidDeployQtStep::runCommand(const QString &program, const QStringList &arguments) void AndroidDeployQtStep::runCommand(const QString &program, const QStringList &arguments)
@@ -493,8 +513,10 @@ AndroidDeployQtStep::DeployErrorCode AndroidDeployQtStep::parseDeployErrors(QStr
if (deployOutputLine.contains(InstallFailedInconsistentCertificatesString)) if (deployOutputLine.contains(InstallFailedInconsistentCertificatesString))
errorCode |= InconsistentCertificates; errorCode |= InconsistentCertificates;
if (deployOutputLine.contains(InstallFailedInconsistentCertificatesString2)) if (deployOutputLine.contains(InstallFailedUpdateIncompatible))
errorCode |= UpdateIncompatible; errorCode |= UpdateIncompatible;
if (deployOutputLine.contains(InstallFailedPermissionModelDowngrade))
errorCode |= PermissionModelDowngrade;
return errorCode; return errorCode;
} }

View File

@@ -64,7 +64,9 @@ class AndroidDeployQtStep : public ProjectExplorer::BuildStep
{ {
NoError = 0, NoError = 0,
InconsistentCertificates = 0x0001, InconsistentCertificates = 0x0001,
UpdateIncompatible = 0x0002 UpdateIncompatible = 0x0002,
PermissionModelDowngrade = 0x0004,
Failure = 0x0008
}; };
public: public:
@@ -88,7 +90,7 @@ public:
void setUninstallPreviousPackage(bool uninstall); void setUninstallPreviousPackage(bool uninstall);
signals: signals:
void askForUninstall(); void askForUninstall(DeployErrorCode errorCode);
void setSerialNumber(const QString &serialNumber); void setSerialNumber(const QString &serialNumber);
private: private:
@@ -98,9 +100,8 @@ private:
bool init(QList<const BuildStep *> &earlierSteps) override; bool init(QList<const BuildStep *> &earlierSteps) override;
void run(QFutureInterface<bool> &fi) override; void run(QFutureInterface<bool> &fi) override;
enum DeployResult { Success, Failure, AskUinstall }; DeployErrorCode runDeploy(QFutureInterface<bool> &fi);
DeployResult runDeploy(QFutureInterface<bool> &fi); void slotAskForUninstall(DeployErrorCode errorCode);
void slotAskForUninstall();
void slotSetSerialNumber(const QString &serialNumber); void slotSetSerialNumber(const QString &serialNumber);
ProjectExplorer::BuildStepConfigWidget *createConfigWidget() override; ProjectExplorer::BuildStepConfigWidget *createConfigWidget() override;