@@ -8,6 +8,11 @@ import com.ubergeek42.WeechatAndroid.utils.Linkify
88import com.ubergeek42.WeechatAndroid.utils.Utils
99import com.ubergeek42.WeechatAndroid.utils.invalidatableLazy
1010import 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
1116import java.util.*
1217import 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