From 02eb6b28363f588f70b69449ca5f754ea4f6d616 Mon Sep 17 00:00:00 2001 From: Rasmus Iversen Date: Sat, 31 Mar 2018 14:12:46 +0200 Subject: [PATCH 01/10] Made indicators draw below selected days by default, and reduced the radius of the cursor --- .../compactcalendarview/CompactCalendarController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/library/src/main/java/com/github/sundeepk/compactcalendarview/CompactCalendarController.java b/library/src/main/java/com/github/sundeepk/compactcalendarview/CompactCalendarController.java index 96d60353..c70143e1 100755 --- a/library/src/main/java/com/github/sundeepk/compactcalendarview/CompactCalendarController.java +++ b/library/src/main/java/com/github/sundeepk/compactcalendarview/CompactCalendarController.java @@ -75,7 +75,7 @@ class CompactCalendarController { private boolean isSmoothScrolling; private boolean isScrolling; private boolean shouldDrawDaysHeader = true; - private boolean shouldDrawIndicatorsBelowSelectedDays = false; + private boolean shouldDrawIndicatorsBelowSelectedDays = true; private boolean displayOtherMonthDays = false; private boolean shouldSelectFirstDayOfMonthOnScroll = true; @@ -396,7 +396,7 @@ void onMeasure(int width, int height, int paddingRight, int paddingLeft) { bigCircleIndicatorRadius = getInterpolatedBigCircleIndicator(); // scale the selected day indicators slightly so that event indicators can be drawn below - bigCircleIndicatorRadius = shouldDrawIndicatorsBelowSelectedDays && eventIndicatorStyle == CompactCalendarView.SMALL_INDICATOR ? bigCircleIndicatorRadius * 0.85f : bigCircleIndicatorRadius; + bigCircleIndicatorRadius = shouldDrawIndicatorsBelowSelectedDays && eventIndicatorStyle == CompactCalendarView.SMALL_INDICATOR ? bigCircleIndicatorRadius * 0.65f : bigCircleIndicatorRadius; } //assume square around each day of width and height = heightPerDay and get diagonal line length From bcb1f64b6cd713301d262fe33edf5113f488ad7d Mon Sep 17 00:00:00 2001 From: Rasmus Zweidorff Iversen Date: Sat, 31 Mar 2018 22:23:11 +0200 Subject: [PATCH 02/10] Changed events to now have a random color each time they are generated --- .../github/com/sample/CompactCalendarTab.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/sample/src/main/java/sundeepk/github/com/sample/CompactCalendarTab.java b/sample/src/main/java/sundeepk/github/com/sample/CompactCalendarTab.java index 8bba6c07..47149a27 100644 --- a/sample/src/main/java/sundeepk/github/com/sample/CompactCalendarTab.java +++ b/sample/src/main/java/sundeepk/github/com/sample/CompactCalendarTab.java @@ -29,6 +29,7 @@ import java.util.GregorianCalendar; import java.util.List; import java.util.Locale; +import java.util.Random; import java.util.TimeZone; public class CompactCalendarTab extends Fragment { @@ -282,19 +283,24 @@ private void addEvents(int month, int year) { private List getEvents(long timeInMillis, int day) { if (day < 2) { - return Arrays.asList(new Event(Color.argb(255, 169, 68, 65), timeInMillis, "Event at " + new Date(timeInMillis))); + return Arrays.asList(new Event(getRandomColor(), timeInMillis, "Event at " + new Date(timeInMillis))); } else if ( day > 2 && day <= 4) { return Arrays.asList( - new Event(Color.argb(255, 169, 68, 65), timeInMillis, "Event at " + new Date(timeInMillis)), - new Event(Color.argb(255, 100, 68, 65), timeInMillis, "Event 2 at " + new Date(timeInMillis))); + new Event(getRandomColor(), timeInMillis, "Event at " + new Date(timeInMillis)), + new Event(getRandomColor(), timeInMillis, "Event 2 at " + new Date(timeInMillis))); } else { return Arrays.asList( - new Event(Color.argb(255, 169, 68, 65), timeInMillis, "Event at " + new Date(timeInMillis) ), - new Event(Color.argb(255, 100, 68, 65), timeInMillis, "Event 2 at " + new Date(timeInMillis)), - new Event(Color.argb(255, 70, 68, 65), timeInMillis, "Event 3 at " + new Date(timeInMillis))); + new Event(getRandomColor(), timeInMillis, "Event at " + new Date(timeInMillis) ), + new Event(getRandomColor(), timeInMillis, "Event 2 at " + new Date(timeInMillis)), + new Event(getRandomColor(), timeInMillis, "Event 3 at " + new Date(timeInMillis))); } } + private int getRandomColor() { + Random rand = new Random(); + return Color.rgb(rand.nextInt(256), rand.nextInt(256), rand.nextInt(256)); + } + private void setToMidnight(Calendar calendar) { calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); From a5f96f343526510ffebf4160f5a7a71cc8caa4da Mon Sep 17 00:00:00 2001 From: Rasmus Zweidorff Iversen Date: Sat, 31 Mar 2018 22:23:37 +0200 Subject: [PATCH 03/10] Changed event indicators to be large non-filled circles --- sample/src/main/res/layout/main_tab.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sample/src/main/res/layout/main_tab.xml b/sample/src/main/res/layout/main_tab.xml index 5bf5c95d..5c4d76ea 100644 --- a/sample/src/main/res/layout/main_tab.xml +++ b/sample/src/main/res/layout/main_tab.xml @@ -18,7 +18,7 @@ app:compactCalendarCurrentSelectedDayBackgroundColor="#ffbd5f5f" app:compactCalendarCurrentDayBackgroundColor="#B71C1C" app:compactCalendarCurrentDayIndicatorStyle="fill_large_indicator" - app:compactCalendarEventIndicatorStyle="small_indicator" + app:compactCalendarEventIndicatorStyle="no_fill_large_indicator" app:compactCalendarOtherMonthDaysTextColor="#534c4c" app:compactCalendarShouldSelectFirstDayOfMonthOnScroll="true" /> From fe50e065334ff62813b187bab2597effef1bd4e0 Mon Sep 17 00:00:00 2001 From: Rasmus Zweidorff Iversen Date: Sat, 31 Mar 2018 22:29:19 +0200 Subject: [PATCH 04/10] Added a way of displaying semi-circles of different colors, adding up to a full circle, if more than one event exist on a date. Of course it will only display if we are using non-fill large event indicators --- .../CompactCalendarController.java | 73 +++++++++++++------ 1 file changed, 49 insertions(+), 24 deletions(-) diff --git a/library/src/main/java/com/github/sundeepk/compactcalendarview/CompactCalendarController.java b/library/src/main/java/com/github/sundeepk/compactcalendarview/CompactCalendarController.java index 96d60353..989874d6 100755 --- a/library/src/main/java/com/github/sundeepk/compactcalendarview/CompactCalendarController.java +++ b/library/src/main/java/com/github/sundeepk/compactcalendarview/CompactCalendarController.java @@ -1,5 +1,6 @@ package com.github.sundeepk.compactcalendarview; +import android.annotation.SuppressLint; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; @@ -15,7 +16,9 @@ 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; @@ -217,7 +220,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); } } @@ -236,7 +239,7 @@ private void setMonthOffset(Calendar calendarWithFirstDayOfMonth, Date currentDa calendarWithFirstDayOfMonth.set(Calendar.MILLISECOND, 0); } - void setShouldSelectFirstDayOfMonthOnScroll(boolean shouldSelectFirstDayOfMonthOnScroll){ + void setShouldSelectFirstDayOfMonthOnScroll(boolean shouldSelectFirstDayOfMonthOnScroll) { this.shouldSelectFirstDayOfMonthOnScroll = shouldSelectFirstDayOfMonthOnScroll; } @@ -244,7 +247,7 @@ void setDisplayOtherMonthDays(boolean displayOtherMonthDays) { this.displayOtherMonthDays = displayOtherMonthDays; } - void shouldDrawIndicatorsBelowSelectedDays(boolean shouldDrawIndicatorsBelowSelectedDays){ + void shouldDrawIndicatorsBelowSelectedDays(boolean shouldDrawIndicatorsBelowSelectedDays) { this.shouldDrawIndicatorsBelowSelectedDays = shouldDrawIndicatorsBelowSelectedDays; } @@ -256,7 +259,7 @@ void setEventIndicatorStyle(int eventIndicatorStyle) { this.eventIndicatorStyle = eventIndicatorStyle; } - void setCurrentSelectedDayIndicatorStyle(int currentSelectedDayIndicatorStyle){ + void setCurrentSelectedDayIndicatorStyle(int currentSelectedDayIndicatorStyle) { this.currentSelectedDayIndicatorStyle = currentSelectedDayIndicatorStyle; } @@ -264,11 +267,11 @@ void setTargetHeight(int targetHeight) { this.targetHeight = targetHeight; } - float getScreenDensity(){ + float getScreenDensity() { return screenDensity; } - float getDayIndicatorRadius(){ + float getDayIndicatorRadius() { return bigCircleIndicatorRadius; } @@ -288,7 +291,7 @@ int getTargetHeight() { return targetHeight; } - int getWidth(){ + int getWidth() { return width; } @@ -300,7 +303,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."); } @@ -336,7 +339,7 @@ void setCurrentDayTextColor(int currentDayTextColor) { void showNextMonth() { monthsScrolledSoFar = monthsScrolledSoFar - 1; accumulatedScrollOffset.x = monthsScrolledSoFar * width; - if(shouldSelectFirstDayOfMonthOnScroll){ + if (shouldSelectFirstDayOfMonthOnScroll) { setCalenderToFirstDayOfMonth(calendarWithFirstDayOfMonth, currentCalender.getTime(), 0, 1); setCurrentDate(calendarWithFirstDayOfMonth.getTime()); } @@ -346,7 +349,7 @@ void showNextMonth() { void showPreviousMonth() { monthsScrolledSoFar = monthsScrolledSoFar + 1; accumulatedScrollOffset.x = monthsScrolledSoFar * width; - if(shouldSelectFirstDayOfMonthOnScroll){ + if (shouldSelectFirstDayOfMonthOnScroll) { setCalenderToFirstDayOfMonth(calendarWithFirstDayOfMonth, currentCalender.getTime(), 0, -1); setCurrentDate(calendarWithFirstDayOfMonth.getTime()); } @@ -405,7 +408,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)); @@ -640,7 +643,7 @@ void addEvent(Event event) { } void addEvents(List events) { - eventsContainer.addEvents(events); + eventsContainer.addEvents(events); } List getCalendarEventsFor(long epochMillis) { @@ -656,11 +659,11 @@ void removeEventsFor(long epochMillis) { } void removeEvent(Event event) { - eventsContainer.removeEvent(event); + eventsContainer.removeEvent(event); } void removeEvents(List events) { - eventsContainer.removeEvents(events); + eventsContainer.removeEvents(events); } void setGrowProgress(float grow) { @@ -749,10 +752,10 @@ void drawEvents(Canvas canvas, Calendar currentMonthToDrawCalender, int offset) 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)) { @@ -768,10 +771,7 @@ void drawEvents(Canvas canvas, Calendar currentMonthToDrawCalender, int offset) if (shouldDrawIndicatorsBelowSelectedDays || (!shouldDrawIndicatorsBelowSelectedDays && !isSameDayAsCurrentDay && !isCurrentSelectedDay) || animationStatus == EXPOSE_CALENDAR_ANIMATION) { if (eventIndicatorStyle == FILL_LARGE_INDICATOR || eventIndicatorStyle == NO_FILL_LARGE_INDICATOR) { - if(!eventsList.isEmpty()){ - Event event = eventsList.get(0); - drawEventIndicatorCircle(canvas, xPosition, yPosition, event.getColor()); - } + drawEventArcs(canvas, xPosition, yPosition, eventsList); } else { yPosition += indicatorOffset; // offset event indicators to draw below selected day indicators @@ -793,6 +793,31 @@ void drawEvents(Canvas canvas, Calendar currentMonthToDrawCalender, int offset) } } + private void drawEventArcs(Canvas canvas, float x, float y, List events) { + float incAngel = 360 / events.size(); + float angelOffset = -90f; + + dayPaint.setStrokeWidth(2 * screenDensity); + dayPaint.setStyle(Paint.Style.STROKE); + + for (int i = 0; i < events.size(); i++) { + dayPaint.setColor(events.get(i).getColor()); + + if (animationStatus == ANIMATE_INDICATORS) { + float maxRadius = 1 * bigCircleIndicatorRadius * 1.4f; + drawArc(canvas, incAngel * i + angelOffset, incAngel, growfactorIndicator > maxRadius ? maxRadius : growfactorIndicator, x, y - (textHeight / 6)); + } else { + drawArc(canvas, incAngel * i + angelOffset, incAngel, 1 * bigCircleIndicatorRadius, x, y - (textHeight / 6)); + } + } + } + + @SuppressLint("NewApi") + private void drawArc(Canvas canvas, float startAngle, float sweepAngle, float radius, float x, float y) { + canvas.drawArc(x - radius, y - radius, x + radius, y + radius, startAngle, sweepAngle, false, dayPaint); + } + + private void drawSingleEvent(Canvas canvas, float xPosition, float yPosition, List eventsList) { Event event = eventsList.get(0); drawEventIndicatorCircle(canvas, xPosition, yPosition, event.getColor()); @@ -829,7 +854,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; } @@ -842,7 +867,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; @@ -934,7 +959,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)); } @@ -945,7 +970,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) { From 0454e7a22b310d8f0c14cc9c89c4b1da1ad3f541 Mon Sep 17 00:00:00 2001 From: Rasmus Zweidorff Iversen Date: Sat, 31 Mar 2018 22:32:49 +0200 Subject: [PATCH 05/10] Reverted some minor changes that was used for debugging --- .../compactcalendarview/CompactCalendarController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/library/src/main/java/com/github/sundeepk/compactcalendarview/CompactCalendarController.java b/library/src/main/java/com/github/sundeepk/compactcalendarview/CompactCalendarController.java index a3cfae6c..989874d6 100755 --- a/library/src/main/java/com/github/sundeepk/compactcalendarview/CompactCalendarController.java +++ b/library/src/main/java/com/github/sundeepk/compactcalendarview/CompactCalendarController.java @@ -78,7 +78,7 @@ class CompactCalendarController { private boolean isSmoothScrolling; private boolean isScrolling; private boolean shouldDrawDaysHeader = true; - private boolean shouldDrawIndicatorsBelowSelectedDays = true; + private boolean shouldDrawIndicatorsBelowSelectedDays = false; private boolean displayOtherMonthDays = false; private boolean shouldSelectFirstDayOfMonthOnScroll = true; @@ -399,7 +399,7 @@ void onMeasure(int width, int height, int paddingRight, int paddingLeft) { bigCircleIndicatorRadius = getInterpolatedBigCircleIndicator(); // scale the selected day indicators slightly so that event indicators can be drawn below - bigCircleIndicatorRadius = shouldDrawIndicatorsBelowSelectedDays && eventIndicatorStyle == CompactCalendarView.SMALL_INDICATOR ? bigCircleIndicatorRadius * 0.65f : bigCircleIndicatorRadius; + bigCircleIndicatorRadius = shouldDrawIndicatorsBelowSelectedDays && eventIndicatorStyle == CompactCalendarView.SMALL_INDICATOR ? bigCircleIndicatorRadius * 0.85f : bigCircleIndicatorRadius; } //assume square around each day of width and height = heightPerDay and get diagonal line length From 63421f9b129249f99728279fde9c4b7fe5afd205 Mon Sep 17 00:00:00 2001 From: Rasmus Iversen Date: Sat, 31 Mar 2018 22:34:42 +0200 Subject: [PATCH 06/10] Added picture of new feature --- images/2018-03-31.png | Bin 0 -> 51518 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/2018-03-31.png diff --git a/images/2018-03-31.png b/images/2018-03-31.png new file mode 100644 index 0000000000000000000000000000000000000000..4f4765504081f2884429855d34ba69b518c85f9d GIT binary patch literal 51518 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 Date: Sat, 31 Mar 2018 22:43:22 +0200 Subject: [PATCH 07/10] Added way to disable the feature if we are below lolipop, and use the legacy draw call --- .../compactcalendarview/CompactCalendarController.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/library/src/main/java/com/github/sundeepk/compactcalendarview/CompactCalendarController.java b/library/src/main/java/com/github/sundeepk/compactcalendarview/CompactCalendarController.java index 989874d6..0bcc441c 100755 --- a/library/src/main/java/com/github/sundeepk/compactcalendarview/CompactCalendarController.java +++ b/library/src/main/java/com/github/sundeepk/compactcalendarview/CompactCalendarController.java @@ -9,6 +9,7 @@ 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; @@ -771,7 +772,12 @@ void drawEvents(Canvas canvas, Calendar currentMonthToDrawCalender, int offset) if (shouldDrawIndicatorsBelowSelectedDays || (!shouldDrawIndicatorsBelowSelectedDays && !isSameDayAsCurrentDay && !isCurrentSelectedDay) || animationStatus == EXPOSE_CALENDAR_ANIMATION) { if (eventIndicatorStyle == FILL_LARGE_INDICATOR || eventIndicatorStyle == NO_FILL_LARGE_INDICATOR) { - drawEventArcs(canvas, xPosition, yPosition, eventsList); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + drawEventArcs(canvas, xPosition, yPosition, eventsList); + } else if(!eventsList.isEmpty()) { + Event event = eventsList.get(0); + drawEventIndicatorCircle(canvas, xPosition, yPosition, event.getColor()); + } } else { yPosition += indicatorOffset; // offset event indicators to draw below selected day indicators From 28cae8aa65f13901339f92e891cb37bdeb8659d9 Mon Sep 17 00:00:00 2001 From: Rasmus Zweidorff Iversen Date: Sat, 31 Mar 2018 22:52:40 +0200 Subject: [PATCH 08/10] Fixed an introduced bug that would otherwise ignore FILL_LARGE_INDICATOR style --- .../sundeepk/compactcalendarview/CompactCalendarController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/src/main/java/com/github/sundeepk/compactcalendarview/CompactCalendarController.java b/library/src/main/java/com/github/sundeepk/compactcalendarview/CompactCalendarController.java index 0bcc441c..a24dff02 100755 --- a/library/src/main/java/com/github/sundeepk/compactcalendarview/CompactCalendarController.java +++ b/library/src/main/java/com/github/sundeepk/compactcalendarview/CompactCalendarController.java @@ -772,7 +772,7 @@ void drawEvents(Canvas canvas, Calendar currentMonthToDrawCalender, int offset) if (shouldDrawIndicatorsBelowSelectedDays || (!shouldDrawIndicatorsBelowSelectedDays && !isSameDayAsCurrentDay && !isCurrentSelectedDay) || animationStatus == EXPOSE_CALENDAR_ANIMATION) { if (eventIndicatorStyle == FILL_LARGE_INDICATOR || eventIndicatorStyle == NO_FILL_LARGE_INDICATOR) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && eventIndicatorStyle == NO_FILL_LARGE_INDICATOR) { drawEventArcs(canvas, xPosition, yPosition, eventsList); } else if(!eventsList.isEmpty()) { Event event = eventsList.get(0); From b4eefd7c5266a368d4cab251cec777f0902d792c Mon Sep 17 00:00:00 2001 From: Rasmus Zweidorff Iversen Date: Sat, 31 Mar 2018 23:06:21 +0200 Subject: [PATCH 09/10] Reverting changes --- .../sundeepk/compactcalendarview/CompactCalendarController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/src/main/java/com/github/sundeepk/compactcalendarview/CompactCalendarController.java b/library/src/main/java/com/github/sundeepk/compactcalendarview/CompactCalendarController.java index a24dff02..1d274408 100755 --- a/library/src/main/java/com/github/sundeepk/compactcalendarview/CompactCalendarController.java +++ b/library/src/main/java/com/github/sundeepk/compactcalendarview/CompactCalendarController.java @@ -79,7 +79,7 @@ class CompactCalendarController { private boolean isSmoothScrolling; private boolean isScrolling; private boolean shouldDrawDaysHeader = true; - private boolean shouldDrawIndicatorsBelowSelectedDays = false; + private boolean shouldDrawIndicatorsBelowSelectedDays = true; private boolean displayOtherMonthDays = false; private boolean shouldSelectFirstDayOfMonthOnScroll = true; From e8957f74881e47c2a6250ba31f359b733ce288d8 Mon Sep 17 00:00:00 2001 From: Rasmus Zweidorff Iversen Date: Sun, 1 Apr 2018 23:34:43 +0200 Subject: [PATCH 10/10] Reverting changes --- .../CompactCalendarController.java | 2 +- .../github/com/sample/CompactCalendarTab.java | 18 ++++++------------ sample/src/main/res/layout/main_tab.xml | 2 +- 3 files changed, 8 insertions(+), 14 deletions(-) diff --git a/library/src/main/java/com/github/sundeepk/compactcalendarview/CompactCalendarController.java b/library/src/main/java/com/github/sundeepk/compactcalendarview/CompactCalendarController.java index 1d274408..a24dff02 100755 --- a/library/src/main/java/com/github/sundeepk/compactcalendarview/CompactCalendarController.java +++ b/library/src/main/java/com/github/sundeepk/compactcalendarview/CompactCalendarController.java @@ -79,7 +79,7 @@ class CompactCalendarController { private boolean isSmoothScrolling; private boolean isScrolling; private boolean shouldDrawDaysHeader = true; - private boolean shouldDrawIndicatorsBelowSelectedDays = true; + private boolean shouldDrawIndicatorsBelowSelectedDays = false; private boolean displayOtherMonthDays = false; private boolean shouldSelectFirstDayOfMonthOnScroll = true; diff --git a/sample/src/main/java/sundeepk/github/com/sample/CompactCalendarTab.java b/sample/src/main/java/sundeepk/github/com/sample/CompactCalendarTab.java index 47149a27..8bba6c07 100644 --- a/sample/src/main/java/sundeepk/github/com/sample/CompactCalendarTab.java +++ b/sample/src/main/java/sundeepk/github/com/sample/CompactCalendarTab.java @@ -29,7 +29,6 @@ import java.util.GregorianCalendar; import java.util.List; import java.util.Locale; -import java.util.Random; import java.util.TimeZone; public class CompactCalendarTab extends Fragment { @@ -283,24 +282,19 @@ private void addEvents(int month, int year) { private List getEvents(long timeInMillis, int day) { if (day < 2) { - return Arrays.asList(new Event(getRandomColor(), timeInMillis, "Event at " + new Date(timeInMillis))); + return Arrays.asList(new Event(Color.argb(255, 169, 68, 65), timeInMillis, "Event at " + new Date(timeInMillis))); } else if ( day > 2 && day <= 4) { return Arrays.asList( - new Event(getRandomColor(), timeInMillis, "Event at " + new Date(timeInMillis)), - new Event(getRandomColor(), timeInMillis, "Event 2 at " + new Date(timeInMillis))); + new Event(Color.argb(255, 169, 68, 65), timeInMillis, "Event at " + new Date(timeInMillis)), + new Event(Color.argb(255, 100, 68, 65), timeInMillis, "Event 2 at " + new Date(timeInMillis))); } else { return Arrays.asList( - new Event(getRandomColor(), timeInMillis, "Event at " + new Date(timeInMillis) ), - new Event(getRandomColor(), timeInMillis, "Event 2 at " + new Date(timeInMillis)), - new Event(getRandomColor(), timeInMillis, "Event 3 at " + new Date(timeInMillis))); + new Event(Color.argb(255, 169, 68, 65), timeInMillis, "Event at " + new Date(timeInMillis) ), + new Event(Color.argb(255, 100, 68, 65), timeInMillis, "Event 2 at " + new Date(timeInMillis)), + new Event(Color.argb(255, 70, 68, 65), timeInMillis, "Event 3 at " + new Date(timeInMillis))); } } - private int getRandomColor() { - Random rand = new Random(); - return Color.rgb(rand.nextInt(256), rand.nextInt(256), rand.nextInt(256)); - } - private void setToMidnight(Calendar calendar) { calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); diff --git a/sample/src/main/res/layout/main_tab.xml b/sample/src/main/res/layout/main_tab.xml index 5c4d76ea..5bf5c95d 100644 --- a/sample/src/main/res/layout/main_tab.xml +++ b/sample/src/main/res/layout/main_tab.xml @@ -18,7 +18,7 @@ app:compactCalendarCurrentSelectedDayBackgroundColor="#ffbd5f5f" app:compactCalendarCurrentDayBackgroundColor="#B71C1C" app:compactCalendarCurrentDayIndicatorStyle="fill_large_indicator" - app:compactCalendarEventIndicatorStyle="no_fill_large_indicator" + app:compactCalendarEventIndicatorStyle="small_indicator" app:compactCalendarOtherMonthDaysTextColor="#534c4c" app:compactCalendarShouldSelectFirstDayOfMonthOnScroll="true" />