Skip to content

Commit 320b049

Browse files
committed
Display day change messages
Similar to weechat.look.day_change.
1 parent 6ee35b2 commit 320b049

1 file changed

Lines changed: 49 additions & 0 deletions

File tree

  • app/src/main/java/com/ubergeek42/WeechatAndroid/relay

app/src/main/java/com/ubergeek42/WeechatAndroid/relay/Lines.kt

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@ import com.ubergeek42.WeechatAndroid.utils.Linkify
88
import com.ubergeek42.WeechatAndroid.utils.Utils
99
import com.ubergeek42.WeechatAndroid.utils.invalidatableLazy
1010
import com.ubergeek42.weechat.Color
11+
import java.time.Instant
12+
import java.time.LocalDate
13+
import java.time.ZoneId
14+
import java.time.format.DateTimeFormatter
15+
import java.time.format.FormatStyle
16+
import java.time.temporal.ChronoUnit
1117
import java.util.*
1218
import kotlin.properties.Delegates.observable
1319

@@ -46,6 +52,13 @@ class Lines {
4652
var maxUnfilteredSize = P.lineIncrement
4753
private set
4854

55+
private var unfilteredDate = LocalDate.MIN
56+
private var filteredDate = LocalDate.MIN
57+
58+
private var lastOldDate = LocalDate.MIN
59+
private var lastNewDate = LocalDate.MIN
60+
private lateinit var lastDateLine: Line
61+
4962
// after reconnecting, in *full sync mode*, we are receiving and adding new lines to buffers.
5063
// there can be inconsistencies; if some lines were added while we were offline,
5164
// we can't display them, but can display what's on top and what's on bottom.
@@ -91,17 +104,53 @@ class Lines {
91104
if (status != Status.Fetching) return
92105
unfiltered.clear()
93106
filtered.clear()
107+
unfilteredDate = LocalDate.MIN
108+
filteredDate = LocalDate.MIN
109+
94110
for (line in lines) {
95111
addLast(line)
96112
}
97113
}
98114

115+
private fun getDateChangeLine(oldDate: LocalDate, newDate: LocalDate) : Line {
116+
if (lastOldDate != oldDate || lastNewDate != newDate) {
117+
val tstamp = newDate.atStartOfDay(ZoneId.systemDefault()).toEpochSecond() * 1000
118+
var msg = newDate.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM))
119+
if (oldDate.plusDays(1) != newDate) {
120+
msg += " (" +
121+
oldDate.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM)) +
122+
")"
123+
}
124+
msg += " --"
125+
lastDateLine = Line(++fakePointerCounter, LineSpec.Type.Other, tstamp, "--", msg,
126+
nick = null, isVisible = true, isHighlighted = false,
127+
LineSpec.DisplayAs.Unspecified, LineSpec.NotifyLevel.Low)
128+
lastOldDate = oldDate
129+
lastNewDate = newDate
130+
}
131+
return lastDateLine
132+
}
133+
99134
fun addLast(line: Line) {
100135
if (shouldAddSquiggleOnNewLine) {
101136
shouldAddSquiggleOnNewLine = false
102137
if (status == Status.Init && unfiltered.size > 0) addLast(SquiggleLine()) // invisible
103138
}
104139

140+
val newDate = Instant.ofEpochSecond(line.timestamp / 1000)
141+
.atZone(ZoneId.systemDefault())
142+
.toLocalDate()
143+
144+
if (unfilteredDate != newDate) {
145+
unfiltered.addLast(getDateChangeLine(unfilteredDate, newDate))
146+
unfilteredDate = newDate
147+
}
148+
149+
if (line.isVisible && filteredDate != newDate) {
150+
filtered.addLast(getDateChangeLine(filteredDate, newDate))
151+
filteredDate = newDate
152+
}
153+
105154
if (shouldAddSquiggleOnNewVisibleLine && line.isVisible) {
106155
shouldAddSquiggleOnNewVisibleLine = false
107156
if (status == Status.Init && filtered.size > 0) {

0 commit comments

Comments
 (0)