Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6cccae13 authored by Arc Wang's avatar Arc Wang
Browse files

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
parent 0dc194d4
Loading
Loading
Loading
Loading
+11 −5
Original line number Diff line number Diff line
@@ -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
+22 −0
Original line number Diff line number Diff line
@@ -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) {
+30 −0
Original line number Diff line number Diff line
@@ -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);
    }
}