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; } }