Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,17 @@
import android.graphics.PointF;
import android.graphics.Rect;
import android.graphics.Typeface;
import android.os.Build;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.ViewConfiguration;
import android.widget.OverScroller;

import com.github.sundeepk.compactcalendarview.domain.Event;

import java.util.Calendar;
import java.util.Date;
import java.util.List;
Expand Down Expand Up @@ -94,6 +97,8 @@ class CompactCalendarController {
private OverScroller scroller;
private Paint dayPaint = new Paint();
private Paint background = new Paint();
private Typeface compactCalendarTypeface = Typeface.SANS_SERIF;
private Typeface compactCalendarTypefaceBold = Typeface.DEFAULT_BOLD;
private Rect textSizeRect;
private String[] dayColumnNames;

Expand All @@ -113,6 +118,7 @@ class CompactCalendarController {
*/
private Calendar tempPreviousMonthCalendar;


private enum Direction {
NONE, HORIZONTAL, VERTICAL
}
Expand Down Expand Up @@ -160,6 +166,17 @@ private void loadAttributes(AttributeSet attrs, Context context) {
currentSelectedDayIndicatorStyle = typedArray.getInt(R.styleable.CompactCalendarView_compactCalendarCurrentSelectedDayIndicatorStyle, FILL_LARGE_INDICATOR);
displayOtherMonthDays = typedArray.getBoolean(R.styleable.CompactCalendarView_compactCalendarDisplayOtherMonthDays, displayOtherMonthDays);
shouldSelectFirstDayOfMonthOnScroll = typedArray.getBoolean(R.styleable.CompactCalendarView_compactCalendarShouldSelectFirstDayOfMonthOnScroll, shouldSelectFirstDayOfMonthOnScroll);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
if (typedArray.hasValue(R.styleable.CompactCalendarView_compactCalendarTypeface)) {
compactCalendarTypeface = typedArray.getFont(R.styleable.CompactCalendarView_compactCalendarTypeface);
}

if (typedArray.hasValue(R.styleable.CompactCalendarView_compactCalendarTypeface)) {
compactCalendarTypefaceBold = typedArray.getFont(R.styleable.CompactCalendarView_compactCalendarTypefaceBold);
}
}

} finally {
typedArray.recycle();
}
Expand All @@ -186,7 +203,7 @@ private void init(Context context) {
dayPaint.setTextAlign(Paint.Align.CENTER);
dayPaint.setStyle(Paint.Style.STROKE);
dayPaint.setFlags(Paint.ANTI_ALIAS_FLAG);
dayPaint.setTypeface(Typeface.SANS_SERIF);
dayPaint.setTypeface(compactCalendarTypeface);
dayPaint.setTextSize(textSize);
dayPaint.setColor(calenderTextColor);
dayPaint.getTextBounds("31", 0, "31".length(), textSizeRect);
Expand Down Expand Up @@ -218,7 +235,7 @@ private void initScreenDensityRelatedValues(Context context) {
densityAdjustedSnapVelocity = (int) (screenDensity * SNAP_VELOCITY_DIP_PER_SECOND);
maximumVelocity = configuration.getScaledMaximumFlingVelocity();

final DisplayMetrics dm = context.getResources().getDisplayMetrics() ;
final DisplayMetrics dm = context.getResources().getDisplayMetrics();
multiDayIndicatorStrokeWidth = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1, dm);
}
}
Expand All @@ -237,19 +254,19 @@ private void setMonthOffset(Calendar calendarWithFirstDayOfMonth, Date currentDa
calendarWithFirstDayOfMonth.set(Calendar.MILLISECOND, 0);
}

