diff options
| author | 2021-02-01 15:50:50 +0800 | |
|---|---|---|
| committer | 2021-02-02 15:14:47 +0800 | |
| commit | 6cccae1354794e31b10bf30aad00586ba7fbfedc (patch) | |
| tree | 129b10b0856e4801ed3f6244a5387ec8d163b859 | |
| parent | 0dc194d487f4946d2a09cd479ecd16dda5be02dd (diff) | |
Support custom content in UsageProgressBarPreference
This change adds UsageProgressBarPreference#setCustomContent
for developers to set a custom ImageView at the right side
of total summary.
Bug: 177617478
Test: atest UsageProgressBarPreferenceTest
manual visual
Change-Id: I020bd406baabd289b09f196e0a22669442e13b8e
3 files changed, 63 insertions, 5 deletions
diff --git a/packages/SettingsLib/UsageProgressBarPreference/res/layout/preference_usage_progress_bar.xml b/packages/SettingsLib/UsageProgressBarPreference/res/layout/preference_usage_progress_bar.xml index 2f80ba01a7a1..f45105dc3311 100644 --- a/packages/SettingsLib/UsageProgressBarPreference/res/layout/preference_usage_progress_bar.xml +++ b/packages/SettingsLib/UsageProgressBarPreference/res/layout/preference_usage_progress_bar.xml @@ -34,10 +34,9 @@ android:id="@+id/usage_summary" android:layout_width="0dp" android:layout_height="wrap_content" - app:layout_constraintWidth_percent="0.6" + app:layout_constraintWidth_percent="0.45" app:layout_constraintStart_toStartOf="parent" app:layout_constraintBaseline_toBaselineOf="@id/total_summary" - android:singleLine="true" android:ellipsize="marquee" android:fontFamily="@*android:string/config_headlineFontFamily" android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Display1" @@ -47,13 +46,20 @@ android:id="@+id/total_summary" android:layout_width="0dp" android:layout_height="wrap_content" - app:layout_constraintWidth_percent="0.4" - app:layout_constraintEnd_toEndOf="parent" - android:singleLine="true" + app:layout_constraintWidth_percent="0.45" + app:layout_constraintEnd_toStartOf="@id/custom_content" android:ellipsize="marquee" android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1" android:textSize="14sp" android:textAlignment="viewEnd"/> + <FrameLayout + android:id="@+id/custom_content" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:visibility="gone" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintBottom_toBottomOf="@id/total_summary" + app:layout_constraintWidth_percent="0.1"/> </androidx.constraintlayout.widget.ConstraintLayout> <ProgressBar 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 950a8b4ad7cc..af64a1dc2282 100644 --- a/packages/SettingsLib/UsageProgressBarPreference/src/com/android/settingslib/widget/UsageProgressBarPreference.java +++ b/packages/SettingsLib/UsageProgressBarPreference/src/com/android/settingslib/widget/UsageProgressBarPreference.java @@ -22,6 +22,9 @@ import android.text.Spanned; import android.text.TextUtils; import android.text.style.RelativeSizeSpan; import android.util.AttributeSet; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; @@ -41,6 +44,7 @@ public class UsageProgressBarPreference extends Preference { private CharSequence mUsageSummary; private CharSequence mTotalSummary; + private ImageView mCustomImageView; private int mPercent = -1; /** @@ -110,6 +114,15 @@ public class UsageProgressBarPreference extends Preference { notifyChanged(); } + /** Set custom ImageView to the right side of total summary. */ + public <T extends ImageView> void setCustomContent(T imageView) { + if (imageView == mCustomImageView) { + return; + } + mCustomImageView = imageView; + notifyChanged(); + } + /** * Binds the created View to the data for this preference. * @@ -141,6 +154,15 @@ public class UsageProgressBarPreference extends Preference { progressBar.setIndeterminate(false); progressBar.setProgress(mPercent); } + + final FrameLayout customLayout = (FrameLayout) holder.findViewById(R.id.custom_content); + if (mCustomImageView == null) { + customLayout.removeAllViews(); + customLayout.setVisibility(View.GONE); + } else { + customLayout.addView(mCustomImageView); + customLayout.setVisibility(View.VISIBLE); + } } private CharSequence enlargeFontOfNumber(CharSequence summary) { 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 85e2174bf87a..1a8477d9b86e 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 @@ -18,11 +18,15 @@ package com.android.settingslib.widget; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.mock; + import android.content.Context; import android.text.SpannedString; import android.text.style.RelativeSizeSpan; import android.view.LayoutInflater; import android.view.View; +import android.widget.FrameLayout; +import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; @@ -97,4 +101,30 @@ public class UsageProgressBarPreferenceTest { .findViewById(android.R.id.progress); assertThat(progressBar.getProgress()).isEqualTo((int) (31.0f / 80 * 100)); } + + @Test + public void setCustomContent_setNullImageView_noChild() { + mUsageProgressBarPreference.setCustomContent(null /* imageView */); + + mUsageProgressBarPreference.onBindViewHolder(mViewHolder); + + final FrameLayout customContent = + (FrameLayout) mViewHolder.findViewById(R.id.custom_content); + assertThat(customContent.getChildCount()).isEqualTo(0); + assertThat(customContent.getVisibility()).isEqualTo(View.GONE); + } + + @Test + public void setCustomContent_setImageView_oneChild() { + final ImageView imageView = mock(ImageView.class); + mUsageProgressBarPreference.setCustomContent(imageView); + + mUsageProgressBarPreference.onBindViewHolder(mViewHolder); + + final FrameLayout customContent = + (FrameLayout) mViewHolder.findViewById(R.id.custom_content); + assertThat(customContent.getChildCount()).isEqualTo(1); + assertThat(customContent.getChildAt(0)).isEqualTo(imageView); + assertThat(customContent.getVisibility()).isEqualTo(View.VISIBLE); + } } |