From e6366eaf025aeadef213d078a2e847031337ac30 Mon Sep 17 00:00:00 2001 From: amerhifi Date: Mon, 11 Feb 2019 09:46:06 -0800 Subject: [PATCH] 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;