Skip to content

Commit c347765

Browse files
committed
WIP activity ordering
1 parent ec4ec49 commit c347765

File tree

6 files changed

+161
-7
lines changed

6 files changed

+161
-7
lines changed

app/build.gradle

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,9 @@ dependencies {
6868
implementation "androidx.constraintlayout:constraintlayout:2.0.0-alpha2"
6969
implementation 'androidx.recyclerview:recyclerview:1.0.0'
7070
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
71-
71+
// https://github.com/JakeWharton/ThreeTenABP
72+
// https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html
73+
implementation 'com.jakewharton.threetenabp:threetenabp:1.1.0'
7274

7375
// https://developer.android.com/kotlin/ktx
7476
implementation "androidx.core:core-ktx:$ktx_version"

app/src/main/java/cz/josefadamcik/activityjournal/MainActivity.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package cz.josefadamcik.activityjournal
33
import android.os.Bundle
44
import androidx.appcompat.app.AppCompatActivity
55
import cz.josefadamcik.activityjournal.model.ActivityRecord
6+
import cz.josefadamcik.activityjournal.model.ActivityRecordsRepository
67
import cz.josefadamcik.activityjournal.screens.addactivity.AddActivityFlowFragment
78
import cz.josefadamcik.activityjournal.screens.addactivity.AddActivityTimeFragment
89
import cz.josefadamcik.activityjournal.screens.addactivity.AddActivityTitleFragment
@@ -17,7 +18,7 @@ class MainActivity : AppCompatActivity(),
1718
AddActivityTimeFragment.OnFragmentInteractionListener,
1819
AddActivityTitleFragment.OnFragmentInteractionListener {
1920

20-
private val activityRecordsList = mutableListOf<ActivityRecord>()
21+
private val activityRecordsRepository = ActivityRecordsRepository()
2122

2223
override fun onCreate(savedInstanceState: Bundle?) {
2324
super.onCreate(savedInstanceState)
@@ -28,7 +29,7 @@ class MainActivity : AppCompatActivity(),
2829
.add(android.R.id.content, TimelineFragment.newInstance())
2930
.commit()
3031
supportFragmentManager.executePendingTransactions()
31-
findTimelineFragment()?.showRecords(activityRecordsList)
32+
findTimelineFragment()?.showRecords(activityRecordsRepository.getActivityRecords())
3233
}
3334
}
3435

@@ -41,8 +42,8 @@ class MainActivity : AppCompatActivity(),
4142

4243
override fun onAddActivityFlowFinished(activityRecord: ActivityRecord) {
4344
supportFragmentManager.popBackStackImmediate()
44-
activityRecordsList.add(activityRecord)
45-
findTimelineFragment()?.showRecords(activityRecordsList)
45+
activityRecordsRepository.add(activityRecord)
46+
findTimelineFragment()?.showRecords(activityRecordsRepository.getActivityRecords())
4647
}
4748

4849
override fun onBackPressed() {

app/src/main/java/cz/josefadamcik/activityjournal/model/ActivityRecord.kt

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
package cz.josefadamcik.activityjournal.model
22

3+
import org.threeten.bp.LocalDate
4+
import org.threeten.bp.LocalDateTime
5+
import org.threeten.bp.LocalTime
6+
import org.threeten.bp.format.DateTimeFormatterBuilder
7+
8+
9+
10+
311
sealed class ActivityRecordDuration {
412
object Undergoing : ActivityRecordDuration()
513
data class Done(val minutes: Int) : ActivityRecordDuration()
@@ -10,4 +18,21 @@ data class ActivityRecord(
1018
val date: String,
1119
val time: String,
1220
val duration: ActivityRecordDuration
13-
)
21+
) {
22+
companion object {
23+
private val timeFormatter = DateTimeFormatterBuilder()
24+
.appendPattern("H:mm")
25+
.toFormatter()
26+
27+
private val dateFormatter = DateTimeFormatterBuilder()
28+
.appendPattern("d.M.yyyy")
29+
.toFormatter()
30+
}
31+
32+
val parsedDateTime : LocalDateTime
33+
get() = LocalDateTime.of(
34+
LocalDate.parse(date, dateFormatter),
35+
LocalTime.parse(time, timeFormatter)
36+
)
37+
38+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package cz.josefadamcik.activityjournal.model
2+
3+
class ActivityRecordsRepository {
4+
private val activityRecordsList = mutableListOf<ActivityRecord>()
5+
6+
fun add(item: ActivityRecord) {
7+
activityRecordsList.add(item)
8+
9+
10+
activityRecordsList.sortWith(Comparator<ActivityRecord> { record1: ActivityRecord, record2: ActivityRecord ->
11+
//a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the
12+
val parsedDateTime1 = record1.parsedDateTime
13+
val parsedDateTime2 = record2.parsedDateTime
14+
if (record1.duration == ActivityRecordDuration.Undergoing
15+
&& record2.duration != ActivityRecordDuration.Undergoing) {
16+
return@Comparator -1
17+
} else if (record1.duration != ActivityRecordDuration.Undergoing
18+
&& record2.duration == ActivityRecordDuration.Undergoing) {
19+
return@Comparator 1
20+
} else {
21+
return@Comparator parsedDateTime2.compareTo(parsedDateTime1)
22+
}
23+
})
24+
}
25+
26+
fun getActivityRecords(): List<ActivityRecord> = activityRecordsList
27+
}

app/src/main/java/cz/josefadamcik/activityjournal/screens/timeline/TimelineFragment.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ class TimelineFragment : Fragment() {
6060
listener = null
6161
}
6262

63-
fun showRecords(list: MutableList<ActivityRecord>) {
63+
fun showRecords(list: List<ActivityRecord>) {
6464
listOfRecords = list
6565
adapter?.updateList(list)
6666
}
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
package cz.josefadamcik.activityjournal.model
2+
3+
import org.junit.Assert.*
4+
import org.junit.Before
5+
import org.junit.Test
6+
7+
8+
/**
9+
* Timeline should look like this:
10+
*
11+
* 10:00 Undergoing
12+
* 8:00 Undergoing
13+
* 12:00 Finished
14+
* 10:00 Finished
15+
*
16+
*/
17+
class ActivityRecordsRepositoryTest {
18+
19+
20+
private val activityRecord = ActivityRecord(
21+
title = "first activity",
22+
time = "10:00",
23+
date = "12.10.2018",
24+
duration = ActivityRecordDuration.Done(60)
25+
)
26+
27+
private val repository = ActivityRecordsRepository().apply {
28+
add(activityRecord)
29+
}
30+
31+
32+
@Test
33+
fun `when new item's time is before first it should be returned as second`() {
34+
//arrange
35+
val record = activityRecord.copy(time = "8:00")
36+
37+
//act
38+
repository.add(record)
39+
40+
//assert
41+
assertEquals(record, repository.getActivityRecords()[1])
42+
}
43+
44+
45+
@Test
46+
fun `when new item's time is after first it should be returned as first`() {
47+
//arrange
48+
val record = activityRecord.copy(time = "12:00")
49+
50+
//act
51+
repository.add(record)
52+
53+
//assert
54+
assertEquals(record, repository.getActivityRecords()[0])
55+
}
56+
57+
@Test
58+
fun `when new item is before first but undergoing it should be returned as first`() {
59+
//arrange
60+
val record = activityRecord.copy(time = "8:00", duration = ActivityRecordDuration.Undergoing)
61+
62+
//act
63+
repository.add(record)
64+
65+
//assert
66+
assertEquals(record, repository.getActivityRecords()[0])
67+
}
68+
69+
@Test
70+
fun `when two undergoing items are added they should be ordered by time`() {
71+
//arrange
72+
val record = activityRecord.copy(time = "8:00", duration = ActivityRecordDuration.Undergoing)
73+
val record2 = activityRecord.copy(time = "9:00", duration = ActivityRecordDuration.Undergoing)
74+
75+
//act
76+
repository.add(record)
77+
repository.add(record2)
78+
79+
//assert
80+
assertEquals(record2, repository.getActivityRecords()[0])
81+
assertEquals(record, repository.getActivityRecords()[1])
82+
}
83+
84+
85+
@Test
86+
fun `when new item's date is after first it should be returned as first`() {
87+
//arrange
88+
val record = activityRecord.copy(date = "13.10.2018")
89+
90+
//act
91+
repository.add(record)
92+
93+
//assert
94+
assertEquals(record, repository.getActivityRecords()[0])
95+
}
96+
97+
98+
99+
}

0 commit comments

Comments
 (0)