forked from qt-creator/qt-creator
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:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user