From 0ca9728f35e7b2f2024c4a450e155ed63ddfbd70 Mon Sep 17 00:00:00 2001 From: "Wesley.CW Wang" Date: Mon, 8 Mar 2021 15:27:43 +0800 Subject: [PATCH] Clear UsageProgressBarPreference image view before setting images The legacy image view will be kept when setting different image view to UsageProgressBarPreference, this will cause UsageProgressBarPreference display duplicate views after setting many times, add removeAllViews() before addView() to fix it. Bug: 174964885 Test: atest UsageProgressBarPreferenceTest Change-Id: Id6b89dccb07a88f2f1be78a19c1de3ac3835087b --- .../widget/UsageProgressBarPreference.java | 1 + .../widget/UsageProgressBarPreferenceTest.java | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/packages/SettingsLib/UsageProgressBarPreference/src/com/android/settingslib/widget/UsageProgressBarPreference.java b/packages/SettingsLib/UsageProgressBarPreference/src/com/android/settingslib/widget/UsageProgressBarPreference.java index af64a1dc2282a..21859501c0578 100644 --- a/packages/SettingsLib/UsageProgressBarPreference/src/com/android/settingslib/widget/UsageProgressBarPreference.java +++ b/packages/SettingsLib/UsageProgressBarPreference/src/com/android/settingslib/widget/UsageProgressBarPreference.java @@ -160,6 +160,7 @@ public class UsageProgressBarPreference extends Preference { customLayout.removeAllViews(); customLayout.setVisibility(View.GONE); } else { + customLayout.removeAllViews(); customLayout.addView(mCustomImageView); customLayout.setVisibility(View.VISIBLE); } diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/widget/UsageProgressBarPreferenceTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/widget/UsageProgressBarPreferenceTest.java index 1a8477d9b86eb..fe76b06a9b617 100644 --- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/widget/UsageProgressBarPreferenceTest.java +++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/widget/UsageProgressBarPreferenceTest.java @@ -127,4 +127,20 @@ public class UsageProgressBarPreferenceTest { assertThat(customContent.getChildAt(0)).isEqualTo(imageView); assertThat(customContent.getVisibility()).isEqualTo(View.VISIBLE); } + + @Test + public void setCustomContent_setImageViewTwice_oneAndLatestChild() { + final ImageView imageViewLegacy = mock(ImageView.class); + final ImageView imageViewNew = mock(ImageView.class); + mUsageProgressBarPreference.setCustomContent(imageViewLegacy); + mUsageProgressBarPreference.setCustomContent(imageViewNew); + + mUsageProgressBarPreference.onBindViewHolder(mViewHolder); + + final FrameLayout customContent = + (FrameLayout) mViewHolder.findViewById(R.id.custom_content); + assertThat(customContent.getChildCount()).isEqualTo(1); + assertThat(customContent.getChildAt(0)).isEqualTo(imageViewNew); + assertThat(customContent.getVisibility()).isEqualTo(View.VISIBLE); + } }