diff options
author | Jeff Sharkey <jsharkey@android.com> | 2011-06-10 15:14:07 -0700 |
---|---|---|
committer | Jeff Sharkey <jsharkey@android.com> | 2011-06-10 19:45:34 -0700 |
commit | cd2ca4038a027315832c38c68be5076000bc4b53 (patch) | |
tree | 27018030282a7f5fd1b12608da4e1077a73b8d3e /core/java/android/net/NetworkPolicyManager.java | |
parent | 21c9c45e5caf62b935354b74392fb40c4bf18529 (diff) | |
download | frameworks_base-cd2ca4038a027315832c38c68be5076000bc4b53.zip frameworks_base-cd2ca4038a027315832c38c68be5076000bc4b53.tar.gz frameworks_base-cd2ca4038a027315832c38c68be5076000bc4b53.tar.bz2 |
Move data cycle methods to framework object.
Moved so they can be used by both system service and Settings UI, since
they both work with data usage cycles. Still covered by tests.
Change-Id: I01c0c4db6da9457dd867c9167d31a5f9f8e5f5d9
Diffstat (limited to 'core/java/android/net/NetworkPolicyManager.java')
-rw-r--r-- | core/java/android/net/NetworkPolicyManager.java | 81 |
1 files changed, 80 insertions, 1 deletions
diff --git a/core/java/android/net/NetworkPolicyManager.java b/core/java/android/net/NetworkPolicyManager.java index 0f4dc9a..08b1a81 100644 --- a/core/java/android/net/NetworkPolicyManager.java +++ b/core/java/android/net/NetworkPolicyManager.java @@ -16,8 +16,11 @@ package android.net; +import static android.text.format.Time.MONTH_DAY; + import android.content.Context; import android.os.RemoteException; +import android.text.format.Time; import java.io.PrintWriter; @@ -88,7 +91,83 @@ public class NetworkPolicyManager { return POLICY_NONE; } } - + + /** + * Compute the last cycle boundary for the given {@link NetworkPolicy}. For + * example, if cycle day is 20th, and today is June 15th, it will return May + * 20th. When cycle day doesn't exist in current month, it snaps to the 1st + * of following month. + * + * @hide + */ + public static long computeLastCycleBoundary(long currentTime, NetworkPolicy policy) { + final Time now = new Time(Time.TIMEZONE_UTC); + now.set(currentTime); + + // first, find cycle boundary for current month + final Time cycle = new Time(now); + cycle.hour = cycle.minute = cycle.second = 0; + snapToCycleDay(cycle, policy.cycleDay); + + if (Time.compare(cycle, now) >= 0) { + // cycle boundary is beyond now, use last cycle boundary; start by + // pushing ourselves squarely into last month. + final Time lastMonth = new Time(now); + lastMonth.hour = lastMonth.minute = lastMonth.second = 0; + lastMonth.monthDay = 1; + lastMonth.month -= 1; + lastMonth.normalize(true); + + cycle.set(lastMonth); + snapToCycleDay(cycle, policy.cycleDay); + } + + return cycle.toMillis(true); + } + + /** {@hide} */ + public static long computeNextCycleBoundary(long currentTime, NetworkPolicy policy) { + final Time now = new Time(Time.TIMEZONE_UTC); + now.set(currentTime); + + // first, find cycle boundary for current month + final Time cycle = new Time(now); + cycle.hour = cycle.minute = cycle.second = 0; + snapToCycleDay(cycle, policy.cycleDay); + + if (Time.compare(cycle, now) <= 0) { + // cycle boundary is before now, use next cycle boundary; start by + // pushing ourselves squarely into next month. + final Time nextMonth = new Time(now); + nextMonth.hour = nextMonth.minute = nextMonth.second = 0; + nextMonth.monthDay = 1; + nextMonth.month += 1; + nextMonth.normalize(true); + + cycle.set(nextMonth); + snapToCycleDay(cycle, policy.cycleDay); + } + + return cycle.toMillis(true); + } + + /** + * Snap to the cycle day for the current month given; when cycle day doesn't + * exist, it snaps to 1st of following month. + * + * @hide + */ + public static void snapToCycleDay(Time time, int cycleDay) { + if (cycleDay > time.getActualMaximum(MONTH_DAY)) { + // cycle day isn't valid this month; snap to 1st of next month + time.month += 1; + time.monthDay = 1; + } else { + time.monthDay = cycleDay; + } + time.normalize(true); + } + /** {@hide} */ public static void dumpPolicy(PrintWriter fout, int policy) { fout.write("["); |