void setIsRtl(boolean isRtl){
void setIsRtl(boolean isRtl) {
this.isRtl = isRtl;
}

void setShouldSelectFirstDayOfMonthOnScroll(boolean shouldSelectFirstDayOfMonthOnScroll){
void setShouldSelectFirstDayOfMonthOnScroll(boolean shouldSelectFirstDayOfMonthOnScroll) {
this.shouldSelectFirstDayOfMonthOnScroll = shouldSelectFirstDayOfMonthOnScroll;
}

void setDisplayOtherMonthDays(boolean displayOtherMonthDays) {
this.displayOtherMonthDays = displayOtherMonthDays;
}

void shouldDrawIndicatorsBelowSelectedDays(boolean shouldDrawIndicatorsBelowSelectedDays){
void shouldDrawIndicatorsBelowSelectedDays(boolean shouldDrawIndicatorsBelowSelectedDays) {
this.shouldDrawIndicatorsBelowSelectedDays = shouldDrawIndicatorsBelowSelectedDays;
}

Expand All @@ -261,19 +278,19 @@ void setEventIndicatorStyle(int eventIndicatorStyle) {
this.eventIndicatorStyle = eventIndicatorStyle;
}

void setCurrentSelectedDayIndicatorStyle(int currentSelectedDayIndicatorStyle){
void setCurrentSelectedDayIndicatorStyle(int currentSelectedDayIndicatorStyle) {
this.currentSelectedDayIndicatorStyle = currentSelectedDayIndicatorStyle;
}

void setTargetHeight(int targetHeight) {
this.targetHeight = targetHeight;
}

float getScreenDensity(){
float getScreenDensity() {
return screenDensity;
}

float getDayIndicatorRadius(){
float getDayIndicatorRadius() {
return bigCircleIndicatorRadius;
}

Expand All @@ -293,7 +310,7 @@ int getTargetHeight() {
return targetHeight;
}

int getWidth(){
int getWidth() {
return width;
}

Expand All @@ -305,7 +322,7 @@ void removeAllEvents() {
eventsContainer.removeAllEvents();
}

void setFirstDayOfWeek(int day){
void setFirstDayOfWeek(int day) {
if (day < 1 || day > 7) {
throw new IllegalArgumentException("Day must be an int between 1 and 7 or DAY_OF_WEEK from Java Calendar class. For more information please see Calendar.DAY_OF_WEEK.");
}
Expand Down Expand Up @@ -357,7 +374,7 @@ void scrollLeft() {
private void scrollNext() {
monthsScrolledSoFar = monthsScrolledSoFar - 1;
accumulatedScrollOffset.x = monthsScrolledSoFar * width;
if(shouldSelectFirstDayOfMonthOnScroll){
if (shouldSelectFirstDayOfMonthOnScroll) {
setCalenderToFirstDayOfMonth(calendarWithFirstDayOfMonth, currentCalender.getTime(), 0, 1);
setCurrentDate(calendarWithFirstDayOfMonth.getTime());
}
Expand All @@ -367,7 +384,7 @@ private void scrollNext() {
private void scrollPrev() {
monthsScrolledSoFar = monthsScrolledSoFar + 1;
accumulatedScrollOffset.x = monthsScrolledSoFar * width;
if(shouldSelectFirstDayOfMonthOnScroll){
if (shouldSelectFirstDayOfMonthOnScroll) {
setCalenderToFirstDayOfMonth(calendarWithFirstDayOfMonth, currentCalender.getTime(), 0, -1);
setCurrentDate(calendarWithFirstDayOfMonth.getTime());
}
Expand Down Expand Up @@ -426,7 +443,7 @@ void onMeasure(int width, int height, int paddingRight, int paddingLeft) {
private float getInterpolatedBigCircleIndicator() {
float x0 = textSizeRect.height();
float x1 = heightPerDay; // take into account indicator offset
float x = (x1 + textSizeRect.height()) / 2f; // pick a point which is almost half way through heightPerDay and textSizeRect
float x = (x1 + textSizeRect.height()) / 2f; // pick a point which is almost half way through heightPerDay and textSizeRect
double y1 = 0.5 * Math.sqrt((x1 * x1) + (x1 * x1));
double y0 = 0.5 * Math.sqrt((x0 * x0) + (x0 * x0));

Expand Down Expand Up @@ -481,7 +498,7 @@ void onSingleTapUp(MotionEvent e) {

int dayOfMonth = ((dayRow - 1) * 7) - firstDayOfMonth;
if (isRtl) {
dayOfMonth += 6 - dayColumn;
dayOfMonth += 6 - dayColumn;
} else {
dayOfMonth += dayColumn;
}
Expand Down Expand Up @@ -617,7 +634,7 @@ private void performMonthScrollCallback() {
}

private void performScroll() {
int targetScroll = (monthsScrolledSoFar ) * width;
int targetScroll = (monthsScrolledSoFar) * width;
float remainingScrollAfterFingerLifted = targetScroll - accumulatedScrollOffset.x;
scroller.startScroll((int) accumulatedScrollOffset.x, 0, (int) (remainingScrollAfterFingerLifted), 0,
(int) (Math.abs((int) (remainingScrollAfterFingerLifted)) / (float) width * ANIMATION_SCREEN_SET_DURATION_MILLIS));
Expand Down Expand Up @@ -665,7 +682,7 @@ void addEvent(Event event) {
}

void addEvents(List<Event> events) {
eventsContainer.addEvents(events);
eventsContainer.addEvents(events);
}

List<Event> getCalendarEventsFor(long epochMillis) {
Expand All @@ -681,11 +698,11 @@ void removeEventsFor(long epochMillis) {
}

void removeEvent(Event event) {
eventsContainer.removeEvent(event);
eventsContainer.removeEvent(event);
}

void removeEvents(List<Event> events) {
eventsContainer.removeEvents(events);
eventsContainer.removeEvents(events);
}

void setGrowProgress(float grow) {
Expand Down Expand Up @@ -718,7 +735,7 @@ private void drawScrollableCalender(Canvas canvas) {
if (isRtl) {
drawNextMonth(canvas, -1);
drawCurrentMonth(canvas);
drawPreviousMonth(canvas,1);
drawPreviousMonth(canvas, 1);
} else {
drawPreviousMonth(canvas, -1);
drawCurrentMonth(canvas);
Expand All @@ -737,7 +754,7 @@ private void drawCurrentMonth(Canvas canvas) {
}

private int monthsScrolledSoFar() {
return isRtl? monthsScrolledSoFar : -monthsScrolledSoFar;
return isRtl ? monthsScrolledSoFar : -monthsScrolledSoFar;
}

private void drawPreviousMonth(Canvas canvas, int offset) {
Expand Down Expand Up @@ -778,17 +795,17 @@ void drawEvents(Canvas canvas, Calendar currentMonthToDrawCalender, int offset)

int dayOfWeek = getDayOfWeek(eventsCalendar);
if (isRtl) {
dayOfWeek = 6 - dayOfWeek;
dayOfWeek = 6 - dayOfWeek;
}

int weekNumberForMonth = eventsCalendar.get(Calendar.WEEK_OF_MONTH);
float xPosition = widthPerDay * dayOfWeek + paddingWidth + paddingLeft + accumulatedScrollOffset.x + offset - paddingRight;
float yPosition = weekNumberForMonth * heightPerDay + paddingHeight;

if (((animationStatus == EXPOSE_CALENDAR_ANIMATION || animationStatus == ANIMATE_INDICATORS) && xPosition >= growFactor ) || yPosition >= growFactor) {
if (((animationStatus == EXPOSE_CALENDAR_ANIMATION || animationStatus == ANIMATE_INDICATORS) && xPosition >= growFactor) || yPosition >= growFactor) {
// only draw small event indicators if enough of the calendar is exposed
continue;
} else if (animationStatus == EXPAND_COLLAPSE_CALENDAR && yPosition >= growFactor){
} else if (animationStatus == EXPAND_COLLAPSE_CALENDAR && yPosition >= growFactor) {
// expanding animation, just draw event indicators if enough of the calendar is visible
continue;
} else if (animationStatus == EXPOSE_CALENDAR_ANIMATION && (eventIndicatorStyle == FILL_LARGE_INDICATOR || eventIndicatorStyle == NO_FILL_LARGE_INDICATOR)) {
Expand Down Expand Up @@ -865,7 +882,7 @@ private void drawEventsWithPlus(Canvas canvas, float xPosition, float yPosition,
// it returns 0-6 where 0 is Sunday instead of 1
int getDayOfWeek(Calendar calendar) {
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK) - firstDayOfWeekToDraw;
dayOfWeek = dayOfWeek < 0 ? 7 + dayOfWeek: dayOfWeek;
dayOfWeek = dayOfWeek < 0 ? 7 + dayOfWeek : dayOfWeek;
return dayOfWeek;
}

Expand All @@ -878,7 +895,7 @@ void drawMonth(Canvas canvas, Calendar monthToDrawCalender, int offset) {
boolean isSameMonthAsToday = monthToDrawCalender.get(Calendar.MONTH) == todayCalender.get(Calendar.MONTH);
boolean isSameYearAsToday = monthToDrawCalender.get(Calendar.YEAR) == todayCalender.get(Calendar.YEAR);
boolean isSameMonthAsCurrentCalendar = monthToDrawCalender.get(Calendar.MONTH) == currentCalender.get(Calendar.MONTH) &&
monthToDrawCalender.get(Calendar.YEAR) == currentCalender.get(Calendar.YEAR);
monthToDrawCalender.get(Calendar.YEAR) == currentCalender.get(Calendar.YEAR);
int todayDayOfMonth = todayCalender.get(Calendar.DAY_OF_MONTH);
boolean isAnimatingWithExpose = animationStatus == EXPOSE_CALENDAR_ANIMATION;

Expand All @@ -888,7 +905,7 @@ void drawMonth(Canvas canvas, Calendar monthToDrawCalender, int offset) {
tempPreviousMonthCalendar.add(Calendar.MONTH, -1);
int maximumPreviousMonthDay = tempPreviousMonthCalendar.getActualMaximum(Calendar.DAY_OF_MONTH);

for (int dayColumn = 0, colDirection = isRtl? 6 : 0, dayRow = 0; dayColumn <= 6; dayRow++) {
for (int dayColumn = 0, colDirection = isRtl ? 6 : 0, dayRow = 0; dayColumn <= 6; dayRow++) {
if (dayRow == 7) {
if (isRtl) {
colDirection--;
Expand All @@ -913,11 +930,11 @@ void drawMonth(Canvas canvas, Calendar monthToDrawCalender, int offset) {
// first row, so draw the first letter of the day
if (shouldDrawDaysHeader) {
dayPaint.setColor(calenderTextColor);
dayPaint.setTypeface(Typeface.DEFAULT_BOLD);
dayPaint.setTypeface(compactCalendarTypefaceBold);
dayPaint.setStyle(Paint.Style.FILL);
dayPaint.setColor(calenderTextColor);
canvas.drawText(dayColumnNames[colDirection], xPosition, paddingHeight, dayPaint);
dayPaint.setTypeface(Typeface.DEFAULT);
dayPaint.setTypeface(compactCalendarTypeface);
}
} else {
int day = ((dayRow - 1) * 7 + colDirection + 1) - firstDayOfMonth;
Expand Down Expand Up @@ -975,7 +992,7 @@ private void drawCircle(Canvas canvas, float x, float y, int color, float circle
dayPaint.setColor(color);
if (animationStatus == ANIMATE_INDICATORS) {
float maxRadius = circleScale * bigCircleIndicatorRadius * 1.4f;
drawCircle(canvas, growfactorIndicator > maxRadius ? maxRadius: growfactorIndicator, x, y - (textHeight / 6));
drawCircle(canvas, growfactorIndicator > maxRadius ? maxRadius : growfactorIndicator, x, y - (textHeight / 6));
} else {
drawCircle(canvas, circleScale * bigCircleIndicatorRadius, x, y - (textHeight / 6));
}
Expand All @@ -986,7 +1003,7 @@ private void drawEventIndicatorCircle(Canvas canvas, float x, float y, int color
if (eventIndicatorStyle == SMALL_INDICATOR) {
dayPaint.setStyle(Paint.Style.FILL);
drawCircle(canvas, smallIndicatorRadius, x, y);
} else if (eventIndicatorStyle == NO_FILL_LARGE_INDICATOR){
} else if (eventIndicatorStyle == NO_FILL_LARGE_INDICATOR) {
dayPaint.setStyle(Paint.Style.STROKE);
drawDayCircleIndicator(NO_FILL_LARGE_INDICATOR, canvas, x, y, color);
} else if (eventIndicatorStyle == FILL_LARGE_INDICATOR) {
Expand Down
2 changes: 2 additions & 0 deletions library/src/main/res/values/attrs.xml
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,7 @@
<attr name="compactCalendarDisplayOtherMonthDays" format="boolean"/>
<attr name="compactCalendarShouldSelectFirstDayOfMonthOnScroll" format="boolean"/>
<attr name="compactCalendarOtherMonthDaysTextColor" format="color"/>
<attr name="compactCalendarTypeface"/>
<attr name="compactCalendarTypefaceBold"/>
</declare-styleable>
</resources>