From ef63213d285a7e7690a5aece3fdb54e955331390 Mon Sep 17 00:00:00 2001 From: Wayne Chen Date: Wed, 16 Jan 2019 21:07:54 -0800 Subject: [PATCH] fixing linking account problems on oculus/steam, changing callback --- .../qml/LoginDialog/CompleteProfileBody.qml | 9 ++-- .../qml/LoginDialog/LinkAccountBody.qml | 4 +- .../qml/LoginDialog/LoggingInBody.qml | 50 ++++++++++++------- interface/src/ui/LoginDialog.cpp | 32 +++++------- libraries/networking/src/AccountManager.cpp | 2 +- libraries/networking/src/AccountManager.h | 2 +- .../src/plugins/OculusPlatformPlugin.h | 4 +- plugins/oculus/src/OculusPlatformPlugin.cpp | 4 +- plugins/oculus/src/OculusPlatformPlugin.h | 2 +- 9 files changed, 59 insertions(+), 50 deletions(-) diff --git a/interface/resources/qml/LoginDialog/CompleteProfileBody.qml b/interface/resources/qml/LoginDialog/CompleteProfileBody.qml index a498370019..b3cd07fc25 100644 --- a/interface/resources/qml/LoginDialog/CompleteProfileBody.qml +++ b/interface/resources/qml/LoginDialog/CompleteProfileBody.qml @@ -287,6 +287,8 @@ Item { case Qt.Key_Return: event.accepted = true; loginDialog.createAccountFromOculus(emailField.text, usernameField.text, passwordField.text); + bodyLoader.setSource("LoggingInBody.qml", { "loginDialog": loginDialog, "root": root, "bodyLoader": bodyLoader, "withSteam": completeProfileBody.withSteam, + "linkSteam": false, "withOculus": completeProfileBody.withOculus, "linkOculus": false, "createOculus": true }); break; } } @@ -434,7 +436,6 @@ Item { linkColor: hifi.colors.blueAccent onLinkActivated: { - loginDialog.isLogIn = true; bodyLoader.setSource("LinkAccountBody.qml", { "loginDialog": loginDialog, "root": root, "bodyLoader": bodyLoader, "errorString": "", "withSteam": completeProfileBody.withSteam, "linkSteam": completeProfileBody.withSteam, "withOculus": completeProfileBody.withOculus, "linkOculus": completeProfileBody.withOculus }); @@ -467,8 +468,10 @@ Item { } onHandleCreateFailed: { console.log("Create Failed: " + error); - bodyLoader.setSource("UsernameCollisionBody.qml", { "loginDialog": loginDialog, "root": root, "bodyLoader": bodyLoader, "withSteam": completeProfileBody.withSteam, - "withOculus": completeProfileBody.withOculus }); + if (!completeProfileBody.withOculus) { + bodyLoader.setSource("UsernameCollisionBody.qml", { "loginDialog": loginDialog, "root": root, "bodyLoader": bodyLoader, "withSteam": completeProfileBody.withSteam, + "withOculus": completeProfileBody.withOculus }); + } } } diff --git a/interface/resources/qml/LoginDialog/LinkAccountBody.qml b/interface/resources/qml/LoginDialog/LinkAccountBody.qml index 4d3a74c033..71a698e48d 100644 --- a/interface/resources/qml/LoginDialog/LinkAccountBody.qml +++ b/interface/resources/qml/LoginDialog/LinkAccountBody.qml @@ -36,9 +36,9 @@ Item { property bool keyboardRaised: false property bool punctuationMode: false - property bool withSteam: false + property bool withSteam: withSteam property bool linkSteam: linkSteam - property bool withOculus: false + property bool withOculus: withOculus property bool linkOculus: linkOculus property string errorString: errorString property bool lostFocus: false diff --git a/interface/resources/qml/LoginDialog/LoggingInBody.qml b/interface/resources/qml/LoginDialog/LoggingInBody.qml index 2c69f58fee..7a2ab04c69 100644 --- a/interface/resources/qml/LoginDialog/LoggingInBody.qml +++ b/interface/resources/qml/LoginDialog/LoggingInBody.qml @@ -79,17 +79,6 @@ Item { loggingInGlyph.visible = true; loggingInText.text = "Creating account with Oculus"; loggingInText.x = loggingInHeader.width/2 - loggingInTextMetrics.width/2 + loggingInGlyphTextMetrics.width/2; - } else if (loggingInBody.linkSteam) { - loggingInGlyph.visible = true; - loggingInText.text = "Linking to Steam"; - loggingInText.x = loggingInHeader.width/2 - loggingInTextMetrics.width/2 + loggingInGlyphTextMetrics.width/2; - loginDialog.linkSteam(); - } else if (loggingInBody.linkOculus) { - loggingInGlyph.text = hifi.glyphs.oculus; - loggingInGlyph.visible = true; - loggingInText.text = "Linking to Oculus"; - loggingInText.x = loggingInHeader.width/2 - loggingInTextMetrics.width/2 + loggingInGlyphTextMetrics.width/2; - loginDialog.linkOculus(); } else if (loggingInBody.withSteam) { loggingInGlyph.visible = true; loggingInText.text = "Logging in to Steam"; @@ -106,16 +95,18 @@ Item { loggingInSpinner.visible = true; } function loadingSuccess() { - loggingInSpinner.visible = false; if (loggingInBody.linkSteam) { loggingInText.text = "Linking to Steam"; + loggingInText.x = loggingInHeader.width/2 - loggingInTextMetrics.width/2 + loggingInGlyphTextMetrics.width/2; loginDialog.linkSteam(); return; } else if (loggingInBody.linkOculus) { loggingInText.text = "Linking to Oculus"; + loggingInText.x = loggingInHeader.width/2 - loggingInTextMetrics.width/2 + loggingInGlyphTextMetrics.width/2; loginDialog.linkOculus(); return; } + loggingInSpinner.visible = false; if (loggingInBody.withSteam) { // reset the flag. loggingInGlyph.visible = false; @@ -237,6 +228,23 @@ Item { verticalAlignment: Text.AlignVCenter; visible: false; } + HifiControlsUit.Button { + id: okButton; + width: d.minWidthButton + height: d.minHeightButton + text: qsTr("OK") + color: hifi.buttons.white + anchors { + top: loggedInGlyph.bottom + topMargin: 3 * hifi.dimensions.contentSpacing.y + left: parent.left + leftMargin: (parent.width - width) / 2; + } + onClicked: { + root.tryDestroy(); + } + visible: false + } } } } @@ -271,8 +279,14 @@ Item { } onHandleLinkFailed: { console.log("Link Failed: " + error); - bodyLoader.setSource("LinkAccountBody.qml", { "loginDialog": loginDialog, "root": root, "bodyLoader": bodyLoader, "linkSteam": loggingInBody.linkSteam, - "linkOculus": loggingInBody.linkOculus, "errorString": error }); + loggingInSpinner.visible = false; + if (loggingInBody.linkOculus) { + loggingInText.text = "Oculus failed to link"; + okButton.visible = true; + } else { + bodyLoader.setSource("LinkAccountBody.qml", { "loginDialog": loginDialog, "root": root, "bodyLoader": bodyLoader, "linkSteam": loggingInBody.linkSteam, + "linkOculus": loggingInBody.linkOculus, "errorString": error }); + } } onHandleLoginCompleted: { @@ -288,19 +302,19 @@ Item { if (loggingInBody.linkOculus && loggingInBody.withOculus) { errorString = "Username or password is incorrect."; bodyLoader.setSource("LinkAccountBody.qml", { "loginDialog": loginDialog, "root": root, "bodyLoader": bodyLoader, "withSteam": loggingInBody.withSteam, - "withOculus": loggingInBody.withOculus, "linkSteam": loggingInBody.linkSteam, "errorString": errorString }); + "withOculus": loggingInBody.withOculus, "linkSteam": loggingInBody.linkSteam, "linkOculus": loggingInBody.linkOculus, "errorString": errorString }); } else if (loggingInBody.linkSteam && loggingInBody.withSteam) { errorString = "Username or password is incorrect."; bodyLoader.setSource("LinkAccountBody.qml", { "loginDialog": loginDialog, "root": root, "bodyLoader": bodyLoader, "withSteam": loggingInBody.withSteam, - "withOculus": loggingInBody.withOculus, "linkSteam": loggingInBody.linkSteam, "errorString": errorString }); + "withOculus": loggingInBody.withOculus, "linkSteam": loggingInBody.linkSteam, "linkOculus": loggingInBody.linkOculus, "errorString": errorString }); } else if (loggingInBody.withSteam) { errorString = "Your Steam authentication has failed. Please make sure you are logged into Steam and try again."; bodyLoader.setSource("CompleteProfileBody.qml", { "loginDialog": loginDialog, "root": root, "bodyLoader": bodyLoader, "withSteam": loggingInBody.withSteam, - "withOculus": loggingInBody.withOculus, "errorString": errorString }); + "withOculus": loggingInBody.withOculus, "linkSteam": loggingInBody.linkSteam, "linkOculus": loggingInBody.linkOculus, "errorString": errorString }); } else if (loggingInBody.withOculus) { errorString = "Your Oculus account is not connected to an existing High Fidelity account. Please create a new one." bodyLoader.setSource("CompleteProfileBody.qml", { "loginDialog": loginDialog, "root": root, "bodyLoader": bodyLoader, "withSteam": loggingInBody.withSteam, - "withOculus": loggingInBody.withOculus, "errorString": errorString }); + "withOculus": loggingInBody.withOculus, "linkSteam": loggingInBody.linkSteam, "linkOculus": loggingInBody.linkOculus, "errorString": errorString }); } else { errorString = "Username or password is incorrect."; bodyLoader.setSource("LinkAccountBody.qml", { "loginDialog": loginDialog, "root": root, "bodyLoader": bodyLoader, "errorString": errorString }); diff --git a/interface/src/ui/LoginDialog.cpp b/interface/src/ui/LoginDialog.cpp index d49c27655b..85557d173b 100644 --- a/interface/src/ui/LoginDialog.cpp +++ b/interface/src/ui/LoginDialog.cpp @@ -138,8 +138,8 @@ void LoginDialog::login(const QString& username, const QString& password) const void LoginDialog::loginThroughOculus() { qDebug() << "Attempting to login through Oculus"; if (auto oculusPlatformPlugin = PluginManager::getInstance()->getOculusPlatformPlugin()) { - oculusPlatformPlugin->requestNonceAndUserID([this] (QString nonce, QString userID, QString oculusID) { - DependencyManager::get()->requestAccessTokenWithOculus(nonce, userID, oculusID); + oculusPlatformPlugin->requestNonceAndUserID([this] (QString nonce, QString oculusID) { + DependencyManager::get()->requestAccessTokenWithOculus(nonce, oculusID); }); } } @@ -147,8 +147,8 @@ void LoginDialog::loginThroughOculus() { void LoginDialog::linkOculus() { qDebug() << "Attempting to link Oculus account"; if (auto oculusPlatformPlugin = PluginManager::getInstance()->getOculusPlatformPlugin()) { - oculusPlatformPlugin->requestNonceAndUserID([this] (QString nonce, QString userID, QString oculusID) { - if (nonce.isEmpty() || userID.isEmpty() || oculusID.isEmpty()) { + oculusPlatformPlugin->requestNonceAndUserID([this] (QString nonce, QString oculusID) { + if (nonce.isEmpty() || oculusID.isEmpty()) { emit handleLoginFailed(); return; } @@ -174,8 +174,8 @@ void LoginDialog::linkOculus() { void LoginDialog::createAccountFromOculus(QString email, QString username, QString password) { qDebug() << "Attempting to create account from Oculus info"; if (auto oculusPlatformPlugin = PluginManager::getInstance()->getOculusPlatformPlugin()) { - oculusPlatformPlugin->requestNonceAndUserID([this, email, username, password] (QString nonce, QString userID, QString oculusID) { - if (nonce.isEmpty() || userID.isEmpty() || oculusID.isEmpty()) { + oculusPlatformPlugin->requestNonceAndUserID([this, email, username, password] (QString nonce, QString oculusID) { + if (nonce.isEmpty() || oculusID.isEmpty()) { emit handleLoginFailed(); return; } @@ -307,14 +307,12 @@ void LoginDialog::createFailed(QNetworkReply* reply) { auto root = doc.object(); auto data = root.value("data").toObject(); auto error = data.value("error").toObject(); - auto identity = error.value("identity"); + auto oculusError = data.value("oculus"); auto user = error.value("username"); auto uid = error.value("uid"); auto email = error.value("email"); QString usernameError; QString emailError; - QString identityError; - QString errorReply; if (!uid.isNull() && !uid.isUndefined()) { QJsonArray arr = uid.toArray(); if (!arr.isEmpty()) { @@ -335,25 +333,19 @@ void LoginDialog::createFailed(QNetworkReply* reply) { } } if (!usernameError.isEmpty()) { - errorReply = usernameError; if (!emailError.isEmpty()) { - errorReply.append(" " + emailError); + usernameError.append(" " + emailError); } - emit handleCreateFailed(errorReply); + emit handleCreateFailed(usernameError); return; } if (!emailError.isEmpty()) { emit handleCreateFailed(emailError); return; } - - if (!identity.isNull() && !identity.isUndefined()) { - QJsonArray arr = identity.toArray(); - if (!arr.isEmpty()) { - auto identityError = "Identity " + arr.at(0).toString() + "."; - emit handleCreateFailed(identityError); - return; - } + if (!oculusError.isNull() && !oculusError.isUndefined()) { + emit handleCreateFailed("Could not verify token with Oculus. Please try again."); + return; } } emit handleCreateFailed(reply->errorString()); diff --git a/libraries/networking/src/AccountManager.cpp b/libraries/networking/src/AccountManager.cpp index 38ec9d21d0..f74b337ee7 100644 --- a/libraries/networking/src/AccountManager.cpp +++ b/libraries/networking/src/AccountManager.cpp @@ -588,7 +588,7 @@ void AccountManager::requestAccessTokenWithSteam(QByteArray authSessionTicket) { connect(requestReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(requestAccessTokenError(QNetworkReply::NetworkError))); } -void AccountManager::requestAccessTokenWithOculus(const QString& nonce, const QString& userID, const QString &oculusID) { +void AccountManager::requestAccessTokenWithOculus(const QString& nonce, const QString &oculusID) { QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkRequest request; diff --git a/libraries/networking/src/AccountManager.h b/libraries/networking/src/AccountManager.h index e21a9a44a4..477488031d 100644 --- a/libraries/networking/src/AccountManager.h +++ b/libraries/networking/src/AccountManager.h @@ -106,7 +106,7 @@ public: public slots: void requestAccessToken(const QString& login, const QString& password); void requestAccessTokenWithSteam(QByteArray authSessionTicket); - void requestAccessTokenWithOculus(const QString& nonce, const QString& userID, const QString& oculusID); + void requestAccessTokenWithOculus(const QString& nonce, const QString& oculusID); void requestAccessTokenWithAuthCode(const QString& authCode, const QString& clientId, const QString& clientSecret, diff --git a/libraries/plugins/src/plugins/OculusPlatformPlugin.h b/libraries/plugins/src/plugins/OculusPlatformPlugin.h index c5a9928ac7..26939ee74b 100644 --- a/libraries/plugins/src/plugins/OculusPlatformPlugin.h +++ b/libraries/plugins/src/plugins/OculusPlatformPlugin.h @@ -11,7 +11,7 @@ #include -using NonceUserIDCallback = std::function; +using NonceUserIDCallback = std::function; class OculusPlatformPlugin { public: @@ -20,7 +20,7 @@ public: virtual const QString getName() const = 0; virtual const QString getOculusUserID() const = 0; - virtual const bool isRunning() const = 0; + virtual bool isRunning() = 0; virtual void requestNonceAndUserID(NonceUserIDCallback callback) = 0; diff --git a/plugins/oculus/src/OculusPlatformPlugin.cpp b/plugins/oculus/src/OculusPlatformPlugin.cpp index 85f43a81cf..d40cedcd9f 100644 --- a/plugins/oculus/src/OculusPlatformPlugin.cpp +++ b/plugins/oculus/src/OculusPlatformPlugin.cpp @@ -24,7 +24,7 @@ OculusAPIPlugin::~OculusAPIPlugin() { hifi::ovr::releaseRenderSession(_session); } -const bool OculusAPIPlugin::isRunning() const { +bool OculusAPIPlugin::isRunning() { return (qApp->property(hifi::properties::OCULUS_STORE).toBool()); } @@ -96,7 +96,7 @@ void OculusAPIPlugin::handleOVREvents() { } if (_nonceChanged) { - _nonceUserIDCallback(_nonce, _user, QString::number(_userID)); + _nonceUserIDCallback(_nonce, QString::number(_userID)); _nonceChanged = false; } diff --git a/plugins/oculus/src/OculusPlatformPlugin.h b/plugins/oculus/src/OculusPlatformPlugin.h index 0837962454..14bb8a3f2d 100644 --- a/plugins/oculus/src/OculusPlatformPlugin.h +++ b/plugins/oculus/src/OculusPlatformPlugin.h @@ -21,7 +21,7 @@ public: const QString getName() const { return NAME; } const QString getOculusUserID() const { return _user; }; - const bool isRunning() const; + bool isRunning(); virtual void requestNonceAndUserID(NonceUserIDCallback callback);