UnixCalendar.java revision d26bea3a1498d1b327ae37cc796fb8cd67e9c977
1d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski/** 2d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski * Copyright (C) 2014 The Android Open Source Project 3d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski * 4d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski * use this file except in compliance with the License. You may obtain a copy 6d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski * of the License at 7d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski * 8d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 9d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski * 10d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski * Unless required by applicable law or agreed to in writing, software 11d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski * License for the specific language governing permissions and limitations 14d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski * under the License. 15d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski */ 16d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinskipackage com.android.server.usage; 17d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski 18d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinskiimport android.app.usage.UsageStatsManager; 19d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski 20d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski/** 21d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski * A handy calendar object that knows nothing of Locale's or TimeZones. This simplifies 22d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski * interval book-keeping. It is *NOT* meant to be used as a user-facing calendar, as it has 23d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski * no concept of Locale or TimeZone. 24d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski */ 25d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinskipublic class UnixCalendar { 26d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski private static final long DAY_IN_MILLIS = 24 * 60 * 60 * 1000; 27d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski private static final long WEEK_IN_MILLIS = 7 * DAY_IN_MILLIS; 28d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski private static final long MONTH_IN_MILLIS = 30 * DAY_IN_MILLIS; 29d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski private static final long YEAR_IN_MILLIS = 365 * DAY_IN_MILLIS; 30d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski private long mTime; 31d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski 32d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski public UnixCalendar(long time) { 33d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski mTime = time; 34d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski } 35d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski 36d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski public void truncateToDay() { 37d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski mTime -= mTime % DAY_IN_MILLIS; 38d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski } 39d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski 40d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski public void truncateToWeek() { 41d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski mTime -= mTime % WEEK_IN_MILLIS; 42d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski } 43d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski 44d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski public void truncateToMonth() { 45d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski mTime -= mTime % MONTH_IN_MILLIS; 46d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski } 47d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski 48d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski public void truncateToYear() { 49d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski mTime -= mTime % YEAR_IN_MILLIS; 50d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski } 51d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski 52d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski public void addDays(int val) { 53d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski mTime += val * DAY_IN_MILLIS; 54d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski } 55d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski 56d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski public void addWeeks(int val) { 57d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski mTime += val * WEEK_IN_MILLIS; 58d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski } 59d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski 60d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski public void addMonths(int val) { 61d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski mTime += val * MONTH_IN_MILLIS; 62d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski } 63d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski 64d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski public void addYears(int val) { 65d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski mTime += val * YEAR_IN_MILLIS; 66d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski } 67d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski 68d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski public void setTimeInMillis(long time) { 69d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski mTime = time; 70d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski } 71d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski 72d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski public long getTimeInMillis() { 73d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski return mTime; 74d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski } 75d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski 76d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski public static void truncateTo(UnixCalendar calendar, int intervalType) { 77d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski switch (intervalType) { 78d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski case UsageStatsManager.INTERVAL_YEARLY: 79d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski calendar.truncateToYear(); 80d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski break; 81d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski 82d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski case UsageStatsManager.INTERVAL_MONTHLY: 83d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski calendar.truncateToMonth(); 84d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski break; 85d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski 86d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski case UsageStatsManager.INTERVAL_WEEKLY: 87d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski calendar.truncateToWeek(); 88d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski break; 89d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski 90d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski case UsageStatsManager.INTERVAL_DAILY: 91d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski calendar.truncateToDay(); 92d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski break; 93d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski 94d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski default: 95d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski throw new UnsupportedOperationException("Can't truncate date to interval " + 96d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski intervalType); 97d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski } 98d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski } 99d26bea3a1498d1b327ae37cc796fb8cd67e9c977Adam Lesinski} 100