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 +}