diff --git a/android/app/src/main/cpp/native.cpp b/android/app/src/main/cpp/native.cpp index cdecc12df6..bdbbe4193f 100644 --- a/android/app/src/main/cpp/native.cpp +++ b/android/app/src/main/cpp/native.cpp @@ -151,9 +151,10 @@ JNIEXPORT void Java_io_highfidelity_hifiinterface_InterfaceActivity_nativeOnCrea unpackAndroidAssets(); 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); - __interfaceActivity.callMethod("openAndroidActivity", "(Ljava/lang/String;)V", string.object()); + jboolean jBackToScene = (jboolean) backToScene; + __interfaceActivity.callMethod("openAndroidActivity", "(Ljava/lang/String;Z)V", string.object(), jBackToScene); }); QObject::connect(&AndroidHelper::instance(), &AndroidHelper::hapticFeedbackRequested, [](const QString &c) { diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/InterfaceActivity.java b/android/app/src/main/java/io/highfidelity/hifiinterface/InterfaceActivity.java index 7b32f72148..fbefcf5b9a 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/InterfaceActivity.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/InterfaceActivity.java @@ -199,10 +199,13 @@ public class InterfaceActivity extends QtActivity { } } - public void openAndroidActivity(String activityName) { + public void openAndroidActivity(String activityName, boolean backToScene) { switch (activityName) { - case "Home": { + case "Home": + case "Login": { Intent intent = new Intent(this, MainActivity.class); + intent.putExtra(MainActivity.EXTRA_FRAGMENT, activityName); + intent.putExtra(MainActivity.EXTRA_BACK_TO_SCENE, backToScene); startActivity(intent); break; } @@ -228,7 +231,7 @@ public class InterfaceActivity extends QtActivity { @Override public void onBackPressed() { - openAndroidActivity("Home"); + openAndroidActivity("Home", false); } } diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java b/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java index ff5aff1f1c..5fb93ba099 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java @@ -17,6 +17,7 @@ import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; +import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; @@ -40,6 +41,10 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On GotoFragment.OnGotoInteractionListener { 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"; public native boolean nativeIsLoggedIn(); @@ -51,6 +56,8 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On private ImageView mProfilePicture; private TextView mDisplayName; + private boolean backToScene; + @Override protected void onCreate(Bundle 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.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() { @@ -200,6 +234,10 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On goToDomain(domainUrl); } + private void goToLastLocation() { + goToDomain(""); + } + private void goToDomain(String domainUrl) { Intent intent = new Intent(this, InterfaceActivity.class); intent.putExtra(InterfaceActivity.DOMAIN_URL, domainUrl); @@ -212,6 +250,10 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On public void onLoginCompleted() { loadHomeFragment(); updateLoginMenu(); + if (backToScene) { + backToScene = false; + goToLastLocation(); + } } public void handleUsernameChanged(String username) { @@ -246,7 +288,6 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On @Override public void onError(Exception e) { mProfilePicture.setImageResource(PROFILE_PICTURE_PLACEHOLDER); - } } @@ -255,8 +296,24 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On int index = getFragmentManager().getBackStackEntryCount() - 1; if (index > -1) { super.onBackPressed(); + if (backToScene) { + backToScene = false; + goToLastLocation(); + } } 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); + } } diff --git a/interface/src/AndroidHelper.cpp b/interface/src/AndroidHelper.cpp index cd1b4cb3a9..2365a87a5f 100644 --- a/interface/src/AndroidHelper.cpp +++ b/interface/src/AndroidHelper.cpp @@ -14,7 +14,6 @@ AndroidHelper::AndroidHelper() : _accountManager () { - workerThread.start(); } AndroidHelper::~AndroidHelper() { @@ -22,18 +21,20 @@ AndroidHelper::~AndroidHelper() { workerThread.wait(); } +void AndroidHelper::init() { + qDebug() << "[LOGIN] AndroidHelper::init"; + workerThread.start(); + _accountManager = DependencyManager::get(); + _accountManager->moveToThread(&workerThread); +} + QSharedPointer AndroidHelper::getAccountManager() { - if (!_accountManager) { - _accountManager = QSharedPointer(new AccountManager, &QObject::deleteLater); - _accountManager->setIsAgent(true); - _accountManager->setAuthURL(NetworkingConstants::METAVERSE_SERVER_URL()); - _accountManager->moveToThread(&workerThread); - } + assert(_accountManager); return _accountManager; } -void AndroidHelper::requestActivity(const QString &activityName) { - emit androidActivityRequested(activityName); +void AndroidHelper::requestActivity(const QString &activityName, const bool backToScene) { + emit androidActivityRequested(activityName, backToScene); } void AndroidHelper::notifyLoadComplete() { @@ -48,3 +49,6 @@ void AndroidHelper::performHapticFeedback(const QString& feedbackConstant) { emit hapticFeedbackRequested(feedbackConstant); } +void AndroidHelper::showLoginDialog() { + emit androidActivityRequested("Login", true); +} diff --git a/interface/src/AndroidHelper.h b/interface/src/AndroidHelper.h index e1d00a080b..f3fe8389ce 100644 --- a/interface/src/AndroidHelper.h +++ b/interface/src/AndroidHelper.h @@ -23,7 +23,8 @@ public: static AndroidHelper instance; return instance; } - void requestActivity(const QString &activityName); + void init(); + void requestActivity(const QString &activityName, const bool backToScene); void notifyLoadComplete(); void notifyLoginComplete(bool success); @@ -33,8 +34,12 @@ public: AndroidHelper(AndroidHelper const&) = delete; void operator=(AndroidHelper const&) = delete; + +public slots: + void showLoginDialog(); + signals: - void androidActivityRequested(const QString &activityName); + void androidActivityRequested(const QString &activityName, const bool backToScene); void qtAppLoadComplete(); void loginComplete(bool success); void hapticFeedbackRequested(const QString &feedbackConstant); diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 454848c87d..175b3b8492 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -830,7 +830,11 @@ bool setupEssentials(int& argc, char** argv, bool runningMarkerExisted) { DependencyManager::set(); DependencyManager::set(); DependencyManager::set(); +#if defined(Q_OS_ANDROID) + DependencyManager::set(); // use the default user agent getter +#else DependencyManager::set(std::bind(&Application::getUserAgent, qApp)); +#endif DependencyManager::set(); DependencyManager::set(ScriptEngine::CLIENT_SCRIPT); DependencyManager::set(); @@ -1189,7 +1193,13 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo nodeList.data(), SLOT(reset())); auto dialogsManager = DependencyManager::get(); +#if defined(Q_OS_ANDROID) + connect(accountManager.data(), &AccountManager::authRequired, this, []() { + AndroidHelper::instance().showLoginDialog(); + }); +#else connect(accountManager.data(), &AccountManager::authRequired, dialogsManager.data(), &DialogsManager::showLoginDialog); +#endif 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 @@ -2166,6 +2176,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo qCDebug(interfaceapp) << "Metaverse session ID is" << uuidStringWithoutCurlyBraces(accountManager->getSessionID()); #if defined(Q_OS_ANDROID) + AndroidHelper::instance().init(); AndroidHelper::instance().notifyLoadComplete(); #endif } @@ -3673,7 +3684,7 @@ void Application::keyReleaseEvent(QKeyEvent* event) { #if defined(Q_OS_ANDROID) if (event->key() == Qt::Key_Back) { event->accept(); - openAndroidActivity("Home"); + openAndroidActivity("Home", false); } #endif _controllerScriptingInterface->emitKeyReleaseEvent(event); // send events to any registered scripts @@ -7936,9 +7947,9 @@ void Application::saveNextPhysicsStats(QString filename) { _physicsEngine->saveNextPhysicsStats(filename); } -void Application::openAndroidActivity(const QString& activityName) { +void Application::openAndroidActivity(const QString& activityName, const bool backToScene) { #if defined(Q_OS_ANDROID) - AndroidHelper::instance().requestActivity(activityName); + AndroidHelper::instance().requestActivity(activityName, backToScene); #endif } diff --git a/interface/src/Application.h b/interface/src/Application.h index 50812a00ec..f22620a96a 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -403,7 +403,7 @@ public slots: 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); private slots: diff --git a/interface/src/commerce/Wallet.cpp b/interface/src/commerce/Wallet.cpp index 3e0e4adf18..57165ef90c 100644 --- a/interface/src/commerce/Wallet.cpp +++ b/interface/src/commerce/Wallet.cpp @@ -615,9 +615,12 @@ void Wallet::updateImageProvider() { securityImageProvider->setSecurityImage(_securityImage); // inform tablet security image provider - QQmlEngine* tabletEngine = DependencyManager::get()->getTablet("com.highfidelity.interface.tablet.system")->getTabletSurface()->getSurfaceContext()->engine(); - securityImageProvider = reinterpret_cast(tabletEngine->imageProvider(SecurityImageProvider::PROVIDER_NAME)); - securityImageProvider->setSecurityImage(_securityImage); + OffscreenQmlSurface * tabletSurface = DependencyManager::get()->getTablet("com.highfidelity.interface.tablet.system")->getTabletSurface(); + if (tabletSurface) { + QQmlEngine* tabletEngine = tabletSurface->getSurfaceContext()->engine(); + securityImageProvider = reinterpret_cast(tabletEngine->imageProvider(SecurityImageProvider::PROVIDER_NAME)); + securityImageProvider->setSecurityImage(_securityImage); + } } void Wallet::chooseSecurityImage(const QString& filename) { diff --git a/interface/src/ui/LoginDialog.cpp b/interface/src/ui/LoginDialog.cpp index 2e40d3c087..39a5849d85 100644 --- a/interface/src/ui/LoginDialog.cpp +++ b/interface/src/ui/LoginDialog.cpp @@ -31,10 +31,13 @@ HIFI_QML_DEF(LoginDialog) LoginDialog::LoginDialog(QQuickItem *parent) : OffscreenQmlDialog(parent) { auto accountManager = DependencyManager::get(); +#if !defined(Q_OS_ANDROID) connect(accountManager.data(), &AccountManager::loginComplete, this, &LoginDialog::handleLoginCompleted); connect(accountManager.data(), &AccountManager::loginFailed, this, &LoginDialog::handleLoginFailed); +#endif + } void LoginDialog::showWithSelection() diff --git a/scripts/system/+android/actionbar.js b/scripts/system/+android/actionbar.js index c23ce89d4c..357e7853e7 100644 --- a/scripts/system/+android/actionbar.js +++ b/scripts/system/+android/actionbar.js @@ -43,7 +43,7 @@ function onBackPressed() { } function onBackClicked() { - App.openAndroidActivity("Home"); + App.openAndroidActivity("Home", false); }