/* * Copyright (C) 2007 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.util; import java.util.Calendar; /** * Helps answer common questions that come up when displaying a month in a * 6 row calendar grid format. * * Not thread safe. */ public class MonthDisplayHelper { // display pref private final int mWeekStartDay; // holds current month, year, helps compute display private Calendar mCalendar; // cached computed stuff that helps with display private int mNumDaysInMonth; private int mNumDaysInPrevMonth; private int mOffset; /** * @param year The year. * @param month The month. * @param weekStartDay What day of the week the week should start. */ public MonthDisplayHelper(int year, int month, int weekStartDay) { if (weekStartDay < Calendar.SUNDAY || weekStartDay > Calendar.SATURDAY) { throw new IllegalArgumentException(); } mWeekStartDay = weekStartDay; mCalendar = Calendar.getInstance(); mCalendar.set(Calendar.YEAR, year); mCalendar.set(Calendar.MONTH, month); mCalendar.set(Calendar.DAY_OF_MONTH, 1); mCalendar.set(Calendar.HOUR_OF_DAY, 0); mCalendar.set(Calendar.MINUTE, 0); mCalendar.set(Calendar.SECOND, 0); mCalendar.getTimeInMillis(); recalculate(); } public MonthDisplayHelper(int year, int month) { this(year, month, Calendar.SUNDAY); } public int getYear() { return mCalendar.get(Calendar.YEAR); } public int getMonth() { return mCalendar.get(Calendar.MONTH); } public int getWeekStartDay() { return mWeekStartDay; } /** * @return The first day of the month using a constants such as * {@link java.util.Calendar#SUNDAY}. */ public int getFirstDayOfMonth() { return mCalendar.get(Calendar.DAY_OF_WEEK); } /** * @return The number of days in the month. */ public int getNumberOfDaysInMonth() { return mNumDaysInMonth; } /** * @return The offset from displaying everything starting on the very first * box. For example, if the calendar is set to display the first day of * the week as Sunday, and the month starts on a Wednesday, the offset is 3. */ public int getOffset() { return mOffset; } /** * @param row Which row (0-5). * @return the digits of the month to display in one * of the 6 rows of a calendar month display. */ public int[] getDigitsForRow(int row) { if (row < 0 || row > 5) { throw new IllegalArgumentException("row " + row + " out of range (0-5)"); } int [] result = new int[7]; for (int column = 0; column < 7; column++) { result[column] = getDayAt(row, column); } return result; } /** * @param row The row, 0-5, starting from the top. * @param column The column, 0-6, starting from the left. * @return The day at a particular row, column */ public int getDayAt(int row, int column) { if (row == 0 && column < mOffset) { return mNumDaysInPrevMonth + column - mOffset + 1; } int day = 7 * row + column - mOffset + 1; return (day > mNumDaysInMonth) ? day - mNumDaysInMonth : day; } /** * @return Which row day is in. */ public int getRowOf(int day) { return (day + mOffset - 1) / 7; } /** * @return Which column day is in. */ public int getColumnOf(int day) { return (day + mOffset - 1) % 7; } /** * Decrement the month. */ public void previousMonth() { mCalendar.add(Calendar.MONTH, -1); recalculate(); } /** * Increment the month. */ public void nextMonth() { mCalendar.add(Calendar.MONTH, 1); recalculate(); } /** * @return Whether the row and column fall within the month. */ public boolean isWithinCurrentMonth(int row, int column) { if (row < 0 || column < 0 || row > 5 || column > 6) { return false; } if (row == 0 && column < mOffset) { return false; } int day = 7 * row + column - mOffset + 1; if (day > mNumDaysInMonth) { return false; } return true; } // helper method that recalculates cached values based on current month / year private void recalculate() { mNumDaysInMonth = mCalendar.getActualMaximum(Calendar.DAY_OF_MONTH); mCalendar.add(Calendar.MONTH, -1); mNumDaysInPrevMonth = mCalendar.getActualMaximum(Calendar.DAY_OF_MONTH); mCalendar.add(Calendar.MONTH, 1); int firstDayOfMonth = getFirstDayOfMonth(); int offset = firstDayOfMonth - mWeekStartDay; if (offset < 0) { offset += 7; } mOffset = offset; } }