214 lines
5.5 KiB
Java
214 lines
5.5 KiB
Java
/*
|
|
* 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;
|
|
}
|
|
}
|