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

This commit is contained in:
amerhifi 2019-02-11 09:46:06 -08:00
parent e8a35c63c7
commit e6366eaf02
6 changed files with 124 additions and 35 deletions

View file

@ -33,7 +33,7 @@
</activity> </activity>
<activity <activity
android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|locale|fontScale|keyboard|keyboardHidden|navigation" android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|locale|fontScale|keyboard|keyboardHidden|navigation"
android:name=".QuestActivity" android:name="io.highfidelity.oculus.OculusMobileActivity"
android:label="@string/app_name" android:label="@string/app_name"
android:launchMode="singleTask"> android:launchMode="singleTask">
<meta-data android:name="android.app.lib_name" android:value="questInterface"/> <meta-data android:name="android.app.lib_name" android:value="questInterface"/>

View file

@ -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" { extern "C" {
JNIEXPORT void JNICALL 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); initOculusPlatform(env, obj);
} }
QAndroidJniObject __interfaceActivity; QAndroidJniObject __interfaceActivity;
JNIEXPORT void JNICALL JNIEXPORT void JNICALL
Java_io_highfidelity_questInterface_QuestActivity_questNativeOnCreate(JNIEnv *env, jobject obj) { Java_io_highfidelity_oculus_OculusMobileActivity_questNativeOnCreate(JNIEnv *env, jobject obj) {
__android_log_print(ANDROID_LOG_WARN, "QQQ","questNativeOnCreate called"); __android_log_print(ANDROID_LOG_INFO, "QQQ", __FUNCTION__);
initOculusPlatform(env, obj); initOculusPlatform(env, obj);
__interfaceActivity = QAndroidJniObject (obj); getClassName(env, obj);
QObject::connect(&AndroidHelper::instance(), &AndroidHelper::qtAppLoadComplete, []() {
qRegisterMetaType<QAndroidJniObject>("QAndroidJniObject");
__interfaceActivity = QAndroidJniObject(obj);
QObject::connect(&AndroidHelper::instance(), &AndroidHelper::qtAppLoadComplete, []() { QObject::connect(&AndroidHelper::instance(), &AndroidHelper::qtAppLoadComplete, []() {
__interfaceActivity.callMethod<void>("onAppLoadedComplete", "()V"); __interfaceActivity.callMethod<void>("onAppLoadedComplete", "()V");
QObject::disconnect(&AndroidHelper::instance(), &AndroidHelper::qtAppLoadComplete, nullptr,
nullptr);
});
QObject::disconnect(&AndroidHelper::instance(), &AndroidHelper::qtAppLoadComplete, 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()); AndroidHelper::instance().moveToThread(qApp->thread());
} }
JNIEXPORT void JNICALL 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 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(); AndroidHelper::instance().notifyEnterBackground();
} }
JNIEXPORT void JNICALL 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(); AndroidHelper::instance().notifyEnterForeground();
} }

View file

