diff --git a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/CallOutputRecovery.kt b/tools/chatgui-android/app/src/main/java/com/utun/chat/data/CallOutputRecovery.kt index bff7e344..ac45c909 100644 --- a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/CallOutputRecovery.kt +++ b/tools/chatgui-android/app/src/main/java/com/utun/chat/data/CallOutputRecovery.kt @@ -32,5 +32,13 @@ internal class CallOutputPosition { } fun played(raw: Int, written: Long): Long? = head.update(raw, written - base)?.let { base + it } - fun timestamp(local: Long): Long = if (local < 0) -1 else base + local + fun timestamp(local: Long, written: Long): Long { + if (local < 0) return -1 + var extended = local + if (local <= 0xffffffffL) { + extended = ((written - base) and -0x100000000L) or local + if (extended > written - base) extended -= 0x100000000L + } + return if (extended < 0) -1 else base + extended + } } diff --git a/tools/chatgui-android/app/src/test/java/com/utun/chat/data/CallOutputRecoveryTest.kt b/tools/chatgui-android/app/src/test/java/com/utun/chat/data/CallOutputRecoveryTest.kt index f256d52d..bad4dcf0 100644 --- a/tools/chatgui-android/app/src/test/java/com/utun/chat/data/CallOutputRecoveryTest.kt +++ b/tools/chatgui-android/app/src/test/java/com/utun/chat/data/CallOutputRecoveryTest.kt @@ -22,8 +22,9 @@ class CallOutputRecoveryTest { p.reopen(accepted) assertEquals(accepted, p.played(0, accepted)) assertEquals(accepted + 96, p.played(96, accepted + 672)) - assertEquals(accepted + 48, p.timestamp(48)) - assertEquals(-1L, p.timestamp(-1)) + assertEquals(accepted + 48, p.timestamp(48, accepted + 672)) + assertEquals(-1L, p.timestamp(-1, accepted + 672)) + assertEquals(accepted + 0x100000030L, p.timestamp(48, accepted + 0x100000100L)) assertNull(p.played(1000, accepted + 672)) p.reopen(1920) assertEquals(1920L, p.played(0, 1920))