diff options
| author | Jeff Sharkey <jsharkey@android.com> | 2012-03-09 17:07:21 -0800 |
|---|---|---|
| committer | Jeff Sharkey <jsharkey@android.com> | 2012-03-09 17:10:05 -0800 |
| commit | 9bf3150cfae03421c9dd237b46657714859d871c (patch) | |
| tree | f62a9a964ba0c745ec0cd45814a45cf8fbf922e4 | |
| parent | 92d291ef6481c6cbb1305780dd4f450a16bb9a7a (diff) | |
| download | frameworks_base-9bf3150cfae03421c9dd237b46657714859d871c.zip frameworks_base-9bf3150cfae03421c9dd237b46657714859d871c.tar.gz frameworks_base-9bf3150cfae03421c9dd237b46657714859d871c.tar.bz2 | |
Save timezone when setting data cycle reset date.
Instead of cycle reset at midnight UTC, use midnight of timezone
active when user last set cycle reset date. Tests to verify, and
also to test leap year behavior.
Bug: 5938567
Change-Id: Ie06f7f0fa242d23110f9586a3f4f7037af87b31b
4 files changed, 95 insertions, 34 deletions
diff --git a/core/java/android/net/NetworkPolicy.java b/core/java/android/net/NetworkPolicy.java index 04cf1a3..5b94784 100644 --- a/core/java/android/net/NetworkPolicy.java +++ b/core/java/android/net/NetworkPolicy.java @@ -36,6 +36,7 @@ public class NetworkPolicy implements Parcelable, Comparable<NetworkPolicy> { public final NetworkTemplate template; public int cycleDay; + public String cycleTimezone; public long warningBytes; public long limitBytes; public long lastWarningSnooze; @@ -44,15 +45,18 @@ public class NetworkPolicy implements Parcelable, Comparable<NetworkPolicy> { private static final long DEFAULT_MTU = 1500; - public NetworkPolicy(NetworkTemplate template, int cycleDay, long warningBytes, - long limitBytes, boolean metered) { - this(template, cycleDay, warningBytes, limitBytes, SNOOZE_NEVER, SNOOZE_NEVER, metered); + public NetworkPolicy(NetworkTemplate template, int cycleDay, String cycleTimezone, + long warningBytes, long limitBytes, boolean metered) { + this(template, cycleDay, cycleTimezone, warningBytes, limitBytes, SNOOZE_NEVER, + SNOOZE_NEVER, metered); } - public NetworkPolicy(NetworkTemplate template, int cycleDay, long warningBytes, - long limitBytes, long lastWarningSnooze, long lastLimitSnooze, boolean metered) { + public NetworkPolicy(NetworkTemplate template, int cycleDay, String cycleTimezone, + long warningBytes, long limitBytes, long lastWarningSnooze, long lastLimitSnooze, + boolean metered) { this.template = checkNotNull(template, "missing NetworkTemplate"); this.cycleDay = cycleDay; + this.cycleTimezone = checkNotNull(cycleTimezone, "missing cycleTimezone"); this.warningBytes = warningBytes; this.limitBytes = limitBytes; this.lastWarningSnooze = lastWarningSnooze; @@ -63,6 +67,7 @@ public class NetworkPolicy implements Parcelable, Comparable<NetworkPolicy> { public NetworkPolicy(Parcel in) { template = in.readParcelable(null); cycleDay = in.readInt(); + cycleTimezone = in.readString(); warningBytes = in.readLong(); limitBytes = in.readLong(); lastWarningSnooze = in.readLong(); @@ -70,10 +75,11 @@ public class NetworkPolicy implements Parcelable, Comparable<NetworkPolicy> { metered = in.readInt() != 0; } - /** {@inheritDoc} */ + @Override public void writeToParcel(Parcel dest, int flags) { dest.writeParcelable(template, flags); dest.writeInt(cycleDay); + dest.writeString(cycleTimezone); dest.writeLong(warningBytes); dest.writeLong(limitBytes); dest.writeLong(lastWarningSnooze); @@ -81,7 +87,7 @@ public class NetworkPolicy implements Parcelable, Comparable<NetworkPolicy> { dest.writeInt(metered ? 1 : 0); } - /** {@inheritDoc} */ + @Override public int describeContents() { return 0; } @@ -112,7 +118,7 @@ public class NetworkPolicy implements Parcelable, Comparable<NetworkPolicy> { lastLimitSnooze = SNOOZE_NEVER; } - /** {@inheritDoc} */ + @Override public int compareTo(NetworkPolicy another) { if (another == null || another.limitBytes == LIMIT_DISABLED) { // other value is missing or disabled; we win @@ -127,8 +133,8 @@ public class NetworkPolicy implements Parcelable, Comparable<NetworkPolicy> { @Override public int hashCode() { - return Objects.hashCode(template, cycleDay, warningBytes, limitBytes, lastWarningSnooze, - lastLimitSnooze, metered); + return Objects.hashCode(template, cycleDay, cycleTimezone, warningBytes, limitBytes, + lastWarningSnooze, lastLimitSnooze, metered); } @Override @@ -139,6 +145,7 @@ public class NetworkPolicy implements Parcelable, Comparable<NetworkPolicy> { && limitBytes == other.limitBytes && lastWarningSnooze == other.lastWarningSnooze && lastLimitSnooze == other.lastLimitSnooze && metered == other.metered + && Objects.equal(cycleTimezone, other.cycleTimezone) && Objects.equal(template, other.template); } return false; @@ -146,17 +153,19 @@ public class NetworkPolicy implements Parcelable, Comparable<NetworkPolicy> { @Override public String toString() { - return "NetworkPolicy[" + template + "]: cycleDay=" + cycleDay + ", warningBytes=" - + warningBytes + ", limitBytes=" + limitBytes + ", lastWarningSnooze=" - + lastWarningSnooze + ", lastLimitSnooze=" + lastLimitSnooze + ", metered=" - + metered; + return "NetworkPolicy[" + template + "]: cycleDay=" + cycleDay + ", cycleTimezone=" + + cycleTimezone + ", warningBytes=" + warningBytes + ", limitBytes=" + limitBytes + + ", lastWarningSnooze=" + lastWarningSnooze + ", lastLimitSnooze=" + + lastLimitSnooze + ", metered=" + metered; } public static final Creator<NetworkPolicy> CREATOR = new Creator<NetworkPolicy>() { + @Override public NetworkPolicy createFromParcel(Parcel in) { return new NetworkPolicy(in); } + @Override public NetworkPolicy[] newArray(int size) { return new NetworkPolicy[size]; } diff --git a/core/java/android/net/NetworkPolicyManager.java b/core/java/android/net/NetworkPolicyManager.java index 9d253c7..7173751 100644 --- a/core/java/android/net/NetworkPolicyManager.java +++ b/core/java/android/net/NetworkPolicyManager.java @@ -131,7 +131,7 @@ public class NetworkPolicyManager { * @hide */ public static long computeLastCycleBoundary(long currentTime, NetworkPolicy policy) { - final Time now = new Time(Time.TIMEZONE_UTC); + final Time now = new Time(policy.cycleTimezone); now.set(currentTime); // first, find cycle boundary for current month @@ -157,7 +157,7 @@ public class NetworkPolicyManager { /** {@hide} */ public static long computeNextCycleBoundary(long currentTime, NetworkPolicy policy) { - final Time now = new Time(Time.TIMEZONE_UTC); + final Time now = new Time(policy.cycleTimezone); now.set(currentTime); // first, find cycle boundary for current month @@ -183,7 +183,7 @@ public class NetworkPolicyManager { /** * Snap to the cycle day for the current month given; when cycle day doesn't - * exist, it snaps to 1st of following month. + * exist, it snaps to last second of current month. * * @hide */ diff --git a/services/java/com/android/server/net/NetworkPolicyManagerService.java b/services/java/com/android/server/net/NetworkPolicyManagerService.java index a890068..2ad24e2 100644 --- a/services/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/java/com/android/server/net/NetworkPolicyManagerService.java @@ -156,6 +156,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { private static final int VERSION_ADDED_RESTRICT_BACKGROUND = 3; private static final int VERSION_ADDED_METERED = 4; private static final int VERSION_SPLIT_SNOOZE = 5; + private static final int VERSION_ADDED_TIMEZONE = 6; // @VisibleForTesting public static final int TYPE_WARNING = 0x1; @@ -171,6 +172,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { private static final String ATTR_NETWORK_TEMPLATE = "networkTemplate"; private static final String ATTR_SUBSCRIBER_ID = "subscriberId"; private static final String ATTR_CYCLE_DAY = "cycleDay"; + private static final String ATTR_CYCLE_TIMEZONE = "cycleTimezone"; private static final String ATTR_WARNING_BYTES = "warningBytes"; private static final String ATTR_LIMIT_BYTES = "limitBytes"; private static final String ATTR_LAST_SNOOZE = "lastSnooze"; @@ -922,13 +924,15 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { com.android.internal.R.integer.config_networkPolicyDefaultWarning) * MB_IN_BYTES; - final Time time = new Time(Time.TIMEZONE_UTC); + final Time time = new Time(); time.setToNow(); + final int cycleDay = time.monthDay; + final String cycleTimezone = time.timezone; final NetworkTemplate template = buildTemplateMobileAll(subscriberId); - mNetworkPolicy.put(template, new NetworkPolicy(template, cycleDay, warningBytes, - LIMIT_DISABLED, SNOOZE_NEVER, SNOOZE_NEVER, true)); + mNetworkPolicy.put(template, new NetworkPolicy(template, cycleDay, cycleTimezone, + warningBytes, LIMIT_DISABLED, SNOOZE_NEVER, SNOOZE_NEVER, true)); writePolicyLocked(); } } @@ -964,6 +968,12 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { final int networkTemplate = readIntAttribute(in, ATTR_NETWORK_TEMPLATE); final String subscriberId = in.getAttributeValue(null, ATTR_SUBSCRIBER_ID); final int cycleDay = readIntAttribute(in, ATTR_CYCLE_DAY); + final String cycleTimezone; + if (version >= VERSION_ADDED_TIMEZONE) { + cycleTimezone = in.getAttributeValue(null, ATTR_CYCLE_TIMEZONE); + } else { + cycleTimezone = Time.TIMEZONE_UTC; + } final long warningBytes = readLongAttribute(in, ATTR_WARNING_BYTES); final long limitBytes = readLongAttribute(in, ATTR_LIMIT_BYTES); final long lastLimitSnooze; @@ -998,8 +1008,8 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { final NetworkTemplate template = new NetworkTemplate( networkTemplate, subscriberId); mNetworkPolicy.put(template, new NetworkPolicy(template, cycleDay, - warningBytes, limitBytes, lastWarningSnooze, lastLimitSnooze, - metered)); + cycleTimezone, warningBytes, limitBytes, lastWarningSnooze, + lastLimitSnooze, metered)); } else if (TAG_UID_POLICY.equals(tag)) { final int uid = readIntAttribute(in, ATTR_UID); @@ -1054,7 +1064,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { out.startDocument(null, true); out.startTag(null, TAG_POLICY_LIST); - writeIntAttribute(out, ATTR_VERSION, VERSION_SPLIT_SNOOZE); + writeIntAttribute(out, ATTR_VERSION, VERSION_ADDED_TIMEZONE); writeBooleanAttribute(out, ATTR_RESTRICT_BACKGROUND, mRestrictBackground); // write all known network policies @@ -1068,6 +1078,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { out.attribute(null, ATTR_SUBSCRIBER_ID, subscriberId); } writeIntAttribute(out, ATTR_CYCLE_DAY, policy.cycleDay); + out.attribute(null, ATTR_CYCLE_TIMEZONE, policy.cycleTimezone); writeLongAttribute(out, ATTR_WARNING_BYTES, policy.warningBytes); writeLongAttribute(out, ATTR_LIMIT_BYTES, policy.limitBytes); writeLongAttribute(out, ATTR_LAST_WARNING_SNOOZE, policy.lastWarningSnooze); diff --git a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java index e863f8b..b4fd55e 100644 --- a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java @@ -32,6 +32,7 @@ import static android.net.TrafficStats.KB_IN_BYTES; import static android.net.TrafficStats.MB_IN_BYTES; import static android.text.format.DateUtils.DAY_IN_MILLIS; import static android.text.format.DateUtils.MINUTE_IN_MILLIS; +import static android.text.format.Time.TIMEZONE_UTC; import static com.android.server.net.NetworkPolicyManagerService.TYPE_LIMIT; import static com.android.server.net.NetworkPolicyManagerService.TYPE_LIMIT_SNOOZED; import static com.android.server.net.NetworkPolicyManagerService.TYPE_WARNING; @@ -439,7 +440,7 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase { final long expectedCycle = parseTime("2007-11-05T00:00:00.000Z"); final NetworkPolicy policy = new NetworkPolicy( - sTemplateWifi, 5, 1024L, 1024L, false); + sTemplateWifi, 5, TIMEZONE_UTC, 1024L, 1024L, false); final long actualCycle = computeLastCycleBoundary(currentTime, policy); assertTimeEquals(expectedCycle, actualCycle); } @@ -450,7 +451,7 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase { final long expectedCycle = parseTime("2007-10-20T00:00:00.000Z"); final NetworkPolicy policy = new NetworkPolicy( - sTemplateWifi, 20, 1024L, 1024L, false); + sTemplateWifi, 20, TIMEZONE_UTC, 1024L, 1024L, false); final long actualCycle = computeLastCycleBoundary(currentTime, policy); assertTimeEquals(expectedCycle, actualCycle); } @@ -461,7 +462,7 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase { final long expectedCycle = parseTime("2007-01-30T00:00:00.000Z"); final NetworkPolicy policy = new NetworkPolicy( - sTemplateWifi, 30, 1024L, 1024L, false); + sTemplateWifi, 30, TIMEZONE_UTC, 1024L, 1024L, false); final long actualCycle = computeLastCycleBoundary(currentTime, policy); assertTimeEquals(expectedCycle, actualCycle); } @@ -472,14 +473,53 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase { final long expectedCycle = parseTime("2007-02-28T23:59:59.000Z"); final NetworkPolicy policy = new NetworkPolicy( - sTemplateWifi, 30, 1024L, 1024L, false); + sTemplateWifi, 30, TIMEZONE_UTC, 1024L, 1024L, false); final long actualCycle = computeLastCycleBoundary(currentTime, policy); assertTimeEquals(expectedCycle, actualCycle); } + public void testCycleBoundaryLeapYear() throws Exception { + final NetworkPolicy policy = new NetworkPolicy( + sTemplateWifi, 29, TIMEZONE_UTC, 1024L, 1024L, false); + + assertTimeEquals(parseTime("2012-01-29T00:00:00.000Z"), + computeNextCycleBoundary(parseTime("2012-01-14T00:00:00.000Z"), policy)); + assertTimeEquals(parseTime("2012-02-29T00:00:00.000Z"), + computeNextCycleBoundary(parseTime("2012-02-14T00:00:00.000Z"), policy)); + assertTimeEquals(parseTime("2012-02-29T00:00:00.000Z"), + computeLastCycleBoundary(parseTime("2012-03-14T00:00:00.000Z"), policy)); + assertTimeEquals(parseTime("2012-03-29T00:00:00.000Z"), + computeNextCycleBoundary(parseTime("2012-03-14T00:00:00.000Z"), policy)); + + assertTimeEquals(parseTime("2007-01-29T00:00:00.000Z"), + computeNextCycleBoundary(parseTime("2007-01-14T00:00:00.000Z"), policy)); + assertTimeEquals(parseTime("2007-02-28T23:59:59.000Z"), + computeNextCycleBoundary(parseTime("2007-02-14T00:00:00.000Z"), policy)); + assertTimeEquals(parseTime("2007-02-28T23:59:59.000Z"), + computeLastCycleBoundary(parseTime("2007-03-14T00:00:00.000Z"), policy)); + assertTimeEquals(parseTime("2007-03-29T00:00:00.000Z"), + computeNextCycleBoundary(parseTime("2007-03-14T00:00:00.000Z"), policy)); + } + + public void testNextCycleTimezoneAfterUtc() throws Exception { + // US/Central is UTC-6 + final NetworkPolicy policy = new NetworkPolicy( + sTemplateWifi, 10, "US/Central", 1024L, 1024L, false); + assertTimeEquals(parseTime("2012-01-10T06:00:00.000Z"), + computeNextCycleBoundary(parseTime("2012-01-05T00:00:00.000Z"), policy)); + } + + public void testNextCycleTimezoneBeforeUtc() throws Exception { + // Israel is UTC+2 + final NetworkPolicy policy = new NetworkPolicy( + sTemplateWifi, 10, "Israel", 1024L, 1024L, false); + assertTimeEquals(parseTime("2012-01-09T22:00:00.000Z"), + computeNextCycleBoundary(parseTime("2012-01-05T00:00:00.000Z"), policy)); + } + public void testNextCycleSane() throws Exception { final NetworkPolicy policy = new NetworkPolicy( - sTemplateWifi, 31, WARNING_DISABLED, LIMIT_DISABLED, false); + sTemplateWifi, 31, TIMEZONE_UTC, WARNING_DISABLED, LIMIT_DISABLED, false); final LinkedHashSet<Long> seen = new LinkedHashSet<Long>(); // walk forwards, ensuring that cycle boundaries don't get stuck @@ -494,7 +534,7 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase { public void testLastCycleSane() throws Exception { final NetworkPolicy policy = new NetworkPolicy( - sTemplateWifi, 31, WARNING_DISABLED, LIMIT_DISABLED, false); + sTemplateWifi, 31, TIMEZONE_UTC, WARNING_DISABLED, LIMIT_DISABLED, false); final LinkedHashSet<Long> seen = new LinkedHashSet<Long>(); // walk backwards, ensuring that cycle boundaries look sane @@ -552,7 +592,7 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase { replay(); setNetworkPolicies(new NetworkPolicy( - sTemplateWifi, CYCLE_DAY, 1 * MB_IN_BYTES, 2 * MB_IN_BYTES, false)); + sTemplateWifi, CYCLE_DAY, TIMEZONE_UTC, 1 * MB_IN_BYTES, 2 * MB_IN_BYTES, false)); future.get(); verifyAndReset(); } @@ -609,8 +649,8 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase { future = expectMeteredIfacesChanged(); replay(); - setNetworkPolicies(new NetworkPolicy(sTemplateWifi, CYCLE_DAY, 1 * MB_IN_BYTES, - 2 * MB_IN_BYTES, false)); + setNetworkPolicies(new NetworkPolicy(sTemplateWifi, CYCLE_DAY, TIMEZONE_UTC, 1 + * MB_IN_BYTES, 2 * MB_IN_BYTES, false)); future.get(); verifyAndReset(); } @@ -740,8 +780,9 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase { future = expectMeteredIfacesChanged(TEST_IFACE); replay(); - setNetworkPolicies(new NetworkPolicy(sTemplateWifi, CYCLE_DAY, WARNING_DISABLED, - LIMIT_DISABLED, true)); + setNetworkPolicies(new NetworkPolicy( + sTemplateWifi, CYCLE_DAY, TIMEZONE_UTC, WARNING_DISABLED, LIMIT_DISABLED, + true)); future.get(); verifyAndReset(); } |