@ -6,6 +6,7 @@ import android.content.Intent;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.os.Bundle; import android.os.Bundle;
import io.highfidelity.oculus.OculusMobileActivity;
import io.highfidelity.utils.HifiUtils; import io.highfidelity.utils.HifiUtils;
public class PermissionsChecker extends Activity { public class PermissionsChecker extends Activity {
@ -46,9 +47,8 @@ public class PermissionsChecker extends Activity {
} }
private void launchActivityWithPermissions() { private void launchActivityWithPermissions() {
HifiUtils.upackAssets(getAssets(), getCacheDir().getAbsolutePath()); startActivity(new Intent(this, OculusMobileActivity.class));
startActivity(new Intent(this, QuestActivity.class)); finish();
} }
@Override @Override

View file

@ -14,6 +14,7 @@ package io.highfidelity.questInterface;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log; import android.util.Log;
import android.view.SurfaceView;
import android.view.WindowManager; import android.view.WindowManager;
import io.highfidelity.oculus.OculusMobileActivity; import io.highfidelity.oculus.OculusMobileActivity;
@ -25,15 +26,22 @@ public class QuestActivity extends OculusMobileActivity {
private native void questNativeOnPause(); private native void questNativeOnPause();
private native void questNativeOnResume(); private native void questNativeOnResume();
private native void questOnAppAfterLoad(); private native void questOnAppAfterLoad();
private boolean isLoading=false;
String TAG = OculusMobileActivity.class.getSimpleName(); String TAG = OculusMobileActivity.class.getSimpleName();
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
HifiUtils.upackAssets(getAssets(), getCacheDir().getAbsolutePath());
isLoading=true;
questNativeOnCreate(); questNativeOnCreate();
} }
public void onAppLoadedComplete() { public void onAppLoadedComplete() {
Log.w(TAG, "QQQ Load Completed"); Log.w(TAG, "QQQ Load Completed");
isLoading=false;
runOnUiThread(() -> { runOnUiThread(() -> {
questOnAppAfterLoad(); questOnAppAfterLoad();
}); });
@ -42,20 +50,25 @@ public class QuestActivity extends OculusMobileActivity {
@Override @Override
protected void onPause() { protected void onPause() {
super.onPause(); super.onPause();
Log.w(TAG, "OnPause");
if(!isLoading){
questNativeOnPause(); questNativeOnPause();
}
} }
@Override @Override
protected void onResume() { protected void onResume() {
super.onResume(); super.onResume();
Log.w(TAG, "OnResume");
questNativeOnResume(); questNativeOnResume();
} }
@Override @Override
protected void onDestroy() { protected void onDestroy() {
super.onDestroy(); super.onDestroy();
Log.w(TAG, "OnDestroy");
questNativeOnDestroy(); questNativeOnDestroy();
} }
} }

View file

@ -10,16 +10,20 @@ package io.highfidelity.oculus;
import android.app.Activity; import android.app.Activity;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.util.Log; import android.util.Log;
import android.view.Surface; import android.view.Surface;
import android.view.SurfaceHolder; import android.view.SurfaceHolder;
import android.view.SurfaceView; import android.view.SurfaceView;
import android.view.WindowManager; import android.view.WindowManager;
import android.widget.LinearLayout;
import org.qtproject.qt5.android.bindings.QtActivity; import org.qtproject.qt5.android.bindings.QtActivity;
import io.highfidelity.utils.HifiUtils;
/** /**
* Contains a native surface and forwards the activity lifecycle and surface lifecycle * Contains a native surface and forwards the activity lifecycle and surface lifecycle
* events to the OculusMobileDisplayPlugin * events to the OculusMobileDisplayPlugin
@ -27,52 +31,86 @@ import org.qtproject.qt5.android.bindings.QtActivity;
public class OculusMobileActivity extends QtActivity implements SurfaceHolder.Callback { public class OculusMobileActivity extends QtActivity implements SurfaceHolder.Callback {
private static final String TAG = OculusMobileActivity.class.getSimpleName(); private static final String TAG = OculusMobileActivity.class.getSimpleName();
static { System.loadLibrary("oculusMobile"); } static { System.loadLibrary("oculusMobile"); }
private native void nativeOnCreate(); private native void nativeOnCreate();
private native static void nativeOnResume(); private native static void nativeOnResume();
private native static void nativeOnPause(); private native static void nativeOnPause();
private native static void nativeOnDestroy(); private native static void nativeOnDestroy();
private native static void nativeOnSurfaceChanged(Surface s); 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 SurfaceView mView;
private SurfaceHolder mSurfaceHolder; private SurfaceHolder mSurfaceHolder;
@Override boolean isLoading =false;
public void onCreate(Bundle savedInstanceState) {
Log.w(TAG, "QQQ onCreate");
super.onCreate(savedInstanceState);
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 // Create a native surface for VR rendering (Qt GL surfaces are not suitable
// because of the lack of fine control over the surface callbacks) // 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 // 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 @Override
protected void onDestroy() { protected void onDestroy() {
Log.w(TAG, "QQQ onDestroy"); Log.w(TAG, "QQQ onDestroy");
super.onDestroy();
if (mSurfaceHolder != null) { if (mSurfaceHolder != null) {
nativeOnSurfaceChanged(null); nativeOnSurfaceChanged(null);
} }
nativeOnDestroy(); nativeOnDestroy();
super.onDestroy(); questNativeOnDestroy();
} }
@Override @Override
protected void onResume() { protected void onResume() {
Log.w(TAG, "QQQ onResume"); Log.w(TAG, "QQQ onResume");
super.onResume(); super.onResume();
nativeOnResume(); nativeOnResume();
questNativeOnResume();
} }
@Override @Override
protected void onPause() { protected void onPause() {
Log.w(TAG, "QQQ onPause"); Log.w(TAG, "QQQ onPause");
nativeOnPause();
super.onPause(); super.onPause();
nativeOnPause();
questNativeOnPause();
} }
@Override @Override

View file

@ -27,6 +27,25 @@ using namespace ovr;
static thread_local bool isRenderThread { false }; 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 { struct VrSurface : public TaskQueue {
using HandlerTask = VrHandler::HandlerTask; using HandlerTask = VrHandler::HandlerTask;