This commit is contained in:
Zach Fox 2018-02-22 14:45:32 -08:00
parent 4d2d7fa51f
commit de0eee52d6
3 changed files with 107 additions and 15 deletions

View file

@ -47,6 +47,7 @@ Item {
property bool showConfirmation: false; property bool showConfirmation: false;
property bool hasPermissionToRezThis; property bool hasPermissionToRezThis;
property bool permissionExplanationCardVisible; property bool permissionExplanationCardVisible;
property bool isInstalled: false;
property string originalStatusText; property string originalStatusText;
property string originalStatusColor; property string originalStatusColor;
@ -62,6 +63,12 @@ Item {
showConfirmation = true; showConfirmation = true;
} }
} }
onAppInstalled: {
if (appHref === root.itemHref) {
root.isInstalled = true;
}
}
} }
Connections { Connections {
@ -81,6 +88,10 @@ Item {
} else { } else {
root.hasPermissionToRezThis = true; root.hasPermissionToRezThis = true;
} }
if (itemType === "app") {
root.isInstalled = Commerce.isAppInstalled(root.itemHref);
}
} }
onPurchaseStatusChangedChanged: { onPurchaseStatusChangedChanged: {
@ -472,6 +483,40 @@ Item {
} }
} }
Rectangle {
id: appButtonContainer;
color: hifi.colors.white;
z: 994;
visible: root.isInstalled;
anchors.fill: buttonContainer;
HifiControlsUit.Button {
id: openAppButton;
color: hifi.buttons.blue;
colorScheme: hifi.colorSchemes.light;
anchors.top: parent.top;
anchors.right: parent.right;
height: 44;
text: "OPEN"
onClicked: {
Commerce.openApp(root.itemHref);
}
}
HifiControlsUit.Button {
id: uninstallAppButton;
color: hifi.buttons.noneBorderless;
colorScheme: hifi.colorSchemes.light;
anchors.bottom: parent.bottom;
anchors.right: parent.right;
height: 44;
text: "UNINSTALL"
onClicked: {
Commerce.uninstallApp(root.itemHref);
}
}
}
Button { Button {
id: buttonContainer; id: buttonContainer;
property int color: hifi.buttons.blue; property int color: hifi.buttons.blue;

View file

@ -19,6 +19,8 @@
#include <Application.h> #include <Application.h>
#include <UserActivityLogger.h> #include <UserActivityLogger.h>
#include <ScriptEngines.h> #include <ScriptEngines.h>
#include <ui/TabletScriptingInterface.h>
#include "scripting/HMDScriptingInterface.h"
QmlCommerce::QmlCommerce() { QmlCommerce::QmlCommerce() {
auto ledger = DependencyManager::get<Ledger>(); auto ledger = DependencyManager::get<Ledger>();
@ -42,6 +44,8 @@ QmlCommerce::QmlCommerce() {
connect(accountManager.data(), &AccountManager::usernameChanged, this, [&]() { connect(accountManager.data(), &AccountManager::usernameChanged, this, [&]() {
setPassphrase(""); setPassphrase("");
}); });
_appsPath = PathUtils::getAppDataPath() + "Apps";
} }
void QmlCommerce::getWalletStatus() { void QmlCommerce::getWalletStatus() {
@ -186,22 +190,32 @@ void QmlCommerce::alreadyOwned(const QString& marketplaceId) {
ledger->alreadyOwned(marketplaceId); ledger->alreadyOwned(marketplaceId);
} }
static QString APP_PATH = PathUtils::getAppDataPath() + "apps";
bool QmlCommerce::isAppInstalled(const QString& itemHref) { bool QmlCommerce::isAppInstalled(const QString& itemHref) {
QUrl appHref(itemHref); QUrl appHref(itemHref);
QFileInfo appFile(APP_PATH + "/" + appHref.fileName()); // First check if .app.json exists
if (appFile.exists() && appFile.isFile()) { QFileInfo appFile(_appsPath + "/" + appHref.fileName());
return true; if (!(appFile.exists() && appFile.isFile())) {
} else {
return false; return false;
} }
// Then check to see if script is running
auto runningScripts = DependencyManager::get<ScriptEngines>()->getRunningScripts();
foreach(const QString& runningScript, runningScripts) {
QUrl runningScriptURL = QUrl(runningScript);
qCDebug(commerce) << "ZRF FIXME" << runningScriptURL;
if (runningScriptURL == appHref) {
return true;
}
}
return false;
} }
bool QmlCommerce::installApp(const QString& itemHref) { bool QmlCommerce::installApp(const QString& itemHref) {
if (!QDir(APP_PATH).exists()) { if (!QDir(_appsPath).exists()) {
if (!QDir().mkdir(APP_PATH)) { if (!QDir().mkdir(_appsPath)) {
qCDebug(commerce) << "Couldn't make APP_PATH directory."; qCDebug(commerce) << "Couldn't make _appsPath directory.";
return false; return false;
} }
} }
@ -228,7 +242,7 @@ bool QmlCommerce::installApp(const QString& itemHref) {
// Copy the .app.json to the apps directory inside %AppData%/High Fidelity/Interface // Copy the .app.json to the apps directory inside %AppData%/High Fidelity/Interface
auto requestData = request->getData(); auto requestData = request->getData();
QFile appFile(APP_PATH + "/" + appHref.fileName()); QFile appFile(_appsPath + "/" + appHref.fileName());
if (!appFile.open(QIODevice::WriteOnly)) { if (!appFile.open(QIODevice::WriteOnly)) {
qCDebug(commerce) << "Couldn't open local .app.json file for creation."; qCDebug(commerce) << "Couldn't open local .app.json file for creation.";
return false; return false;
@ -250,7 +264,7 @@ bool QmlCommerce::installApp(const QString& itemHref) {
return false; return false;
} }
emit appInstalled(appHref.fileName()); emit appInstalled(itemHref);
return true; return true;
} }
@ -258,7 +272,7 @@ bool QmlCommerce::uninstallApp(const QString& itemHref) {
QUrl appHref(itemHref); QUrl appHref(itemHref);
// Read from the file to know what .js script to stop // Read from the file to know what .js script to stop
QFile appFile(APP_PATH + "/" + appHref.fileName()); QFile appFile(_appsPath + "/" + appHref.fileName());
if (!appFile.open(QIODevice::ReadOnly)) { if (!appFile.open(QIODevice::ReadOnly)) {
qCDebug(commerce) << "Couldn't open local .app.json file for deletion."; qCDebug(commerce) << "Couldn't open local .app.json file for deletion.";
return false; return false;
@ -279,6 +293,35 @@ bool QmlCommerce::uninstallApp(const QString& itemHref) {
return false; return false;
} }
emit appUninstalled(appHref.fileName()); emit appUninstalled(itemHref);
return true;
}
bool QmlCommerce::openApp(const QString& itemHref) {
QUrl appHref(itemHref);
// Read from the file to know what .html or .qml document to open
QFile appFile(_appsPath + "/" + appHref.fileName());
if (!appFile.open(QIODevice::ReadOnly)) {
qCDebug(commerce) << "Couldn't open local .app.json file.";
return false;
}
QJsonDocument appFileJsonDocument = QJsonDocument::fromJson(appFile.readAll());
QJsonObject appFileJsonObject = appFileJsonDocument.object();
QString homeUrl = appFileJsonObject["homeURL"].toString();
auto tabletScriptingInterface = DependencyManager::get<TabletScriptingInterface>();
auto tablet = dynamic_cast<TabletProxy*>(tabletScriptingInterface->getTablet("com.highfidelity.interface.tablet.system"));
if (homeUrl.contains(".qml", Qt::CaseInsensitive)) {
tablet->loadQMLSource(homeUrl);
} else if (homeUrl.contains(".html", Qt::CaseInsensitive)) {
tablet->gotoWebScreen(homeUrl);
} else {
qCDebug(commerce) << "Attempted to open unknown type of homeURL!";
return false;
}
DependencyManager::get<HMDScriptingInterface>()->openTablet();
return true; return true;
} }

View file

@ -81,9 +81,13 @@ protected:
Q_INVOKABLE void replaceContentSet(const QString& itemHref); Q_INVOKABLE void replaceContentSet(const QString& itemHref);
Q_INVOKABLE bool isAppInstalled(const QString& itemHref); Q_INVOKABLE bool isAppInstalled(const QString& appHref);
Q_INVOKABLE bool installApp(const QString& itemHref); Q_INVOKABLE bool installApp(const QString& appHref);
Q_INVOKABLE bool uninstallApp(const QString& itemHref); Q_INVOKABLE bool uninstallApp(const QString& appHref);
Q_INVOKABLE bool openApp(const QString& appHref);
private:
QString _appsPath;
}; };
#endif // hifi_QmlCommerce_h #endif // hifi_QmlCommerce_h