SurfaceControl: add getAllowedDisplayConfigs
expose ISurfaceComposer::getAllowedDisplayConfigs to SurfaceControl.
Test: manual test to call getAllowedDisplayConfigs() from SurfaceControl
observe config change.
Bug: 122905403
Change-Id: I0587ac5ed2eb29788c2ce941d9c54ebfd215ddf9
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java
index ea7f31d..3768aca 100644
--- a/core/java/android/view/SurfaceControl.java
+++ b/core/java/android/view/SurfaceControl.java
@@ -160,6 +160,7 @@
private static native boolean nativeSetActiveConfig(IBinder displayToken, int id);
private static native boolean nativeSetAllowedDisplayConfigs(IBinder displayToken,
int[] allowedConfigs);
+ private static native int[] nativeGetAllowedDisplayConfigs(IBinder displayToken);
private static native int[] nativeGetDisplayColorModes(IBinder displayToken);
private static native SurfaceControl.DisplayPrimaries nativeGetDisplayNativePrimaries(
IBinder displayToken);
@@ -1538,6 +1539,16 @@
/**
* @hide
*/
+ public static int[] getAllowedDisplayConfigs(IBinder displayToken) {
+ if (displayToken == null) {
+ throw new IllegalArgumentException("displayToken must not be null");
+ }
+ return nativeGetAllowedDisplayConfigs(displayToken);
+ }
+
+ /**
+ * @hide
+ */
public static int[] getDisplayColorModes(IBinder displayToken) {
if (displayToken == null) {
throw new IllegalArgumentException("displayToken must not be null");
diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp
index 4c25fd4..af2bf2d 100644
--- a/core/jni/android_view_SurfaceControl.cpp
+++ b/core/jni/android_view_SurfaceControl.cpp
@@ -717,6 +717,29 @@
return result == NO_ERROR ? JNI_TRUE : JNI_FALSE;
}
+static jintArray nativeGetAllowedDisplayConfigs(JNIEnv* env, jclass clazz, jobject tokenObj) {
+ sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
+ if (token == nullptr) return JNI_FALSE;
+
+ std::vector<int32_t> allowedConfigs;
+ size_t result = SurfaceComposerClient::getAllowedDisplayConfigs(token, &allowedConfigs);
+ if (result != NO_ERROR) {
+ return nullptr;
+ }
+
+ jintArray allowedConfigsArray = env->NewIntArray(allowedConfigs.size());
+ if (allowedConfigsArray == nullptr) {
+ jniThrowException(env, "java/lang/OutOfMemoryError", NULL);
+ return nullptr;
+ }
+ jint* allowedConfigsArrayValues = env->GetIntArrayElements(allowedConfigsArray, 0);
+ for (size_t i = 0; i < allowedConfigs.size(); i++) {
+ allowedConfigsArrayValues[i] = static_cast<jint>(allowedConfigs[i]);
+ }
+ env->ReleaseIntArrayElements(allowedConfigsArray, allowedConfigsArrayValues, 0);
+ return allowedConfigsArray;
+}
+
static jint nativeGetActiveConfig(JNIEnv* env, jclass clazz, jobject tokenObj) {
sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
if (token == NULL) return -1;
@@ -1215,6 +1238,8 @@
(void*)nativeSetActiveConfig },
{"nativeSetAllowedDisplayConfigs", "(Landroid/os/IBinder;[I)Z",
(void*)nativeSetAllowedDisplayConfigs },
+ {"nativeGetAllowedDisplayConfigs", "(Landroid/os/IBinder;)[I",
+ (void*)nativeGetAllowedDisplayConfigs },
{"nativeGetDisplayColorModes", "(Landroid/os/IBinder;)[I",
(void*)nativeGetDisplayColorModes},
{"nativeGetDisplayNativePrimaries", "(Landroid/os/IBinder;)Landroid/view/SurfaceControl$DisplayPrimaries;",