From 99d8f822b23cccf36da34288f8d374431d85bb7b Mon Sep 17 00:00:00 2001 From: Gabriel Calero Date: Wed, 4 Apr 2018 19:24:26 -0300 Subject: [PATCH] Fix crash selecting domain for second time. Stop rendering while Goto activity is started --- android/app/src/main/cpp/native.cpp | 11 +++++----- .../hifiinterface/GotoActivity.java | 2 -- .../hifiinterface/InterfaceActivity.java | 20 +++++++++++++++---- interface/src/AndroidHelper.cpp | 4 ++++ interface/src/AndroidHelper.h | 3 +++ interface/src/Application.cpp | 11 ++++++++++ interface/src/Application.h | 2 ++ scripts/system/+android/goto.js | 2 +- 8 files changed, 42 insertions(+), 13 deletions(-) diff --git a/android/app/src/main/cpp/native.cpp b/android/app/src/main/cpp/native.cpp index 96c4356d32..aac55adf41 100644 --- a/android/app/src/main/cpp/native.cpp +++ b/android/app/src/main/cpp/native.cpp @@ -139,10 +139,6 @@ void unpackAndroidAssets() { } } -void openGotoActivity(const QString& a) { - __activity.callMethod("openGotoActivity", "()V"); -} - extern "C" { JNIEXPORT void Java_io_highfidelity_hifiinterface_InterfaceActivity_nativeOnCreate(JNIEnv* env, jobject obj, jobject instance, jobject asset_mgr) { @@ -154,7 +150,8 @@ JNIEXPORT void Java_io_highfidelity_hifiinterface_InterfaceActivity_nativeOnCrea qInstallMessageHandler(oldMessageHandler); QObject::connect(&AndroidHelper::instance(), &AndroidHelper::androidActivityRequested, [](const QString& a) { - __activity.callMethod("openGotoActivity", "()V"); + QAndroidJniObject string = QAndroidJniObject::fromString(a); + __activity.callMethod("openGotoActivity", "(Ljava/lang/String;)V", string.object()); }); } @@ -181,6 +178,8 @@ JNIEXPORT void Java_io_highfidelity_hifiinterface_InterfaceActivity_nativeOnExit qDebug() << "nativeOnCreate On thread " << QThread::currentThreadId(); } +JNIEXPORT void Java_io_highfidelity_hifiinterface_InterfaceActivity_nativeGoBackFromAndroidActivity(JNIEnv *env, jobject instance) { + AndroidHelper::instance().goBackFromAndroidActivity(); } - +} diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/GotoActivity.java b/android/app/src/main/java/io/highfidelity/hifiinterface/GotoActivity.java index 5782837634..dc07c7b99a 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/GotoActivity.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/GotoActivity.java @@ -106,8 +106,6 @@ public class GotoActivity extends AppCompatActivity { searchTextView.setTextAppearance(R.style.SearchText); } - preloadQt(); - if (getIntent() == null || !getIntent().hasExtra(PARAM_NOT_START_INTERFACE_ACTIVITY) || !getIntent().getBooleanExtra(PARAM_NOT_START_INTERFACE_ACTIVITY, false)) { 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 0f059a3ff5..93d6725994 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/InterfaceActivity.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/InterfaceActivity.java @@ -32,6 +32,7 @@ import android.view.View; public class InterfaceActivity extends QtActivity { public static final String DOMAIN_URL = "url"; + private static final String TAG = "Interface"; //public static native void handleHifiURL(String hifiURLString); private native long nativeOnCreate(InterfaceActivity instance, AssetManager assetManager); @@ -39,6 +40,7 @@ public class InterfaceActivity extends QtActivity { //private native void nativeOnResume(); private native void nativeOnDestroy(); private native void nativeGotoUrl(String url); + private native void nativeGoBackFromAndroidActivity(); //private native void nativeOnStop(); //private native void nativeOnStart(); //private native void saveRealScreenSize(int width, int height); @@ -193,12 +195,22 @@ public class InterfaceActivity extends QtActivity { if (intent.hasExtra(DOMAIN_URL)) { nativeGotoUrl(intent.getStringExtra(DOMAIN_URL)); } + nativeGoBackFromAndroidActivity(); } - public void openGotoActivity() { - Intent intent = new Intent(this, GotoActivity.class); - intent.putExtra(GotoActivity.PARAM_NOT_START_INTERFACE_ACTIVITY, true); - startActivity(intent); + public void openGotoActivity(String activityName) { + switch (activityName) { + case "Goto": { + Intent intent = new Intent(this, GotoActivity.class); + intent.putExtra(GotoActivity.PARAM_NOT_START_INTERFACE_ACTIVITY, true); + startActivity(intent); + break; + } + default: { + Log.w(TAG, "Could not open activity by name " + activityName); + break; + } + } } } \ No newline at end of file diff --git a/interface/src/AndroidHelper.cpp b/interface/src/AndroidHelper.cpp index 9ae08314ae..b04a6ff2c4 100644 --- a/interface/src/AndroidHelper.cpp +++ b/interface/src/AndroidHelper.cpp @@ -13,4 +13,8 @@ void AndroidHelper::requestActivity(const QString &activityName) { emit androidActivityRequested(activityName); +} + +void AndroidHelper::goBackFromAndroidActivity() { + emit backFromAndroidActivity(); } \ No newline at end of file diff --git a/interface/src/AndroidHelper.h b/interface/src/AndroidHelper.h index 7e5e5a0a39..34f32b461b 100644 --- a/interface/src/AndroidHelper.h +++ b/interface/src/AndroidHelper.h @@ -22,10 +22,13 @@ public: return instance; } void requestActivity(const QString &activityName); + void goBackFromAndroidActivity(); + AndroidHelper(AndroidHelper const&) = delete; void operator=(AndroidHelper const&) = delete; signals: void androidActivityRequested(const QString &activityName); + void backFromAndroidActivity(); private: AndroidHelper() {} diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 27fe2dd4e7..3e16c3e287 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -7868,7 +7868,18 @@ void Application::saveNextPhysicsStats(QString filename) { void Application::openAndroidActivity(const QString& activityName) { #if defined(Q_OS_ANDROID) + getActiveDisplayPlugin()->deactivate(); AndroidHelper::instance().requestActivity(activityName); + connect(&AndroidHelper::instance(), &AndroidHelper::backFromAndroidActivity, this, &Application::restoreAfterAndroidActivity); +#endif +} + +void Application::restoreAfterAndroidActivity() { +#if defined(Q_OS_ANDROID) + if (!getActiveDisplayPlugin() || !getActiveDisplayPlugin()->activate()) { + qWarning() << "Could not re-activate display plugin"; + } + disconnect(&AndroidHelper::instance(), &AndroidHelper::backFromAndroidActivity, this, &Application::restoreAfterAndroidActivity); #endif } diff --git a/interface/src/Application.h b/interface/src/Application.h index ddace2a205..ab55861930 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -454,6 +454,8 @@ private slots: void handleSandboxStatus(QNetworkReply* reply); void switchDisplayMode(); + void restoreAfterAndroidActivity(); + private: static void initDisplay(); void init(); diff --git a/scripts/system/+android/goto.js b/scripts/system/+android/goto.js index 39519d8c23..540705c673 100644 --- a/scripts/system/+android/goto.js +++ b/scripts/system/+android/goto.js @@ -34,7 +34,7 @@ function fromQml(message) { // messages are {method, params}, like json-rpc. See module.exports.onHidden(); break; case 'openAndroidActivity': - App.openAndroidActivity("Hello"); + App.openAndroidActivity("Goto"); break; default: print('[goto-android.js] Unrecognized message from AddressBarDialog.qml:', JSON.stringify(message));