aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2024-04-23 13:59:20 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2024-04-23 13:59:20 +0000
commitd6cdc66b3dbeb0d170ef57b31b044c0d39e0f82d (patch)
tree1c9056bae10d4784fa13c60175b38887310c4cee
parentdd3ca07974c7308692442f5324aa7327787a6af0 (diff)
parent1fcac2cf4e2e64218ceff2fa0194dc43e1c1c819 (diff)
downloadsupport-snap-temp-L01000030003350421.tar.gz
Merge "Make BoundDynamicTypeImpl#close method idempotent" into snap-temp-L01000030003350421snap-temp-L01000030003350421
-rw-r--r--wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/BoundDynamicTypeImpl.java13
-rw-r--r--wear/protolayout/protolayout-expression-pipeline/src/test/java/androidx/wear/protolayout/expression/pipeline/DynamicTypeEvaluatorTest.java16
2 files changed, 29 insertions, 0 deletions
diff --git a/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/BoundDynamicTypeImpl.java b/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/BoundDynamicTypeImpl.java
index bbae3dce988..4481752f703 100644
--- a/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/BoundDynamicTypeImpl.java
+++ b/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/BoundDynamicTypeImpl.java
@@ -18,6 +18,7 @@ package androidx.wear.protolayout.expression.pipeline;
import android.os.Handler;
import android.os.Looper;
+import android.util.Log;
import androidx.annotation.UiThread;
@@ -28,8 +29,11 @@ import java.util.List;
* evaluation.
*/
class BoundDynamicTypeImpl implements BoundDynamicType {
+ private static final String TAG = "BoundDynamicTypeImpl";
+
private final List<DynamicDataNode<?>> mNodes;
private final QuotaManager mDynamicDataNodesQuotaManager;
+ private boolean mIsClosed = false;
BoundDynamicTypeImpl(
List<DynamicDataNode<?>> nodes, QuotaManager dynamicDataNodesQuotaManager) {
@@ -88,8 +92,17 @@ class BoundDynamicTypeImpl implements BoundDynamicType {
}
}
+ /**
+ * Closes this {@link BoundDynamicTypeImpl} instance and releases any allocated quota. This
+ * method must be called only once on each {@link BoundDynamicTypeImpl} instance.
+ */
@UiThread
private void closeInternal() {
+ if (mIsClosed) {
+ Log.w(TAG, "close() method was called more than once.");
+ return;
+ }
+ mIsClosed = true;
mNodes.stream()
.filter(n -> n instanceof DynamicDataSourceNode)
.forEach(n -> ((DynamicDataSourceNode<?>) n).destroy());
diff --git a/wear/protolayout/protolayout-expression-pipeline/src/test/java/androidx/wear/protolayout/expression/pipeline/DynamicTypeEvaluatorTest.java b/wear/protolayout/protolayout-expression-pipeline/src/test/java/androidx/wear/protolayout/expression/pipeline/DynamicTypeEvaluatorTest.java
index d1fcf4cc91b..ae0ab5a896e 100644
--- a/wear/protolayout/protolayout-expression-pipeline/src/test/java/androidx/wear/protolayout/expression/pipeline/DynamicTypeEvaluatorTest.java
+++ b/wear/protolayout/protolayout-expression-pipeline/src/test/java/androidx/wear/protolayout/expression/pipeline/DynamicTypeEvaluatorTest.java
@@ -132,6 +132,22 @@ public class DynamicTypeEvaluatorTest {
verify(provider).clearReceiver();
}
+ @Test
+ public void closeCalledMultipleTimesOnBoundDynamicType_doesNotThrow()
+ throws EvaluationException {
+ DynamicTypeEvaluator evaluator =
+ createEvaluatorWithQuota(
+ /* animationQuota= */ unlimitedQuota(),
+ /* dynamicTypesQuota= */ new FixedQuotaManagerImpl(1));
+ ArrayList<Boolean> results = new ArrayList<>();
+ BoundDynamicType boundDynamicType = evaluator.bind(
+ createSingleNodeDynamicBoolRequest(results));
+
+ for (int i = 0; i < 10; i++) {
+ boundDynamicType.close();
+ }
+ }
+
@NonNull
private static DynamicTypeBindingRequest createSingleNodeDynamicBoolRequest(
ArrayList<Boolean> results) {