diff --git a/core/java/com/android/internal/widget/ConversationLayout.java b/core/java/com/android/internal/widget/ConversationLayout.java index e6deada45fc1a..78bb53d335393 100644 --- a/core/java/com/android/internal/widget/ConversationLayout.java +++ b/core/java/com/android/internal/widget/ConversationLayout.java @@ -871,6 +871,10 @@ public class ConversationLayout extends FrameLayout if (newGroup == null) { newGroup = MessagingGroup.createGroup(mMessagingLinearLayout); mAddedGroups.add(newGroup); + } else if (newGroup.getParent() != mMessagingLinearLayout) { + throw new IllegalStateException( + "group parent was " + newGroup.getParent() + " but expected " + + mMessagingLinearLayout); } newGroup.setImageDisplayLocation(mIsCollapsed ? IMAGE_DISPLAY_LOCATION_EXTERNAL diff --git a/core/java/com/android/internal/widget/MessagingLayout.java b/core/java/com/android/internal/widget/MessagingLayout.java index e1602a9819204..21ca196886ab8 100644 --- a/core/java/com/android/internal/widget/MessagingLayout.java +++ b/core/java/com/android/internal/widget/MessagingLayout.java @@ -419,6 +419,10 @@ public class MessagingLayout extends FrameLayout if (newGroup == null) { newGroup = MessagingGroup.createGroup(mMessagingLinearLayout); mAddedGroups.add(newGroup); + } else if (newGroup.getParent() != mMessagingLinearLayout) { + throw new IllegalStateException( + "group parent was " + newGroup.getParent() + " but expected " + + mMessagingLinearLayout); } newGroup.setImageDisplayLocation(mIsCollapsed ? IMAGE_DISPLAY_LOCATION_EXTERNAL diff --git a/core/java/com/android/internal/widget/MessagingPool.java b/core/java/com/android/internal/widget/MessagingPool.java index 1c2c0151bd996..9c0fe4b07beb8 100644 --- a/core/java/com/android/internal/widget/MessagingPool.java +++ b/core/java/com/android/internal/widget/MessagingPool.java @@ -16,15 +16,18 @@ package com.android.internal.widget; +import android.util.Log; import android.util.Pools; +import android.view.View; /** * A trivial wrapper around Pools.SynchronizedPool which allows clearing the pool, as well as * disabling the pool class altogether. * @param the type of object in the pool */ -public class MessagingPool implements Pools.Pool { +public class MessagingPool implements Pools.Pool { private static final boolean ENABLED = false; // disabled to test b/208508846 + private static final String TAG = "MessagingPool"; private final int mMaxPoolSize; private Pools.SynchronizedPool mCurrentPool; @@ -37,12 +40,27 @@ public class MessagingPool implements Pools.Pool { @Override public T acquire() { - return ENABLED ? mCurrentPool.acquire() : null; + if (!ENABLED) { + return null; + } + T instance = mCurrentPool.acquire(); + if (instance.getParent() != null) { + Log.wtf(TAG, "acquired " + instance + " with parent " + instance.getParent()); + return null; + } + return instance; } @Override public boolean release(T instance) { - return ENABLED && mCurrentPool.release(instance); + if (instance.getParent() != null) { + Log.wtf(TAG, "releasing " + instance + " with parent " + instance.getParent()); + return false; + } + if (!ENABLED) { + return false; + } + return mCurrentPool.release(instance); } /** Clear the pool */