Hide navigation bar for more comfortable playing and more screen space
This commit is contained in:
parent
5d9614295e
commit
b7a11e68ad
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user