diff --git a/android/app/src/main/cpp/native.cpp b/android/app/src/main/cpp/native.cpp index 6b44b2dc7a..dce78f2156 100644 --- a/android/app/src/main/cpp/native.cpp +++ b/android/app/src/main/cpp/native.cpp @@ -156,7 +156,7 @@ JNIEXPORT void Java_io_highfidelity_hifiinterface_InterfaceActivity_nativeOnCrea JavaVM* jvm; env->GetJavaVM(&jvm); - QObject::connect(&AndroidHelper::instance(), &AndroidHelper::androidActivityRequested, [jvm](const QString& a, const bool backToScene, QList args) { + QObject::connect(&AndroidHelper::instance(), &AndroidHelper::androidActivityRequested, [jvm](const QString& a, const bool backToScene, QMap args) { JNIEnv* myNewEnv; JavaVMAttachArgs jvmArgs; jvmArgs.version = JNI_VERSION_1_6; // choose your JNI version @@ -182,9 +182,11 @@ JNIEXPORT void Java_io_highfidelity_hifiinterface_InterfaceActivity_nativeOnCrea jmethodID mapClassConstructor = myNewEnv->GetMethodID(hashMapClass, "", "()V"); jobject hashmap = myNewEnv->NewObject(hashMapClass, mapClassConstructor); jmethodID mapClassPut = myNewEnv->GetMethodID(hashMapClass, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); - for (const QString& arg: args) { - QAndroidJniObject jArg = QAndroidJniObject::fromString(arg); - myNewEnv->CallObjectMethod(hashmap, mapClassPut, QAndroidJniObject::fromString("url").object(), jArg.object()); + QMap::iterator i; + for (i = args.begin(); i != args.end(); ++i) { + QAndroidJniObject jKey = QAndroidJniObject::fromString(i.key()); + QAndroidJniObject jValue = QAndroidJniObject::fromString(i.value()); + myNewEnv->CallObjectMethod(hashmap, mapClassPut, jKey.object(), jValue.object()); } __interfaceActivity.callMethod("openAndroidActivity", "(Ljava/lang/String;ZLjava/util/HashMap;)V", string.object(), jBackToScene, hashmap); if (attachedHere) { 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 08e66a2f42..3d43e20c63 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/InterfaceActivity.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/InterfaceActivity.java @@ -39,6 +39,7 @@ import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Map; import io.highfidelity.hifiinterface.fragment.WebViewFragment; import io.highfidelity.hifiinterface.receiver.HeadsetStateReceiver; @@ -303,14 +304,22 @@ public class InterfaceActivity extends QtActivity implements WebViewFragment.OnW switch (activityName) { case "Home": case "Privacy Policy": - case "Login": { nativeBeforeEnterBackground(); Intent intent = new Intent(this, MainActivity.class); intent.putExtra(MainActivity.EXTRA_FRAGMENT, activityName); intent.putExtra(MainActivity.EXTRA_BACK_TO_SCENE, backToScene); startActivity(intent); break; - } + case "Login": + nativeBeforeEnterBackground(); + Intent loginIntent = new Intent(this, MainActivity.class); + loginIntent.putExtra(MainActivity.EXTRA_FRAGMENT, activityName); + loginIntent.putExtra(MainActivity.EXTRA_BACK_TO_SCENE, backToScene); + if (args != null && args.containsKey(DOMAIN_URL)) { + loginIntent.putExtra(DOMAIN_URL, (String) args.get(DOMAIN_URL)); + } + startActivity(loginIntent); + break; case "WebView": runOnUiThread(() -> { webSlidingDrawer.setVisibility(View.VISIBLE); 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 4c6d05a3e8..ff91409b9e 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java @@ -29,6 +29,9 @@ import android.widget.TextView; import com.squareup.picasso.Callback; import com.squareup.picasso.Picasso; +import java.util.HashMap; +import java.util.Map; + import io.highfidelity.hifiinterface.fragment.FriendsFragment; import io.highfidelity.hifiinterface.fragment.HomeFragment; import io.highfidelity.hifiinterface.fragment.LoginFragment; @@ -45,6 +48,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On public static final String DEFAULT_FRAGMENT = "Home"; public static final String EXTRA_FRAGMENT = "fragment"; public static final String EXTRA_BACK_TO_SCENE = "backToScene"; + public static final String EXTRA_BACK_TO_URL = "url"; private String TAG = "HighFidelity"; @@ -62,6 +66,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On private MenuItem mPeopleMenuItem; private boolean backToScene; + private String backToUrl; @Override protected void onCreate(Bundle savedInstanceState) { @@ -105,9 +110,8 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On loadFragment(DEFAULT_FRAGMENT); } - if (getIntent().hasExtra(EXTRA_BACK_TO_SCENE)) { - backToScene = getIntent().getBooleanExtra(EXTRA_BACK_TO_SCENE, false); - } + backToScene = getIntent().getBooleanExtra(EXTRA_BACK_TO_SCENE, false); + backToUrl = getIntent().getStringExtra(EXTRA_BACK_TO_URL); } } @@ -301,7 +305,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On } private void goToLastLocation() { - goToDomain(""); + goToDomain(backToUrl != null? backToUrl : ""); } private void goToDomain(String domainUrl) { diff --git a/interface/src/AndroidHelper.cpp b/interface/src/AndroidHelper.cpp index 400085a62a..c3019229ca 100644 --- a/interface/src/AndroidHelper.cpp +++ b/interface/src/AndroidHelper.cpp @@ -25,7 +25,7 @@ AndroidHelper::AndroidHelper() { AndroidHelper::~AndroidHelper() { } -void AndroidHelper::requestActivity(const QString &activityName, const bool backToScene, QList args) { +void AndroidHelper::requestActivity(const QString &activityName, const bool backToScene, QMap args) { emit androidActivityRequested(activityName, backToScene, args); } @@ -49,8 +49,10 @@ void AndroidHelper::performHapticFeedback(int duration) { emit hapticFeedbackRequested(duration); } -void AndroidHelper::showLoginDialog() { - emit androidActivityRequested("Login", true); +void AndroidHelper::showLoginDialog(QUrl url) { + QMap args; + args["url"] = url.toString(); + emit androidActivityRequested("Login", true, args); } void AndroidHelper::processURL(const QString &url) { diff --git a/interface/src/AndroidHelper.h b/interface/src/AndroidHelper.h index 11b84e4025..f93187e44f 100644 --- a/interface/src/AndroidHelper.h +++ b/interface/src/AndroidHelper.h @@ -13,6 +13,8 @@ #define hifi_Android_Helper_h #include +#include +#include class AndroidHelper : public QObject { Q_OBJECT @@ -21,7 +23,7 @@ public: static AndroidHelper instance; return instance; } - void requestActivity(const QString &activityName, const bool backToScene, QList args = QList()); + void requestActivity(const QString &activityName, const bool backToScene, QMap args = QMap()); void notifyLoadComplete(); void notifyEnterForeground(); void notifyBeforeEnterBackground(); @@ -35,10 +37,10 @@ public: void operator=(AndroidHelper const&) = delete; public slots: - void showLoginDialog(); + void showLoginDialog(QUrl url); signals: - void androidActivityRequested(const QString &activityName, const bool backToScene, QList args = QList()); + void androidActivityRequested(const QString &activityName, const bool backToScene, QMap args = QMap()); void qtAppLoadComplete(); void enterForeground(); void beforeEnterBackground(); diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 3a34c87ef1..56aa195925 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1236,7 +1236,8 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo auto dialogsManager = DependencyManager::get(); #if defined(Q_OS_ANDROID) connect(accountManager.data(), &AccountManager::authRequired, this, []() { - AndroidHelper::instance().showLoginDialog(); + auto addressManager = DependencyManager::get(); + AndroidHelper::instance().showLoginDialog(addressManager->currentAddress()); }); #else connect(accountManager.data(), &AccountManager::authRequired, dialogsManager.data(), &DialogsManager::showLoginDialog); diff --git a/interface/src/scripting/WindowScriptingInterface.cpp b/interface/src/scripting/WindowScriptingInterface.cpp index d4eb37e0aa..2e679e0947 100644 --- a/interface/src/scripting/WindowScriptingInterface.cpp +++ b/interface/src/scripting/WindowScriptingInterface.cpp @@ -134,7 +134,8 @@ void WindowScriptingInterface::openUrl(const QUrl& url) { DependencyManager::get()->handleLookupString(url.toString()); } else { #if defined(Q_OS_ANDROID) - QList args = { url.toString() }; + QMap args; + args["url"] = url.toString(); AndroidHelper::instance().requestActivity("WebView", true, args); #else // address manager did not handle - ask QDesktopServices to handle