//// AndroidHelper.cpp// interface/src//// Created by Gabriel Calero & Cristian Duarte on 3/30/18.// Copyright 2018 High Fidelity, Inc.//// Distributed under the Apache License, Version 2.0.// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html//#include "AndroidHelper.h"#include <QDebug>#include <AccountManager.h>#include <AudioClient.h>#include <src/ui/LoginDialog.h>#include "Application.h"#include "Constants.h"#include "avatar/AvatarManager.h" #if defined(qApp)#undef qApp#endif#define qApp (static_cast<Application*>(QCoreApplication::instance())) AndroidHelper::AndroidHelper() { qRegisterMetaType<QAudio::Mode>("QAudio::Mode");} AndroidHelper::~AndroidHelper() {} void AndroidHelper::requestActivity(const QString &activityName, const bool backToScene, QMap<QString, QString> args) { emit androidActivityRequested(activityName, backToScene, args);} void AndroidHelper::notifyLoadComplete() { emit qtAppLoadComplete();} void AndroidHelper::notifyEnterForeground() { emit enterForeground();} void AndroidHelper::notifyBeforeEnterBackground() { emit beforeEnterBackground();} void AndroidHelper::notifyToggleAwayMode() { emit toggleAwayMode();} void AndroidHelper::notifyEnterBackground() { emit enterBackground();} void AndroidHelper::performHapticFeedback(int duration) { emit hapticFeedbackRequested(duration);} void AndroidHelper::showLoginDialog(QUrl url) { QMap<QString, QString> args; args["url"] = url.toString(); emit androidActivityRequested("Login", true, args);} void AndroidHelper::processURL(const QString &url) { if (qApp->canAcceptURL(url)) { qApp->acceptURL(url); }} void AndroidHelper::notifyHeadsetOn(bool pluggedIn) {#if defined (Q_OS_ANDROID) auto audioClient = DependencyManager::get<AudioClient>(); if (audioClient) { QMetaObject::invokeMethod(audioClient.data(), "setHeadsetPluggedIn", Q_ARG(bool, pluggedIn)); }#endif} void AndroidHelper::muteMic() { auto audioClient = DependencyManager::get<AudioClient>(); if (audioClient) { QMetaObject::invokeMethod(audioClient.data(), "setMuted", Q_ARG(bool, true), Q_ARG(bool, true)); }} void AndroidHelper::signup(QString email, QString username, QString password) { JSONCallbackParameters callbackParams; callbackParams.callbackReceiver = this; callbackParams.jsonCallbackMethod = "signupCompleted"; callbackParams.errorCallbackMethod = "signupFailed"; QJsonObject payload; QJsonObject userObject; userObject.insert("email", email); userObject.insert("username", username); userObject.insert("password", password); payload.insert("user", userObject); auto accountManager = DependencyManager::get<AccountManager>(); accountManager->sendRequest(API_SIGNUP_PATH, AccountManagerAuth::None, QNetworkAccessManager::PostOperation, callbackParams, QJsonDocument(payload).toJson());} void AndroidHelper::signupCompleted(QNetworkReply* reply) { emit handleSignupCompleted();} QString AndroidHelper::errorStringFromAPIObject(const QJsonValue& apiObject) { if (apiObject.isArray()) { return apiObject.toArray()[0].toString(); } else if (apiObject.isString()) { return apiObject.toString(); } else { return "is invalid"; }} void AndroidHelper::signupFailed(QNetworkReply* reply) { // parse the returned JSON to see what the problem was auto jsonResponse = QJsonDocument::fromJson(reply->readAll()); static const QString RESPONSE_DATA_KEY = "data"; auto dataJsonValue = jsonResponse.object()[RESPONSE_DATA_KEY]; if (dataJsonValue.isObject()) { auto dataObject = dataJsonValue.toObject(); static const QString EMAIL_DATA_KEY = "email"; static const QString USERNAME_DATA_KEY = "username"; static const QString PASSWORD_DATA_KEY = "password"; QStringList errorStringList; if (dataObject.contains(EMAIL_DATA_KEY)) { errorStringList.append(QString("Email %1.").arg(errorStringFromAPIObject(dataObject[EMAIL_DATA_KEY]))); } if (dataObject.contains(USERNAME_DATA_KEY)) { errorStringList.append(QString("Username %1.").arg(errorStringFromAPIObject(dataObject[USERNAME_DATA_KEY]))); } if (dataObject.contains(PASSWORD_DATA_KEY)) { errorStringList.append(QString("Password %1.").arg(errorStringFromAPIObject(dataObject[PASSWORD_DATA_KEY]))); } emit handleSignupFailed(errorStringList.join('\n')); } else { static const QString DEFAULT_SIGN_UP_FAILURE_MESSAGE = "There was an unknown error while creating your account. Please try again later."; emit handleSignupFailed(DEFAULT_SIGN_UP_FAILURE_MESSAGE); }} QString AndroidHelper::getDisplayName() { return DependencyManager::get<AvatarManager>()->getMyAvatar()->getDisplayName();} void AndroidHelper::setDisplayName(const QString &displayName) { DependencyManager::get<AvatarManager>()->getMyAvatar()->setDisplayName(displayName);} void AndroidHelper::setMyAvatarUrl(const QString &avatarUrl) { QUrl url = QUrl(avatarUrl); DependencyManager::get<AvatarManager>()->getMyAvatar()->useFullAvatarURL(url);}
//
// AndroidHelper.cpp
// interface/src
//
// Created by Gabriel Calero & Cristian Duarte on 3/30/18.
// Copyright 2018 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
#include "AndroidHelper.h"
#include <QDebug>
#include <AccountManager.h>
#include <AudioClient.h>
#include <src/ui/LoginDialog.h>
#include "Application.h"
#include "Constants.h"
#include "avatar/AvatarManager.h"
#if defined(qApp)
#undef qApp
#endif
#define qApp (static_cast<Application*>(QCoreApplication::instance()))
AndroidHelper::AndroidHelper() {
qRegisterMetaType<QAudio::Mode>("QAudio::Mode");
}
AndroidHelper::~AndroidHelper() {
}
void AndroidHelper::requestActivity(const QString &activityName, const bool backToScene, QMap<QString, QString> args) {
emit androidActivityRequested(activityName, backToScene, args);
}
void AndroidHelper::notifyLoadComplete() {
emit qtAppLoadComplete();
}
void AndroidHelper::notifyEnterForeground() {
emit enterForeground();
}
void AndroidHelper::notifyBeforeEnterBackground() {
emit beforeEnterBackground();
}
void AndroidHelper::notifyToggleAwayMode() {
emit toggleAwayMode();
}
void AndroidHelper::notifyEnterBackground() {
emit enterBackground();
}
void AndroidHelper::performHapticFeedback(int duration) {
emit hapticFeedbackRequested(duration);
}
void AndroidHelper::showLoginDialog(QUrl url) {
QMap<QString, QString> args;
args["url"] = url.toString();
emit androidActivityRequested("Login", true, args);
}
void AndroidHelper::processURL(const QString &url) {
if (qApp->canAcceptURL(url)) {
qApp->acceptURL(url);
}
}
void AndroidHelper::notifyHeadsetOn(bool pluggedIn) {
#if defined (Q_OS_ANDROID)
auto audioClient = DependencyManager::get<AudioClient>();
if (audioClient) {
QMetaObject::invokeMethod(audioClient.data(), "setHeadsetPluggedIn", Q_ARG(bool, pluggedIn));
}
#endif
}
void AndroidHelper::muteMic() {
auto audioClient = DependencyManager::get<AudioClient>();
if (audioClient) {
QMetaObject::invokeMethod(audioClient.data(), "setMuted", Q_ARG(bool, true), Q_ARG(bool, true));
}
}
void AndroidHelper::signup(QString email, QString username, QString password) {
JSONCallbackParameters callbackParams;
callbackParams.callbackReceiver = this;
callbackParams.jsonCallbackMethod = "signupCompleted";
callbackParams.errorCallbackMethod = "signupFailed";
QJsonObject payload;
QJsonObject userObject;
userObject.insert("email", email);
userObject.insert("username", username);
userObject.insert("password", password);
payload.insert("user", userObject);
auto accountManager = DependencyManager::get<AccountManager>();
accountManager->sendRequest(API_SIGNUP_PATH, AccountManagerAuth::None,
QNetworkAccessManager::PostOperation, callbackParams,
QJsonDocument(payload).toJson());
}
void AndroidHelper::signupCompleted(QNetworkReply* reply) {
emit handleSignupCompleted();
}
QString AndroidHelper::errorStringFromAPIObject(const QJsonValue& apiObject) {
if (apiObject.isArray()) {
return apiObject.toArray()[0].toString();
} else if (apiObject.isString()) {
return apiObject.toString();
} else {
return "is invalid";
}
}
void AndroidHelper::signupFailed(QNetworkReply* reply) {
// parse the returned JSON to see what the problem was
auto jsonResponse = QJsonDocument::fromJson(reply->readAll());
static const QString RESPONSE_DATA_KEY = "data";
auto dataJsonValue = jsonResponse.object()[RESPONSE_DATA_KEY];
if (dataJsonValue.isObject()) {
auto dataObject = dataJsonValue.toObject();
static const QString EMAIL_DATA_KEY = "email";
static const QString USERNAME_DATA_KEY = "username";
static const QString PASSWORD_DATA_KEY = "password";
QStringList errorStringList;
if (dataObject.contains(EMAIL_DATA_KEY)) {
errorStringList.append(QString("Email %1.").arg(errorStringFromAPIObject(dataObject[EMAIL_DATA_KEY])));
}
if (dataObject.contains(USERNAME_DATA_KEY)) {
errorStringList.append(QString("Username %1.").arg(errorStringFromAPIObject(dataObject[USERNAME_DATA_KEY])));
}
if (dataObject.contains(PASSWORD_DATA_KEY)) {
errorStringList.append(QString("Password %1.").arg(errorStringFromAPIObject(dataObject[PASSWORD_DATA_KEY])));
}
emit handleSignupFailed(errorStringList.join('\n'));
} else {
static const QString DEFAULT_SIGN_UP_FAILURE_MESSAGE = "There was an unknown error while creating your account. Please try again later.";
emit handleSignupFailed(DEFAULT_SIGN_UP_FAILURE_MESSAGE);
}
}
QString AndroidHelper::getDisplayName() {
return DependencyManager::get<AvatarManager>()->getMyAvatar()->getDisplayName();
}
void AndroidHelper::setDisplayName(const QString &displayName) {
DependencyManager::get<AvatarManager>()->getMyAvatar()->setDisplayName(displayName);
}
void AndroidHelper::setMyAvatarUrl(const QString &avatarUrl) {
QUrl url = QUrl(avatarUrl);
DependencyManager::get<AvatarManager>()->getMyAvatar()->useFullAvatarURL(url);
}