Skip to content

Commit 26ffa94

Browse files
committed
Cleans up sample by moving data generation into EventCreator.
1 parent 9779d7a commit 26ffa94

File tree

6 files changed

+152
-117
lines changed

6 files changed

+152
-117
lines changed

app/build.gradle

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ apply plugin: 'com.android.application'
22

33
apply plugin: 'kotlin-android'
44

5-
apply plugin: 'kotlin-android-extensions'
6-
75
android {
86
compileSdkVersion 28
97
defaultConfig {
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package de.tobiasschuerg.weekview.sample
2+
3+
import android.graphics.Color
4+
import de.tobiasschuerg.weekview.data.Event
5+
import de.tobiasschuerg.weekview.data.WeekData
6+
import org.threeten.bp.DayOfWeek
7+
import org.threeten.bp.LocalDate
8+
import org.threeten.bp.LocalTime
9+
import java.util.Random
10+
11+
object EventCreator {
12+
13+
private val random = Random()
14+
private val titles = listOf("Title", "Event", "Android", "Sport", "Yoga", "Shopping", "Meeting")
15+
private val subTitles = listOf("City Center", "@Home", "urgent", "New York", null)
16+
private val weekDays = DayOfWeek.values()
17+
// Filter the weekend
18+
.filter { it != DayOfWeek.SATURDAY }
19+
.filter { it != DayOfWeek.SUNDAY }
20+
21+
private const val minEventLength = 30
22+
private const val maxEventLength = 90
23+
24+
val weekData: WeekData by lazy {
25+
WeekData().apply {
26+
var startTime: LocalTime
27+
weekDays
28+
.map { dayOfWeek ->
29+
startTime = LocalTime.of(8 + random.nextInt(1), random.nextInt(60))
30+
while (startTime.isBefore(LocalTime.of(15, 0))) {
31+
val endTime = startTime.plusMinutes(minEventLength + random.nextInt(maxEventLength - minEventLength).toLong())
32+
this.add(createSampleEntry(dayOfWeek, startTime, endTime))
33+
startTime = endTime.plusMinutes(5 + random.nextInt(95).toLong())
34+
}
35+
}
36+
earliestStart = LocalTime.MIN
37+
}
38+
}
39+
40+
fun createRandomEvent(): Event.Single {
41+
val startTime = LocalTime.of(8 + random.nextInt(8), random.nextInt(60))
42+
val endTime = startTime.plusMinutes((30 + random.nextInt(60)).toLong())
43+
val day = weekDays.shuffled().first()
44+
return createSampleEntry(day, startTime, endTime)
45+
}
46+
47+
private fun createSampleEntry(day: DayOfWeek, startTime: LocalTime, endTime: LocalTime): Event.Single {
48+
val name = titles[random.nextInt(titles.size)]
49+
val subTitle = subTitles[random.nextInt(subTitles.size)]
50+
return Event.Single(
51+
random.nextLong(),
52+
LocalDate.now(),
53+
name,
54+
name,
55+
subTitle,
56+
day,
57+
startTime,
58+
endTime,
59+
null, // "upper",
60+
null, // "lower",
61+
Color.WHITE,
62+
randomColor()
63+
)
64+
}
65+
66+
private fun randomColor(): Int {
67+
return Color.argb(255, random.nextInt(256), random.nextInt(256), random.nextInt(256))
68+
}
69+
}
Lines changed: 31 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package de.tobiasschuerg.weekview.sample
22

3-
import android.graphics.Color
43
import android.os.Bundle
54
import android.util.Log
65
import android.view.ContextMenu
@@ -10,64 +9,35 @@ import android.view.View
109
import android.widget.Toast
1110
import androidx.appcompat.app.AppCompatActivity
1211
import com.jakewharton.threetenabp.AndroidThreeTen
13-
import de.tobiasschuerg.weekview.data.Event
1412
import de.tobiasschuerg.weekview.data.EventConfig
15-
import de.tobiasschuerg.weekview.data.WeekData
1613
import de.tobiasschuerg.weekview.view.EventView
17-
import kotlinx.android.synthetic.main.activity_sample.week_view_foo
18-
import org.threeten.bp.DayOfWeek
19-
import org.threeten.bp.LocalDate
20-
import org.threeten.bp.LocalTime
21-
import java.util.Random
22-
import kotlin.math.absoluteValue
14+
import de.tobiasschuerg.weekview.view.WeekView
2315

2416
class SampleActivity : AppCompatActivity() {
2517

26-
private val random = Random()
27-
private val titles = listOf("Title", "Event", "Android", "Sport", "Yoga", "Shopping", "Meeting")
28-
private val subTitles = listOf("City Center", "@Home", "urgent", "New York", null)
29-
30-
private val minEventLength = 30
31-
private val maxEventLength = 90
32-
33-
private val data: WeekData by lazy {
34-
WeekData().apply {
35-
var startTime: LocalTime
36-
DayOfWeek.values()
37-
// Filter the weekend
38-
.filter { it != DayOfWeek.SATURDAY }
39-
.filter { it != DayOfWeek.SUNDAY }
40-
.map { dayOfWeek ->
41-
startTime = LocalTime.of(8 + random.nextInt(1), random.nextInt(60))
42-
while (startTime.isBefore(LocalTime.of(15, 0))) {
43-
val endTime = startTime.plusMinutes(minEventLength + random.nextInt(maxEventLength - minEventLength).toLong())
44-
this.add(createSampleEntry(dayOfWeek, startTime, endTime))
45-
startTime = endTime.plusMinutes(5 + random.nextInt(95).toLong())
46-
}
47-
}
48-
earliestStart = LocalTime.MIN
49-
}
50-
}
18+
private val weekView: WeekView by lazy { findViewById<WeekView>(R.id.week_view) }
5119

5220
override fun onCreate(savedInstanceState: Bundle?) {
5321
AndroidThreeTen.init(this)
5422
super.onCreate(savedInstanceState)
5523
setContentView(R.layout.activity_sample)
5624

5725
val config = EventConfig(showSubtitle = false, showTimeEnd = false)
58-
week_view_foo.eventConfig = config
26+
weekView.eventConfig = config
5927

6028
// set up the WeekView with the data
61-
week_view_foo.addEvents(data)
29+
weekView.addEvents(EventCreator.weekData)
30+
6231
// optional: add an onClickListener for each event
63-
week_view_foo.setLessonClickListener {
32+
weekView.setLessonClickListener {
6433
Toast.makeText(applicationContext, "Removing " + it.event.title, Toast.LENGTH_SHORT).show()
65-
week_view_foo.removeView(it)
34+
weekView.removeView(it)
6635
}
36+
6737
// optional: register a context menu to each event
68-
registerForContextMenu(week_view_foo)
38+
registerForContextMenu(weekView)
6939

70-
week_view_foo.setOnTouchListener { v, event ->
40+
weekView.setOnTouchListener { v, event ->
7141
when (event.pointerCount) {
7242
1 -> {
7343
Log.d("Scroll", "1-pointer touch")
@@ -82,28 +52,6 @@ class SampleActivity : AppCompatActivity() {
8252
}
8353
}
8454

85-
private fun createSampleEntry(day: DayOfWeek, startTime: LocalTime, endTime: LocalTime): Event.Single {
86-
val name = titles[random.nextInt(titles.size)]
87-
val subTitle = subTitles[random.nextInt(subTitles.size)]
88-
return Event.Single(
89-
random.nextLong().absoluteValue,
90-
LocalDate.now(),
91-
name,
92-
name,
93-
subTitle,
94-
day,
95-
startTime,
96-
endTime,
97-
null, // "upper",
98-
null, // "lower",
99-
Color.WHITE,
100-
randomColor()
101-
)
102-
}
103-
104-
private fun randomColor(): Int {
105-
return Color.argb(255, random.nextInt(256), random.nextInt(256), random.nextInt(256))
106-
}
10755

10856
override fun onCreateContextMenu(menu: ContextMenu, v: View, menuInfo: ContextMenu.ContextMenuInfo) {
10957
val (event) = menuInfo as EventView.LessonViewContextInfo
@@ -116,17 +64,30 @@ class SampleActivity : AppCompatActivity() {
11664

11765
override fun onCreateOptionsMenu(menu: Menu): Boolean {
11866
menu.add("Add").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM)
67+
menu.add("Clear").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM)
11968
return super.onCreateOptionsMenu(menu)
12069
}
12170

122-
override fun onOptionsItemSelected(item: MenuItem?): Boolean {
123-
val startTime = LocalTime.of(8 + random.nextInt(8), random.nextInt(60))
124-
val endTime = startTime.plusMinutes((30 + random.nextInt(60)).toLong())
125-
val day = DayOfWeek.values().asList().shuffled().first()
126-
val newEvents = listOf(createSampleEntry(day, startTime, endTime))
127-
newEvents.forEach { data.add(it) }
128-
week_view_foo.addEvents(data)
129-
registerForContextMenu(week_view_foo)
71+
override fun onOptionsItemSelected(item: MenuItem): Boolean {
72+
when (item.title) {
73+
"Add" -> addRandomItem()
74+
"Clear" -> removeAllEvents()
75+
}
13076
return true
13177
}
78+
79+
private fun removeAllEvents() {
80+
Log.i(TAG, "removeAllEvents()")
81+
weekView.removeViews(1, weekView.childCount - 1)
82+
}
83+
84+
private fun addRandomItem() {
85+
Log.i(TAG, "addRandomItem()")
86+
val newEvent = EventCreator.createRandomEvent()
87+
weekView.addEvent(newEvent)
88+
}
89+
90+
companion object {
91+
private const val TAG = "SampleActivity"
92+
}
13293
}

app/src/main/res/layout/activity_sample.xml

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
<?xml version="1.0" encoding="utf-8"?>
2-
<androidx.constraintlayout.widget.ConstraintLayout
3-
xmlns:android="http://schemas.android.com/apk/res/android"
2+
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
43
xmlns:app="http://schemas.android.com/apk/res-auto"
54
xmlns:tools="http://schemas.android.com/tools"
65
android:layout_width="match_parent"
@@ -13,7 +12,7 @@
1312
android:layout_height="match_parent">
1413

1514
<de.tobiasschuerg.weekview.view.WeekView
16-
android:id="@+id/week_view_foo"
15+
android:id="@+id/week_view"
1716
android:layout_width="match_parent"
1817
android:layout_height="wrap_content"
1918
app:accent_color="@color/colorAccent">
@@ -23,7 +22,7 @@
2322
android:layout_height="wrap_content"
2423
android:layout_alignParentBottom="true"
2524
android:layout_centerHorizontal="true"
26-
tools:text="@tools:sample/full_names"/>
25+
tools:text="@tools:sample/full_names" />
2726

2827
</de.tobiasschuerg.weekview.view.WeekView>
2928

library/src/main/java/de/tobiasschuerg/weekview/data/WeekData.kt

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,10 @@ class WeekData {
66

77
private val singleEvents: MutableList<Event.Single> = mutableListOf()
88

9-
fun getSingleEvents(): List<Event.Single> = singleEvents.toList()
10-
119
private val allDays: MutableList<Event.AllDay> = mutableListOf()
1210

13-
fun getAllDayEvents(): List<Event.AllDay> = allDays.toList()
14-
1511
var earliestStart: LocalTime = LocalTime.MAX
12+
1613
var latestEnd: LocalTime = LocalTime.MIN
1714

1815
fun add(item: Event.AllDay) {
@@ -31,5 +28,14 @@ class WeekData {
3128
}
3229
}
3330

31+
fun getSingleEvents(): List<Event.Single> = singleEvents.toList()
32+
33+
fun getAllDayEvents(): List<Event.AllDay> = allDays.toList()
34+
3435
fun isEmpty() = singleEvents.isEmpty() && allDays.isEmpty()
36+
37+
fun clear() {
38+
singleEvents.clear()
39+
allDays.clear()
40+
}
3541
}

library/src/main/java/de/tobiasschuerg/weekview/view/WeekView.kt

Lines changed: 39 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import android.view.View
1111
import android.widget.RelativeLayout
1212
import androidx.annotation.RequiresApi
1313
import de.tobiasschuerg.weekview.R
14+
import de.tobiasschuerg.weekview.data.Event
1415
import de.tobiasschuerg.weekview.data.EventConfig
1516
import de.tobiasschuerg.weekview.data.WeekData
1617
import de.tobiasschuerg.weekview.data.WeekViewConfig
@@ -118,59 +119,60 @@ class WeekView(context: Context, attributeSet: AttributeSet) : RelativeLayout(co
118119
}
119120

120121
fun addEvents(weekData: WeekData) {
121-
Log.d(TAG, "Adding ${weekData.getSingleEvents().size} weekData to timetable")
122+
Log.d(TAG, "Adding ${weekData.getSingleEvents().size} weekData to week view")
122123

123124
backgroundView.updateTimes(weekData.earliestStart, weekData.latestEnd)
124125

125-
val time: LocalTime = LocalTime.now()
126126
for (event in weekData.getSingleEvents()) {
127+
addEvent(event)
128+
}
127129

128-
when {
129-
event.day == DayOfWeek.SATURDAY -> {
130-
Log.i(TAG, "Enabling Saturday")
131-
if (!backgroundView.days.contains(DayOfWeek.SATURDAY)) {
132-
backgroundView.days.add(DayOfWeek.SATURDAY)
133-
}
130+
// TODO: support multi day weekData
131+
Log.d(TAG, " - Done adding weekData to timetable")
132+
}
133+
134+
fun addEvent(event: Event.Single) {
135+
when {
136+
event.day == DayOfWeek.SATURDAY -> {
137+
Log.i(TAG, "Enabling Saturday")
138+
if (!backgroundView.days.contains(DayOfWeek.SATURDAY)) {
139+
backgroundView.days.add(DayOfWeek.SATURDAY)
134140
}
135-
event.day == DayOfWeek.SUNDAY -> {
136-
Log.i(TAG, "Enabling Saturday")
137-
if (!backgroundView.days.contains(DayOfWeek.SATURDAY)) {
138-
backgroundView.days.add(DayOfWeek.SATURDAY)
139-
}
140-
Log.i(TAG, "Enabling Sunday")
141-
if (!backgroundView.days.contains(DayOfWeek.SUNDAY)) {
142-
backgroundView.days.add(DayOfWeek.SUNDAY)
143-
}
141+
}
142+
event.day == DayOfWeek.SUNDAY -> {
143+
Log.i(TAG, "Enabling Saturday")
144+
if (!backgroundView.days.contains(DayOfWeek.SATURDAY)) {
145+
backgroundView.days.add(DayOfWeek.SATURDAY)
146+
}
147+
Log.i(TAG, "Enabling Sunday")
148+
if (!backgroundView.days.contains(DayOfWeek.SUNDAY)) {
149+
backgroundView.days.add(DayOfWeek.SUNDAY)
144150
}
145151
}
152+
}
146153

147-
val lv = EventView(context, event, eventConfig, weekViewConfig.scalingFactor)
148-
backgroundView.updateTimes(event.startTime, event.endTime)
149-
150-
// mark active event
151-
152-
// mark active event
153-
if (LocalDate.now().dayOfWeek == event.day && // this day
154-
event.startTime < time && event.endTime > time) {
155-
lv.animation = Animation.createBlinkAnimation()
156-
}
154+
val lv = EventView(context, event, eventConfig, weekViewConfig.scalingFactor)
155+
backgroundView.updateTimes(event.startTime, event.endTime)
157156

158-
lv.setOnClickListener { clickListener?.invoke(lv) }
159-
lv.setOnCreateContextMenuListener(contextMenuListener)
160-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
161-
lv.transitionName = eventTransitionName
162-
}
157+
// mark active event
158+
val now = LocalTime.now()
159+
if (LocalDate.now().dayOfWeek == event.day && // this day
160+
event.startTime < now && event.endTime > now) {
161+
lv.animation = Animation.createBlinkAnimation()
162+
}
163163

164-
addView(lv)
164+
lv.setOnClickListener { clickListener?.invoke(lv) }
165+
lv.setOnCreateContextMenuListener(contextMenuListener)
166+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
167+
lv.transitionName = eventTransitionName
165168
}
166169

167-
// TODO: support multi day weekData
168-
Log.d(TAG, " - Done adding weekData to timetable")
170+
addView(lv)
169171
}
170172

171173
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
172-
val widthSize = View.MeasureSpec.getSize(widthMeasureSpec)
173-
val heightSize = View.MeasureSpec.getSize(heightMeasureSpec)
174+
val widthSize = MeasureSpec.getSize(widthMeasureSpec)
175+
val heightSize = MeasureSpec.getSize(heightMeasureSpec)
174176
Log.v(TAG, "Measuring ($widthSize x $heightSize)")
175177
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
176178
}

0 commit comments

Comments
 (0)