Hide navigation bar for more comfortable playing and more screen space

This commit is contained in:
Deve 2018-07-26 22:34:56 +02:00
parent 5d9614295e
commit b7a11e68ad
2 changed files with 115 additions and 13 deletions

View File

@ -64,6 +64,7 @@ CIrrDeviceAndroid::CIrrDeviceAndroid(const SIrrlichtCreationParameters& param)
Android->userData = this;
Android->onAppCmd = handleAndroidCommand;
Android->onAppCmdDirect = handleAndroidCommandDirect;
Android->onInputEvent = handleInput;
printConfig();
@ -365,6 +366,20 @@ E_DEVICE_TYPE CIrrDeviceAndroid::getType() const
return EIDT_ANDROID;
}
void CIrrDeviceAndroid::handleAndroidCommandDirect(ANativeActivity* activity,
int32_t cmd)
{
switch (cmd)
{
case APP_CMD_RESUME:
os::Printer::log("Android command direct APP_CMD_RESUME", ELL_DEBUG);
hideNavBar(activity);
break;
default:
break;
}
}
void CIrrDeviceAndroid::handleAndroidCommand(android_app* app, int32_t cmd)
{
CIrrDeviceAndroid* device = (CIrrDeviceAndroid *)app->userData;
@ -1133,15 +1148,101 @@ void CIrrDeviceAndroid::getKeyChar(SEvent& event)
}
}
void CIrrDeviceAndroid::hideNavBar(ANativeActivity* activity)
{
bool was_detached = false;
JNIEnv* env = NULL;
jint status = activity->vm->GetEnv((void**)&env, JNI_VERSION_1_6);
if (status == JNI_EDETACHED)
{
JavaVMAttachArgs args;
args.version = JNI_VERSION_1_6;
args.name = "NativeThread";
args.group = NULL;
status = activity->vm->AttachCurrentThread(&env, &args);
was_detached = true;
}
if (status != JNI_OK)
{
os::Printer::log("Cannot hide navbar.", ELL_DEBUG);
return;
}
jobject activity_obj = activity->clazz;
jclass activity_class = env->GetObjectClass(activity_obj);
jclass window_class = env->FindClass("android/view/Window");
jclass view_class = env->FindClass("android/view/View");
jmethodID get_window = env->GetMethodID(activity_class, "getWindow",
"()Landroid/view/Window;");
jmethodID get_decor_view = env->GetMethodID(window_class, "getDecorView",
"()Landroid/view/View;");
jmethodID set_system_ui_visibility = env->GetMethodID(view_class,
"setSystemUiVisibility", "(I)V");
jobject window_obj = env->CallObjectMethod(activity_obj, get_window);
jobject decor_view_obj = env->CallObjectMethod(window_obj, get_decor_view);
jfieldID fullscreen_field = env->GetStaticFieldID(view_class,
"SYSTEM_UI_FLAG_FULLSCREEN", "I");
jfieldID hide_navigation_field = env->GetStaticFieldID(view_class,
"SYSTEM_UI_FLAG_HIDE_NAVIGATION", "I");
jfieldID immersive_sticky_field = env->GetStaticFieldID(view_class,
"SYSTEM_UI_FLAG_IMMERSIVE_STICKY", "I");
jfieldID layout_stable_field = env->GetStaticFieldID(view_class,
"SYSTEM_UI_FLAG_LAYOUT_STABLE", "I");
jfieldID layout_hide_navigation_field = env->GetStaticFieldID(view_class,
"SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION", "I");
jfieldID layout_fullscreen_field = env->GetStaticFieldID(view_class,
"SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN", "I");
jint fullscreen = env->GetStaticIntField(view_class, fullscreen_field);
jint hide_navigation = env->GetStaticIntField(view_class,
hide_navigation_field);
jint immersive_sticky = env->GetStaticIntField(view_class,
immersive_sticky_field);
jint layout_stable = env->GetStaticIntField(view_class,
layout_stable_field);
jint layout_hide_navigation = env->GetStaticIntField(view_class,
layout_hide_navigation_field);
jint layout_fullscreen = env->GetStaticIntField(view_class,
layout_fullscreen_field);
jint flags = fullscreen | hide_navigation | immersive_sticky |
layout_stable | layout_hide_navigation | layout_fullscreen;
env->CallVoidMethod(decor_view_obj, set_system_ui_visibility, flags);
if (was_detached)
{
activity->vm->DetachCurrentThread();
}
}
int CIrrDeviceAndroid::getRotation()
{
JavaVMAttachArgs args;
args.version = JNI_VERSION_1_6;
args.name = "NativeThread";
args.group = NULL;
JNIEnv* env;
bool was_detached = false;
JNIEnv* env = NULL;
jint status = Android->activity->vm->GetEnv((void**)&env, JNI_VERSION_1_6);
if (status == JNI_EDETACHED)
{
JavaVMAttachArgs args;
args.version = JNI_VERSION_1_6;
args.name = "NativeThread";
args.group = NULL;
status = Android->activity->vm->AttachCurrentThread(&env, &args);
was_detached = true;
}
if (Android->activity->vm->AttachCurrentThread(&env, &args) != JNI_OK)
if (status != JNI_OK)
{
os::Printer::log("Cannot find rotation.", ELL_DEBUG);
return 0;
@ -1172,13 +1273,11 @@ int CIrrDeviceAndroid::getRotation()
jobject display_obj = env->CallObjectMethod(window_manager_obj, get_default_display);
int rotation = env->CallIntMethod(display_obj, get_rotation);
env->DeleteLocalRef(activity);
env->DeleteLocalRef(context);
env->DeleteLocalRef(window_manager);
env->DeleteLocalRef(display);
Android->activity->vm->DetachCurrentThread();
if (was_detached)
{
Android->activity->vm->DetachCurrentThread();
}
return rotation;
}

View File

@ -142,10 +142,13 @@ namespace irr
void createKeyMap();
void createVideoModeList();
void getKeyChar(SEvent& event);
static void hideNavBar(ANativeActivity* activity);
int getRotation();
DeviceOrientation getDefaultOrientation();
video::SExposedVideoData& getExposedVideoData();
static void handleAndroidCommandDirect(ANativeActivity* activity,
int32_t cmd);
static void handleAndroidCommand(android_app* app, int32_t cmd);
static s32 handleInput(android_app* app, AInputEvent* event);