mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 09:48:44 +02:00
Use a single AccountManager for android.
This commit is contained in:
parent
ce8bd13685
commit
0f08bd8fa1
10 changed files with 114 additions and 27 deletions
|
@ -151,9 +151,10 @@ JNIEXPORT void Java_io_highfidelity_hifiinterface_InterfaceActivity_nativeOnCrea
|
||||||
unpackAndroidAssets();
|
unpackAndroidAssets();
|
||||||
qInstallMessageHandler(oldMessageHandler);
|
qInstallMessageHandler(oldMessageHandler);
|
||||||
|
|
||||||
QObject::connect(&AndroidHelper::instance(), &AndroidHelper::androidActivityRequested, [](const QString& a) {
|
QObject::connect(&AndroidHelper::instance(), &AndroidHelper::androidActivityRequested, [](const QString& a, const bool backToScene) {
|
||||||
QAndroidJniObject string = QAndroidJniObject::fromString(a);
|
QAndroidJniObject string = QAndroidJniObject::fromString(a);
|
||||||
__interfaceActivity.callMethod<void>("openAndroidActivity", "(Ljava/lang/String;)V", string.object<jstring>());
|
jboolean jBackToScene = (jboolean) backToScene;
|
||||||
|
__interfaceActivity.callMethod<void>("openAndroidActivity", "(Ljava/lang/String;Z)V", string.object<jstring>(), jBackToScene);
|
||||||
});
|
});
|
||||||
|
|
||||||
QObject::connect(&AndroidHelper::instance(), &AndroidHelper::hapticFeedbackRequested, [](const QString &c) {
|
QObject::connect(&AndroidHelper::instance(), &AndroidHelper::hapticFeedbackRequested, [](const QString &c) {
|
||||||
|
|
|
@ -199,10 +199,13 @@ public class InterfaceActivity extends QtActivity {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void openAndroidActivity(String activityName) {
|
public void openAndroidActivity(String activityName, boolean backToScene) {
|
||||||
switch (activityName) {
|
switch (activityName) {
|
||||||
case "Home": {
|
case "Home":
|
||||||
|
case "Login": {
|
||||||
Intent intent = new Intent(this, MainActivity.class);
|
Intent intent = new Intent(this, MainActivity.class);
|
||||||
|
intent.putExtra(MainActivity.EXTRA_FRAGMENT, activityName);
|
||||||
|
intent.putExtra(MainActivity.EXTRA_BACK_TO_SCENE, backToScene);
|
||||||
startActivity(intent);
|
startActivity(intent);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -228,7 +231,7 @@ public class InterfaceActivity extends QtActivity {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onBackPressed() {
|
public void onBackPressed() {
|
||||||
openAndroidActivity("Home");
|
openAndroidActivity("Home", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,7 @@ import android.support.v4.widget.DrawerLayout;
|
||||||
import android.support.v7.app.ActionBar;
|
import android.support.v7.app.ActionBar;
|
||||||
import android.support.v7.app.AppCompatActivity;
|
import android.support.v7.app.AppCompatActivity;
|
||||||
import android.support.v7.widget.Toolbar;
|
import android.support.v7.widget.Toolbar;
|
||||||
|
import android.util.Log;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
@ -40,6 +41,10 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
|
||||||
GotoFragment.OnGotoInteractionListener {
|
GotoFragment.OnGotoInteractionListener {
|
||||||
|
|
||||||
private static final int PROFILE_PICTURE_PLACEHOLDER = R.drawable.default_profile_avatar;
|
private static final int PROFILE_PICTURE_PLACEHOLDER = R.drawable.default_profile_avatar;
|
||||||
|
public static final String DEFAULT_FRAGMENT = "Home";
|
||||||
|
public static final String EXTRA_FRAGMENT = "fragment";
|
||||||
|
public static final String EXTRA_BACK_TO_SCENE = "backToScene";
|
||||||
|
|
||||||
private String TAG = "HighFidelity";
|
private String TAG = "HighFidelity";
|
||||||
|
|
||||||
public native boolean nativeIsLoggedIn();
|
public native boolean nativeIsLoggedIn();
|
||||||
|
@ -51,6 +56,8 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
|
||||||
private ImageView mProfilePicture;
|
private ImageView mProfilePicture;
|
||||||
private TextView mDisplayName;
|
private TextView mDisplayName;
|
||||||
|
|
||||||
|
private boolean backToScene;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
@ -76,7 +83,34 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
|
||||||
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
|
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
|
||||||
window.setStatusBarColor(ContextCompat.getColor(this, R.color.statusbar_color));
|
window.setStatusBarColor(ContextCompat.getColor(this, R.color.statusbar_color));
|
||||||
|
|
||||||
loadHomeFragment();
|
if (getIntent() != null) {
|
||||||
|
if (getIntent().hasExtra(EXTRA_FRAGMENT)) {
|
||||||
|
loadFragment(getIntent().getStringExtra(EXTRA_FRAGMENT));
|
||||||
|
} else {
|
||||||
|
loadFragment(DEFAULT_FRAGMENT);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (getIntent().hasExtra(EXTRA_BACK_TO_SCENE)) {
|
||||||
|
backToScene = getIntent().getBooleanExtra(EXTRA_BACK_TO_SCENE, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadFragment(String fragment) {
|
||||||
|
switch (fragment) {
|
||||||
|
case "Login":
|
||||||
|
loadLoginFragment();
|
||||||
|
break;
|
||||||
|
case "Home":
|
||||||
|
loadHomeFragment();
|
||||||
|
break;
|
||||||
|
case "Privacy Policy":
|
||||||
|
loadPrivacyPolicyFragment();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
Log.e(TAG, "Unknown fragment " + fragment);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loadHomeFragment() {
|
private void loadHomeFragment() {
|
||||||
|
@ -200,6 +234,10 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
|
||||||
goToDomain(domainUrl);
|
goToDomain(domainUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void goToLastLocation() {
|
||||||
|
goToDomain("");
|
||||||
|
}
|
||||||
|
|
||||||
private void goToDomain(String domainUrl) {
|
private void goToDomain(String domainUrl) {
|
||||||
Intent intent = new Intent(this, InterfaceActivity.class);
|
Intent intent = new Intent(this, InterfaceActivity.class);
|
||||||
intent.putExtra(InterfaceActivity.DOMAIN_URL, domainUrl);
|
intent.putExtra(InterfaceActivity.DOMAIN_URL, domainUrl);
|
||||||
|
@ -212,6 +250,10 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
|
||||||
public void onLoginCompleted() {
|
public void onLoginCompleted() {
|
||||||
loadHomeFragment();
|
loadHomeFragment();
|
||||||
updateLoginMenu();
|
updateLoginMenu();
|
||||||
|
if (backToScene) {
|
||||||
|
backToScene = false;
|
||||||
|
goToLastLocation();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void handleUsernameChanged(String username) {
|
public void handleUsernameChanged(String username) {
|
||||||
|
@ -246,7 +288,6 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
|
||||||
@Override
|
@Override
|
||||||
public void onError(Exception e) {
|
public void onError(Exception e) {
|
||||||
mProfilePicture.setImageResource(PROFILE_PICTURE_PLACEHOLDER);
|
mProfilePicture.setImageResource(PROFILE_PICTURE_PLACEHOLDER);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -255,8 +296,24 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
|
||||||
int index = getFragmentManager().getBackStackEntryCount() - 1;
|
int index = getFragmentManager().getBackStackEntryCount() - 1;
|
||||||
if (index > -1) {
|
if (index > -1) {
|
||||||
super.onBackPressed();
|
super.onBackPressed();
|
||||||
|
if (backToScene) {
|
||||||
|
backToScene = false;
|
||||||
|
goToLastLocation();
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
finishAffinity();
|
finishAffinity();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSaveInstanceState(Bundle savedInstanceState) {
|
||||||
|
super.onSaveInstanceState(savedInstanceState);
|
||||||
|
savedInstanceState.putBoolean(EXTRA_BACK_TO_SCENE, backToScene);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onRestoreInstanceState(Bundle savedInstanceState) {
|
||||||
|
super.onRestoreInstanceState(savedInstanceState);
|
||||||
|
backToScene = savedInstanceState.getBoolean(EXTRA_BACK_TO_SCENE, false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,6 @@
|
||||||
AndroidHelper::AndroidHelper() :
|
AndroidHelper::AndroidHelper() :
|
||||||
_accountManager ()
|
_accountManager ()
|
||||||
{
|
{
|
||||||
workerThread.start();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
AndroidHelper::~AndroidHelper() {
|
AndroidHelper::~AndroidHelper() {
|
||||||
|
@ -22,18 +21,20 @@ AndroidHelper::~AndroidHelper() {
|
||||||
workerThread.wait();
|
workerThread.wait();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AndroidHelper::init() {
|
||||||
|
qDebug() << "[LOGIN] AndroidHelper::init";
|
||||||
|
workerThread.start();
|
||||||
|
_accountManager = DependencyManager::get<AccountManager>();
|
||||||
|
_accountManager->moveToThread(&workerThread);
|
||||||
|
}
|
||||||
|
|
||||||
QSharedPointer<AccountManager> AndroidHelper::getAccountManager() {
|
QSharedPointer<AccountManager> AndroidHelper::getAccountManager() {
|
||||||
if (!_accountManager) {
|
assert(_accountManager);
|
||||||
_accountManager = QSharedPointer<AccountManager>(new AccountManager, &QObject::deleteLater);
|
|
||||||
_accountManager->setIsAgent(true);
|
|
||||||
_accountManager->setAuthURL(NetworkingConstants::METAVERSE_SERVER_URL());
|
|
||||||
_accountManager->moveToThread(&workerThread);
|
|
||||||
}
|
|
||||||
return _accountManager;
|
return _accountManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AndroidHelper::requestActivity(const QString &activityName) {
|
void AndroidHelper::requestActivity(const QString &activityName, const bool backToScene) {
|
||||||
emit androidActivityRequested(activityName);
|
emit androidActivityRequested(activityName, backToScene);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AndroidHelper::notifyLoadComplete() {
|
void AndroidHelper::notifyLoadComplete() {
|
||||||
|
@ -48,3 +49,6 @@ void AndroidHelper::performHapticFeedback(const QString& feedbackConstant) {
|
||||||
emit hapticFeedbackRequested(feedbackConstant);
|
emit hapticFeedbackRequested(feedbackConstant);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AndroidHelper::showLoginDialog() {
|
||||||
|
emit androidActivityRequested("Login", true);
|
||||||
|
}
|
||||||
|
|
|
@ -23,7 +23,8 @@ public:
|
||||||
static AndroidHelper instance;
|
static AndroidHelper instance;
|
||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
void requestActivity(const QString &activityName);
|
void init();
|
||||||
|
void requestActivity(const QString &activityName, const bool backToScene);
|
||||||
void notifyLoadComplete();
|
void notifyLoadComplete();
|
||||||
|
|
||||||
void notifyLoginComplete(bool success);
|
void notifyLoginComplete(bool success);
|
||||||
|
@ -33,8 +34,12 @@ public:
|
||||||
|
|
||||||
AndroidHelper(AndroidHelper const&) = delete;
|
AndroidHelper(AndroidHelper const&) = delete;
|
||||||
void operator=(AndroidHelper const&) = delete;
|
void operator=(AndroidHelper const&) = delete;
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void showLoginDialog();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void androidActivityRequested(const QString &activityName);
|
void androidActivityRequested(const QString &activityName, const bool backToScene);
|
||||||
void qtAppLoadComplete();
|
void qtAppLoadComplete();
|
||||||
void loginComplete(bool success);
|
void loginComplete(bool success);
|
||||||
void hapticFeedbackRequested(const QString &feedbackConstant);
|
void hapticFeedbackRequested(const QString &feedbackConstant);
|
||||||
|
|
|
@ -830,7 +830,11 @@ bool setupEssentials(int& argc, char** argv, bool runningMarkerExisted) {
|
||||||
DependencyManager::set<Cursor::Manager>();
|
DependencyManager::set<Cursor::Manager>();
|
||||||
DependencyManager::set<VirtualPad::Manager>();
|
DependencyManager::set<VirtualPad::Manager>();
|
||||||
DependencyManager::set<DesktopPreviewProvider>();
|
DependencyManager::set<DesktopPreviewProvider>();
|
||||||
|
#if defined(Q_OS_ANDROID)
|
||||||
|
DependencyManager::set<AccountManager>(); // use the default user agent getter
|
||||||
|
#else
|
||||||
DependencyManager::set<AccountManager>(std::bind(&Application::getUserAgent, qApp));
|
DependencyManager::set<AccountManager>(std::bind(&Application::getUserAgent, qApp));
|
||||||
|
#endif
|
||||||
DependencyManager::set<StatTracker>();
|
DependencyManager::set<StatTracker>();
|
||||||
DependencyManager::set<ScriptEngines>(ScriptEngine::CLIENT_SCRIPT);
|
DependencyManager::set<ScriptEngines>(ScriptEngine::CLIENT_SCRIPT);
|
||||||
DependencyManager::set<ScriptInitializerMixin, NativeScriptInitializers>();
|
DependencyManager::set<ScriptInitializerMixin, NativeScriptInitializers>();
|
||||||
|
@ -1189,7 +1193,13 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
|
||||||
nodeList.data(), SLOT(reset()));
|
nodeList.data(), SLOT(reset()));
|
||||||
|
|
||||||
auto dialogsManager = DependencyManager::get<DialogsManager>();
|
auto dialogsManager = DependencyManager::get<DialogsManager>();
|
||||||
|
#if defined(Q_OS_ANDROID)
|
||||||
|
connect(accountManager.data(), &AccountManager::authRequired, this, []() {
|
||||||
|
AndroidHelper::instance().showLoginDialog();
|
||||||
|
});
|
||||||
|
#else
|
||||||
connect(accountManager.data(), &AccountManager::authRequired, dialogsManager.data(), &DialogsManager::showLoginDialog);
|
connect(accountManager.data(), &AccountManager::authRequired, dialogsManager.data(), &DialogsManager::showLoginDialog);
|
||||||
|
#endif
|
||||||
connect(accountManager.data(), &AccountManager::usernameChanged, this, &Application::updateWindowTitle);
|
connect(accountManager.data(), &AccountManager::usernameChanged, this, &Application::updateWindowTitle);
|
||||||
|
|
||||||
// set the account manager's root URL and trigger a login request if we don't have the access token
|
// set the account manager's root URL and trigger a login request if we don't have the access token
|
||||||
|
@ -2166,6 +2176,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
|
||||||
qCDebug(interfaceapp) << "Metaverse session ID is" << uuidStringWithoutCurlyBraces(accountManager->getSessionID());
|
qCDebug(interfaceapp) << "Metaverse session ID is" << uuidStringWithoutCurlyBraces(accountManager->getSessionID());
|
||||||
|
|
||||||
#if defined(Q_OS_ANDROID)
|
#if defined(Q_OS_ANDROID)
|
||||||
|
AndroidHelper::instance().init();
|
||||||
AndroidHelper::instance().notifyLoadComplete();
|
AndroidHelper::instance().notifyLoadComplete();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -3673,7 +3684,7 @@ void Application::keyReleaseEvent(QKeyEvent* event) {
|
||||||
#if defined(Q_OS_ANDROID)
|
#if defined(Q_OS_ANDROID)
|
||||||
if (event->key() == Qt::Key_Back) {
|
if (event->key() == Qt::Key_Back) {
|
||||||
event->accept();
|
event->accept();
|
||||||
openAndroidActivity("Home");
|
openAndroidActivity("Home", false);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
_controllerScriptingInterface->emitKeyReleaseEvent(event); // send events to any registered scripts
|
_controllerScriptingInterface->emitKeyReleaseEvent(event); // send events to any registered scripts
|
||||||
|
@ -7936,9 +7947,9 @@ void Application::saveNextPhysicsStats(QString filename) {
|
||||||
_physicsEngine->saveNextPhysicsStats(filename);
|
_physicsEngine->saveNextPhysicsStats(filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::openAndroidActivity(const QString& activityName) {
|
void Application::openAndroidActivity(const QString& activityName, const bool backToScene) {
|
||||||
#if defined(Q_OS_ANDROID)
|
#if defined(Q_OS_ANDROID)
|
||||||
AndroidHelper::instance().requestActivity(activityName);
|
AndroidHelper::instance().requestActivity(activityName, backToScene);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -403,7 +403,7 @@ public slots:
|
||||||
|
|
||||||
Q_INVOKABLE bool askBeforeSetAvatarUrl(const QString& avatarUrl) { return askToSetAvatarUrl(avatarUrl); }
|
Q_INVOKABLE bool askBeforeSetAvatarUrl(const QString& avatarUrl) { return askToSetAvatarUrl(avatarUrl); }
|
||||||
|
|
||||||
Q_INVOKABLE void openAndroidActivity(const QString& activityName);
|
Q_INVOKABLE void openAndroidActivity(const QString& activityName, const bool backToScene);
|
||||||
Q_INVOKABLE void performHapticFeedback(const QString& feedbackConstant);
|
Q_INVOKABLE void performHapticFeedback(const QString& feedbackConstant);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
|
|
@ -615,9 +615,12 @@ void Wallet::updateImageProvider() {
|
||||||
securityImageProvider->setSecurityImage(_securityImage);
|
securityImageProvider->setSecurityImage(_securityImage);
|
||||||
|
|
||||||
// inform tablet security image provider
|
// inform tablet security image provider
|
||||||
QQmlEngine* tabletEngine = DependencyManager::get<TabletScriptingInterface>()->getTablet("com.highfidelity.interface.tablet.system")->getTabletSurface()->getSurfaceContext()->engine();
|
OffscreenQmlSurface * tabletSurface = DependencyManager::get<TabletScriptingInterface>()->getTablet("com.highfidelity.interface.tablet.system")->getTabletSurface();
|
||||||
securityImageProvider = reinterpret_cast<SecurityImageProvider*>(tabletEngine->imageProvider(SecurityImageProvider::PROVIDER_NAME));
|
if (tabletSurface) {
|
||||||
securityImageProvider->setSecurityImage(_securityImage);
|
QQmlEngine* tabletEngine = tabletSurface->getSurfaceContext()->engine();
|
||||||
|
securityImageProvider = reinterpret_cast<SecurityImageProvider*>(tabletEngine->imageProvider(SecurityImageProvider::PROVIDER_NAME));
|
||||||
|
securityImageProvider->setSecurityImage(_securityImage);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Wallet::chooseSecurityImage(const QString& filename) {
|
void Wallet::chooseSecurityImage(const QString& filename) {
|
||||||
|
|
|
@ -31,10 +31,13 @@ HIFI_QML_DEF(LoginDialog)
|
||||||
|
|
||||||
LoginDialog::LoginDialog(QQuickItem *parent) : OffscreenQmlDialog(parent) {
|
LoginDialog::LoginDialog(QQuickItem *parent) : OffscreenQmlDialog(parent) {
|
||||||
auto accountManager = DependencyManager::get<AccountManager>();
|
auto accountManager = DependencyManager::get<AccountManager>();
|
||||||
|
#if !defined(Q_OS_ANDROID)
|
||||||
connect(accountManager.data(), &AccountManager::loginComplete,
|
connect(accountManager.data(), &AccountManager::loginComplete,
|
||||||
this, &LoginDialog::handleLoginCompleted);
|
this, &LoginDialog::handleLoginCompleted);
|
||||||
connect(accountManager.data(), &AccountManager::loginFailed,
|
connect(accountManager.data(), &AccountManager::loginFailed,
|
||||||
this, &LoginDialog::handleLoginFailed);
|
this, &LoginDialog::handleLoginFailed);
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void LoginDialog::showWithSelection()
|
void LoginDialog::showWithSelection()
|
||||||
|
|
|
@ -43,7 +43,7 @@ function onBackPressed() {
|
||||||
}
|
}
|
||||||
|
|
||||||
function onBackClicked() {
|
function onBackClicked() {
|
||||||
App.openAndroidActivity("Home");
|
App.openAndroidActivity("Home", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue