From d18ffd8223282285ab5e6a576976c115e50bd509 Mon Sep 17 00:00:00 2001 From: Shunta Sato Date: Tue, 25 Oct 2016 17:42:58 +0900 Subject: [PATCH] Avoid Calendar's unexpect change in snapToCycleDay() Symptom: Calendar object's certain field is unexpectedly changed after using Calendar.add() method. Detail and sample: Following patch causes this issue. - Switch network cycle calculation to use Calendar. https://android.googlesource.com/platform/frameworks/base/+/f2bead5 Call of Calendar.add() method might make a smaller field value invariant. The smaller field means such a field of Calendar.HOUR_OF_DAY, Calendar.MINUTE, Calendar.SECOND and so on if Calendar.MONTH field is focused. According to above, sometimes correct Calendar value won't be acquired by original code. To avoid unexpected change, it requires initialization toward each smaller field after Calendar.add() call. Solutions: Calendar.DAY_OF_MONTH, Calendar.HOUR_OF_DAY, Calendar.MINUTE, and Calendar.SECOND fields is set to 0 after added value to Calendar.MONTH field. Bug: 32724903 Author: Shigeki Yokomichi Change-Id: I7af6391653be21786b662b2f8eaad10c413733c1 --- core/java/android/net/NetworkPolicyManager.java | 5 ++++- .../com/android/server/NetworkPolicyManagerServiceTest.java | 11 +++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/core/java/android/net/NetworkPolicyManager.java b/core/java/android/net/NetworkPolicyManager.java index 11b861aef5aa..22850b4bdb89 100644 --- a/core/java/android/net/NetworkPolicyManager.java +++ b/core/java/android/net/NetworkPolicyManager.java @@ -298,8 +298,11 @@ public class NetworkPolicyManager { cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); if (cycleDay > cal.getActualMaximum(Calendar.DAY_OF_MONTH)) { - cal.set(Calendar.DAY_OF_MONTH, 1); cal.add(Calendar.MONTH, 1); + cal.set(Calendar.DAY_OF_MONTH, 1); + cal.set(Calendar.HOUR_OF_DAY, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.SECOND, 0); cal.add(Calendar.SECOND, -1); } else { cal.set(Calendar.DAY_OF_MONTH, cycleDay); diff --git a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java index ef95fb8f6354..a545af96da70 100644 --- a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java @@ -447,6 +447,17 @@ public class NetworkPolicyManagerServiceTest { } @Test + public void testLastCycleBoundaryJanuaryDST() throws Exception { + final long currentTime = parseTime("1989-01-26T21:00:00.000Z"); + final long expectedCycle = parseTime("1989-01-01T01:59:59.000Z"); + + final NetworkPolicy policy = new NetworkPolicy( + sTemplateWifi, 32, "America/Argentina/Buenos_Aires", 1024L, 1024L, false); + final long actualCycle = computeLastCycleBoundary(currentTime, policy); + assertTimeEquals(expectedCycle, actualCycle); + } + + @Test public void testNetworkPolicyAppliedCycleLastMonth() throws Exception { NetworkState[] state = null; NetworkStats stats = null; -- 2.11.0