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
This commit is contained in:
Arc Wang
2021-02-01 15:50:50 +08:00
parent 0dc194d487
commit 6cccae1354
3 changed files with 63 additions and 5 deletions

View File

@@ -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

View File

@@ -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) {

View File

@@ -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);
}
}