diff --git a/doc/classes/DisplayServer.xml b/doc/classes/DisplayServer.xml
index fea38aad55c8..42b378311d96 100644
--- a/doc/classes/DisplayServer.xml
+++ b/doc/classes/DisplayServer.xml
@@ -199,7 +199,7 @@
Returns the OS theme base color (default control background). Returns [code]Color(0, 0, 0, 0)[/code] if the base color is unknown.
- [b]Note:[/b] This method is implemented on macOS and Windows.
+ [b]Note:[/b] This method is implemented on macOS, Windows, and Android.
diff --git a/platform/android/display_server_android.cpp b/platform/android/display_server_android.cpp
index 38f6931c8a86..ee666bdce963 100644
--- a/platform/android/display_server_android.cpp
+++ b/platform/android/display_server_android.cpp
@@ -209,6 +209,12 @@ Color DisplayServerAndroid::get_accent_color() const {
return godot_java->get_accent_color();
}
+Color DisplayServerAndroid::get_base_color() const {
+ GodotJavaWrapper *godot_java = OS_Android::get_singleton()->get_godot_java();
+ ERR_FAIL_NULL_V(godot_java, Color(0, 0, 0, 0));
+ return godot_java->get_base_color();
+}
+
TypedArray DisplayServerAndroid::get_display_cutouts() const {
GodotIOJavaWrapper *godot_io_java = OS_Android::get_singleton()->get_godot_io_java();
ERR_FAIL_NULL_V(godot_io_java, Array());
diff --git a/platform/android/display_server_android.h b/platform/android/display_server_android.h
index 1744ad306907..b26e963798c0 100644
--- a/platform/android/display_server_android.h
+++ b/platform/android/display_server_android.h
@@ -126,6 +126,7 @@ class DisplayServerAndroid : public DisplayServer {
void emit_file_picker_callback(bool p_ok, const Vector &p_selected_paths);
virtual Color get_accent_color() const override;
+ virtual Color get_base_color() const override;
virtual TypedArray get_display_cutouts() const override;
virtual Rect2i get_display_safe_area() const override;
diff --git a/platform/android/java/lib/src/org/godotengine/godot/Godot.kt b/platform/android/java/lib/src/org/godotengine/godot/Godot.kt
index 38df7ada3ef6..960e92993723 100644
--- a/platform/android/java/lib/src/org/godotengine/godot/Godot.kt
+++ b/platform/android/java/lib/src/org/godotengine/godot/Godot.kt
@@ -933,6 +933,13 @@ class Godot(private val context: Context) {
return value.data
}
+ @Keep
+ private fun getBaseColor(): Int {
+ val value = TypedValue()
+ context.theme.resolveAttribute(android.R.attr.colorBackground, value, true)
+ return value.data
+ }
+
/**
* Destroys the Godot Engine and kill the process it's running in.
*/
diff --git a/platform/android/java_godot_wrapper.cpp b/platform/android/java_godot_wrapper.cpp
index 5ecd789d43b6..d96ca5710378 100644
--- a/platform/android/java_godot_wrapper.cpp
+++ b/platform/android/java_godot_wrapper.cpp
@@ -65,6 +65,7 @@ GodotJavaWrapper::GodotJavaWrapper(JNIEnv *p_env, jobject p_activity, jobject p_
_is_dark_mode_supported = p_env->GetMethodID(godot_class, "isDarkModeSupported", "()Z");
_is_dark_mode = p_env->GetMethodID(godot_class, "isDarkMode", "()Z");
_get_accent_color = p_env->GetMethodID(godot_class, "getAccentColor", "()I");
+ _get_base_color = p_env->GetMethodID(godot_class, "getBaseColor", "()I");
_get_clipboard = p_env->GetMethodID(godot_class, "getClipboard", "()Ljava/lang/String;");
_set_clipboard = p_env->GetMethodID(godot_class, "setClipboard", "(Ljava/lang/String;)V");
_has_clipboard = p_env->GetMethodID(godot_class, "hasClipboard", "()Z");
@@ -215,18 +216,32 @@ bool GodotJavaWrapper::is_dark_mode() {
}
}
+// Convert ARGB to RGBA.
+static Color _argb_to_rgba(int p_color) {
+ int alpha = (p_color >> 24) & 0xFF;
+ int red = (p_color >> 16) & 0xFF;
+ int green = (p_color >> 8) & 0xFF;
+ int blue = p_color & 0xFF;
+ return Color(red / 255.0f, green / 255.0f, blue / 255.0f, alpha / 255.0f);
+}
+
Color GodotJavaWrapper::get_accent_color() {
if (_get_accent_color) {
JNIEnv *env = get_jni_env();
ERR_FAIL_NULL_V(env, Color(0, 0, 0, 0));
int accent_color = env->CallIntMethod(godot_instance, _get_accent_color);
+ return _argb_to_rgba(accent_color);
+ } else {
+ return Color(0, 0, 0, 0);
+ }
+}
- // Convert ARGB to RGBA.
- int alpha = (accent_color >> 24) & 0xFF;
- int red = (accent_color >> 16) & 0xFF;
- int green = (accent_color >> 8) & 0xFF;
- int blue = accent_color & 0xFF;
- return Color(red / 255.0f, green / 255.0f, blue / 255.0f, alpha / 255.0f);
+Color GodotJavaWrapper::get_base_color() {
+ if (_get_base_color) {
+ JNIEnv *env = get_jni_env();
+ ERR_FAIL_NULL_V(env, Color(0, 0, 0, 0));
+ int base_color = env->CallIntMethod(godot_instance, _get_base_color);
+ return _argb_to_rgba(base_color);
} else {
return Color(0, 0, 0, 0);
}
diff --git a/platform/android/java_godot_wrapper.h b/platform/android/java_godot_wrapper.h
index 512779169a4d..2b2613fd2178 100644
--- a/platform/android/java_godot_wrapper.h
+++ b/platform/android/java_godot_wrapper.h
@@ -57,6 +57,7 @@ class GodotJavaWrapper {
jmethodID _is_dark_mode_supported = nullptr;
jmethodID _is_dark_mode = nullptr;
jmethodID _get_accent_color = nullptr;
+ jmethodID _get_base_color = nullptr;
jmethodID _get_clipboard = nullptr;
jmethodID _set_clipboard = nullptr;
jmethodID _has_clipboard = nullptr;
@@ -102,6 +103,7 @@ class GodotJavaWrapper {
bool is_dark_mode_supported();
bool is_dark_mode();
Color get_accent_color();
+ Color get_base_color();
bool has_get_clipboard();
String get_clipboard();
bool has_set_clipboard();