diff --git a/res/layout/data_usage_summary_preference.xml b/res/layout/data_usage_summary_preference.xml index c2e1581d9e7..eda8a81e250 100644 --- a/res/layout/data_usage_summary_preference.xml +++ b/res/layout/data_usage_summary_preference.xml @@ -35,15 +35,34 @@ android:textColor="?android:attr/textColorSecondary" android:text="@string/data_usage_title" /> - + android:paddingTop="12dp" + android:paddingBottom="4dp" + android:orientation="horizontal"> + + + + + + + + ^1 used - , ^1 left + ^1 left %1$s left in this cycle diff --git a/src/com/android/settings/datausage/DataUsageSummary.java b/src/com/android/settings/datausage/DataUsageSummary.java index 2d505892ab3..6d9ef3836c8 100644 --- a/src/com/android/settings/datausage/DataUsageSummary.java +++ b/src/com/android/settings/datausage/DataUsageSummary.java @@ -234,12 +234,17 @@ public class DataUsageSummary extends DataUsageBaseFragment implements Indexable static CharSequence formatUsage(Context context, String template, long usageLevel) { final float LARGER_SIZE = 1.25f * 1.25f; // (1/0.8)^2 final float SMALLER_SIZE = 1.0f / LARGER_SIZE; // 0.8^2 + return formatUsage(context, template, usageLevel, LARGER_SIZE, SMALLER_SIZE); + } + + static CharSequence formatUsage(Context context, String template, long usageLevel, + float larger, float smaller) { final int FLAGS = Spannable.SPAN_INCLUSIVE_INCLUSIVE; final Formatter.BytesResult usedResult = Formatter.formatBytes(context.getResources(), usageLevel, Formatter.FLAG_CALCULATE_ROUNDED); final SpannableString enlargedValue = new SpannableString(usedResult.value); - enlargedValue.setSpan(new RelativeSizeSpan(LARGER_SIZE), 0, enlargedValue.length(), FLAGS); + enlargedValue.setSpan(new RelativeSizeSpan(larger), 0, enlargedValue.length(), FLAGS); final SpannableString amountTemplate = new SpannableString( context.getString(com.android.internal.R.string.fileSizeSuffix) @@ -248,7 +253,7 @@ public class DataUsageSummary extends DataUsageBaseFragment implements Indexable enlargedValue, usedResult.units); final SpannableString fullTemplate = new SpannableString(template); - fullTemplate.setSpan(new RelativeSizeSpan(SMALLER_SIZE), 0, fullTemplate.length(), FLAGS); + fullTemplate.setSpan(new RelativeSizeSpan(smaller), 0, fullTemplate.length(), FLAGS); return TextUtils.expandTemplate(fullTemplate, BidiFormatter.getInstance().unicodeWrap(formattedUsage.toString())); } diff --git a/src/com/android/settings/datausage/DataUsageSummaryPreference.java b/src/com/android/settings/datausage/DataUsageSummaryPreference.java index dbf87fe5bed..94e70002376 100644 --- a/src/com/android/settings/datausage/DataUsageSummaryPreference.java +++ b/src/com/android/settings/datausage/DataUsageSummaryPreference.java @@ -21,6 +21,7 @@ import android.content.Intent; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceViewHolder; import android.text.TextUtils; +import android.text.format.Formatter; import android.util.AttributeSet; import android.view.View; import android.widget.Button; @@ -41,6 +42,10 @@ public class DataUsageSummaryPreference extends Preference { private String mStartLabel; private String mEndLabel; + /** large vs small size is 36/16 ~ 2.25 */ + private static final float LARGER_FONT_RATIO = 2.25f; + private static final float SMALLER_FONT_RATIO = 1.0f; + private int mNumPlans; /** The ending time of the billing cycle in milliseconds since epoch. */ private long mCycleEndTimeMs; @@ -53,6 +58,16 @@ public class DataUsageSummaryPreference extends Preference { /** Progress to display on ProgressBar */ private float mProgress; + private boolean mHasMobileData; + + /** + * The size of the first registered plan if one exists or the size of the warning if it is set. + * -1 if no information is available. + */ + private long mDataplanSize; + + /** The number of bytes used since the start of the cycle. */ + private long mDataplanUse; public DataUsageSummaryPreference(Context context, AttributeSet attrs) { super(context, attrs); @@ -94,10 +109,18 @@ public class DataUsageSummaryPreference extends Preference { notifyChanged(); } + void setUsageNumbers(long used, long dataPlanSize, boolean hasMobileData) { + mDataplanUse = used; + mDataplanSize = dataPlanSize; + mHasMobileData = hasMobileData; + notifyChanged(); + } + @Override public void onBindViewHolder(PreferenceViewHolder holder) { super.onBindViewHolder(holder); + if (mChartEnabled && (!TextUtils.isEmpty(mStartLabel) || !TextUtils.isEmpty(mEndLabel))) { holder.findViewById(R.id.label_bar).setVisibility(View.VISIBLE); ProgressBar bar = (ProgressBar) holder.findViewById(R.id.determinateBar); @@ -108,6 +131,17 @@ public class DataUsageSummaryPreference extends Preference { holder.findViewById(R.id.label_bar).setVisibility(View.GONE); } + TextView usageNumberField = (TextView) holder.findViewById(R.id.data_usage_view); + usageNumberField.setText(TextUtils.expandTemplate( + getContext().getString(R.string.data_used), + Formatter.formatFileSize(getContext(), mDataplanUse))); + if (mHasMobileData && mNumPlans >= 0 && mDataplanSize > 0L) { + TextView usageRemainingField = (TextView) holder.findViewById(R.id.data_remaining_view); + usageRemainingField.setText( + TextUtils.expandTemplate(getContext().getText(R.string.data_remaining), + Formatter.formatFileSize(getContext(), mDataplanSize - mDataplanUse))); + } + TextView usageTitle = (TextView) holder.findViewById(R.id.usage_title); usageTitle.setVisibility(mNumPlans > 1 ? View.VISIBLE : View.GONE); diff --git a/src/com/android/settings/datausage/DataUsageSummaryPreferenceController.java b/src/com/android/settings/datausage/DataUsageSummaryPreferenceController.java index 0729fff1517..5deca964fbd 100644 --- a/src/com/android/settings/datausage/DataUsageSummaryPreferenceController.java +++ b/src/com/android/settings/datausage/DataUsageSummaryPreferenceController.java @@ -174,19 +174,7 @@ public class DataUsageSummaryPreferenceController extends BasePreferenceControll summaryPreference.setLimitInfo(null); } - final StringBuilder title = new StringBuilder(); - if (mHasMobileData) { - title.append(formatUsage(mContext, mContext.getString(R.string.data_used), - mDataplanUse)); - if (mDataplanCount >= 0 && mDataplanSize > 0L) { - title.append(formatUsage(mContext, mContext.getString(R.string.data_remaining), - mDataplanSize - mDataplanUse)); - } - } else { - title.append(formatUsage(mContext, mContext.getString(mDataUsageTemplate), - mDataplanUse)); - } - summaryPreference.setTitle(title.toString()); + summaryPreference.setUsageNumbers(mDataplanUse, mDataplanSize, mHasMobileData); if (mDataplanSize <= 0) { summaryPreference.setChartEnabled(false); diff --git a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java index 57f1f8c6f66..f17e8b5e781 100644 --- a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java +++ b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java @@ -55,6 +55,8 @@ public class DataUsageSummaryPreferenceTest { private TextView mCycleTime; private TextView mCarrierInfo; private TextView mDataLimits; + private TextView mDataUsed; + private TextView mDataRemaining; private Button mLaunchButton; private LinearLayout mLabelBar; private TextView mLabel1; @@ -205,12 +207,35 @@ public class DataUsageSummaryPreferenceTest { mSummaryPreference.setLabels("0.0 GB", "5.0 GB"); } + public void testSetUsageAndRemainingInfo_withUsageInfo_dataUsageAndRemainingShown() { + mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, DUMMY_CARRIER, 1 /* numPlans */, + new Intent()); + mSummaryPreference.setUsageNumbers(1000000L, 10000000L, true); + + bindViewHolder(); + assertThat(mDataUsed.getText().toString()).isEqualTo("1.00 MB used"); + assertThat(mDataRemaining.getText().toString()).isEqualTo("9.00 MB left"); + } + + @Test + public void testSetUsageInfo_withUsageInfo_dataUsageShown() { + mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, DUMMY_CARRIER, 0 /* numPlans */, + new Intent()); + mSummaryPreference.setUsageNumbers(1000000L, -1L, true); + + bindViewHolder(); + assertThat(mDataUsed.getText().toString()).isEqualTo("1.00 MB used"); + assertThat(mDataRemaining.getText()).isEqualTo(""); + } + private void bindViewHolder() { mSummaryPreference.onBindViewHolder(mHolder); mUsageTitle = (TextView) mHolder.findViewById(R.id.usage_title); mCycleTime = (TextView) mHolder.findViewById(R.id.cycle_left_time); mCarrierInfo = (TextView) mHolder.findViewById(R.id.carrier_and_update); mDataLimits = (TextView) mHolder.findViewById(R.id.data_limits); + mDataUsed = (TextView) mHolder.findViewById(R.id.data_usage_view); + mDataRemaining = (TextView) mHolder.findViewById(R.id.data_remaining_view); mLaunchButton = (Button) mHolder.findViewById(R.id.launch_mdp_app_button); mLabelBar = (LinearLayout) mHolder.findViewById(R.id.label_bar); mLabel1 = (TextView) mHolder.findViewById(R.id.text1);