Skip to content

Commit 2c8ca57

Browse files
made WeekViewEvent to be extendable, yet made most of its fields final
1 parent d021bc1 commit 2c8ca57

File tree

7 files changed

+83
-108
lines changed

7 files changed

+83
-108
lines changed

library/project.properties

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
android.library=true
1+
# suppress inspection "UnusedProperty" for whole file
2+
android.library=true

library/src/main/java/com/alamkanak/weekview/WeekView.kt

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,7 @@ class WeekView @JvmOverloads constructor(context: Context, attrs: AttributeSet?
377377
// If the tap was on add new Event space, then trigger the callback
378378
if (addEventClickListener != null && mNewEventRect != null && mNewEventRect!!.rectF != null &&
379379
mNewEventRect!!.rectF!!.contains(x, y)) {
380-
addEventClickListener!!.onAddEventClicked(mNewEventRect!!.event.startTime!!, mNewEventRect!!.event.endTime!!)
380+
addEventClickListener!!.onAddEventClicked(mNewEventRect!!.event.startTime, mNewEventRect!!.event.endTime)
381381
return super.onSingleTapConfirmed(e)
382382
}
383383

@@ -1242,7 +1242,7 @@ class WeekView @JvmOverloads constructor(context: Context, attrs: AttributeSet?
12421242
for (dayNumber in 0 until realNumberOfVisibleDays) {
12431243
for (i in mEventRects!!.indices) {
12441244
val event = mEventRects!![i].event
1245-
if (isSameDay(event.startTime!!, day) && event.isAllDay) {
1245+
if (isSameDay(event.startTime, day) && event.isAllDay) {
12461246
containsAllDayEvent = true
12471247
break
12481248
}
@@ -1614,13 +1614,13 @@ class WeekView @JvmOverloads constructor(context: Context, attrs: AttributeSet?
16141614

16151615
for (eventRect in mEventRects!!) {
16161616
for (date in dates) {
1617-
if (isSameDay(eventRect.event.startTime!!, date) && !eventRect.event.isAllDay) {
1617+
if (isSameDay(eventRect.event.startTime, date) && !eventRect.event.isAllDay) {
16181618

1619-
if (startTime == null || getPassedMinutesInDay(startTime) > getPassedMinutesInDay(eventRect.event.startTime!!)) {
1619+
if (startTime == null || getPassedMinutesInDay(startTime) > getPassedMinutesInDay(eventRect.event.startTime)) {
16201620
startTime = eventRect.event.startTime
16211621
}
16221622

1623-
if (endTime == null || getPassedMinutesInDay(endTime) < getPassedMinutesInDay(eventRect.event.endTime!!)) {
1623+
if (endTime == null || getPassedMinutesInDay(endTime) < getPassedMinutesInDay(eventRect.event.endTime)) {
16241624
endTime = eventRect.event.endTime
16251625
}
16261626
}
@@ -1645,7 +1645,7 @@ class WeekView @JvmOverloads constructor(context: Context, attrs: AttributeSet?
16451645
private fun drawEvents(date: Calendar, startFromPixel: Float, canvas: Canvas) {
16461646
if (mEventRects != null && mEventRects!!.size > 0) {
16471647
for (i in mEventRects!!.indices) {
1648-
if (isSameDay(mEventRects!![i].event.startTime!!, date) && !mEventRects!![i].event.isAllDay) {
1648+
if (isSameDay(mEventRects!![i].event.startTime, date) && !mEventRects!![i].event.isAllDay) {
16491649
val top = hourHeight * mEventRects!![i].top / 60 + eventsTop
16501650
val bottom = hourHeight * mEventRects!![i].bottom / 60 + eventsTop
16511651

@@ -1668,7 +1668,7 @@ class WeekView @JvmOverloads constructor(context: Context, attrs: AttributeSet?
16681668
mEventBackgroundPaint.shader = mEventRects!![i].event.shader
16691669
canvas.drawRoundRect(mEventRects!![i].rectF!!, eventCornerRadius.toFloat(), eventCornerRadius.toFloat(), mEventBackgroundPaint)
16701670
var topToUse = top
1671-
if (mEventRects!![i].event.startTime!!.get(Calendar.HOUR_OF_DAY) < mMinTime)
1671+
if (mEventRects!![i].event.startTime.get(Calendar.HOUR_OF_DAY) < mMinTime)
16721672
topToUse = hourHeight * getPassedMinutesInDay(mMinTime, 0) / 60 + eventsTop
16731673

16741674
if (newEventIdentifier != mEventRects!![i].event.id)
@@ -1695,7 +1695,7 @@ class WeekView @JvmOverloads constructor(context: Context, attrs: AttributeSet?
16951695
val headerTitleAndSubtitleTextHeight = mHeaderWeekDayTitleTextHeight + (if (isSubtitleHeaderEnabled) mHeaderWeekDaySubtitleTextHeight + spaceBetweenHeaderWeekDayTitleAndSubtitle else 0.0f)
16961696

16971697
for (i in mEventRects!!.indices) {
1698-
if (isSameDay(mEventRects!![i].event.startTime!!, date) && mEventRects!![i].event.isAllDay) {
1698+
if (isSameDay(mEventRects!![i].event.startTime, date) && mEventRects!![i].event.isAllDay) {
16991699

17001700
// Calculate top.
17011701
val weekDaysHeight = headerTitleAndSubtitleTextHeight + weekDaysHeaderRowPadding * 2
@@ -1885,7 +1885,7 @@ class WeekView @JvmOverloads constructor(context: Context, attrs: AttributeSet?
18851885
while (i < tempEvents.size) {
18861886
// Collect all other events for same day.
18871887
val eventRect2 = tempEvents[i]
1888-
if (isSameDay(eventRect1.event.startTime!!, eventRect2.event.startTime!!)) {
1888+
if (isSameDay(eventRect1.event.startTime, eventRect2.event.startTime)) {
18891889
tempEvents.removeAt(i)
18901890
eventRects.add(eventRect2)
18911891
} else {
@@ -1907,7 +1907,7 @@ class WeekView @JvmOverloads constructor(context: Context, attrs: AttributeSet?
19071907
* @param event The event to cache.
19081908
*/
19091909
private fun cacheEvent(event: WeekViewEvent) {
1910-
if (!event.isAllDay && event.startTime!! >= event.endTime)
1910+
if (!event.isAllDay && event.startTime >= event.endTime)
19111911
return
19121912
val splitEvents = event.splitWeekViewEvents()
19131913
for (splitEvent in splitEvents) {
@@ -1936,12 +1936,12 @@ class WeekView @JvmOverloads constructor(context: Context, attrs: AttributeSet?
19361936
*/
19371937
private fun sortEventRects(eventRects: MutableList<EventRect>?) {
19381938
eventRects?.sortWith(Comparator { left, right ->
1939-
val start1 = left.event.startTime!!.timeInMillis
1940-
val start2 = right.event.startTime!!.timeInMillis
1939+
val start1 = left.event.startTime.timeInMillis
1940+
val start2 = right.event.startTime.timeInMillis
19411941
var comparator = if (start1 > start2) 1 else if (start1 < start2) -1 else 0
19421942
if (comparator == 0) {
1943-
val end1 = left.event.endTime!!.timeInMillis
1944-
val end2 = right.event.endTime!!.timeInMillis
1943+
val end1 = left.event.endTime.timeInMillis
1944+
val end2 = right.event.endTime.timeInMillis
19451945
comparator = if (end1 > end2) 1 else if (end1 < end2) -1 else 0
19461946
}
19471947
comparator
@@ -2026,8 +2026,8 @@ class WeekView @JvmOverloads constructor(context: Context, attrs: AttributeSet?
20262026
eventRect.width = 1f / columns.size
20272027
eventRect.left = j / columns.size
20282028
if (!eventRect.event.isAllDay) {
2029-
eventRect.top = getPassedMinutesInDay(eventRect.event.startTime!!).toFloat()
2030-
eventRect.bottom = getPassedMinutesInDay(eventRect.event.endTime!!).toFloat()
2029+
eventRect.top = getPassedMinutesInDay(eventRect.event.startTime).toFloat()
2030+
eventRect.bottom = getPassedMinutesInDay(eventRect.event.endTime).toFloat()
20312031
} else {
20322032
eventRect.top = 0f
20332033
eventRect.bottom = allDayEventHeight.toFloat()
@@ -2049,10 +2049,10 @@ class WeekView @JvmOverloads constructor(context: Context, attrs: AttributeSet?
20492049
private fun isEventsCollide(event1: WeekViewEvent, event2: WeekViewEvent): Boolean {
20502050
if (event1.isAllDay != event2.isAllDay)
20512051
return false
2052-
val start1 = event1.startTime!!.timeInMillis
2053-
val start2 = event2.startTime!!.timeInMillis
2054-
val end1 = event1.endTime!!.timeInMillis
2055-
val end2 = event2.endTime!!.timeInMillis
2052+
val start1 = event1.startTime.timeInMillis
2053+
val start2 = event2.startTime.timeInMillis
2054+
val end1 = event1.endTime.timeInMillis
2055+
val end2 = event2.endTime.timeInMillis
20562056
if (event1.isAllDay)
20572057
return !(start1 > end2 || end1 < start2)
20582058
val minOverlappingMillis = (minOverlappingMinutes * 60 * 1000).toLong()

library/src/main/java/com/alamkanak/weekview/WeekViewEvent.kt

Lines changed: 30 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -5,54 +5,18 @@ import android.support.annotation.ColorInt
55
import com.alamkanak.weekview.WeekViewUtil.isSameDay
66
import java.util.*
77

8-
class WeekViewEvent {
8+
open class WeekViewEvent {
99
var id: String? = null
10-
var startTime: Calendar? = null
11-
set(value) {
12-
field = value
13-
resetDatesForAllDayIfNeeded()
14-
}
15-
var endTime: Calendar? = null
16-
set(value) {
17-
field = value
18-
resetDatesForAllDayIfNeeded()
19-
}
10+
val startTime: Calendar
11+
val endTime: Calendar
2012
var name: String? = null
2113
var location: String? = null
2214
@ColorInt
2315
@get:ColorInt
2416
var color: Int = 0
25-
var isAllDay: Boolean = false
26-
set(value) {
27-
field = value
28-
resetDatesForAllDayIfNeeded()
29-
}
17+
val isAllDay: Boolean
3018
var shader: Shader? = null
3119

32-
constructor()
33-
34-
private fun resetDatesForAllDayIfNeeded() {
35-
if (!isAllDay)
36-
return
37-
when {
38-
startTime == null && endTime != null -> {
39-
WeekViewUtil.resetTime(endTime!!)
40-
startTime = endTime
41-
}
42-
startTime != null && endTime == null -> {
43-
WeekViewUtil.resetTime(startTime!!)
44-
endTime = startTime
45-
}
46-
startTime != null && endTime != null -> {
47-
WeekViewUtil.resetTime(startTime!!)
48-
if (!WeekViewUtil.isSameDay(startTime!!, endTime!!))
49-
WeekViewUtil.resetTime(endTime!!)
50-
else if (endTime !== startTime)
51-
endTime = startTime
52-
}
53-
}
54-
}
55-
5620
/**CTOR for a single, all day event*/
5721
constructor(id: String?, name: String?, location: String? = null, allDayTime: Calendar, shader: Shader? = null) : this(id, name, location, allDayTime, allDayTime, true, shader)
5822

@@ -72,10 +36,18 @@ class WeekViewEvent {
7236
this.name = name
7337
this.location = location
7438
this.isAllDay = allDay
75-
this.startTime = startTime
76-
this.endTime = endTime
77-
this.startTime = startTime
78-
this.isAllDay = allDay
39+
if (!allDay) {
40+
this.startTime = startTime
41+
this.endTime = endTime
42+
} else {
43+
WeekViewUtil.resetTime(startTime)
44+
this.startTime = startTime
45+
if (!WeekViewUtil.isSameDay(startTime, endTime)) {
46+
WeekViewUtil.resetTime(endTime)
47+
this.endTime = endTime
48+
} else
49+
this.endTime = startTime
50+
}
7951
this.shader = shader
8052
}
8153

@@ -91,73 +63,68 @@ class WeekViewEvent {
9163

9264
override fun equals(other: Any?): Boolean {
9365
if (this === other) return true
94-
if (other == null || javaClass != other.javaClass) return false
95-
val that = other as WeekViewEvent?
96-
return id == that!!.id
66+
if (other !is WeekViewEvent) return false
67+
return id == other.id
9768
}
9869

9970
override fun hashCode(): Int {
100-
return id!!.hashCode()
71+
return id?.hashCode() ?: 0
10172
}
10273

10374
fun splitWeekViewEvents(): MutableList<WeekViewEvent> {
10475
//This function splits the WeekViewEvent in WeekViewEvents by day
105-
if (this.endTime == null || isSameDay(this.startTime!!, this.endTime!!)) {
76+
if (isSameDay(this.startTime, this.endTime)) {
10677
val events = ArrayList<WeekViewEvent>(1)
10778
events.add(this)
10879
return events
10980
}
11081
val events = ArrayList<WeekViewEvent>()
11182
// The first millisecond of the next day is still the same day. (no need to split events for this).
112-
var endTime = this.endTime!!.clone() as Calendar
83+
var endTime = this.endTime.clone() as Calendar
11384
endTime.add(Calendar.MILLISECOND, -1)
114-
endTime = this.startTime!!.clone() as Calendar
85+
endTime = this.startTime.clone() as Calendar
11586
endTime.set(Calendar.HOUR_OF_DAY, 23)
11687
endTime.set(Calendar.MINUTE, 59)
117-
val event1 = WeekViewEvent(this.id!!, this.name, this.location, this.startTime!!, endTime, this.isAllDay)
88+
val event1 = WeekViewEvent(this.id, this.name, this.location, this.startTime, endTime, this.isAllDay)
11889
event1.color = this.color
11990
events.add(event1)
120-
12191
// Add other days.
122-
if (!isSameDay(this.startTime!!, this.endTime!!)) {
123-
val otherDay = this.startTime!!.clone() as Calendar
92+
if (!isSameDay(this.startTime, this.endTime)) {
93+
val otherDay = this.startTime.clone() as Calendar
12494
otherDay.add(Calendar.DATE, 1)
125-
while (!isSameDay(otherDay, this.endTime!!)) {
95+
while (!isSameDay(otherDay, this.endTime)) {
12696
val overDay = otherDay.clone() as Calendar
12797
overDay.set(Calendar.HOUR_OF_DAY, 0)
12898
overDay.set(Calendar.MINUTE, 0)
12999
val endOfOverDay = overDay.clone() as Calendar
130100
endOfOverDay.set(Calendar.HOUR_OF_DAY, 23)
131101
endOfOverDay.set(Calendar.MINUTE, 59)
132-
val eventMore = WeekViewEvent(this.id!!, this.name, null, overDay, endOfOverDay, this.isAllDay)
102+
val eventMore = WeekViewEvent(this.id, this.name, null, overDay, endOfOverDay, this.isAllDay)
133103
eventMore.color = this.color
134104
events.add(eventMore)
135105

136106
// Add next day.
137107
otherDay.add(Calendar.DATE, 1)
138108
}
139109
// Add last day.
140-
val startTime = this.endTime!!.clone() as Calendar
110+
val startTime = this.endTime.clone() as Calendar
141111
startTime.set(Calendar.HOUR_OF_DAY, 0)
142112
startTime.set(Calendar.MINUTE, 0)
143-
val event2 = WeekViewEvent(this.id!!, this.name, this.location, startTime, this.endTime!!, this.isAllDay)
113+
val event2 = WeekViewEvent(this.id, this.name, this.location, startTime, this.endTime, this.isAllDay)
144114
event2.color = this.color
145115
events.add(event2)
146116
}
147-
148117
return events
149118
}
150119

151120
override fun toString(): String {
152121
val colorStr = "#${Integer.toHexString(color)}"
153122
val startTimeStr = WeekViewUtil.calendarToString(startTime, !isAllDay)
154123
if (isAllDay) {
155-
if (endTime != null || WeekViewUtil.isSameDay(startTime!!, endTime!!))
124+
if (WeekViewUtil.isSameDay(startTime, endTime))
156125
return "allDayEvent(id=$id, time=$startTimeStr..${WeekViewUtil.calendarToString(startTime, false)}, name=$name, location=$location, color=$colorStr ,shader=$shader)"
157126
return "allDayEvent(id=$id, time=$startTimeStr, name=$name, location=$location, color=$colorStr ,shader=$shader)"
158127
}
159-
if (endTime != null)
160-
return "normalEvent(id=$id, startTime=$startTimeStr, name=$name, location=$location, color=$colorStr , shader=$shader)"
161128
val endTimeStr = WeekViewUtil.calendarToString(endTime, true)
162129
return "normalEvent(id=$id, startTime=$colorStr, endTime=$endTimeStr, name=$name, location=$location, color=$colorStr , shader=$shader)"
163130
}

sample/build.gradle

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,22 @@ android {
1818
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
1919
}
2020
}
21+
repositories {
22+
maven { url 'https://jitpack.io' }
23+
}
2124
}
2225

26+
2327
dependencies {
2428
implementation fileTree(dir: 'libs', include: ['*.jar'])
25-
implementation project(':library')
2629
implementation 'com.android.support:appcompat-v7:27.1.1'
2730
implementation 'com.squareup.retrofit:retrofit:1.9.0'
2831
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
32+
implementation project(':library')
33+
// implementation 'com.github.AndroidDeveloperLB:Android-Week-View:ef94b8d256'
34+
// implementation 'com.github.AndroidDeveloperLB:Android-Week-View:develop-SNAPSHOT'
35+
// implementation 'com.github.AndroidDeveloperLB:Android-Week-View:develop-v2.3.0-gef94b8d-26'
36+
2937
}
3038
repositories {
3139
mavenCentral()

sample/src/main/java/com/alamkanak/weekview/sample/AsynchronousActivity.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ class AsynchronousActivity : BaseActivity(), Callback<MutableList<Event>> {
5454
* @return True if the event matches the year and month.
5555
*/
5656
private fun eventMatches(event: WeekViewEvent, year: Int, month: Int): Boolean {
57-
return event.startTime!!.get(Calendar.YEAR) == year && event.startTime!!.get(Calendar.MONTH) == month - 1 || event.endTime!!.get(Calendar.YEAR) == year && event.endTime!!.get(Calendar.MONTH) == month - 1
57+
return event.startTime.get(Calendar.YEAR) == year && event.startTime.get(Calendar.MONTH) == month - 1 || event.endTime.get(Calendar.YEAR) == year && event.endTime.get(Calendar.MONTH) == month - 1
5858
}
5959

6060
override fun success(events: MutableList<Event>, response: Response) {

sample/src/main/java/com/alamkanak/weekview/sample/BaseActivity.kt

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -84,16 +84,15 @@ abstract class BaseActivity : AppCompatActivity(), WeekView.EventClickListener,
8484
setupDateTimeInterpreter(false)
8585
}
8686

87-
override fun onResume() {
88-
super.onResume()
89-
/*mWeekView.setShowDistinctPastFutureColor(true);
90-
mWeekView.setShowDistinctWeekendColor(true);
91-
mWeekView.setFutureBackgroundColor(Color.rgb(24,85,96));
92-
mWeekView.setFutureWeekendBackgroundColor(Color.rgb(255,0,0));
93-
mWeekView.setPastBackgroundColor(Color.rgb(85,189,200));
94-
mWeekView.setPastWeekendBackgroundColor(Color.argb(50, 0,255,0));
95-
*/
96-
}
87+
// override fun onResume() {
88+
// super.onResume()
89+
// mWeekView.setShowDistinctPastFutureColor(true);
90+
// mWeekView.setShowDistinctWeekendColor(true);
91+
// mWeekView.setFutureBackgroundColor(Color.rgb(24,85,96));
92+
// mWeekView.setFutureWeekendBackgroundColor(Color.rgb(255,0,0));
93+
// mWeekView.setPastBackgroundColor(Color.rgb(85,189,200));
94+
// mWeekView.setPastWeekendBackgroundColor(Color.argb(50, 0,255,0));
95+
// }
9796

9897
private inner class DragTapListener : View.OnLongClickListener {
9998
override fun onLongClick(v: View): Boolean {

sample/src/main/java/com/alamkanak/weekview/sample/apiclient/Event.kt

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -51,23 +51,23 @@ class Event {
5151

5252
// Initialize start and end time.
5353
val now = Calendar.getInstance()
54-
val startTime = now.clone() as Calendar
54+
val startTime = Calendar.getInstance()
5555
startTime.timeInMillis = start.time
56-
startTime.set(Calendar.YEAR, now.get(Calendar.YEAR))
57-
startTime.set(Calendar.MONTH, now.get(Calendar.MONTH))
58-
startTime.set(Calendar.DAY_OF_MONTH, dayOfMonth)
56+
with(startTime) {
57+
set(Calendar.YEAR, now.get(Calendar.YEAR))
58+
set(Calendar.MONTH, now.get(Calendar.MONTH))
59+
set(Calendar.DAY_OF_MONTH, dayOfMonth)
60+
}
5961
val endTime = startTime.clone() as Calendar
6062
endTime.timeInMillis = end.time
61-
endTime.set(Calendar.YEAR, startTime.get(Calendar.YEAR))
62-
endTime.set(Calendar.MONTH, startTime.get(Calendar.MONTH))
63-
endTime.set(Calendar.DAY_OF_MONTH, startTime.get(Calendar.DAY_OF_MONTH))
63+
with(endTime) {
64+
set(Calendar.YEAR, startTime.get(Calendar.YEAR))
65+
set(Calendar.MONTH, startTime.get(Calendar.MONTH))
66+
set(Calendar.DAY_OF_MONTH, startTime.get(Calendar.DAY_OF_MONTH))
67+
}
6468

6569
// Create an week view event.
66-
val weekViewEvent = WeekViewEvent()
67-
weekViewEvent.id = name
68-
weekViewEvent.name = name
69-
weekViewEvent.startTime = startTime
70-
weekViewEvent.endTime = endTime
70+
val weekViewEvent = WeekViewEvent(name, name, null, startTime, endTime)
7171
weekViewEvent.color = Color.parseColor(color)
7272

7373
return weekViewEvent

0 commit comments

Comments
 (0)