Browse Source

Android: Fix love.window.getSafeArea() not working.

Fixes #2081.
Miku AuahDark 1 year ago
parent
commit
5ee6c5befd
1 changed files with 11 additions and 13 deletions
  1. 11 13
      src/common/android.cpp

+ 11 - 13
src/common/android.cpp

@@ -98,26 +98,24 @@ bool getSafeArea(int &top, int &left, int &bottom, int &right)
 	JNIEnv *env = (JNIEnv*) SDL_AndroidGetJNIEnv();
 	JNIEnv *env = (JNIEnv*) SDL_AndroidGetJNIEnv();
 	jobject activity = (jobject) SDL_AndroidGetActivity();
 	jobject activity = (jobject) SDL_AndroidGetActivity();
 	jclass clazz = env->GetObjectClass(activity);
 	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(clazz);
 	env->DeleteLocalRef(activity);
 	env->DeleteLocalRef(activity);
 
 
-	return hasSafeArea;
+	return safeArea != nullptr;
 }
 }
 
 
 bool openURL(const std::string &url)
 bool openURL(const std::string &url)