From f4cc95956c0ac8564416c4f30882699f0a66100c Mon Sep 17 00:00:00 2001 From: Vishnu Nair Date: Fri, 2 Jul 2021 13:03:51 -0700 Subject: [PATCH] SurfaceControl: Query native object for transform hint When a new SurfaceControl was created, the java object's transform hint was not updated. This created a mismatch between the java and native objects resulting in the client getting an incorrect transform hint. Fix this by making the native object the source of truth for transform hints. Test: in landscape mode, dismiss apps and check launcher does not reject buffers Bug: 191841127 Change-Id: Icc87b8cf8158eedb87eea886392a0460a76c6443 --- core/java/android/view/SurfaceControl.java | 12 ++++-------- core/jni/android_view_SurfaceControl.cpp | 10 ++++++++++ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index c03db6d673569..4e2f37fde1f79 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -234,6 +234,7 @@ public final class SurfaceControl implements Parcelable { private static native long nativeCreateJankDataListenerWrapper(OnJankDataListener listener); private static native int nativeGetGPUContextPriority(); private static native void nativeSetTransformHint(long nativeObject, int transformHint); + private static native int nativeGetTransformHint(long nativeObject); @Nullable @GuardedBy("mLock") @@ -608,7 +609,6 @@ public final class SurfaceControl implements Parcelable { mName = other.mName; mWidth = other.mWidth; mHeight = other.mHeight; - mTransformHint = other.mTransformHint; mLocalOwnerView = other.mLocalOwnerView; assignNativeObject(nativeCopyFromSurfaceControl(other.mNativeObject), callsite); } @@ -1471,7 +1471,6 @@ public final class SurfaceControl implements Parcelable { mName = in.readString8(); mWidth = in.readInt(); mHeight = in.readInt(); - mTransformHint = in.readInt(); long object = 0; if (in.readInt() != 0) { @@ -1490,7 +1489,6 @@ public final class SurfaceControl implements Parcelable { dest.writeString8(mName); dest.writeInt(mWidth); dest.writeInt(mHeight); - dest.writeInt(mTransformHint); if (mNativeObject == 0) { dest.writeInt(0); } else { @@ -3603,7 +3601,8 @@ public final class SurfaceControl implements Parcelable { * @hide */ public int getTransformHint() { - return mTransformHint; + checkNotReleased(); + return nativeGetTransformHint(mNativeObject); } /** @@ -3616,9 +3615,6 @@ public final class SurfaceControl implements Parcelable { * @hide */ public void setTransformHint(@Surface.Rotation int transformHint) { - if (mTransformHint != transformHint) { - mTransformHint = transformHint; - nativeSetTransformHint(mNativeObject, transformHint); - } + nativeSetTransformHint(mNativeObject, transformHint); } } diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index e9e79dc30c20a..1695e1af9270d 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -1785,6 +1785,14 @@ static void nativeSetTransformHint(JNIEnv* env, jclass clazz, jlong nativeSurfac ui::Transform::toRotationFlags(static_cast(transformHint))); } +static jint nativeGetTransformHint(JNIEnv* env, jclass clazz, jlong nativeSurfaceControl) { + sp surface(reinterpret_cast(nativeSurfaceControl)); + ui::Transform::RotationFlags transformHintRotationFlags = + static_cast(surface->getTransformHint()); + + return toRotationInt(ui::Transform::toRotation((transformHintRotationFlags))); +} + // ---------------------------------------------------------------------------- static const JNINativeMethod sSurfaceControlMethods[] = { @@ -1974,6 +1982,8 @@ static const JNINativeMethod sSurfaceControlMethods[] = { (void*)nativeGetGPUContextPriority }, {"nativeSetTransformHint", "(JI)V", (void*)nativeSetTransformHint }, + {"nativeGetTransformHint", "(J)I", + (void*)nativeGetTransformHint }, // clang-format on };