summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author TreeHugger Robot <treehugger-gerrit@google.com> 2022-03-02 01:40:39 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2022-03-02 01:40:39 +0000
commit6d990b12967b6f306d05ed6d77b751b27e6bf13c (patch)
treed4022c915b4be0db983bedcd8c139dc7521738cc
parent6f06d92d7712fa1e58719ce2807aa6c2f217a72a (diff)
parent0a682bf137d4683c99bc60deeac646f4d060a6af (diff)
Merge "Close Transactions explicitly" into tm-dev
-rw-r--r--core/java/android/view/InsetsSourceConsumer.java26
-rw-r--r--core/java/android/view/SyncRtSurfaceTransactionApplier.java8
-rw-r--r--core/java/android/view/ViewRootImpl.java3
3 files changed, 24 insertions, 13 deletions
diff --git a/core/java/android/view/InsetsSourceConsumer.java b/core/java/android/view/InsetsSourceConsumer.java
index b1582cf9f023..6aab6359d23e 100644
--- a/core/java/android/view/InsetsSourceConsumer.java
+++ b/core/java/android/view/InsetsSourceConsumer.java
@@ -98,6 +98,13 @@ public class InsetsSourceConsumer {
*/
private boolean mIsAnimationPending;
+ /**
+ * @param type The {@link InternalInsetsType} of the consumed insets.
+ * @param state The current {@link InsetsState} of the consumed insets.
+ * @param transactionSupplier The source of new {@link Transaction} instances. The supplier
+ * must provide *new* instances, which will be explicitly closed by this class.
+ * @param controller The {@link InsetsController} to use for insets interaction.
+ */
public InsetsSourceConsumer(@InternalInsetsType int type, InsetsState state,
Supplier<Transaction> transactionSupplier, InsetsController controller) {
mType = type;
@@ -390,16 +397,17 @@ public class InsetsSourceConsumer {
return;
}
- final Transaction t = mTransactionSupplier.get();
- if (DEBUG) Log.d(TAG, "applyRequestedVisibilityToControl: " + mRequestedVisible);
- if (mRequestedVisible) {
- t.show(mSourceControl.getLeash());
- } else {
- t.hide(mSourceControl.getLeash());
+ try (Transaction t = mTransactionSupplier.get()) {
+ if (DEBUG) Log.d(TAG, "applyRequestedVisibilityToControl: " + mRequestedVisible);
+ if (mRequestedVisible) {
+ t.show(mSourceControl.getLeash());
+ } else {
+ t.hide(mSourceControl.getLeash());
+ }
+ // Ensure the alpha value is aligned with the actual requested visibility.
+ t.setAlpha(mSourceControl.getLeash(), mRequestedVisible ? 1 : 0);
+ t.apply();
}
- // Ensure the alpha value is aligned with the actual requested visibility.
- t.setAlpha(mSourceControl.getLeash(), mRequestedVisible ? 1 : 0);
- t.apply();
onPerceptible(mRequestedVisible);
}
diff --git a/core/java/android/view/SyncRtSurfaceTransactionApplier.java b/core/java/android/view/SyncRtSurfaceTransactionApplier.java
index 3e2110341693..e9c937cc0f9b 100644
--- a/core/java/android/view/SyncRtSurfaceTransactionApplier.java
+++ b/core/java/android/view/SyncRtSurfaceTransactionApplier.java
@@ -65,10 +65,12 @@ public class SyncRtSurfaceTransactionApplier {
applyParams(t, params);
mTargetViewRootImpl.registerRtFrameCallback(frame -> {
- if (mTargetSc == null || !mTargetSc.isValid()) {
- return;
+ if (mTargetSc != null && mTargetSc.isValid()) {
+ applyTransaction(t, frame);
}
- applyTransaction(t, frame);
+ // The transaction was either dropped, successfully applied, or merged with a future
+ // transaction, so we can safely release its resources.
+ t.close();
});
// Make sure a frame gets scheduled.
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index a9a2689bd318..d5b14352d57f 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -4178,7 +4178,7 @@ public final class ViewRootImpl implements ViewParent,
+ " didProduceBuffer=" + didProduceBuffer);
}
- Transaction tmpTransaction = new Transaction();
+ final Transaction tmpTransaction = new Transaction();
tmpTransaction.merge(mRtBLASTSyncTransaction);
// If frame wasn't drawn, clear out the next transaction so it doesn't affect the next
@@ -4209,6 +4209,7 @@ public final class ViewRootImpl implements ViewParent,
blastSyncConsumer.accept(mSurfaceChangedTransaction);
}
}
+ tmpTransaction.close();
if (reportNextDraw) {
pendingDrawFinished();