summaryrefslogtreecommitdiff
path: root/src/com/android/calendar/month/SimpleWeekView.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/calendar/month/SimpleWeekView.java')
-rw-r--r--src/com/android/calendar/month/SimpleWeekView.java551
1 files changed, 0 insertions, 551 deletions
diff --git a/src/com/android/calendar/month/SimpleWeekView.java b/src/com/android/calendar/month/SimpleWeekView.java
deleted file mode 100644
index 4d0c09f4..00000000
--- a/src/com/android/calendar/month/SimpleWeekView.java
+++ /dev/null
@@ -1,551 +0,0 @@
-/*
- * Copyright (C) 2010 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 com.android.calendar.month;
-
-import com.android.calendar.R;
-import com.android.calendar.Utils;
-
-import android.app.Service;
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.Paint.Align;
-import android.graphics.Paint.Style;
-import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
-import android.text.format.DateUtils;
-import android.text.format.Time;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.accessibility.AccessibilityEvent;
-import android.view.accessibility.AccessibilityManager;
-
-import java.security.InvalidParameterException;
-import java.util.HashMap;
-
-/**
- * <p>
- * This is a dynamic view for drawing a single week. It can be configured to
- * display the week number, start the week on a given day, or show a reduced
- * number of days. It is intended for use as a single view within a ListView.
- * See {@link SimpleWeeksAdapter} for usage.
- * </p>
- */
-public class SimpleWeekView extends View {
- private static final String TAG = "MonthView";
-
- /**
- * These params can be passed into the view to control how it appears.
- * {@link #VIEW_PARAMS_WEEK} is the only required field, though the default
- * values are unlikely to fit most layouts correctly.
- */
- /**
- * This sets the height of this week in pixels
- */
- public static final String VIEW_PARAMS_HEIGHT = "height";
- /**
- * This specifies the position (or weeks since the epoch) of this week,
- * calculated using {@link Utils#getWeeksSinceEpochFromJulianDay}
- */
- public static final String VIEW_PARAMS_WEEK = "week";
- /**
- * This sets one of the days in this view as selected {@link Time#SUNDAY}
- * through {@link Time#SATURDAY}.
- */
- public static final String VIEW_PARAMS_SELECTED_DAY = "selected_day";
- /**
- * Which day the week should start on. {@link Time#SUNDAY} through
- * {@link Time#SATURDAY}.
- */
- public static final String VIEW_PARAMS_WEEK_START = "week_start";
- /**
- * How many days to display at a time. Days will be displayed starting with
- * {@link #mWeekStart}.
- */
- public static final String VIEW_PARAMS_NUM_DAYS = "num_days";
- /**
- * Which month is currently in focus, as defined by {@link Time#month}
- * [0-11].
- */
- public static final String VIEW_PARAMS_FOCUS_MONTH = "focus_month";
- /**
- * If this month should display week numbers. false if 0, true otherwise.
- */
- public static final String VIEW_PARAMS_SHOW_WK_NUM = "show_wk_num";
-
- protected static int DEFAULT_HEIGHT = 32;
- protected static int MIN_HEIGHT = 10;
- protected static final int DEFAULT_SELECTED_DAY = -1;
- protected static final int DEFAULT_WEEK_START = Time.SUNDAY;
- protected static final int DEFAULT_NUM_DAYS = 7;
- protected static final int DEFAULT_SHOW_WK_NUM = 0;
- protected static final int DEFAULT_FOCUS_MONTH = -1;
-
- protected static int DAY_SEPARATOR_WIDTH = 1;
-
- protected static int MINI_DAY_NUMBER_TEXT_SIZE = 14;
- protected static int MINI_WK_NUMBER_TEXT_SIZE = 12;
- protected static int MINI_TODAY_NUMBER_TEXT_SIZE = 18;
- protected static int MINI_TODAY_OUTLINE_WIDTH = 2;
- protected static int WEEK_NUM_MARGIN_BOTTOM = 4;
-
- // used for scaling to the device density
- protected static float mScale = 0;
-
- // affects the padding on the sides of this view
- protected int mPadding = 0;
-
- protected Rect r = new Rect();
- protected Paint p = new Paint();
- protected Paint mMonthNumPaint;
- protected Drawable mSelectedDayLine;
-
- // Cache the number strings so we don't have to recompute them each time
- protected String[] mDayNumbers;
- // Quick lookup for checking which days are in the focus month
- protected boolean[] mFocusDay;
- // Quick lookup for checking which days are in an odd month (to set a different background)
- protected boolean[] mOddMonth;
- // The Julian day of the first day displayed by this item
- protected int mFirstJulianDay = -1;
- // The month of the first day in this week
- protected int mFirstMonth = -1;
- // The month of the last day in this week
- protected int mLastMonth = -1;
- // The position of this week, equivalent to weeks since the week of Jan 1st,
- // 1970
- protected int mWeek = -1;
- // Quick reference to the width of this view, matches parent
- protected int mWidth;
- // The height this view should draw at in pixels, set by height param
- protected int mHeight = DEFAULT_HEIGHT;
- // Whether the week number should be shown
- protected boolean mShowWeekNum = false;
- // If this view contains the selected day
- protected boolean mHasSelectedDay = false;
- // If this view contains the today
- protected boolean mHasToday = false;
- // Which day is selected [0-6] or -1 if no day is selected
- protected int mSelectedDay = DEFAULT_SELECTED_DAY;
- // Which day is today [0-6] or -1 if no day is today
- protected int mToday = DEFAULT_SELECTED_DAY;
- // Which day of the week to start on [0-6]
- protected int mWeekStart = DEFAULT_WEEK_START;
- // How many days to display
- protected int mNumDays = DEFAULT_NUM_DAYS;
- // The number of days + a spot for week number if it is displayed
- protected int mNumCells = mNumDays;
- // The left edge of the selected day
- protected int mSelectedLeft = -1;
- // The right edge of the selected day
- protected int mSelectedRight = -1;
- // The timezone to display times/dates in (used for determining when Today
- // is)
- protected String mTimeZone = Time.getCurrentTimezone();
-
- protected int mBGColor;
- protected int mSelectedWeekBGColor;
- protected int mFocusMonthColor;
- protected int mOtherMonthColor;
- protected int mDaySeparatorColor;
- protected int mTodayOutlineColor;
- protected int mWeekNumColor;
-
- public SimpleWeekView(Context context) {
- super(context);
-
- Resources res = context.getResources();
-
- mBGColor = res.getColor(R.color.month_bgcolor);
- mSelectedWeekBGColor = res.getColor(R.color.month_selected_week_bgcolor);
- mFocusMonthColor = res.getColor(R.color.month_mini_day_number);
- mOtherMonthColor = res.getColor(R.color.month_other_month_day_number);
- mDaySeparatorColor = res.getColor(R.color.month_grid_lines);
- mTodayOutlineColor = res.getColor(R.color.mini_month_today_outline_color);
- mWeekNumColor = res.getColor(R.color.month_week_num_color);
- mSelectedDayLine = res.getDrawable(R.drawable.dayline_minical_holo_light);
-
- if (mScale == 0) {
- mScale = context.getResources().getDisplayMetrics().density;
- if (mScale != 1) {
- DEFAULT_HEIGHT *= mScale;
- MIN_HEIGHT *= mScale;
- MINI_DAY_NUMBER_TEXT_SIZE *= mScale;
- MINI_TODAY_NUMBER_TEXT_SIZE *= mScale;
- MINI_TODAY_OUTLINE_WIDTH *= mScale;
- WEEK_NUM_MARGIN_BOTTOM *= mScale;
- DAY_SEPARATOR_WIDTH *= mScale;
- MINI_WK_NUMBER_TEXT_SIZE *= mScale;
- }
- }
-
- // Sets up any standard paints that will be used
- initView();
- }
-
- /**
- * Sets all the parameters for displaying this week. The only required
- * parameter is the week number. Other parameters have a default value and
- * will only update if a new value is included, except for focus month,
- * which will always default to no focus month if no value is passed in. See
- * {@link #VIEW_PARAMS_HEIGHT} for more info on parameters.
- *
- * @param params A map of the new parameters, see
- * {@link #VIEW_PARAMS_HEIGHT}
- * @param tz The time zone this view should reference times in
- */
- public void setWeekParams(HashMap<String, Integer> params, String tz) {
- if (!params.containsKey(VIEW_PARAMS_WEEK)) {
- throw new InvalidParameterException("You must specify the week number for this view");
- }
- setTag(params);
- mTimeZone = tz;
- // We keep the current value for any params not present
- if (params.containsKey(VIEW_PARAMS_HEIGHT)) {
- mHeight = params.get(VIEW_PARAMS_HEIGHT);
- if (mHeight < MIN_HEIGHT) {
- mHeight = MIN_HEIGHT;
- }
- }
- if (params.containsKey(VIEW_PARAMS_SELECTED_DAY)) {
- mSelectedDay = params.get(VIEW_PARAMS_SELECTED_DAY);
- }
- mHasSelectedDay = mSelectedDay != -1;
- if (params.containsKey(VIEW_PARAMS_NUM_DAYS)) {
- mNumDays = params.get(VIEW_PARAMS_NUM_DAYS);
- }
- if (params.containsKey(VIEW_PARAMS_SHOW_WK_NUM)) {
- if (params.get(VIEW_PARAMS_SHOW_WK_NUM) != 0) {
- mShowWeekNum = true;
- } else {
- mShowWeekNum = false;
- }
- }
- mNumCells = mShowWeekNum ? mNumDays + 1 : mNumDays;
-
- // Allocate space for caching the day numbers and focus values
- mDayNumbers = new String[mNumCells];
- mFocusDay = new boolean[mNumCells];
- mOddMonth = new boolean[mNumCells];
- mWeek = params.get(VIEW_PARAMS_WEEK);
- int julianMonday = Utils.getJulianMondayFromWeeksSinceEpoch(mWeek);
- Time time = new Time(tz);
- time.setJulianDay(julianMonday);
-
- // If we're showing the week number calculate it based on Monday
- int i = 0;
- if (mShowWeekNum) {
- mDayNumbers[0] = Integer.toString(time.getWeekNumber());
- i++;
- }
-
- if (params.containsKey(VIEW_PARAMS_WEEK_START)) {
- mWeekStart = params.get(VIEW_PARAMS_WEEK_START);
- }
-
- // Now adjust our starting day based on the start day of the week
- // If the week is set to start on a Saturday the first week will be
- // Dec 27th 1969 -Jan 2nd, 1970
- if (time.weekDay != mWeekStart) {
- int diff = time.weekDay - mWeekStart;
- if (diff < 0) {
- diff += 7;
- }
- time.monthDay -= diff;
- time.normalize(true);
- }
-
- mFirstJulianDay = Time.getJulianDay(time.toMillis(true), time.gmtoff);
- mFirstMonth = time.month;
-
- // Figure out what day today is
- Time today = new Time(tz);
- today.setToNow();
- mHasToday = false;
- mToday = -1;
-
- int focusMonth = params.containsKey(VIEW_PARAMS_FOCUS_MONTH) ? params.get(
- VIEW_PARAMS_FOCUS_MONTH)
- : DEFAULT_FOCUS_MONTH;
-
- for (; i < mNumCells; i++) {
- if (time.monthDay == 1) {
- mFirstMonth = time.month;
- }
- mOddMonth [i] = (time.month %2) == 1;
- if (time.month == focusMonth) {
- mFocusDay[i] = true;
- } else {
- mFocusDay[i] = false;
- }
- if (time.year == today.year && time.yearDay == today.yearDay) {
- mHasToday = true;
- mToday = i;
- }
- mDayNumbers[i] = Integer.toString(time.monthDay++);
- time.normalize(true);
- }
- // We do one extra add at the end of the loop, if that pushed us to a
- // new month undo it
- if (time.monthDay == 1) {
- time.monthDay--;
- time.normalize(true);
- }
- mLastMonth = time.month;
-
- updateSelectionPositions();
- }
-
- /**
- * Sets up the text and style properties for painting. Override this if you
- * want to use a different paint.
- */
- protected void initView() {
- p.setFakeBoldText(false);
- p.setAntiAlias(true);
- p.setTextSize(MINI_DAY_NUMBER_TEXT_SIZE);
- p.setStyle(Style.FILL);
-
- mMonthNumPaint = new Paint();
- mMonthNumPaint.setFakeBoldText(true);
- mMonthNumPaint.setAntiAlias(true);
- mMonthNumPaint.setTextSize(MINI_DAY_NUMBER_TEXT_SIZE);
- mMonthNumPaint.setColor(mFocusMonthColor);
- mMonthNumPaint.setStyle(Style.FILL);
- mMonthNumPaint.setTextAlign(Align.CENTER);
- }
-
- /**
- * Returns the month of the first day in this week
- *
- * @return The month the first day of this view is in
- */
- public int getFirstMonth() {
- return mFirstMonth;
- }
-
- /**
- * Returns the month of the last day in this week
- *
- * @return The month the last day of this view is in
- */
- public int getLastMonth() {
- return mLastMonth;
- }
-
- /**
- * Returns the julian day of the first day in this view.
- *
- * @return The julian day of the first day in the view.
- */
- public int getFirstJulianDay() {
- return mFirstJulianDay;
- }
-
- /**
- * Calculates the day that the given x position is in, accounting for week
- * number. Returns a Time referencing that day or null if
- *
- * @param x The x position of the touch event
- * @return A time object for the tapped day or null if the position wasn't
- * in a day
- */
- public Time getDayFromLocation(float x) {
- int dayStart = mShowWeekNum ? (mWidth - mPadding * 2) / mNumCells + mPadding : mPadding;
- if (x < dayStart || x > mWidth - mPadding) {
- return null;
- }
- // Selection is (x - start) / (pixels/day) == (x -s) * day / pixels
- int dayPosition = (int) ((x - dayStart) * mNumDays / (mWidth - dayStart - mPadding));
- int day = mFirstJulianDay + dayPosition;
-
- Time time = new Time(mTimeZone);
- if (mWeek == 0) {
- // This week is weird...
- if (day < Time.EPOCH_JULIAN_DAY) {
- day++;
- } else if (day == Time.EPOCH_JULIAN_DAY) {
- time.set(1, 0, 1970);
- time.normalize(true);
- return time;
- }
- }
-
- time.setJulianDay(day);
- return time;
- }
-
- @Override
- protected void onDraw(Canvas canvas) {
- drawBackground(canvas);
- drawWeekNums(canvas);
- drawDaySeparators(canvas);
- }
-
- /**
- * This draws the selection highlight if a day is selected in this week.
- * Override this method if you wish to have a different background drawn.
- *
- * @param canvas The canvas to draw on
- */
- protected void drawBackground(Canvas canvas) {
- if (mHasSelectedDay) {
- p.setColor(mSelectedWeekBGColor);
- p.setStyle(Style.FILL);
- } else {
- return;
- }
- r.top = 1;
- r.bottom = mHeight - 1;
- r.left = mPadding;
- r.right = mSelectedLeft;
- canvas.drawRect(r, p);
- r.left = mSelectedRight;
- r.right = mWidth - mPadding;
- canvas.drawRect(r, p);
- }
-
- /**
- * Draws the week and month day numbers for this week. Override this method
- * if you need different placement.
- *
- * @param canvas The canvas to draw on
- */
- protected void drawWeekNums(Canvas canvas) {
- int y = ((mHeight + MINI_DAY_NUMBER_TEXT_SIZE) / 2) - DAY_SEPARATOR_WIDTH;
- int nDays = mNumCells;
-
- int i = 0;
- int divisor = 2 * nDays;
- if (mShowWeekNum) {
- p.setTextSize(MINI_WK_NUMBER_TEXT_SIZE);
- p.setStyle(Style.FILL);
- p.setTextAlign(Align.CENTER);
- p.setAntiAlias(true);
- p.setColor(mWeekNumColor);
- int x = (mWidth - mPadding * 2) / divisor + mPadding;
- canvas.drawText(mDayNumbers[0], x, y, p);
- i++;
- }
-
- boolean isFocusMonth = mFocusDay[i];
- mMonthNumPaint.setColor(isFocusMonth ? mFocusMonthColor : mOtherMonthColor);
- mMonthNumPaint.setFakeBoldText(false);
- for (; i < nDays; i++) {
- if (mFocusDay[i] != isFocusMonth) {
- isFocusMonth = mFocusDay[i];
- mMonthNumPaint.setColor(isFocusMonth ? mFocusMonthColor : mOtherMonthColor);
- }
- if (mHasToday && mToday == i) {
- mMonthNumPaint.setTextSize(MINI_TODAY_NUMBER_TEXT_SIZE);
- mMonthNumPaint.setFakeBoldText(true);
- }
- int x = (2 * i + 1) * (mWidth - mPadding * 2) / (divisor) + mPadding;
- canvas.drawText(mDayNumbers[i], x, y, mMonthNumPaint);
- if (mHasToday && mToday == i) {
- mMonthNumPaint.setTextSize(MINI_DAY_NUMBER_TEXT_SIZE);
- mMonthNumPaint.setFakeBoldText(false);
- }
- }
- }
-
- /**
- * Draws a horizontal line for separating the weeks. Override this method if
- * you want custom separators.
- *
- * @param canvas The canvas to draw on
- */
- protected void drawDaySeparators(Canvas canvas) {
- if (mHasSelectedDay) {
- r.top = 1;
- r.bottom = mHeight - 1;
- r.left = mSelectedLeft + 1;
- r.right = mSelectedRight - 1;
- p.setStrokeWidth(MINI_TODAY_OUTLINE_WIDTH);
- p.setStyle(Style.STROKE);
- p.setColor(mTodayOutlineColor);
- canvas.drawRect(r, p);
- }
- if (mShowWeekNum) {
- p.setColor(mDaySeparatorColor);
- p.setStrokeWidth(DAY_SEPARATOR_WIDTH);
-
- int x = (mWidth - mPadding * 2) / mNumCells + mPadding;
- canvas.drawLine(x, 0, x, mHeight, p);
- }
- }
-
- @Override
- protected void onSizeChanged(int w, int h, int oldw, int oldh) {
- mWidth = w;
- updateSelectionPositions();
- }
-
- /**
- * This calculates the positions for the selected day lines.
- */
- protected void updateSelectionPositions() {
- if (mHasSelectedDay) {
- int selectedPosition = mSelectedDay - mWeekStart;
- if (selectedPosition < 0) {
- selectedPosition += 7;
- }
- if (mShowWeekNum) {
- selectedPosition++;
- }
- mSelectedLeft = selectedPosition * (mWidth - mPadding * 2) / mNumCells
- + mPadding;
- mSelectedRight = (selectedPosition + 1) * (mWidth - mPadding * 2) / mNumCells
- + mPadding;
- }
- }
-
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), mHeight);
- }
-
- @Override
- public boolean onHoverEvent(MotionEvent event) {
- Context context = getContext();
- // only send accessibility events if accessibility and exploration are
- // on.
- AccessibilityManager am = (AccessibilityManager) context
- .getSystemService(Service.ACCESSIBILITY_SERVICE);
- if (!am.isEnabled() || !am.isTouchExplorationEnabled()) {
- return super.onHoverEvent(event);
- }
- if (event.getAction() != MotionEvent.ACTION_HOVER_EXIT) {
- Time hover = getDayFromLocation(event.getX());
- if (hover != null
- && (mLastHoverTime == null || Time.compare(hover, mLastHoverTime) != 0)) {
- Long millis = hover.toMillis(true);
- String date = Utils.formatDateRange(context, millis, millis,
- DateUtils.FORMAT_SHOW_DATE);
- AccessibilityEvent accessEvent =
- AccessibilityEvent.obtain(AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED);
- accessEvent.getText().add(date);
- sendAccessibilityEventUnchecked(accessEvent);
- mLastHoverTime = hover;
- }
- }
- return true;
- }
-
- Time mLastHoverTime = null;
-} \ No newline at end of file