From 5ee6c5befd503b5e47685256e52ac4f141a43ffe Mon Sep 17 00:00:00 2001 From: Miku AuahDark Date: Sun, 23 Jun 2024 19:32:28 +0800 Subject: [PATCH] Android: Fix love.window.getSafeArea() not working. Fixes #2081. --- src/common/android.cpp | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/common/android.cpp b/src/common/android.cpp index 369258480..25c68e44b 100644 --- a/src/common/android.cpp +++ b/src/common/android.cpp @@ -98,26 +98,24 @@ bool getSafeArea(int &top, int &left, int &bottom, int &right) JNIEnv *env = (JNIEnv*) SDL_AndroidGetJNIEnv(); jobject activity = (jobject) SDL_AndroidGetActivity(); jclass clazz = env->GetObjectClass(activity); + jclass rectClass = env->FindClass("android/graphics/Rect"); + jmethodID methodID = env->GetMethodID(clazz, "getSafeArea", "()Landroid/graphics/Rect;"); + jobject safeArea = env->CallObjectMethod(activity, methodID); - static jmethodID methodID = env->GetMethodID(clazz, "getSafeArea", "()Z"); - - bool hasSafeArea = false; - - if (methodID == nullptr) - // NoSuchMethodException is thrown in case methodID is null - env->ExceptionClear(); - else if ((hasSafeArea = env->CallBooleanMethod(activity, methodID))) + if (safeArea != nullptr) { - top = env->GetIntField(activity, env->GetFieldID(clazz, "safeAreaTop", "I")); - left = env->GetIntField(activity, env->GetFieldID(clazz, "safeAreaLeft", "I")); - bottom = env->GetIntField(activity, env->GetFieldID(clazz, "safeAreaBottom", "I")); - right = env->GetIntField(activity, env->GetFieldID(clazz, "safeAreaRight", "I")); + top = env->GetIntField(activity, env->GetFieldID(rectClass, "top", "I")); + left = env->GetIntField(activity, env->GetFieldID(rectClass, "left", "I")); + bottom = env->GetIntField(activity, env->GetFieldID(rectClass, "bottom", "I")); + right = env->GetIntField(activity, env->GetFieldID(rectClass, "right", "I")); + env->DeleteLocalRef(safeArea); } + env->DeleteLocalRef(rectClass); env->DeleteLocalRef(clazz); env->DeleteLocalRef(activity); - return hasSafeArea; + return safeArea != nullptr; } bool openURL(const std::string &url)