diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2024-04-23 13:59:20 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2024-04-23 13:59:20 +0000 |
commit | d6cdc66b3dbeb0d170ef57b31b044c0d39e0f82d (patch) | |
tree | 1c9056bae10d4784fa13c60175b38887310c4cee | |
parent | dd3ca07974c7308692442f5324aa7327787a6af0 (diff) | |
parent | 1fcac2cf4e2e64218ceff2fa0194dc43e1c1c819 (diff) | |
download | support-snap-temp-L01000030003350421.tar.gz |
Merge "Make BoundDynamicTypeImpl#close method idempotent" into snap-temp-L01000030003350421snap-temp-L01000030003350421
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) { |