OSDN Git Service

In Data Usage screen, Below the data bar, Add “X days left” field.
authorJan Nordqvist <jannq@google.com>
Fri, 9 Mar 2018 23:13:46 +0000 (15:13 -0800)
committerSundeep Ghuman <sghuman@google.com>
Thu, 15 Mar 2018 07:17:53 +0000 (00:17 -0700)
Bug: 70950124

Test: manual
Test: make RunSettingsRoboTests
Change-Id: I35eb3f0c09c84d609ad54e87400913ec77e19ea0

res/values/strings.xml
src/com/android/settings/datausage/DataUsageSummaryPreference.java
tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java

index 45d8816..a611a82 100644 (file)
     <!-- Optional part of data usage showing the remaining amount [CHAR LIMIT=30] -->
     <string name="data_remaining"><xliff:g name="bytes" example="2 GB">^1</xliff:g> left</string>
 
-    <!-- Informational text about time left in billing cycle [CHAR LIMIT=30] -->
-    <string name="cycle_left_time_text"><xliff:g name="time" example="2d">%1$s</xliff:g> left in this cycle</string>
+    <!-- Informational text about time left in billing cycle [CHAR LIMIT=60] -->
+    <string name="cycle_left_multiple_days"><xliff:g name="time" example="2d">%d</xliff:g> days left</string>
+
+    <!-- Informational text about time left in billing cycle [CHAR LIMIT=60] -->
+    <plurals name="billing_cycle_days_left">
+        <item quantity="one">%d day left</item>
+        <item quantity="other">%d days left</item>
+    </plurals>
+
+    <!-- Informational text about time left in billing cycle [CHAR LIMIT=60] -->
+    <string name="billing_cycle_less_than_one_day_left">Less than 1 day left</string>
 
     <!-- Informational text about carrier and update time [CHAR LIMIT=30] -->
     <string name="carrier_and_update_text">Updated by <xliff:g name="carrier" example="T-mobile">%1$s</xliff:g> <xliff:g name="time" example="3m">%2$s</xliff:g></string>
index e7f4a9d..f1f3283 100644 (file)
@@ -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);
index 2a64e90..0dd2d89 100644 (file)
@@ -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());
+
+        bindViewHolder();
+        assertThat(mCycleTime.getVisibility()).isEqualTo(View.VISIBLE);
+        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());
-        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(daysLeft + " days left");
     }
 
     @Test