diff options
| author | 2024-04-29 20:06:11 +0000 | |
|---|---|---|
| committer | 2024-04-29 20:06:11 +0000 | |
| commit | d011345d7bd70582b654a7989a050f70d701cf7a (patch) | |
| tree | 503bea59e1073b55ae3a0967b4c20d7376bac228 | |
| parent | 5be651f1190fa9728cbe4915fff336c97025245d (diff) | |
| parent | 34459252775f3d09f36000e897b80c76c6ee7adb (diff) | |
Merge "Allow creating ASurfaceControl from NativeActivity Surface" into main
| -rw-r--r-- | core/java/android/view/Surface.java | 4 | ||||
| -rw-r--r-- | core/java/android/view/ViewRootImpl.java | 8 | ||||
| -rw-r--r-- | core/java/android/view/flags/view_flags.aconfig | 11 | ||||
| -rw-r--r-- | core/tests/coretests/Android.bp | 1 | ||||
| -rw-r--r-- | core/tests/coretests/jni/Android.bp | 24 | ||||
| -rw-r--r-- | core/tests/coretests/jni/ViewRootImplTestJni.cpp | 79 | ||||
| -rw-r--r-- | core/tests/coretests/src/android/view/ViewRootImplTest.java | 22 |
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( |