diff --git a/res/values/strings.xml b/res/values/strings.xml
index 50eb3c8778b..d09beab802f 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -8825,10 +8825,16 @@
Less than 1 day left
- Updated by %1$s %2$s
+ Updated by ^1 ^2 ago
-
- Updated %1$s
+
+ Updated ^2 ago
+
+
+ Updated by ^1 just now
+
+
+ Updated just now
View plan
diff --git a/src/com/android/settings/datausage/DataUsageSummaryPreference.java b/src/com/android/settings/datausage/DataUsageSummaryPreference.java
index 2c61e21957e..6b00a6891a3 100644
--- a/src/com/android/settings/datausage/DataUsageSummaryPreference.java
+++ b/src/com/android/settings/datausage/DataUsageSummaryPreference.java
@@ -16,8 +16,10 @@
package com.android.settings.datausage;
+import android.annotation.AttrRes;
import android.content.Context;
import android.content.Intent;
+import android.graphics.Typeface;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceViewHolder;
import android.text.Spannable;
@@ -31,6 +33,7 @@ import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.R;
import com.android.settingslib.Utils;
import com.android.settingslib.utils.StringUtil;
@@ -44,6 +47,8 @@ import java.util.concurrent.TimeUnit;
public class DataUsageSummaryPreference extends Preference {
private static final long MILLIS_IN_A_DAY = TimeUnit.DAYS.toMillis(1);
private static final long WARNING_AGE = TimeUnit.HOURS.toMillis(6L);
+ @VisibleForTesting static final Typeface SANS_SERIF_MEDIUM =
+ Typeface.create("sans-serif-medium", Typeface.NORMAL);
private boolean mChartEnabled = true;
private String mStartLabel;
@@ -217,24 +222,64 @@ public class DataUsageSummaryPreference extends Preference {
private void updateCarrierInfo(TextView carrierInfo) {
if (mNumPlans > 0 && mSnapshotTimeMs >= 0L) {
- long updateAge = System.currentTimeMillis() - mSnapshotTimeMs;
carrierInfo.setVisibility(View.VISIBLE);
- if (mCarrierName != null) {
- carrierInfo.setText(getContext().getString(R.string.carrier_and_update_text,
- mCarrierName, StringUtil.formatRelativeTime(
- getContext(), updateAge, false /* withSeconds */)));
- } else {
- carrierInfo.setText(getContext().getString(R.string.no_carrier_update_text,
- StringUtil.formatRelativeTime(
- getContext(), updateAge, false /* withSeconds */)));
- }
+ long updateAgeMillis = calculateTruncatedUpdateAge();
- carrierInfo.setTextColor(
- updateAge <= WARNING_AGE
- ? Utils.getColorAttr(getContext(), android.R.attr.textColorPrimary)
- : Utils.getColorAttr(getContext(), android.R.attr.colorError));
+ int textResourceId;
+ CharSequence updateTime = null;
+ if (updateAgeMillis == 0) {
+ if (mCarrierName != null) {
+ textResourceId = R.string.carrier_and_update_now_text;
+ } else {
+ textResourceId = R.string.no_carrier_update_now_text;
+ }
+ } else {
+ if (mCarrierName != null) {
+ textResourceId = R.string.carrier_and_update_text;
+ } else {
+ textResourceId = R.string.no_carrier_update_text;
+ }
+ updateTime = StringUtil.formatElapsedTime(
+ getContext(), updateAgeMillis, false /* withSeconds */);
+ }
+ carrierInfo.setText(TextUtils.expandTemplate(
+ getContext().getText(textResourceId),
+ mCarrierName,
+ updateTime));
+
+ if (updateAgeMillis <= WARNING_AGE) {
+ setCarrierInfoTextStyle(
+ carrierInfo, android.R.attr.textColorSecondary, Typeface.SANS_SERIF);
+ } else {
+ setCarrierInfoTextStyle(carrierInfo, android.R.attr.colorError, SANS_SERIF_MEDIUM);
+ }
} else {
carrierInfo.setVisibility(View.GONE);
}
}
+
+ /**
+ * Returns the time since the last carrier update, as defined by {@link #mSnapshotTimeMs},
+ * truncated to the nearest day / hour / minute in milliseconds, or 0 if less than 1 min.
+ */
+ private long calculateTruncatedUpdateAge() {
+ long updateAgeMillis = System.currentTimeMillis() - mSnapshotTimeMs;
+
+ // Round to nearest whole unit
+ if (updateAgeMillis >= TimeUnit.DAYS.toMillis(1)) {
+ return (updateAgeMillis / TimeUnit.DAYS.toMillis(1)) * TimeUnit.DAYS.toMillis(1);
+ } else if (updateAgeMillis >= TimeUnit.HOURS.toMillis(1)) {
+ return (updateAgeMillis / TimeUnit.HOURS.toMillis(1)) * TimeUnit.HOURS.toMillis(1);
+ } else if (updateAgeMillis >= TimeUnit.MINUTES.toMillis(1)) {
+ return (updateAgeMillis / TimeUnit.MINUTES.toMillis(1)) * TimeUnit.MINUTES.toMillis(1);
+ } else {
+ return 0;
+ }
+ }
+
+ private void setCarrierInfoTextStyle(
+ TextView carrierInfo, @AttrRes int colorId, Typeface typeface) {
+ carrierInfo.setTextColor(Utils.getColorAttr(getContext(), colorId));
+ carrierInfo.setTypeface(typeface);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java
index bfa296b6af1..072f558364c 100644
--- a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java
@@ -16,8 +16,11 @@
package com.android.settings.datausage;
+import static com.google.common.truth.Truth.assertThat;
+
import android.content.Context;
import android.content.Intent;
+import android.graphics.Typeface;
import android.support.v7.preference.PreferenceViewHolder;
import android.view.LayoutInflater;
import android.view.View;
@@ -30,8 +33,6 @@ import com.android.settings.R;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl;
import com.android.settingslib.Utils;
-import com.android.settingslib.utils.StringUtil;
-import java.util.concurrent.TimeUnit;
import org.junit.Before;
import org.junit.Test;
@@ -42,8 +43,6 @@ import org.robolectric.annotation.Config;
import java.util.concurrent.TimeUnit;
-import static com.google.common.truth.Truth.assertThat;
-
@RunWith(SettingsRobolectricTestRunner.class)
@Config(shadows = SettingsShadowResourcesImpl.class)
public class DataUsageSummaryPreferenceTest {
@@ -123,7 +122,88 @@ public class DataUsageSummaryPreferenceTest {
}
@Test
- public void testSetUsageInfo_withRecentCarrierUpdate_doesNotSetCarrierInfoWarningColor() {
+ public void testCarrierUpdateTime_shouldFormatDaysCorrectly() {
+ int baseUnit = 2;
+ int smudge = 6;
+ final long updateTime = System.currentTimeMillis()
+ - TimeUnit.DAYS.toMillis(baseUnit) - TimeUnit.HOURS.toMillis(smudge);
+ mCarrierInfo = (TextView) mHolder.findViewById(R.id.carrier_and_update);
+ mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, DUMMY_CARRIER, 1 /* numPlans */,
+ new Intent());
+
+ bindViewHolder();
+ assertThat(mCarrierInfo.getText().toString())
+ .isEqualTo("Updated by " + DUMMY_CARRIER + " " + baseUnit + "d ago");
+ }
+
+ @Test
+ public void testCarrierUpdateTime_shouldFormatHoursCorrectly() {
+ int baseUnit = 2;
+ int smudge = 6;
+ final long updateTime = System.currentTimeMillis()
+ - TimeUnit.HOURS.toMillis(baseUnit) - TimeUnit.MINUTES.toMillis(smudge);
+ mCarrierInfo = (TextView) mHolder.findViewById(R.id.carrier_and_update);
+ mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, DUMMY_CARRIER, 1 /* numPlans */,
+ new Intent());
+
+ bindViewHolder();
+ assertThat(mCarrierInfo.getText().toString())
+ .isEqualTo("Updated by " + DUMMY_CARRIER + " " + baseUnit + "h ago");
+ }
+
+ @Test
+ public void testCarrierUpdateTime_shouldFormatMinutesCorrectly() {
+ int baseUnit = 2;
+ int smudge = 6;
+ final long updateTime = System.currentTimeMillis()
+ - TimeUnit.MINUTES.toMillis(baseUnit) - TimeUnit.SECONDS.toMillis(smudge);
+ mCarrierInfo = (TextView) mHolder.findViewById(R.id.carrier_and_update);
+ mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, DUMMY_CARRIER, 1 /* numPlans */,
+ new Intent());
+
+ bindViewHolder();
+ assertThat(mCarrierInfo.getText().toString())
+ .isEqualTo("Updated by " + DUMMY_CARRIER + " " + baseUnit + "m ago");
+ }
+
+ @Test
+ public void testCarrierUpdateTime_shouldFormatLessThanMinuteCorrectly() {
+ final long updateTime = System.currentTimeMillis() - TimeUnit.SECONDS.toMillis(45);
+ mCarrierInfo = (TextView) mHolder.findViewById(R.id.carrier_and_update);
+ mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, DUMMY_CARRIER, 1 /* numPlans */,
+ new Intent());
+
+ bindViewHolder();
+ assertThat(mCarrierInfo.getText().toString())
+ .isEqualTo("Updated by " + DUMMY_CARRIER + " just now");
+ }
+
+ @Test
+ public void testCarrierUpdateTimeWithNoCarrier_shouldSayJustNow() {
+ final long updateTime = System.currentTimeMillis() - TimeUnit.SECONDS.toMillis(45);
+ mCarrierInfo = (TextView) mHolder.findViewById(R.id.carrier_and_update);
+ mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, null /* carrier */,
+ 1 /* numPlans */, new Intent());
+
+ bindViewHolder();
+ assertThat(mCarrierInfo.getText().toString())
+ .isEqualTo("Updated just now");
+ }
+
+ @Test
+ public void testCarrierUpdateTimeWithNoCarrier_shouldFormatTime() {
+ final long updateTime = System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(2);
+ mCarrierInfo = (TextView) mHolder.findViewById(R.id.carrier_and_update);
+ mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, null /* carrier */,
+ 1 /* numPlans */, new Intent());
+
+ bindViewHolder();
+ assertThat(mCarrierInfo.getText().toString())
+ .isEqualTo("Updated 2m ago");
+ }
+
+ @Test
+ public void testSetUsageInfo_withRecentCarrierUpdate_doesNotSetCarrierInfoWarningColorAndFont() {
final long updateTime = System.currentTimeMillis() - TimeUnit.HOURS.toMillis(1);
mCarrierInfo = (TextView) mHolder.findViewById(R.id.carrier_and_update);
mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, DUMMY_CARRIER, 1 /* numPlans */,
@@ -132,11 +212,12 @@ public class DataUsageSummaryPreferenceTest {
bindViewHolder();
assertThat(mCarrierInfo.getVisibility()).isEqualTo(View.VISIBLE);
assertThat(mCarrierInfo.getCurrentTextColor()).isEqualTo(
- Utils.getColorAttr(mContext, android.R.attr.textColorPrimary));
+ Utils.getColorAttr(mContext, android.R.attr.textColorSecondary));
+ assertThat(mCarrierInfo.getTypeface()).isEqualTo(Typeface.SANS_SERIF);
}
@Test
- public void testSetUsageInfo_withStaleCarrierUpdate_setsCarrierInfoWarningColor() {
+ public void testSetUsageInfo_withStaleCarrierUpdate_setsCarrierInfoWarningColorAndFont() {
final long updateTime = System.currentTimeMillis() - TimeUnit.HOURS.toMillis(7);
mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, DUMMY_CARRIER, 1 /* numPlans */,
new Intent());
@@ -145,6 +226,8 @@ public class DataUsageSummaryPreferenceTest {
assertThat(mCarrierInfo.getVisibility()).isEqualTo(View.VISIBLE);
assertThat(mCarrierInfo.getCurrentTextColor()).isEqualTo(
Utils.getColorAttr(mContext, android.R.attr.colorError));
+ assertThat(mCarrierInfo.getTypeface()).isEqualTo(
+ DataUsageSummaryPreference.SANS_SERIF_MEDIUM);
}
@Test
@@ -311,4 +394,4 @@ public class DataUsageSummaryPreferenceTest {
mLabel2 = (TextView) mHolder.findViewById(R.id.text2);
mProgressBar = (ProgressBar) mHolder.findViewById(R.id.determinateBar);
}
-}
\ No newline at end of file
+}