AGPL-3.0-only, a source link in the app, and everything on dev since #5 #6

Merged
bvandeusen merged 214 commits from dev into main 2026-10-21 21:40:00 -04:00
2 changed files with 8 additions and 9 deletions
Showing only changes of commit 142fafe0ed - Show all commits
@@ -10,7 +10,6 @@ import androidx.compose.ui.platform.LocalContext
import com.fabledsword.inkwell.TagViews
import com.fabledsword.inkwell.core.Label
import com.fabledsword.inkwell.core.Note
import java.time.OffsetDateTime
/**
* The drawer lists the few tags in use rather than every tag (#5931), so a long
@@ -47,17 +46,16 @@ fun tagRecency(
notes: List<Note>,
views: Map<String, Long>,
): Map<String, Long> {
val latest = labels.associate { it.id to maxOf(epochMillis(it.lastUsed), views[it.id] ?: 0L) }.toMutableMap()
// A missing or unreadable stamp counts as 0: such a tag simply ranks last.
val latest = labels.associate { it.id to maxOf(it.lastUsed.millis(), views[it.id] ?: 0L) }.toMutableMap()
for (note in notes) {
val at = epochMillis(note.updatedAt)
val at = note.updatedAt.millis()
for (label in note.labels) latest.computeIfPresent(label.id) { _, was -> maxOf(was, at) }
}
return latest
}
/** 0 for a missing or unreadable stamp: such a tag simply ranks last. */
fun epochMillis(stamp: String?): Long =
stamp?.let { runCatching { OffsetDateTime.parse(it).toInstant().toEpochMilli() }.getOrNull() } ?: 0L
private fun String?.millis(): Long = this?.let(::epochMillis) ?: 0L
/**
* When each tag's lens was last opened here. Opening one counts as using it,
@@ -1,6 +1,7 @@
package com.fabledsword.inkwell.ui
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNull
import org.junit.Assert.assertSame
import org.junit.Test
@@ -32,10 +33,10 @@ class RecentTagsTest {
}
@Test
fun `reads both stamp forms the store holds`() {
fun `the shared epochMillis reads both stamp forms tag recency is built from`() {
// The core writes `Z` with milliseconds; a pulled server row may carry +00:00.
assertEquals(1_760_000_000_000L, epochMillis("2025-10-09T08:53:20.000Z"))
assertEquals(1_760_000_000_000L, epochMillis("2025-10-09T08:53:20+00:00"))
assertEquals(0L, epochMillis(null))
assertEquals(0L, epochMillis("not a time"))
assertNull(epochMillis("not a time"))
}
}