@@ -8,6 +8,12 @@ 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
16+ import java.time.temporal.ChronoUnit
1117import java.util.*
1218import 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