diff --git a/res/values/strings.xml b/res/values/strings.xml
index 45d88162038..a611a82257d 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -8754,8 +8754,17 @@
^1 left
-
- %1$s left in this cycle
+
+ %d days left
+
+
+
+ - %d day left
+ - %d days left
+
+
+
+ Less than 1 day left
Updated by %1$s %2$s
diff --git a/src/com/android/settings/datausage/DataUsageSummaryPreference.java b/src/com/android/settings/datausage/DataUsageSummaryPreference.java
index e7f4a9dec7a..f1f3283b0d9 100644
--- a/src/com/android/settings/datausage/DataUsageSummaryPreference.java
+++ b/src/com/android/settings/datausage/DataUsageSummaryPreference.java
@@ -32,11 +32,13 @@ import com.android.settings.R;
import com.android.settingslib.utils.StringUtil;
import java.util.Objects;
+import java.util.concurrent.TimeUnit;
/**
* Provides a summary of data usage.
*/
public class DataUsageSummaryPreference extends Preference {
+ private static final long MILLIS_IN_A_DAY = TimeUnit.DAYS.toMillis(1);
private boolean mChartEnabled = true;
private String mStartLabel;
@@ -136,10 +138,7 @@ public class DataUsageSummaryPreference extends Preference {
TextView usageTitle = (TextView) holder.findViewById(R.id.usage_title);
usageTitle.setVisibility(mNumPlans > 1 ? View.VISIBLE : View.GONE);
- TextView cycleTime = (TextView) holder.findViewById(R.id.cycle_left_time);
- cycleTime.setText(getContext().getString(R.string.cycle_left_time_text,
- StringUtil.formatElapsedTime(getContext(),
- mCycleEndTimeMs - System.currentTimeMillis(),false /* withSeconds */)));
+ updateCycleTimeText(holder);
TextView carrierInfo = (TextView) holder.findViewById(R.id.carrier_and_update);
setCarrierInfo(carrierInfo, mCarrierName, mSnapshotTimeMs);
@@ -180,6 +179,21 @@ public class DataUsageSummaryPreference extends Preference {
}
}
+ private void updateCycleTimeText(PreferenceViewHolder holder) {
+ float daysLeft =
+ ((float) mCycleEndTimeMs - System.currentTimeMillis()) / MILLIS_IN_A_DAY;
+ if (daysLeft < 0) {
+ daysLeft = 0;
+ }
+
+ TextView cycleTime = (TextView) holder.findViewById(R.id.cycle_left_time);
+ cycleTime.setText(
+ (daysLeft > 0 && daysLeft < 1)
+ ? getContext().getString(R.string.billing_cycle_less_than_one_day_left)
+ : getContext().getResources().getQuantityString(
+ R.plurals.billing_cycle_days_left, (int) daysLeft, (int) daysLeft));
+ }
+
private void setCarrierInfo(TextView carrierInfo, CharSequence carrierName, long updateAge) {
if (mNumPlans > 0 && updateAge >= 0L) {
carrierInfo.setVisibility(View.VISIBLE);
diff --git a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java
index 2a64e90c2f7..0dd2d893545 100644
--- a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java
@@ -32,6 +32,7 @@ import com.android.settings.R;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl;
import com.android.settingslib.utils.StringUtil;
+import java.util.concurrent.TimeUnit;
import org.junit.Before;
import org.junit.Test;
@@ -137,16 +138,41 @@ public class DataUsageSummaryPreferenceTest {
}
@Test
- public void testSetUsageInfo_cycleRemainingTimeShown() {
- mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, DUMMY_CARRIER, 0 /* numPlans */,
+ public void testSetUsageInfo_cycleRemainingTimeIsLessOneDay() {
+ // just under one day
+ final long cycleEnd = System.currentTimeMillis() + TimeUnit.DAYS.toMillis(1) - 1;
+ mSummaryPreference.setUsageInfo(cycleEnd, mUpdateTime, DUMMY_CARRIER, 0 /* numPlans */,
new Intent());
- String cyclePrefix = StringUtil.formatElapsedTime(mContext, CYCLE_DURATION_MILLIS,
- false /* withSeconds */).toString();
- String text = mContext.getString(R.string.cycle_left_time_text, cyclePrefix);
bindViewHolder();
assertThat(mCycleTime.getVisibility()).isEqualTo(View.VISIBLE);
- assertThat(mCycleTime.getText()).isEqualTo(text);
+ assertThat(mCycleTime.getText()).isEqualTo(
+ mContext.getString(R.string.billing_cycle_less_than_one_day_left));
+ }
+
+ @Test
+ public void testSetUsageInfo_cycleRemainingTimeNegativeDaysLeft_shouldDisplayZeroDays() {
+ final long cycleEnd = System.currentTimeMillis() - 1L;
+ mSummaryPreference.setUsageInfo(cycleEnd, mUpdateTime, DUMMY_CARRIER, 0 /* numPlans */,
+ new Intent());
+
+ bindViewHolder();
+ assertThat(mCycleTime.getVisibility()).isEqualTo(View.VISIBLE);
+ assertThat(mCycleTime.getText()).isEqualTo(
+ mContext.getResources().getQuantityString(R.plurals.billing_cycle_days_left, 0, 0));
+ }
+
+ @Test
+ public void testSetUsageInfo_cycleRemainingTimeDaysLeft_shouldUsePlurals() {
+ final int daysLeft = 3;
+ final long cycleEnd = System.currentTimeMillis() + TimeUnit.DAYS.toMillis(daysLeft)
+ + TimeUnit.HOURS.toMillis(1);
+ mSummaryPreference.setUsageInfo(cycleEnd, mUpdateTime, DUMMY_CARRIER, 0 /* numPlans */,
+ new Intent());
+
+ bindViewHolder();
+ assertThat(mCycleTime.getVisibility()).isEqualTo(View.VISIBLE);
+ assertThat(mCycleTime.getText()).isEqualTo(daysLeft + " days left");
}
@Test