Fix MS16615: Don't early-remove .app.json we JUST installed

This commit is contained in:
Zach Fox 2018-07-11 15:27:43 -07:00
parent 54d2f42fa4
commit bf4954d667
5 changed files with 24 additions and 10 deletions

View file

@ -129,7 +129,7 @@ Rectangle {
}
onAppInstalled: {
if (appHref === root.itemHref) {
if (appID === root.itemId) {
root.isInstalled = true;
}
}

View file

@ -67,13 +67,13 @@ Item {
}
onAppInstalled: {
if (appHref === root.itemHref) {
if (appID === root.itemId) {
root.isInstalled = true;
}
}
onAppUninstalled: {
if (appHref === root.itemHref) {
if (appID === root.itemId) {
root.isInstalled = false;
}
}

View file

@ -98,7 +98,7 @@ Rectangle {
}
onAppInstalled: {
root.installedApps = Commerce.getInstalledApps();
root.installedApps = Commerce.getInstalledApps(appID);
}
onAppUninstalled: {

View file

@ -208,7 +208,7 @@ void QmlCommerce::alreadyOwned(const QString& marketplaceId) {
ledger->alreadyOwned(marketplaceId);
}
QString QmlCommerce::getInstalledApps() {
QString QmlCommerce::getInstalledApps(const QString& justInstalledAppID) {
QString installedAppsFromMarketplace;
QStringList runningScripts = DependencyManager::get<ScriptEngines>()->getRunningScripts();
@ -217,6 +217,18 @@ QString QmlCommerce::getInstalledApps() {
foreach(QString appFileName, apps) {
installedAppsFromMarketplace += appFileName;
installedAppsFromMarketplace += ",";
// If we were supplied a "justInstalledAppID" argument, that means we're entering this function
// to get the new list of installed apps immediately after installing an app.
// In that case, the app we installed may not yet have its associated script running -
// that task is asynchronous and takes a nonzero amount of time. This is especially true
// for apps that are not in Interface's script cache.
// Thus, we protect against deleting the .app.json from the user's disk (below)
// by skipping that check for the app we just installed.
if ((justInstalledAppID != "") && ((justInstalledAppID + ".app.json") == appFileName)) {
continue;
}
QFile appFile(_appsPath + appFileName);
if (appFile.open(QIODevice::ReadOnly)) {
QJsonDocument appFileJsonDocument = QJsonDocument::fromJson(appFile.readAll());
@ -291,7 +303,8 @@ bool QmlCommerce::installApp(const QString& itemHref) {
return false;
}
emit appInstalled(itemHref);
QFileInfo appFileInfo(appFile);
emit appInstalled(appFileInfo.baseName());
return true;
});
request->send();
@ -321,7 +334,8 @@ bool QmlCommerce::uninstallApp(const QString& itemHref) {
qCWarning(commerce) << "Couldn't delete local .app.json file during app uninstall. Continuing anyway. App filename is:" << appHref.fileName();
}
emit appUninstalled(itemHref);
QFileInfo appFileInfo(appFile);
emit appUninstalled(appFileInfo.baseName());
return true;
}

View file

@ -53,8 +53,8 @@ signals:
void contentSetChanged(const QString& contentSetHref);
void appInstalled(const QString& appHref);
void appUninstalled(const QString& appHref);
void appInstalled(const QString& appID);
void appUninstalled(const QString& appID);
protected:
Q_INVOKABLE void getWalletStatus();
@ -86,7 +86,7 @@ protected:
Q_INVOKABLE void replaceContentSet(const QString& itemHref, const QString& certificateID);
Q_INVOKABLE QString getInstalledApps();
Q_INVOKABLE QString getInstalledApps(const QString& justInstalledAppID = "");
Q_INVOKABLE bool installApp(const QString& appHref);
Q_INVOKABLE bool uninstallApp(const QString& appHref);
Q_INVOKABLE bool openApp(const QString& appHref);