diff options
| -rw-r--r-- | core/java/android/view/SurfaceControl.java | 22 | ||||
| -rw-r--r-- | core/java/android/view/ViewRootImpl.java | 5 | ||||
| -rw-r--r-- | core/jni/android_view_SurfaceControl.cpp | 9 |
3 files changed, 33 insertions, 3 deletions
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index 85a4f2035901..e7b31aa8daf0 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -104,6 +104,7 @@ public final class SurfaceControl implements Parcelable { private static native void nativeApplyTransaction(long transactionObj, boolean sync); private static native void nativeMergeTransaction(long transactionObj, long otherTransactionObj); + private static native void nativeClearTransaction(long transactionObj); private static native void nativeSetAnimationTransaction(long transactionObj); private static native void nativeSetEarlyWakeupStart(long transactionObj); private static native void nativeSetEarlyWakeupEnd(long transactionObj); @@ -2604,6 +2605,19 @@ public final class SurfaceControl implements Parcelable { } /** + * Clear the transaction object, without applying it. + * + * @hide + */ + public void clear() { + mResizedSurfaces.clear(); + mReparentedSurfaces.clear(); + if (mNativeObject != 0) { + nativeClearTransaction(mNativeObject); + } + } + + /** * Release the native transaction object, without applying it. */ @Override @@ -3428,10 +3442,14 @@ public final class SurfaceControl implements Parcelable { public void writeToParcel(@NonNull Parcel dest, @WriteFlags int flags) { if (mNativeObject == 0) { dest.writeInt(0); - } else { - dest.writeInt(1); + return; } + + dest.writeInt(1); nativeWriteTransactionToParcel(mNativeObject, dest); + if ((flags & Parcelable.PARCELABLE_WRITE_RETURN_VALUE) != 0) { + nativeClearTransaction(mNativeObject); + } } private void readFromParcel(Parcel in) { diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index e2cf9624e1a5..b12e464d8dae 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -3901,7 +3901,10 @@ public final class ViewRootImpl implements ViewParent, mDrawsNeededToReport = 0; mWindowSession.finishDrawing(mWindow, mSurfaceChangedTransaction); } catch (RemoteException e) { - // Have fun! + Log.e(mTag, "Unable to report draw finished", e); + mSurfaceChangedTransaction.apply(); + } finally { + mSurfaceChangedTransaction.clear(); } } diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index 354e3a4d67ed..17a8b5a7fb70 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -1570,6 +1570,13 @@ static void nativeWriteTransactionToParcel(JNIEnv* env, jclass clazz, jlong nati reinterpret_cast<SurfaceComposerClient::Transaction *>(nativeObject); if (self != nullptr) { self->writeToParcel(parcel); + } +} + +static void nativeClearTransaction(JNIEnv* env, jclass clazz, jlong nativeObject) { + SurfaceComposerClient::Transaction* const self = + reinterpret_cast<SurfaceComposerClient::Transaction*>(nativeObject); + if (self != nullptr) { self->clear(); } } @@ -1890,6 +1897,8 @@ static const JNINativeMethod sSurfaceControlMethods[] = { (void*)nativeReadTransactionFromParcel }, {"nativeWriteTransactionToParcel", "(JLandroid/os/Parcel;)V", (void*)nativeWriteTransactionToParcel }, + {"nativeClearTransaction", "(J)V", + (void*)nativeClearTransaction }, {"nativeMirrorSurface", "(J)J", (void*)nativeMirrorSurface }, {"nativeSetGlobalShadowSettings", "([F[FFFF)V", |