Skip to content

Commit 1a5926c

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

1 file changed

Lines changed: 55 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: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ 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
1116
import java.util.*
1217
import kotlin.properties.Delegates.observable
1318

@@ -46,6 +51,13 @@ class Lines {
4651
var maxUnfilteredSize = P.lineIncrement
4752
private set
4853

54+
private var dateOfLastUnfilteredLine: LocalDate? = null
55+
private var dateOfLastFilteredLine: LocalDate? = null
56+
57+
private var lastOldDate: LocalDate? = null
58+
private lateinit var lastNewDate: LocalDate
59+
private lateinit var lastDateLine: Line
60+
4961
// after reconnecting, in *full sync mode*, we are receiving and adding new lines to buffers.
5062
// there can be inconsistencies; if some lines were added while we were offline,
5163
// we can't display them, but can display what's on top and what's on bottom.
@@ -91,17 +103,60 @@ class Lines {
91103
if (status != Status.Fetching) return
92104
unfiltered.clear()
93105
filtered.clear()
106+
dateOfLastUnfilteredLine = null
107+
dateOfLastFilteredLine = null
108+
94109
for (line in lines) {
95110
addLast(line)
96111
}
97112
}
98113

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

144+
val newDate = Instant.ofEpochSecond(line.timestamp / 1000)
145+
.atZone(ZoneId.systemDefault())
146+
.toLocalDate()
147+
148+
if (dateOfLastUnfilteredLine != newDate) {
149+
unfiltered.addLast(obtainDateChangeLine(dateOfLastUnfilteredLine, newDate))
150+
dateOfLastUnfilteredLine = newDate
151+
skipUnfiltered++
152+
}
153+
154+
if (line.isVisible && dateOfLastFilteredLine != newDate) {
155+
filtered.addLast(obtainDateChangeLine(dateOfLastFilteredLine, newDate))
156+
dateOfLastFilteredLine = newDate
157+
skipFiltered++
158+
}
159+
105160
if (shouldAddSquiggleOnNewVisibleLine && line.isVisible) {
106161
shouldAddSquiggleOnNewVisibleLine = false
107162
if (status == Status.Init && filtered.size > 0) {

0 commit comments

Comments
 (0)