summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Vishnu Nair <vishnun@google.com> 2024-04-29 20:06:11 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2024-04-29 20:06:11 +0000
commitd011345d7bd70582b654a7989a050f70d701cf7a (patch)
tree503bea59e1073b55ae3a0967b4c20d7376bac228
parent5be651f1190fa9728cbe4915fff336c97025245d (diff)
parent34459252775f3d09f36000e897b80c76c6ee7adb (diff)
Merge "Allow creating ASurfaceControl from NativeActivity Surface" into main
-rw-r--r--core/java/android/view/Surface.java4
-rw-r--r--core/java/android/view/ViewRootImpl.java8
-rw-r--r--core/java/android/view/flags/view_flags.aconfig11
-rw-r--r--core/tests/coretests/Android.bp1
-rw-r--r--core/tests/coretests/jni/Android.bp24
-rw-r--r--core/tests/coretests/jni/ViewRootImplTestJni.cpp79
-rw-r--r--core/tests/coretests/src/android/view/ViewRootImplTest.java22
7 files changed, 146 insertions, 3 deletions
diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java
index 56edfe72ba26..e20b15e3dde4 100644
--- a/core/java/android/view/Surface.java
+++ b/core/java/android/view/Surface.java
@@ -835,8 +835,8 @@ public class Surface implements Parcelable {
@Override
public String toString() {
synchronized (mLock) {
- return "Surface(name=" + mName + ")/@0x" +
- Integer.toHexString(System.identityHashCode(this));
+ return "Surface(name=" + mName + " mNativeObject=" + mNativeObject + ")/@0x"
+ + Integer.toHexString(System.identityHashCode(this));
}
}
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 2cb862cce4ac..2dafd807cda6 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -110,6 +110,7 @@ import static android.view.WindowManagerGlobal.RELAYOUT_RES_SURFACE_CHANGED;
import static android.view.accessibility.Flags.fixMergedContentChangeEventV2;
import static android.view.accessibility.Flags.forceInvertColor;
import static android.view.accessibility.Flags.reduceWindowContentChangedEventThrottle;
+import static android.view.flags.Flags.addSchandleToVriSurface;
import static android.view.flags.Flags.sensitiveContentAppProtection;
import static android.view.flags.Flags.toolkitFrameRateFunctionEnablingReadOnly;
import static android.view.flags.Flags.toolkitFrameRateTypingReadOnly;
@@ -2624,7 +2625,12 @@ public final class ViewRootImpl implements ViewParent,
mBlastBufferQueue = new BLASTBufferQueue(mTag, mSurfaceControl,
mSurfaceSize.x, mSurfaceSize.y, mWindowAttributes.format);
mBlastBufferQueue.setTransactionHangCallback(sTransactionHangCallback);
- Surface blastSurface = mBlastBufferQueue.createSurface();
+ Surface blastSurface;
+ if (addSchandleToVriSurface()) {
+ blastSurface = mBlastBufferQueue.createSurfaceWithHandle();
+ } else {
+ blastSurface = mBlastBufferQueue.createSurface();
+ }
// Only call transferFrom if the surface has changed to prevent inc the generation ID and
// causing EGL resources to be recreated.
mSurface.transferFrom(blastSurface);
diff --git a/core/java/android/view/flags/view_flags.aconfig b/core/java/android/view/flags/view_flags.aconfig
index 33b29c7e308d..16e141550fdc 100644
--- a/core/java/android/view/flags/view_flags.aconfig
+++ b/core/java/android/view/flags/view_flags.aconfig
@@ -59,3 +59,14 @@ flag {
bug: "333752000"
is_fixed_read_only: true
}
+
+flag {
+ name: "add_schandle_to_vri_surface"
+ namespace: "window_surfaces"
+ description: "Add surface control handle to VRI Surface"
+ bug: "320706287"
+ is_fixed_read_only: true
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+} \ No newline at end of file
diff --git a/core/tests/coretests/Android.bp b/core/tests/coretests/Android.bp
index 04e90baaff3a..436ba15235c9 100644
--- a/core/tests/coretests/Android.bp
+++ b/core/tests/coretests/Android.bp
@@ -116,6 +116,7 @@ android_test {
],
jni_libs: [
"libpowermanagertest_jni",
+ "libviewRootImplTest_jni",
"libworksourceparceltest_jni",
],
diff --git a/core/tests/coretests/jni/Android.bp b/core/tests/coretests/jni/Android.bp
index 7cc844ae9fc6..538e7f3d66e9 100644
--- a/core/tests/coretests/jni/Android.bp
+++ b/core/tests/coretests/jni/Android.bp
@@ -67,3 +67,27 @@ cc_test_library {
],
gtest: false,
}
+
+cc_test_library {
+ name: "libviewRootImplTest_jni",
+ srcs: [
+ "ViewRootImplTestJni.cpp",
+ ],
+ shared_libs: [
+ "libandroid",
+ "libandroid_runtime_lazy",
+ "libbase",
+ "libbinder",
+ "liblog",
+ "libnativehelper",
+ "libpowermanager",
+ "libutils",
+ ],
+ header_libs: ["jni_headers"],
+ stl: "libc++_static",
+ cflags: [
+ "-Werror",
+ "-Wall",
+ ],
+ gtest: false,
+}
diff --git a/core/tests/coretests/jni/ViewRootImplTestJni.cpp b/core/tests/coretests/jni/ViewRootImplTestJni.cpp
new file mode 100644
index 000000000000..06a0f23f6672
--- /dev/null
+++ b/core/tests/coretests/jni/ViewRootImplTestJni.cpp
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "ViewRootImplTest"
+
+#include "jni.h"
+
+#include <android_util_Binder.h>
+#include <binder/IServiceManager.h>
+#include <nativehelper/JNIHelp.h>
+#include <utils/Log.h>
+#include <android/native_window_jni.h>
+#include <android/surface_control.h>
+#include <android/surface_control_jni.h>
+
+#include <android-base/stringprintf.h>
+#include <android-base/strings.h>
+
+namespace android {
+
+static bool nativeCreateASurfaceControlFromSurface(JNIEnv* env, jclass /* obj */,
+ jobject jSurface) {
+ if (!jSurface) {
+ ALOGE("Surface object is null\n");
+ return false;
+ }
+
+ ANativeWindow* window = ANativeWindow_fromSurface(env, jSurface);
+ if (!window) {
+ ALOGE("Could not create ANW from jSurface\n");
+ return false;
+ }
+
+ ASurfaceControl* surfaceControl =
+ ASurfaceControl_createFromWindow(window, "ViewRootImplTestLayer");
+ if (!surfaceControl) {
+ ALOGE("Could not create SC from ANW\n");
+ return false;
+ }
+
+ ANativeWindow_release(window);
+ ASurfaceControl_release(surfaceControl);
+ return true;
+}
+
+extern "C" jint JNI_OnLoad(JavaVM* vm, void* /* reserved */)
+{
+ JNIEnv* env;
+ const JNINativeMethod methodTable[] = {
+ /* name, signature, funcPtr */
+ { "nativeCreateASurfaceControlFromSurface", "(Landroid/view/Surface;)Z",
+ (void*) nativeCreateASurfaceControlFromSurface },
+ };
+
+ if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
+ return JNI_ERR;
+ }
+
+ jniRegisterNativeMethods(env, "android/view/ViewRootImplTest", methodTable,
+ sizeof(methodTable) / sizeof(JNINativeMethod));
+
+ return JNI_VERSION_1_6;
+}
+
+} /* namespace android */
diff --git a/core/tests/coretests/src/android/view/ViewRootImplTest.java b/core/tests/coretests/src/android/view/ViewRootImplTest.java
index 20fb6e3025ef..9afc4be20eee 100644
--- a/core/tests/coretests/src/android/view/ViewRootImplTest.java
+++ b/core/tests/coretests/src/android/view/ViewRootImplTest.java
@@ -17,6 +17,7 @@
package android.view;
import static android.view.accessibility.Flags.FLAG_FORCE_INVERT_COLOR;
+import static android.view.flags.Flags.FLAG_ADD_SCHANDLE_TO_VRI_SURFACE;
import static android.view.flags.Flags.FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY;
import static android.view.flags.Flags.FLAG_TOOLKIT_FRAME_RATE_BY_SIZE_READ_ONLY;
import static android.view.flags.Flags.FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY;
@@ -124,6 +125,10 @@ public class ViewRootImplTest {
private CountDownLatch mAfterDrawLatch;
private Throwable mAfterDrawThrowable;
+ private native boolean nativeCreateASurfaceControlFromSurface(Surface surface);
+ static {
+ System.loadLibrary("viewRootImplTest_jni");
+ }
@Rule
public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
@@ -1364,6 +1369,23 @@ public class ViewRootImplTest {
assertThat(mViewRootImpl.determineForceDarkType()).isEqualTo(ForceDarkType.FORCE_DARK);
}
+ @Test
+ @RequiresFlagsEnabled({FLAG_ADD_SCHANDLE_TO_VRI_SURFACE})
+ public void testASurfaceControl_createFromWindow() throws Throwable {
+ mView = new View(sContext);
+ attachViewToWindow(mView);
+ sInstrumentation.runOnMainSync(() -> {
+ mView.setVisibility(View.VISIBLE);
+ mView.invalidate();
+ runAfterDraw(()->{});
+ });
+ waitForAfterDraw();
+ mViewRootImpl = mView.getViewRootImpl();
+ Log.d(TAG, "mViewRootImpl.mSurface=" + mViewRootImpl.mSurface);
+ assertTrue("Could not create ASurfaceControl from VRI surface",
+ nativeCreateASurfaceControlFromSurface(mViewRootImpl.mSurface));
+ }
+
private boolean setForceDarkSysProp(boolean isForceDarkEnabled) {
try {
SystemProperties.set(