Modify "Updated ..." text.
Use d/h/m "narrow" time formatting with no period. Change font style when update is "old." Bug: 70950124 Test: make RunSettingsRoboTests ROBOTEST_FILTER=DataUsageSummaryPreferenceTest Change-Id: I25902c98eb0fdf4dd2f64c3f5d668b5efdcdff0c
This commit is contained in:
@@ -8800,10 +8800,16 @@
|
|||||||
<string name="billing_cycle_less_than_one_day_left">Less than 1 day left</string>
|
<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] -->
|
<!-- 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>
|
<string name="carrier_and_update_text">Updated by <xliff:g name="carrier" example="T-mobile">^1</xliff:g> <xliff:g name="time" example="3m">^2</xliff:g> ago</string>
|
||||||
|
|
||||||
<!-- Informational text about update time only, without carrier [CHAR LIMIT=30] -->
|
<!-- Informational text about update time only, without carrier. First argument intentionally skipped. [CHAR LIMIT=30] -->
|
||||||
<string name="no_carrier_update_text">Updated <xliff:g name="time" example="3m">%1$s</xliff:g></string>
|
<string name="no_carrier_update_text">Updated <xliff:g name="time" example="3m">^2</xliff:g> ago</string>
|
||||||
|
|
||||||
|
<!-- Informational text about a recent carrier and update time [CHAR LIMIT=30] -->
|
||||||
|
<string name="carrier_and_update_now_text">Updated by <xliff:g name="carrier" example="T-mobile">^1</xliff:g> just now</string>
|
||||||
|
|
||||||
|
<!-- Informational text about recent update time only, without carrier [CHAR LIMIT=30] -->
|
||||||
|
<string name="no_carrier_update_now_text">Updated just now</string>
|
||||||
|
|
||||||
<!-- Button to launch external data plan app [CHAR LIMIT=30] -->
|
<!-- Button to launch external data plan app [CHAR LIMIT=30] -->
|
||||||
<string name="launch_mdp_app_text">VIEW PLAN</string>
|
<string name="launch_mdp_app_text">VIEW PLAN</string>
|
||||||
|
@@ -16,8 +16,10 @@
|
|||||||
|
|
||||||
package com.android.settings.datausage;
|
package com.android.settings.datausage;
|
||||||
|
|
||||||
|
import android.annotation.AttrRes;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
import android.graphics.Typeface;
|
||||||
import android.support.v7.preference.Preference;
|
import android.support.v7.preference.Preference;
|
||||||
import android.support.v7.preference.PreferenceViewHolder;
|
import android.support.v7.preference.PreferenceViewHolder;
|
||||||
import android.text.Spannable;
|
import android.text.Spannable;
|
||||||
@@ -31,6 +33,7 @@ import android.widget.Button;
|
|||||||
import android.widget.ProgressBar;
|
import android.widget.ProgressBar;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import com.android.internal.annotations.VisibleForTesting;
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settingslib.Utils;
|
import com.android.settingslib.Utils;
|
||||||
import com.android.settingslib.utils.StringUtil;
|
import com.android.settingslib.utils.StringUtil;
|
||||||
@@ -44,6 +47,8 @@ import java.util.concurrent.TimeUnit;
|
|||||||
public class DataUsageSummaryPreference extends Preference {
|
public class DataUsageSummaryPreference extends Preference {
|
||||||
private static final long MILLIS_IN_A_DAY = TimeUnit.DAYS.toMillis(1);
|
private static final long MILLIS_IN_A_DAY = TimeUnit.DAYS.toMillis(1);
|
||||||
private static final long WARNING_AGE = TimeUnit.HOURS.toMillis(6L);
|
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 boolean mChartEnabled = true;
|
||||||
private String mStartLabel;
|
private String mStartLabel;
|
||||||
@@ -216,24 +221,64 @@ public class DataUsageSummaryPreference extends Preference {
|
|||||||
|
|
||||||
private void updateCarrierInfo(TextView carrierInfo) {
|
private void updateCarrierInfo(TextView carrierInfo) {
|
||||||
if (mNumPlans > 0 && mSnapshotTimeMs >= 0L) {
|
if (mNumPlans > 0 && mSnapshotTimeMs >= 0L) {
|
||||||
long updateAge = System.currentTimeMillis() - mSnapshotTimeMs;
|
|
||||||
carrierInfo.setVisibility(View.VISIBLE);
|
carrierInfo.setVisibility(View.VISIBLE);
|
||||||
if (mCarrierName != null) {
|
long updateAgeMillis = calculateTruncatedUpdateAge();
|
||||||
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 */)));
|
|
||||||
}
|
|
||||||
|
|
||||||
carrierInfo.setTextColor(
|
int textResourceId;
|
||||||
updateAge <= WARNING_AGE
|
CharSequence updateTime = null;
|
||||||
? Utils.getColorAttr(getContext(), android.R.attr.textColorPrimary)
|
if (updateAgeMillis == 0) {
|
||||||
: Utils.getColorAttr(getContext(), android.R.attr.colorError));
|
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 {
|
} else {
|
||||||
carrierInfo.setVisibility(View.GONE);
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -16,8 +16,11 @@
|
|||||||
|
|
||||||
package com.android.settings.datausage;
|
package com.android.settings.datausage;
|
||||||
|
|
||||||
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
import android.graphics.Typeface;
|
||||||
import android.support.v7.preference.PreferenceViewHolder;
|
import android.support.v7.preference.PreferenceViewHolder;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
@@ -30,8 +33,6 @@ import com.android.settings.R;
|
|||||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||||
import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl;
|
import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl;
|
||||||
import com.android.settingslib.Utils;
|
import com.android.settingslib.Utils;
|
||||||
import com.android.settingslib.utils.StringUtil;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
@@ -42,8 +43,6 @@ import org.robolectric.annotation.Config;
|
|||||||
|
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
|
||||||
|
|
||||||
@RunWith(SettingsRobolectricTestRunner.class)
|
@RunWith(SettingsRobolectricTestRunner.class)
|
||||||
@Config(shadows = SettingsShadowResourcesImpl.class)
|
@Config(shadows = SettingsShadowResourcesImpl.class)
|
||||||
public class DataUsageSummaryPreferenceTest {
|
public class DataUsageSummaryPreferenceTest {
|
||||||
@@ -123,7 +122,88 @@ public class DataUsageSummaryPreferenceTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@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);
|
final long updateTime = System.currentTimeMillis() - TimeUnit.HOURS.toMillis(1);
|
||||||
mCarrierInfo = (TextView) mHolder.findViewById(R.id.carrier_and_update);
|
mCarrierInfo = (TextView) mHolder.findViewById(R.id.carrier_and_update);
|
||||||
mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, DUMMY_CARRIER, 1 /* numPlans */,
|
mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, DUMMY_CARRIER, 1 /* numPlans */,
|
||||||
@@ -132,11 +212,12 @@ public class DataUsageSummaryPreferenceTest {
|
|||||||
bindViewHolder();
|
bindViewHolder();
|
||||||
assertThat(mCarrierInfo.getVisibility()).isEqualTo(View.VISIBLE);
|
assertThat(mCarrierInfo.getVisibility()).isEqualTo(View.VISIBLE);
|
||||||
assertThat(mCarrierInfo.getCurrentTextColor()).isEqualTo(
|
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
|
@Test
|
||||||
public void testSetUsageInfo_withStaleCarrierUpdate_setsCarrierInfoWarningColor() {
|
public void testSetUsageInfo_withStaleCarrierUpdate_setsCarrierInfoWarningColorAndFont() {
|
||||||
final long updateTime = System.currentTimeMillis() - TimeUnit.HOURS.toMillis(7);
|
final long updateTime = System.currentTimeMillis() - TimeUnit.HOURS.toMillis(7);
|
||||||
mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, DUMMY_CARRIER, 1 /* numPlans */,
|
mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, DUMMY_CARRIER, 1 /* numPlans */,
|
||||||
new Intent());
|
new Intent());
|
||||||
@@ -145,6 +226,8 @@ public class DataUsageSummaryPreferenceTest {
|
|||||||
assertThat(mCarrierInfo.getVisibility()).isEqualTo(View.VISIBLE);
|
assertThat(mCarrierInfo.getVisibility()).isEqualTo(View.VISIBLE);
|
||||||
assertThat(mCarrierInfo.getCurrentTextColor()).isEqualTo(
|
assertThat(mCarrierInfo.getCurrentTextColor()).isEqualTo(
|
||||||
Utils.getColorAttr(mContext, android.R.attr.colorError));
|
Utils.getColorAttr(mContext, android.R.attr.colorError));
|
||||||
|
assertThat(mCarrierInfo.getTypeface()).isEqualTo(
|
||||||
|
DataUsageSummaryPreference.SANS_SERIF_MEDIUM);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -308,4 +391,4 @@ public class DataUsageSummaryPreferenceTest {
|
|||||||
mLabel2 = (TextView) mHolder.findViewById(R.id.text2);
|
mLabel2 = (TextView) mHolder.findViewById(R.id.text2);
|
||||||
mProgressBar = (ProgressBar) mHolder.findViewById(R.id.determinateBar);
|
mProgressBar = (ProgressBar) mHolder.findViewById(R.id.determinateBar);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user