From dade8e9e7a439c3f4a7efb1acbc08aa68c18bba8 Mon Sep 17 00:00:00 2001 From: amerhifi Date: Thu, 7 Feb 2019 23:22:15 -0800 Subject: [PATCH 1/7] moving all the qtactivity code to OculusActivity due to lost reference when switching from MAin to Quest --- android/apps/interface/build.gradle | 2 +- .../src/main/AndroidManifest.xml | 9 +- .../questInterface/src/main/cpp/native.cpp | 124 ++++++++++++------ .../questInterface/MainActivity.java | 10 +- .../questInterface/PermissionsChecker.java | 2 +- .../questInterface/QuestActivity.java | 33 ++++- android/build.gradle | 2 +- android/libraries/oculus/build.gradle | 4 + .../oculus/OculusMobileActivity.java | 9 +- .../qt5/android/bindings/QtActivity.java | 16 +-- .../android/bindings/QtActivityLoader.java | 3 + android/settings.gradle | 12 +- 12 files changed, 150 insertions(+), 76 deletions(-) diff --git a/android/apps/interface/build.gradle b/android/apps/interface/build.gradle index 4163df03b7..4093f0ff0d 100644 --- a/android/apps/interface/build.gradle +++ b/android/apps/interface/build.gradle @@ -6,7 +6,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:3.2.1' + classpath 'com.android.tools.build:gradle:3.3.0' } } diff --git a/android/apps/questInterface/src/main/AndroidManifest.xml b/android/apps/questInterface/src/main/AndroidManifest.xml index c23f14ee15..24bd643744 100644 --- a/android/apps/questInterface/src/main/AndroidManifest.xml +++ b/android/apps/questInterface/src/main/AndroidManifest.xml @@ -28,17 +28,12 @@ android:excludeFromRecents="true"> - + - diff --git a/android/apps/questInterface/src/main/cpp/native.cpp b/android/apps/questInterface/src/main/cpp/native.cpp index b7422b3b66..02b585203d 100644 --- a/android/apps/questInterface/src/main/cpp/native.cpp +++ b/android/apps/questInterface/src/main/cpp/native.cpp @@ -22,8 +22,8 @@ #include #include -#include -#include +//#include +//#include void initOculusPlatform(JNIEnv* env, jobject obj) { static std::once_flag once; @@ -38,49 +38,89 @@ void initOculusPlatform(JNIEnv* env, jobject obj) { } extern "C" { + JNIEXPORT void JNICALL + Java_io_highfidelity_questInterface_QuestActivity_nativeInitOculusPlatform(JNIEnv *env, jobject obj){ + initOculusPlatform(env, obj); + } -JNIEXPORT void JNICALL -Java_io_highfidelity_questInterface_MainActivity_nativeInitOculusPlatform(JNIEnv* env, jobject obj) { - initOculusPlatform(env, obj); -} +QAndroidJniObject __interfaceActivity; -JNIEXPORT void JNICALL -Java_io_highfidelity_questInterface_MainActivity_nativeOnCreate(JNIEnv* env, jobject obj) { - initOculusPlatform(env, obj); - qRegisterMetaType("QAndroidJniObject"); - QObject::connect(&AndroidHelper::instance(), &AndroidHelper::qtAppLoadComplete, []() { - qWarning() << "QQQ" << __FUNCTION__ << "scheduling onAppLoadedComplete"; - AndroidHelper::instance().moveToThread(qApp->thread()); - QtAndroid::androidActivity().callMethod("onAppLoadedComplete", "()V"); - QObject::disconnect(&AndroidHelper::instance(), &AndroidHelper::qtAppLoadComplete, nullptr, nullptr); - }); -} + JNIEXPORT void JNICALL + Java_io_highfidelity_questInterface_QuestActivity_nativeOnCreate(JNIEnv *env, jobject obj) { + initOculusPlatform(env, obj); + __interfaceActivity = QAndroidJniObject(obj); -JNIEXPORT void JNICALL -Java_io_highfidelity_questInterface_MainActivity_nativeOnDestroy(JNIEnv* env, jobject obj) { -} + if(qApp) { + QThread *thr = qApp->thread(); + } -JNIEXPORT void JNICALL -Java_io_highfidelity_questInterface_SplashActivity_registerLoadCompleteListener(JNIEnv *env, - jobject instance) { - -} - -JNIEXPORT void JNICALL -Java_io_highfidelity_questInterface_MainActivity_nativeOnPause(JNIEnv *env, jobject obj) { - AndroidHelper::instance().notifyEnterBackground(); -} - -JNIEXPORT void JNICALL -Java_io_highfidelity_questInterface_MainActivity_nativeOnResume(JNIEnv *env, jobject obj) { - AndroidHelper::instance().notifyEnterForeground(); -} - -JNIEXPORT void JNICALL -Java_io_highfidelity_questInterface_receiver_HeadsetStateReceiver_notifyHeadsetOn(JNIEnv *env, - jobject instance, - jboolean pluggedIn) { - AndroidHelper::instance().notifyHeadsetOn(pluggedIn); -} + AndroidHelper::instance().moveToThread(thr); + + + qRegisterMetaType("QAndroidJniObject"); + + JavaVM* jvm; + env->GetJavaVM(&jvm); + + 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 + jvmArgs.name = NULL; // you might want to give the java thread a name + jvmArgs.group = NULL; // you might want to assign the java thread to a ThreadGroup + + int attachedHere = 0; // know if detaching at the end is necessary + jint res = jvm->GetEnv((void**)&myNewEnv, JNI_VERSION_1_6); // checks if current env needs attaching or it is already attached + if (JNI_OK != res) { + qDebug() << "[JCRASH] GetEnv env not attached yet, attaching now.."; + res = jvm->AttachCurrentThread(reinterpret_cast(&myNewEnv), &jvmArgs); + if (JNI_OK != res) { + qDebug() << "[JCRASH] Failed to AttachCurrentThread, ErrorCode = " << res; + return; + } else { + attachedHere = 1; + } + } + + QAndroidJniObject string = QAndroidJniObject::fromString(a); + jboolean jBackToScene = (jboolean) backToScene; + jclass hashMapClass = myNewEnv->FindClass("java/util/HashMap"); + 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;"); + 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) { + jvm->DetachCurrentThread(); + } + }); + + } + + JNIEXPORT void JNICALL + Java_io_highfidelity_questInterface_QuestActivity_nativeOnDestroy(JNIEnv *env, jobject obj) { + } + + JNIEXPORT void JNICALL + Java_io_highfidelity_questInterface_QuestActivity_nativeOnPause(JNIEnv *env, jobject obj) { + AndroidHelper::instance().notifyEnterBackground(); + } + + JNIEXPORT void JNICALL + Java_io_highfidelity_questInterface_QuestActivity_nativeOnResume(JNIEnv *env, jobject obj) { + AndroidHelper::instance().notifyEnterForeground(); + } + + JNIEXPORT void JNICALL + Java_io_highfidelity_questInterface_receiver_HeadsetStateReceiver_notifyHeadsetOn(JNIEnv *env, + jobject instance, + jboolean pluggedIn) { + AndroidHelper::instance().notifyHeadsetOn(pluggedIn); + } } diff --git a/android/apps/questInterface/src/main/java/io/highfidelity/questInterface/MainActivity.java b/android/apps/questInterface/src/main/java/io/highfidelity/questInterface/MainActivity.java index ce75c54f12..93aafa042b 100644 --- a/android/apps/questInterface/src/main/java/io/highfidelity/questInterface/MainActivity.java +++ b/android/apps/questInterface/src/main/java/io/highfidelity/questInterface/MainActivity.java @@ -11,6 +11,8 @@ package io.highfidelity.questInterface; +import android.app.Activity; +import android.app.Application; import android.content.Intent; import android.os.Bundle; import android.util.Log; @@ -29,10 +31,9 @@ public class MainActivity extends QtActivity { private native void nativeOnPause(); private native void nativeOnResume(); + private boolean isLoading; @Override public void onCreate(Bundle savedInstanceState) { - super.isLoading = true; - super.keepInterfaceRunning = true; super.onCreate(savedInstanceState); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); HifiUtils.upackAssets(getAssets(), getCacheDir().getAbsolutePath()); @@ -41,6 +42,7 @@ public class MainActivity extends QtActivity { public void onAppLoadedComplete() { + Log.w("QQQ", "Returning to quest activity"); runOnUiThread(()->{ startActivity(new Intent(MainActivity.this, QuestActivity.class)); @@ -51,9 +53,9 @@ public class MainActivity extends QtActivity { @Override protected void onPause() { super.onPause(); - if (!super.isLoading) { + nativeOnPause(); - } + } @Override diff --git a/android/apps/questInterface/src/main/java/io/highfidelity/questInterface/PermissionsChecker.java b/android/apps/questInterface/src/main/java/io/highfidelity/questInterface/PermissionsChecker.java index 91b5bdcdae..7d8ce383dc 100644 --- a/android/apps/questInterface/src/main/java/io/highfidelity/questInterface/PermissionsChecker.java +++ b/android/apps/questInterface/src/main/java/io/highfidelity/questInterface/PermissionsChecker.java @@ -45,7 +45,7 @@ public class PermissionsChecker extends Activity { private void launchActivityWithPermissions() { startActivity(new Intent(this, QuestActivity.class)); - finish(); + } @Override diff --git a/android/apps/questInterface/src/main/java/io/highfidelity/questInterface/QuestActivity.java b/android/apps/questInterface/src/main/java/io/highfidelity/questInterface/QuestActivity.java index 6887140de5..a7aa93dbb9 100644 --- a/android/apps/questInterface/src/main/java/io/highfidelity/questInterface/QuestActivity.java +++ b/android/apps/questInterface/src/main/java/io/highfidelity/questInterface/QuestActivity.java @@ -13,13 +13,44 @@ package io.highfidelity.questInterface; import android.content.Intent; import android.os.Bundle; +import android.view.WindowManager; import io.highfidelity.oculus.OculusMobileActivity; +import io.highfidelity.utils.HifiUtils; public class QuestActivity extends OculusMobileActivity { + private native void nativeOnCreate(); + private native void nativeOnDestroy(); + private native void nativeOnPause(); + private native void nativeOnResume(); + + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - startActivity(new Intent(this, MainActivity.class)); + getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + HifiUtils.upackAssets(getAssets(), getCacheDir().getAbsolutePath()); + nativeOnCreate(); } + + + @Override + protected void onPause() { + super.onPause(); + nativeOnPause(); + + } + + @Override + protected void onResume() { + super.onResume(); + nativeOnResume(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + nativeOnDestroy(); + } + } diff --git a/android/build.gradle b/android/build.gradle index 4affdf65cd..eebe7bdc27 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -6,7 +6,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.2.1' + classpath 'com.android.tools.build:gradle:3.3.0' } } diff --git a/android/libraries/oculus/build.gradle b/android/libraries/oculus/build.gradle index b072f99eb7..776c0c1e48 100644 --- a/android/libraries/oculus/build.gradle +++ b/android/libraries/oculus/build.gradle @@ -15,3 +15,7 @@ android { targetCompatibility JavaVersion.VERSION_1_8 } } + +dependencies { + compile project(path: ':qt') +} diff --git a/android/libraries/oculus/src/main/java/io/highfidelity/oculus/OculusMobileActivity.java b/android/libraries/oculus/src/main/java/io/highfidelity/oculus/OculusMobileActivity.java index 01d74ea94d..b06f850afc 100644 --- a/android/libraries/oculus/src/main/java/io/highfidelity/oculus/OculusMobileActivity.java +++ b/android/libraries/oculus/src/main/java/io/highfidelity/oculus/OculusMobileActivity.java @@ -16,11 +16,15 @@ import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.WindowManager; + + +import org.qtproject.qt5.android.bindings.QtActivity; + /** * Contains a native surface and forwards the activity lifecycle and surface lifecycle * events to the OculusMobileDisplayPlugin */ -public class OculusMobileActivity extends Activity implements SurfaceHolder.Callback { +public class OculusMobileActivity extends QtActivity implements SurfaceHolder.Callback { private static final String TAG = OculusMobileActivity.class.getSimpleName(); static { System.loadLibrary("oculusMobile"); } private native void nativeOnCreate(); @@ -32,7 +36,6 @@ public class OculusMobileActivity extends Activity implements SurfaceHolder.Call private SurfaceView mView; private SurfaceHolder mSurfaceHolder; - public static void launch(Activity activity) { if (activity != null) { activity.runOnUiThread(()->{ @@ -45,7 +48,9 @@ public class OculusMobileActivity extends Activity implements SurfaceHolder.Call public void onCreate(Bundle savedInstanceState) { Log.w(TAG, "QQQ onCreate"); super.onCreate(savedInstanceState); + getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + // Create a native surface for VR rendering (Qt GL surfaces are not suitable // because of the lack of fine control over the surface callbacks) mView = new SurfaceView(this); diff --git a/android/libraries/qt/src/main/java/org/qtproject/qt5/android/bindings/QtActivity.java b/android/libraries/qt/src/main/java/org/qtproject/qt5/android/bindings/QtActivity.java index 6a6688ac41..02597956e4 100644 --- a/android/libraries/qt/src/main/java/org/qtproject/qt5/android/bindings/QtActivity.java +++ b/android/libraries/qt/src/main/java/org/qtproject/qt5/android/bindings/QtActivity.java @@ -70,9 +70,6 @@ public class QtActivity extends Activity { public final String QT_ANDROID_DEFAULT_THEME = QT_ANDROID_THEMES[0]; // sets the default theme. private QtActivityLoader m_loader = new QtActivityLoader(this); - public boolean isLoading; - public boolean keepInterfaceRunning; - public QtActivity() { } @@ -229,10 +226,13 @@ public class QtActivity extends Activity { //--------------------------------------------------------------------------- protected void onCreateHook(Bundle savedInstanceState) { + m_loader.APPLICATION_PARAMETERS = APPLICATION_PARAMETERS; m_loader.ENVIRONMENT_VARIABLES = ENVIRONMENT_VARIABLES; m_loader.QT_ANDROID_THEMES = QT_ANDROID_THEMES; m_loader.QT_ANDROID_DEFAULT_THEME = QT_ANDROID_DEFAULT_THEME; + + m_loader.onCreate(savedInstanceState); } @@ -506,9 +506,7 @@ public class QtActivity extends Activity { super.onPause(); // GC: this trick allow us to show a splash activity until Qt app finishes // loading - if (!isLoading && !keepInterfaceRunning) { - QtApplication.invokeDelegate(); - } + QtApplication.invokeDelegate(); } //--------------------------------------------------------------------------- @@ -647,11 +645,7 @@ public class QtActivity extends Activity { @Override protected void onStop() { super.onStop(); - if (!keepInterfaceRunning) { - QtApplication.invokeDelegate(); - } - QtNative.terminateQt(); - QtNative.setActivity(null,null); + QtApplication.invokeDelegate(); } //--------------------------------------------------------------------------- diff --git a/android/libraries/qt/src/main/java/org/qtproject/qt5/android/bindings/QtActivityLoader.java b/android/libraries/qt/src/main/java/org/qtproject/qt5/android/bindings/QtActivityLoader.java index e3066a3bd9..5258c0fb88 100644 --- a/android/libraries/qt/src/main/java/org/qtproject/qt5/android/bindings/QtActivityLoader.java +++ b/android/libraries/qt/src/main/java/org/qtproject/qt5/android/bindings/QtActivityLoader.java @@ -79,6 +79,7 @@ public class QtActivityLoader { private static final String EXTRACT_STYLE_MINIMAL_KEY = "extract.android.style.option"; private static final int BUFFER_SIZE = 1024; + public boolean Created=false; String APPLICATION_PARAMETERS = null; // use this variable to pass any parameters to your application, String ENVIRONMENT_VARIABLES = "QT_USE_ANDROID_NATIVE_DIALOGS=1"; String[] QT_ANDROID_THEMES = null; @@ -497,6 +498,8 @@ public class QtActivityLoader { } startApp(); + + Created=true; } } } diff --git a/android/settings.gradle b/android/settings.gradle index 64eb246719..23e54b0457 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -12,8 +12,8 @@ project(':qt').projectDir = new File(settingsDir, 'libraries/qt') // Applications // -include ':interface' -project(':interface').projectDir = new File(settingsDir, 'apps/interface') +//include ':interface' +//project(':interface').projectDir = new File(settingsDir, 'apps/interface') include ':questInterface' project(':questInterface').projectDir = new File(settingsDir, 'apps/questInterface') @@ -22,8 +22,8 @@ project(':questInterface').projectDir = new File(settingsDir, 'apps/questInterfa // Test projects // -include ':framePlayer' -project(':framePlayer').projectDir = new File(settingsDir, 'apps/framePlayer') +//include ':framePlayer' +//project(':framePlayer').projectDir = new File(settingsDir, 'apps/framePlayer') -include ':questFramePlayer' -project(':questFramePlayer').projectDir = new File(settingsDir, 'apps/questFramePlayer') +//include ':questFramePlayer' +//project(':questFramePlayer').projectDir = new File(settingsDir, 'apps/questFramePlayer') From 8848d0210abdc4eb141385cb53c9ecec2753d5ea Mon Sep 17 00:00:00 2001 From: amerhifi Date: Fri, 8 Feb 2019 00:27:25 -0800 Subject: [PATCH 2/7] stuff --- .../questInterface/src/main/cpp/native.cpp | 63 +++---------------- .../questInterface/QuestActivity.java | 17 +++-- .../oculus/OculusMobileActivity.java | 14 +---- .../android/bindings/QtActivityLoader.java | 3 - 4 files changed, 19 insertions(+), 78 deletions(-) diff --git a/android/apps/questInterface/src/main/cpp/native.cpp b/android/apps/questInterface/src/main/cpp/native.cpp index 02b585203d..5a4b1ee4ad 100644 --- a/android/apps/questInterface/src/main/cpp/native.cpp +++ b/android/apps/questInterface/src/main/cpp/native.cpp @@ -43,76 +43,31 @@ extern "C" { initOculusPlatform(env, obj); } -QAndroidJniObject __interfaceActivity; - JNIEXPORT void JNICALL - Java_io_highfidelity_questInterface_QuestActivity_nativeOnCreate(JNIEnv *env, jobject obj) { + Java_io_highfidelity_questInterface_QuestActivity_questNativeOnCreate(JNIEnv *env, jobject obj) { initOculusPlatform(env, obj); - __interfaceActivity = QAndroidJniObject(obj); + if(qApp) { QThread *thr = qApp->thread(); + AndroidHelper::instance().moveToThread(thr); + } + else{ + __android_log_print(ANDROID_LOG_ERROR,"QQQ_", "APP is not valid"); } - - AndroidHelper::instance().moveToThread(thr); - - - qRegisterMetaType("QAndroidJniObject"); - - JavaVM* jvm; - env->GetJavaVM(&jvm); - - 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 - jvmArgs.name = NULL; // you might want to give the java thread a name - jvmArgs.group = NULL; // you might want to assign the java thread to a ThreadGroup - - int attachedHere = 0; // know if detaching at the end is necessary - jint res = jvm->GetEnv((void**)&myNewEnv, JNI_VERSION_1_6); // checks if current env needs attaching or it is already attached - if (JNI_OK != res) { - qDebug() << "[JCRASH] GetEnv env not attached yet, attaching now.."; - res = jvm->AttachCurrentThread(reinterpret_cast(&myNewEnv), &jvmArgs); - if (JNI_OK != res) { - qDebug() << "[JCRASH] Failed to AttachCurrentThread, ErrorCode = " << res; - return; - } else { - attachedHere = 1; - } - } - - QAndroidJniObject string = QAndroidJniObject::fromString(a); - jboolean jBackToScene = (jboolean) backToScene; - jclass hashMapClass = myNewEnv->FindClass("java/util/HashMap"); - 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;"); - 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) { - jvm->DetachCurrentThread(); - } - }); - } JNIEXPORT void JNICALL - Java_io_highfidelity_questInterface_QuestActivity_nativeOnDestroy(JNIEnv *env, jobject obj) { + Java_io_highfidelity_questInterface_QuestActivity_questNativeOnDestroy(JNIEnv *env, jobject obj) { } JNIEXPORT void JNICALL - Java_io_highfidelity_questInterface_QuestActivity_nativeOnPause(JNIEnv *env, jobject obj) { + Java_io_highfidelity_questInterface_QuestActivity_questNativeOnPause(JNIEnv *env, jobject obj) { AndroidHelper::instance().notifyEnterBackground(); } JNIEXPORT void JNICALL - Java_io_highfidelity_questInterface_QuestActivity_nativeOnResume(JNIEnv *env, jobject obj) { + Java_io_highfidelity_questInterface_QuestActivity_questNativeOnResume(JNIEnv *env, jobject obj) { AndroidHelper::instance().notifyEnterForeground(); } diff --git a/android/apps/questInterface/src/main/java/io/highfidelity/questInterface/QuestActivity.java b/android/apps/questInterface/src/main/java/io/highfidelity/questInterface/QuestActivity.java index a7aa93dbb9..a482e98a24 100644 --- a/android/apps/questInterface/src/main/java/io/highfidelity/questInterface/QuestActivity.java +++ b/android/apps/questInterface/src/main/java/io/highfidelity/questInterface/QuestActivity.java @@ -19,38 +19,37 @@ import io.highfidelity.oculus.OculusMobileActivity; import io.highfidelity.utils.HifiUtils; public class QuestActivity extends OculusMobileActivity { - private native void nativeOnCreate(); - private native void nativeOnDestroy(); - private native void nativeOnPause(); - private native void nativeOnResume(); - + private native void questNativeOnCreate(); + private native void questNativeOnDestroy(); + private native void questNativeOnPause(); + private native void questNativeOnResume(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); HifiUtils.upackAssets(getAssets(), getCacheDir().getAbsolutePath()); - nativeOnCreate(); + questNativeOnCreate(); } @Override protected void onPause() { super.onPause(); - nativeOnPause(); + questNativeOnPause(); } @Override protected void onResume() { super.onResume(); - nativeOnResume(); + questNativeOnResume(); } @Override protected void onDestroy() { super.onDestroy(); - nativeOnDestroy(); + questNativeOnDestroy(); } } diff --git a/android/libraries/oculus/src/main/java/io/highfidelity/oculus/OculusMobileActivity.java b/android/libraries/oculus/src/main/java/io/highfidelity/oculus/OculusMobileActivity.java index b06f850afc..0a39e3abf0 100644 --- a/android/libraries/oculus/src/main/java/io/highfidelity/oculus/OculusMobileActivity.java +++ b/android/libraries/oculus/src/main/java/io/highfidelity/oculus/OculusMobileActivity.java @@ -36,29 +36,19 @@ public class OculusMobileActivity extends QtActivity implements SurfaceHolder.Ca private SurfaceView mView; private SurfaceHolder mSurfaceHolder; - public static void launch(Activity activity) { - if (activity != null) { - activity.runOnUiThread(()->{ - activity.startActivity(new Intent(activity, OculusMobileActivity.class)); - }); - } - } - @Override public void onCreate(Bundle savedInstanceState) { Log.w(TAG, "QQQ onCreate"); super.onCreate(savedInstanceState); - getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); - // Create a native surface for VR rendering (Qt GL surfaces are not suitable // because of the lack of fine control over the surface callbacks) mView = new SurfaceView(this); - setContentView(mView); mView.getHolder().addCallback(this); - + setContentView(mView); // Forward the create message to the JNI code nativeOnCreate(); + } @Override diff --git a/android/libraries/qt/src/main/java/org/qtproject/qt5/android/bindings/QtActivityLoader.java b/android/libraries/qt/src/main/java/org/qtproject/qt5/android/bindings/QtActivityLoader.java index 5258c0fb88..e3066a3bd9 100644 --- a/android/libraries/qt/src/main/java/org/qtproject/qt5/android/bindings/QtActivityLoader.java +++ b/android/libraries/qt/src/main/java/org/qtproject/qt5/android/bindings/QtActivityLoader.java @@ -79,7 +79,6 @@ public class QtActivityLoader { private static final String EXTRACT_STYLE_MINIMAL_KEY = "extract.android.style.option"; private static final int BUFFER_SIZE = 1024; - public boolean Created=false; String APPLICATION_PARAMETERS = null; // use this variable to pass any parameters to your application, String ENVIRONMENT_VARIABLES = "QT_USE_ANDROID_NATIVE_DIALOGS=1"; String[] QT_ANDROID_THEMES = null; @@ -498,8 +497,6 @@ public class QtActivityLoader { } startApp(); - - Created=true; } } } From e8a35c63c75b4c04c99540f89555993e07a2a0d5 Mon Sep 17 00:00:00 2001 From: amerhifi Date: Fri, 8 Feb 2019 13:45:53 -0800 Subject: [PATCH 3/7] moved asset loading to the permissions screen, added the onNotifyAppLoaded signal connect function as well as binding to the qtread with the ui thread. --- .../hifiinterface/MainActivity.java | 1 + .../questInterface/src/main/cpp/native.cpp | 26 +++++++++++++------ .../questInterface/PermissionsChecker.java | 3 +++ .../questInterface/QuestActivity.java | 12 ++++++--- .../oculus/OculusMobileActivity.java | 4 +-- interface/src/Application.cpp | 1 + 6 files changed, 34 insertions(+), 13 deletions(-) diff --git a/android/apps/interface/src/main/java/io/highfidelity/hifiinterface/MainActivity.java b/android/apps/interface/src/main/java/io/highfidelity/hifiinterface/MainActivity.java index e5ea0f998d..239dc96523 100644 --- a/android/apps/interface/src/main/java/io/highfidelity/hifiinterface/MainActivity.java +++ b/android/apps/interface/src/main/java/io/highfidelity/hifiinterface/MainActivity.java @@ -1,3 +1,4 @@ + package io.highfidelity.hifiinterface; import android.app.Activity; diff --git a/android/apps/questInterface/src/main/cpp/native.cpp b/android/apps/questInterface/src/main/cpp/native.cpp index 5a4b1ee4ad..047ec2007c 100644 --- a/android/apps/questInterface/src/main/cpp/native.cpp +++ b/android/apps/questInterface/src/main/cpp/native.cpp @@ -42,21 +42,31 @@ extern "C" { Java_io_highfidelity_questInterface_QuestActivity_nativeInitOculusPlatform(JNIEnv *env, jobject obj){ initOculusPlatform(env, obj); } - +QAndroidJniObject __interfaceActivity; JNIEXPORT void JNICALL Java_io_highfidelity_questInterface_QuestActivity_questNativeOnCreate(JNIEnv *env, jobject obj) { + __android_log_print(ANDROID_LOG_WARN, "QQQ","questNativeOnCreate called"); initOculusPlatform(env, obj); + __interfaceActivity = QAndroidJniObject (obj); + QObject::connect(&AndroidHelper::instance(), &AndroidHelper::qtAppLoadComplete, []() { - if(qApp) { - QThread *thr = qApp->thread(); - AndroidHelper::instance().moveToThread(thr); - } - else{ - __android_log_print(ANDROID_LOG_ERROR,"QQQ_", "APP is not valid"); - } + QObject::connect(&AndroidHelper::instance(), &AndroidHelper::qtAppLoadComplete, []() { + __interfaceActivity.callMethod("onAppLoadedComplete", "()V"); + + QObject::disconnect(&AndroidHelper::instance(), &AndroidHelper::qtAppLoadComplete, nullptr, + nullptr); + }); + + QObject::disconnect(&AndroidHelper::instance(), &AndroidHelper::qtAppLoadComplete, + nullptr, nullptr); + }); } +JNIEXPORT void Java_io_highfidelity_questInterface_QuestActivity_questOnAppAfterLoad(JNIEnv* env, jobject obj) { + AndroidHelper::instance().moveToThread(qApp->thread()); +} + JNIEXPORT void JNICALL Java_io_highfidelity_questInterface_QuestActivity_questNativeOnDestroy(JNIEnv *env, jobject obj) { } diff --git a/android/apps/questInterface/src/main/java/io/highfidelity/questInterface/PermissionsChecker.java b/android/apps/questInterface/src/main/java/io/highfidelity/questInterface/PermissionsChecker.java index 7d8ce383dc..10a0faf9cc 100644 --- a/android/apps/questInterface/src/main/java/io/highfidelity/questInterface/PermissionsChecker.java +++ b/android/apps/questInterface/src/main/java/io/highfidelity/questInterface/PermissionsChecker.java @@ -6,6 +6,8 @@ import android.content.Intent; import android.content.pm.PackageManager; import android.os.Bundle; +import io.highfidelity.utils.HifiUtils; + public class PermissionsChecker extends Activity { private static final int REQUEST_PERMISSIONS = 20; private static final String TAG = PermissionsChecker.class.getName(); @@ -44,6 +46,7 @@ public class PermissionsChecker extends Activity { } private void launchActivityWithPermissions() { + HifiUtils.upackAssets(getAssets(), getCacheDir().getAbsolutePath()); startActivity(new Intent(this, QuestActivity.class)); } diff --git a/android/apps/questInterface/src/main/java/io/highfidelity/questInterface/QuestActivity.java b/android/apps/questInterface/src/main/java/io/highfidelity/questInterface/QuestActivity.java index a482e98a24..6c8072498b 100644 --- a/android/apps/questInterface/src/main/java/io/highfidelity/questInterface/QuestActivity.java +++ b/android/apps/questInterface/src/main/java/io/highfidelity/questInterface/QuestActivity.java @@ -13,6 +13,7 @@ package io.highfidelity.questInterface; import android.content.Intent; import android.os.Bundle; +import android.util.Log; import android.view.WindowManager; import io.highfidelity.oculus.OculusMobileActivity; @@ -23,15 +24,20 @@ public class QuestActivity extends OculusMobileActivity { private native void questNativeOnDestroy(); private native void questNativeOnPause(); private native void questNativeOnResume(); - + private native void questOnAppAfterLoad(); + String TAG = OculusMobileActivity.class.getSimpleName(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); - HifiUtils.upackAssets(getAssets(), getCacheDir().getAbsolutePath()); questNativeOnCreate(); } + public void onAppLoadedComplete() { + Log.w(TAG, "QQQ Load Completed"); + runOnUiThread(() -> { + questOnAppAfterLoad(); + }); + } @Override protected void onPause() { diff --git a/android/libraries/oculus/src/main/java/io/highfidelity/oculus/OculusMobileActivity.java b/android/libraries/oculus/src/main/java/io/highfidelity/oculus/OculusMobileActivity.java index 0a39e3abf0..a14057e57f 100644 --- a/android/libraries/oculus/src/main/java/io/highfidelity/oculus/OculusMobileActivity.java +++ b/android/libraries/oculus/src/main/java/io/highfidelity/oculus/OculusMobileActivity.java @@ -44,11 +44,11 @@ public class OculusMobileActivity extends QtActivity implements SurfaceHolder.Ca // Create a native surface for VR rendering (Qt GL surfaces are not suitable // because of the lack of fine control over the surface callbacks) mView = new SurfaceView(this); + mView.getHolder().addCallback(this); setContentView(mView); - // Forward the create message to the JNI code nativeOnCreate(); - + // Forward the create message to the JNI code } @Override diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index d9eae20752..62c65ee940 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2428,6 +2428,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo connect(&AndroidHelper::instance(), &AndroidHelper::enterForeground, this, &Application::enterForeground); AndroidHelper::instance().notifyLoadComplete(); #endif + AndroidHelper::instance().notifyLoadComplete(); pauseUntilLoginDetermined(); } From e6366eaf025aeadef213d078a2e847031337ac30 Mon Sep 17 00:00:00 2001 From: amerhifi Date: Mon, 11 Feb 2019 09:46:06 -0800 Subject: [PATCH 4/7] consolidated the OculusAcitivity into OCulusMobilieAcitivity to reduce amount of back and forth between super and base as well as remove reduntant calls to native. Moved setcontentView on the native callback becuase it was blocking QtActivity from finishing its initialization --- .../src/main/AndroidManifest.xml | 2 +- .../questInterface/src/main/cpp/native.cpp | 53 +++++++++++----- .../questInterface/PermissionsChecker.java | 6 +- .../questInterface/QuestActivity.java | 17 ++++- .../oculus/OculusMobileActivity.java | 62 +++++++++++++++---- libraries/oculusMobile/src/ovr/VrHandler.cpp | 19 ++++++ 6 files changed, 124 insertions(+), 35 deletions(-) diff --git a/android/apps/questInterface/src/main/AndroidManifest.xml b/android/apps/questInterface/src/main/AndroidManifest.xml index 24bd643744..f3d06e0c13 100644 --- a/android/apps/questInterface/src/main/AndroidManifest.xml +++ b/android/apps/questInterface/src/main/AndroidManifest.xml @@ -33,7 +33,7 @@ diff --git a/android/apps/questInterface/src/main/cpp/native.cpp b/android/apps/questInterface/src/main/cpp/native.cpp index 047ec2007c..9864273158 100644 --- a/android/apps/questInterface/src/main/cpp/native.cpp +++ b/android/apps/questInterface/src/main/cpp/native.cpp @@ -37,47 +37,66 @@ void initOculusPlatform(JNIEnv* env, jobject obj) { }); } +void getClassName(JNIEnv *env, jobject obj){ + jclass cls = env->GetObjectClass(obj); + jmethodID mid = env->GetMethodID(cls,"getClass", "()Ljava/lang/Class;"); + jobject clsObj = env->CallObjectMethod(obj, mid); + + cls= env->GetObjectClass(clsObj); + + mid= env->GetMethodID(cls, "getName", "()Ljava/lang/String;"); + + jstring strObj = (jstring) env->CallObjectMethod(clsObj, mid); + + const char* str = env->GetStringUTFChars(strObj, NULL); + + __android_log_print(ANDROID_LOG_ERROR,__FUNCTION__, "Native Class call: %s",str); + + env->ReleaseStringUTFChars(strObj, str); +} + + extern "C" { JNIEXPORT void JNICALL - Java_io_highfidelity_questInterface_QuestActivity_nativeInitOculusPlatform(JNIEnv *env, jobject obj){ + Java_io_highfidelity_oculus_OculusMobileActivity_nativeInitOculusPlatform(JNIEnv *env, jobject obj){ initOculusPlatform(env, obj); } QAndroidJniObject __interfaceActivity; JNIEXPORT void JNICALL - Java_io_highfidelity_questInterface_QuestActivity_questNativeOnCreate(JNIEnv *env, jobject obj) { - __android_log_print(ANDROID_LOG_WARN, "QQQ","questNativeOnCreate called"); + Java_io_highfidelity_oculus_OculusMobileActivity_questNativeOnCreate(JNIEnv *env, jobject obj) { + __android_log_print(ANDROID_LOG_INFO, "QQQ", __FUNCTION__); initOculusPlatform(env, obj); - __interfaceActivity = QAndroidJniObject (obj); + getClassName(env, obj); + + qRegisterMetaType("QAndroidJniObject"); + __interfaceActivity = QAndroidJniObject(obj); + QObject::connect(&AndroidHelper::instance(), &AndroidHelper::qtAppLoadComplete, []() { - - - QObject::connect(&AndroidHelper::instance(), &AndroidHelper::qtAppLoadComplete, []() { - __interfaceActivity.callMethod("onAppLoadedComplete", "()V"); - - QObject::disconnect(&AndroidHelper::instance(), &AndroidHelper::qtAppLoadComplete, nullptr, - nullptr); - }); + __interfaceActivity.callMethod("onAppLoadedComplete", "()V"); QObject::disconnect(&AndroidHelper::instance(), &AndroidHelper::qtAppLoadComplete, - nullptr, nullptr); + nullptr, + nullptr); }); } -JNIEXPORT void Java_io_highfidelity_questInterface_QuestActivity_questOnAppAfterLoad(JNIEnv* env, jobject obj) { + + +JNIEXPORT void Java_io_highfidelity_oculus_OculusMobileActivity_questOnAppAfterLoad(JNIEnv* env, jobject obj) { AndroidHelper::instance().moveToThread(qApp->thread()); } JNIEXPORT void JNICALL - Java_io_highfidelity_questInterface_QuestActivity_questNativeOnDestroy(JNIEnv *env, jobject obj) { + Java_io_highfidelity_oculus_OculusMobileActivity_questNativeOnDestroy(JNIEnv *env, jobject obj) { } JNIEXPORT void JNICALL - Java_io_highfidelity_questInterface_QuestActivity_questNativeOnPause(JNIEnv *env, jobject obj) { + Java_io_highfidelity_oculus_OculusMobileActivity_questNativeOnPause(JNIEnv *env, jobject obj) { AndroidHelper::instance().notifyEnterBackground(); } JNIEXPORT void JNICALL - Java_io_highfidelity_questInterface_QuestActivity_questNativeOnResume(JNIEnv *env, jobject obj) { + Java_io_highfidelity_oculus_OculusMobileActivity_questNativeOnResume(JNIEnv *env, jobject obj) { AndroidHelper::instance().notifyEnterForeground(); } diff --git a/android/apps/questInterface/src/main/java/io/highfidelity/questInterface/PermissionsChecker.java b/android/apps/questInterface/src/main/java/io/highfidelity/questInterface/PermissionsChecker.java index 10a0faf9cc..72fc4b5182 100644 --- a/android/apps/questInterface/src/main/java/io/highfidelity/questInterface/PermissionsChecker.java +++ b/android/apps/questInterface/src/main/java/io/highfidelity/questInterface/PermissionsChecker.java @@ -6,6 +6,7 @@ import android.content.Intent; import android.content.pm.PackageManager; import android.os.Bundle; +import io.highfidelity.oculus.OculusMobileActivity; import io.highfidelity.utils.HifiUtils; public class PermissionsChecker extends Activity { @@ -46,9 +47,8 @@ public class PermissionsChecker extends Activity { } private void launchActivityWithPermissions() { - HifiUtils.upackAssets(getAssets(), getCacheDir().getAbsolutePath()); - startActivity(new Intent(this, QuestActivity.class)); - + startActivity(new Intent(this, OculusMobileActivity.class)); + finish(); } @Override diff --git a/android/apps/questInterface/src/main/java/io/highfidelity/questInterface/QuestActivity.java b/android/apps/questInterface/src/main/java/io/highfidelity/questInterface/QuestActivity.java index 6c8072498b..9e2ace3bd3 100644 --- a/android/apps/questInterface/src/main/java/io/highfidelity/questInterface/QuestActivity.java +++ b/android/apps/questInterface/src/main/java/io/highfidelity/questInterface/QuestActivity.java @@ -14,6 +14,7 @@ package io.highfidelity.questInterface; import android.content.Intent; import android.os.Bundle; import android.util.Log; +import android.view.SurfaceView; import android.view.WindowManager; import io.highfidelity.oculus.OculusMobileActivity; @@ -25,15 +26,22 @@ public class QuestActivity extends OculusMobileActivity { private native void questNativeOnPause(); private native void questNativeOnResume(); private native void questOnAppAfterLoad(); + + private boolean isLoading=false; String TAG = OculusMobileActivity.class.getSimpleName(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + + HifiUtils.upackAssets(getAssets(), getCacheDir().getAbsolutePath()); + isLoading=true; questNativeOnCreate(); + } public void onAppLoadedComplete() { Log.w(TAG, "QQQ Load Completed"); + isLoading=false; runOnUiThread(() -> { questOnAppAfterLoad(); }); @@ -42,20 +50,25 @@ public class QuestActivity extends OculusMobileActivity { @Override protected void onPause() { super.onPause(); - questNativeOnPause(); + + Log.w(TAG, "OnPause"); + if(!isLoading){ + questNativeOnPause(); + } } @Override protected void onResume() { super.onResume(); + Log.w(TAG, "OnResume"); questNativeOnResume(); } @Override protected void onDestroy() { super.onDestroy(); + Log.w(TAG, "OnDestroy"); questNativeOnDestroy(); } - } diff --git a/android/libraries/oculus/src/main/java/io/highfidelity/oculus/OculusMobileActivity.java b/android/libraries/oculus/src/main/java/io/highfidelity/oculus/OculusMobileActivity.java index a14057e57f..f1aa42c22c 100644 --- a/android/libraries/oculus/src/main/java/io/highfidelity/oculus/OculusMobileActivity.java +++ b/android/libraries/oculus/src/main/java/io/highfidelity/oculus/OculusMobileActivity.java @@ -10,16 +10,20 @@ package io.highfidelity.oculus; import android.app.Activity; import android.content.Intent; import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; import android.util.Log; import android.view.Surface; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.WindowManager; - +import android.widget.LinearLayout; import org.qtproject.qt5.android.bindings.QtActivity; +import io.highfidelity.utils.HifiUtils; + /** * Contains a native surface and forwards the activity lifecycle and surface lifecycle * events to the OculusMobileDisplayPlugin @@ -27,52 +31,86 @@ import org.qtproject.qt5.android.bindings.QtActivity; public class OculusMobileActivity extends QtActivity implements SurfaceHolder.Callback { private static final String TAG = OculusMobileActivity.class.getSimpleName(); static { System.loadLibrary("oculusMobile"); } + private native void nativeOnCreate(); private native static void nativeOnResume(); private native static void nativeOnPause(); private native static void nativeOnDestroy(); private native static void nativeOnSurfaceChanged(Surface s); + private native void questNativeOnCreate(); + private native void questNativeOnDestroy(); + private native void questNativeOnPause(); + private native void questNativeOnResume(); + private native void questOnAppAfterLoad(); + + private SurfaceView mView; private SurfaceHolder mSurfaceHolder; - @Override - public void onCreate(Bundle savedInstanceState) { - Log.w(TAG, "QQQ onCreate"); - super.onCreate(savedInstanceState); + boolean isLoading =false; + public void onCreate(Bundle savedInstanceState) { + isLoading=true; + super.onCreate(savedInstanceState); + HifiUtils.upackAssets(getAssets(), getCacheDir().getAbsolutePath()); + + Log.w(TAG, "QQQ onCreate"); // Create a native surface for VR rendering (Qt GL surfaces are not suitable // because of the lack of fine control over the surface callbacks) - mView = new SurfaceView(this); - - mView.getHolder().addCallback(this); - setContentView(mView); - nativeOnCreate(); // Forward the create message to the JNI code + mView = new SurfaceView(this); + mView.getHolder().addCallback(this); + + // mainHandler=new Handler(Looper.getMainLooper()); + + nativeOnCreate(); + questNativeOnCreate(); + } + + + // public static void runOnMainThread(Runnable run){ + // mainHandler.post(run); + // } + + public void onAppLoadedComplete() { + Log.w(TAG, "QQQ Load Completed"); + isLoading=false; + + //isLoading=false; + runOnUiThread(() -> { + setContentView(mView); + questOnAppAfterLoad(); + }); } @Override protected void onDestroy() { Log.w(TAG, "QQQ onDestroy"); + super.onDestroy(); + if (mSurfaceHolder != null) { nativeOnSurfaceChanged(null); } nativeOnDestroy(); - super.onDestroy(); + questNativeOnDestroy(); } @Override protected void onResume() { Log.w(TAG, "QQQ onResume"); super.onResume(); + nativeOnResume(); + questNativeOnResume(); } @Override protected void onPause() { Log.w(TAG, "QQQ onPause"); - nativeOnPause(); super.onPause(); + nativeOnPause(); + questNativeOnPause(); } @Override diff --git a/libraries/oculusMobile/src/ovr/VrHandler.cpp b/libraries/oculusMobile/src/ovr/VrHandler.cpp index de2b4e1ff6..c6329c62a6 100644 --- a/libraries/oculusMobile/src/ovr/VrHandler.cpp +++ b/libraries/oculusMobile/src/ovr/VrHandler.cpp @@ -27,6 +27,25 @@ using namespace ovr; static thread_local bool isRenderThread { false }; +static void getClassName(JNIEnv *env, jobject obj){ + jclass cls = env->GetObjectClass(obj); + jmethodID mid = env->GetMethodID(cls,"getClass", "()Ljava/lang/Class;"); + jobject clsObj = env->CallObjectMethod(obj, mid); + + cls= env->GetObjectClass(clsObj); + + mid= env->GetMethodID(cls, "getName", "()Ljava/lang/String;"); + + jstring strObj = (jstring) env->CallObjectMethod(clsObj, mid); + + const char* str = env->GetStringUTFChars(strObj, NULL); + + __android_log_print(ANDROID_LOG_ERROR,__FUNCTION__, "VRHandler class: %s",str); + + env->ReleaseStringUTFChars(strObj, str); + +} + struct VrSurface : public TaskQueue { using HandlerTask = VrHandler::HandlerTask; From ef655cd243dcc44014c7cb0e70b9880c7876dc7d Mon Sep 17 00:00:00 2001 From: amerhifi Date: Mon, 11 Feb 2019 10:38:10 -0800 Subject: [PATCH 5/7] removed junk --- .../oculus/OculusMobileActivity.java | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/android/libraries/oculus/src/main/java/io/highfidelity/oculus/OculusMobileActivity.java b/android/libraries/oculus/src/main/java/io/highfidelity/oculus/OculusMobileActivity.java index f1aa42c22c..197c8a8da2 100644 --- a/android/libraries/oculus/src/main/java/io/highfidelity/oculus/OculusMobileActivity.java +++ b/android/libraries/oculus/src/main/java/io/highfidelity/oculus/OculusMobileActivity.java @@ -62,17 +62,10 @@ public class OculusMobileActivity extends QtActivity implements SurfaceHolder.Ca mView = new SurfaceView(this); mView.getHolder().addCallback(this); - // mainHandler=new Handler(Looper.getMainLooper()); - nativeOnCreate(); questNativeOnCreate(); } - - // public static void runOnMainThread(Runnable run){ - // mainHandler.post(run); - // } - public void onAppLoadedComplete() { Log.w(TAG, "QQQ Load Completed"); isLoading=false; @@ -101,16 +94,20 @@ public class OculusMobileActivity extends QtActivity implements SurfaceHolder.Ca Log.w(TAG, "QQQ onResume"); super.onResume(); - nativeOnResume(); questNativeOnResume(); + nativeOnResume(); + } @Override protected void onPause() { Log.w(TAG, "QQQ onPause"); super.onPause(); - nativeOnPause(); - questNativeOnPause(); + + if (!isLoading) { + questNativeOnPause(); + nativeOnPause(); + } } @Override From 68b3ae989f0340ca2d1bf7148a6cce6880aca4d9 Mon Sep 17 00:00:00 2001 From: amerhifi Date: Mon, 11 Feb 2019 14:24:51 -0800 Subject: [PATCH 6/7] removed unused activities. Fixed null refference pointer to activity.getApplicationContext() error on restart --- .../questInterface/src/main/cpp/native.cpp | 1 - .../questInterface/MainActivity.java | 72 ------------------ .../questInterface/QuestActivity.java | 74 ------------------- .../oculus/OculusMobileActivity.java | 12 ++- 4 files changed, 9 insertions(+), 150 deletions(-) delete mode 100644 android/apps/questInterface/src/main/java/io/highfidelity/questInterface/MainActivity.java delete mode 100644 android/apps/questInterface/src/main/java/io/highfidelity/questInterface/QuestActivity.java diff --git a/android/apps/questInterface/src/main/cpp/native.cpp b/android/apps/questInterface/src/main/cpp/native.cpp index 9864273158..b9ff56bbf7 100644 --- a/android/apps/questInterface/src/main/cpp/native.cpp +++ b/android/apps/questInterface/src/main/cpp/native.cpp @@ -68,7 +68,6 @@ QAndroidJniObject __interfaceActivity; initOculusPlatform(env, obj); getClassName(env, obj); - qRegisterMetaType("QAndroidJniObject"); __interfaceActivity = QAndroidJniObject(obj); QObject::connect(&AndroidHelper::instance(), &AndroidHelper::qtAppLoadComplete, []() { diff --git a/android/apps/questInterface/src/main/java/io/highfidelity/questInterface/MainActivity.java b/android/apps/questInterface/src/main/java/io/highfidelity/questInterface/MainActivity.java deleted file mode 100644 index 93aafa042b..0000000000 --- a/android/apps/questInterface/src/main/java/io/highfidelity/questInterface/MainActivity.java +++ /dev/null @@ -1,72 +0,0 @@ -// -// MainActivity.java -// android/app/src/main/java -// -// Created by Stephen Birarda on 1/26/15. -// Copyright 2015 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -package io.highfidelity.questInterface; - -import android.app.Activity; -import android.app.Application; -import android.content.Intent; -import android.os.Bundle; -import android.util.Log; -import android.view.WindowManager; - -import org.qtproject.qt5.android.bindings.QtActivity; - -import java.util.Timer; -import java.util.TimerTask; - -import io.highfidelity.utils.HifiUtils; - -public class MainActivity extends QtActivity { - private native void nativeOnCreate(); - private native void nativeOnDestroy(); - private native void nativeOnPause(); - private native void nativeOnResume(); - - private boolean isLoading; - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); - HifiUtils.upackAssets(getAssets(), getCacheDir().getAbsolutePath()); - nativeOnCreate(); - } - - - public void onAppLoadedComplete() { - - Log.w("QQQ", "Returning to quest activity"); - runOnUiThread(()->{ - startActivity(new Intent(MainActivity.this, QuestActivity.class)); - //moveTaskToBack(true); - }); - } - - @Override - protected void onPause() { - super.onPause(); - - nativeOnPause(); - - } - - @Override - protected void onResume() { - super.onResume(); - nativeOnResume(); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - nativeOnDestroy(); - } -} diff --git a/android/apps/questInterface/src/main/java/io/highfidelity/questInterface/QuestActivity.java b/android/apps/questInterface/src/main/java/io/highfidelity/questInterface/QuestActivity.java deleted file mode 100644 index 9e2ace3bd3..0000000000 --- a/android/apps/questInterface/src/main/java/io/highfidelity/questInterface/QuestActivity.java +++ /dev/null @@ -1,74 +0,0 @@ -// -// MainActivity.java -// android/app/src/main/java -// -// Created by Stephen Birarda on 1/26/15. -// Copyright 2015 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -package io.highfidelity.questInterface; - -import android.content.Intent; -import android.os.Bundle; -import android.util.Log; -import android.view.SurfaceView; -import android.view.WindowManager; - -import io.highfidelity.oculus.OculusMobileActivity; -import io.highfidelity.utils.HifiUtils; - -public class QuestActivity extends OculusMobileActivity { - private native void questNativeOnCreate(); - private native void questNativeOnDestroy(); - private native void questNativeOnPause(); - private native void questNativeOnResume(); - private native void questOnAppAfterLoad(); - - private boolean isLoading=false; - String TAG = OculusMobileActivity.class.getSimpleName(); - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - HifiUtils.upackAssets(getAssets(), getCacheDir().getAbsolutePath()); - isLoading=true; - questNativeOnCreate(); - - } - - public void onAppLoadedComplete() { - Log.w(TAG, "QQQ Load Completed"); - isLoading=false; - runOnUiThread(() -> { - questOnAppAfterLoad(); - }); - } - - @Override - protected void onPause() { - super.onPause(); - - Log.w(TAG, "OnPause"); - if(!isLoading){ - questNativeOnPause(); - } - - } - - @Override - protected void onResume() { - super.onResume(); - Log.w(TAG, "OnResume"); - questNativeOnResume(); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - Log.w(TAG, "OnDestroy"); - questNativeOnDestroy(); - } -} diff --git a/android/libraries/oculus/src/main/java/io/highfidelity/oculus/OculusMobileActivity.java b/android/libraries/oculus/src/main/java/io/highfidelity/oculus/OculusMobileActivity.java index 197c8a8da2..637600b34b 100644 --- a/android/libraries/oculus/src/main/java/io/highfidelity/oculus/OculusMobileActivity.java +++ b/android/libraries/oculus/src/main/java/io/highfidelity/oculus/OculusMobileActivity.java @@ -72,7 +72,7 @@ public class OculusMobileActivity extends QtActivity implements SurfaceHolder.Ca //isLoading=false; runOnUiThread(() -> { - setContentView(mView); + setContentView(mView); setContentView(mView); questOnAppAfterLoad(); }); } @@ -110,9 +110,15 @@ public class OculusMobileActivity extends QtActivity implements SurfaceHolder.Ca } } + @Override + protected void onRestart(){ + super.onRestart(); + nativeOnCreate(); + } + @Override public void surfaceCreated(SurfaceHolder holder) { - Log.w(TAG, "QQQ surfaceCreated"); + Log.w(TAG, "QQQ surfaceCreated ************************************"); nativeOnSurfaceChanged(holder.getSurface()); mSurfaceHolder = holder; } @@ -126,7 +132,7 @@ public class OculusMobileActivity extends QtActivity implements SurfaceHolder.Ca @Override public void surfaceDestroyed(SurfaceHolder holder) { - Log.w(TAG, "QQQ surfaceDestroyed"); + Log.w(TAG, "QQQ surfaceDestroyed ***************************************************"); nativeOnSurfaceChanged(null); mSurfaceHolder = null; } From 3cada9722c674ea1cac1715c691b3ec74371a1fb Mon Sep 17 00:00:00 2001 From: amerhifi Date: Mon, 11 Feb 2019 15:01:22 -0800 Subject: [PATCH 7/7] undoing some unfavorable changes --- android/apps/interface/build.gradle | 2 +- android/apps/questInterface/src/main/AndroidManifest.xml | 2 +- android/apps/questInterface/src/main/cpp/native.cpp | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/android/apps/interface/build.gradle b/android/apps/interface/build.gradle index 4093f0ff0d..4163df03b7 100644 --- a/android/apps/interface/build.gradle +++ b/android/apps/interface/build.gradle @@ -6,7 +6,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' + classpath 'com.android.tools.build:gradle:3.2.1' } } diff --git a/android/apps/questInterface/src/main/AndroidManifest.xml b/android/apps/questInterface/src/main/AndroidManifest.xml index f3d06e0c13..a5029382cb 100644 --- a/android/apps/questInterface/src/main/AndroidManifest.xml +++ b/android/apps/questInterface/src/main/AndroidManifest.xml @@ -28,7 +28,7 @@ android:excludeFromRecents="true"> - + #include -//#include -//#include +#include +#include void initOculusPlatform(JNIEnv* env, jobject obj) { static std::once_flag once;