diff --git a/android/app/src/main/cpp/native.cpp b/android/app/src/main/cpp/native.cpp index de2f6ec3e0..9a5d29d675 100644 --- a/android/app/src/main/cpp/native.cpp +++ b/android/app/src/main/cpp/native.cpp @@ -218,7 +218,7 @@ Java_io_highfidelity_hifiinterface_LoginActivity_nativeLogin(JNIEnv *env, jobjec env->ReleaseStringUTFChars(username_, c_username); env->ReleaseStringUTFChars(password_, c_password); - auto accountManager = DependencyManager::get(); + auto accountManager = AndroidHelper::instance().getAccountManager(); __loginActivity = QAndroidJniObject(instance); @@ -253,18 +253,18 @@ Java_io_highfidelity_hifiinterface_SplashActivity_registerLoadCompleteListener(J } JNIEXPORT jboolean JNICALL Java_io_highfidelity_hifiinterface_HomeActivity_nativeIsLoggedIn(JNIEnv *env, jobject instance) { - return DependencyManager::get()->isLoggedIn(); + return AndroidHelper::instance().getAccountManager()->isLoggedIn(); } JNIEXPORT void JNICALL Java_io_highfidelity_hifiinterface_HomeActivity_nativeLogout(JNIEnv *env, jobject instance) { - DependencyManager::get()->logout(); + AndroidHelper::instance().getAccountManager()->logout(); } JNIEXPORT jstring JNICALL Java_io_highfidelity_hifiinterface_HomeActivity_nativeGetDisplayName(JNIEnv *env, jobject instance) { - QString username = DependencyManager::get()->getAccountInfo().getUsername(); + QString username = AndroidHelper::instance().getAccountManager()->getAccountInfo().getUsername(); return env->NewStringUTF(username.toLatin1().data()); } diff --git a/interface/src/AndroidHelper.cpp b/interface/src/AndroidHelper.cpp index fad4468622..825a45c21b 100644 --- a/interface/src/AndroidHelper.cpp +++ b/interface/src/AndroidHelper.cpp @@ -13,7 +13,6 @@ #include AndroidHelper::AndroidHelper() { - workerThread.start(); } AndroidHelper::~AndroidHelper() { @@ -22,7 +21,20 @@ AndroidHelper::~AndroidHelper() { } void AndroidHelper::init() { - DependencyManager::get()->moveToThread(&workerThread); + workerThread.start(); + _accountManager = QSharedPointer(new AccountManager, &QObject::deleteLater); + _accountManager->setIsAgent(true); + _accountManager->setAuthURL(NetworkingConstants::METAVERSE_SERVER_URL()); + _accountManager->setSessionID(DependencyManager::get()->getSessionID()); + connect(_accountManager.data(), &AccountManager::loginComplete, [](const QUrl& authURL) { + DependencyManager::get()->setAccountInfo(AndroidHelper::instance().getAccountManager()->getAccountInfo()); + DependencyManager::get()->setAuthURL(authURL); + }); + + connect(_accountManager.data(), &AccountManager::logoutComplete, [] () { + DependencyManager::get()->logout(); + }); + _accountManager->moveToThread(&workerThread); } void AndroidHelper::requestActivity(const QString &activityName) { diff --git a/interface/src/AndroidHelper.h b/interface/src/AndroidHelper.h index 0c6d05cbb2..c5e15a31da 100644 --- a/interface/src/AndroidHelper.h +++ b/interface/src/AndroidHelper.h @@ -14,6 +14,7 @@ #include #include +#include class AndroidHelper : public QObject { Q_OBJECT @@ -26,6 +27,7 @@ public: void requestActivity(const QString &activityName); void notifyLoadComplete(); void goBackFromAndroidActivity(); + QSharedPointer getAccountManager() { return _accountManager; } AndroidHelper(AndroidHelper const&) = delete; void operator=(AndroidHelper const&) = delete; @@ -37,6 +39,7 @@ signals: private: AndroidHelper(); ~AndroidHelper(); + QSharedPointer _accountManager; QThread workerThread; }; diff --git a/libraries/networking/src/AccountManager.cpp b/libraries/networking/src/AccountManager.cpp index 049129b2ba..e70e3e26d0 100644 --- a/libraries/networking/src/AccountManager.cpp +++ b/libraries/networking/src/AccountManager.cpp @@ -453,6 +453,20 @@ void AccountManager::removeAccountFromFile() { << "from settings file."; } +void AccountManager::setAccountInfo(const DataServerAccountInfo &newAccountInfo) { + _accountInfo = newAccountInfo; + _pendingPrivateKey.clear(); + if (_isAgent && !_accountInfo.getAccessToken().token.isEmpty() && !_accountInfo.hasProfile()) { + // we are missing profile information, request it now + requestProfile(); + } + + // prepare to refresh our token if it is about to expire + if (needsToRefreshToken()) { + refreshAccessToken(); + } +} + bool AccountManager::hasValidAccessToken() { if (_accountInfo.getAccessToken().token.isEmpty() || _accountInfo.getAccessToken().isExpired()) { diff --git a/libraries/networking/src/AccountManager.h b/libraries/networking/src/AccountManager.h index 87b17d00d5..88ebaf5656 100644 --- a/libraries/networking/src/AccountManager.h +++ b/libraries/networking/src/AccountManager.h @@ -88,6 +88,7 @@ public: void requestProfile(); DataServerAccountInfo& getAccountInfo() { return _accountInfo; } + void setAccountInfo(const DataServerAccountInfo &newAccountInfo); static QJsonObject dataObjectFromResponse(QNetworkReply& requestReply);