diff --git a/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt b/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt index eeb6549794a615dff2003559da1c26af007571d1..ee1778e9a7a8e73179bf03b238a1b25812dfe009 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt @@ -179,8 +179,8 @@ class QuasselService : DaggerLifecycleService(), } } - val clearMessageId = intent.getIntExtra("mark_read_message", -1) - if (bufferId != -1 && clearMessageId != -1) { + val clearMessageId = intent.getLongExtra("mark_read_message", -1) + if (bufferId != -1 && clearMessageId != -1L) { sessionManager.session.value?.bufferSyncer?.requestSetLastSeenMsg(bufferId, clearMessageId) sessionManager.session.value?.bufferSyncer?.requestMarkBufferAsRead(bufferId) } diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt index 53884fc0d0cfc35950c973fcaec38ca4c6d80e8d..89bcbe7cbdcd4e4c000c54835afc6bc8bbe26582 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt @@ -313,7 +313,7 @@ class MessageListFragment : ServiceBoundFragment() { swipeRefreshLayout.isEnabled = (bufferId != null || bufferId != -1) }) - var previousVisible = -1 + var previousVisible = -1L viewModel.buffer.toFlowable(BackpressureStrategy.LATEST).switchMap { buffer -> database.filtered().listenRx(accountId, buffer).switchMap { filtered -> database.message().firstMsgId(buffer).map { diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/Message.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/Message.kt index 38e62fb9cd12e16342dc674e3d60c7aa6cb52297..f7e53537816482218c64402cbe6506f3a9e77d92 100644 --- a/lib/src/main/java/de/kuschku/libquassel/protocol/Message.kt +++ b/lib/src/main/java/de/kuschku/libquassel/protocol/Message.kt @@ -25,7 +25,7 @@ import de.kuschku.libquassel.util.flag.Flags import org.threeten.bp.Instant class Message( - val messageId: Int, + val messageId: MsgId, val time: Instant, val type: Message_Types, val flag: Message_Flags, diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/QType.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/QType.kt index 723f54f2bc42cff9075bcdbd4b39fdbb7e8f7002..4190819052b789fb2ef0ac61c0f0233922dea1a0 100644 --- a/lib/src/main/java/de/kuschku/libquassel/protocol/QType.kt +++ b/lib/src/main/java/de/kuschku/libquassel/protocol/QType.kt @@ -33,7 +33,7 @@ enum class QType(val typeName: String, val serializer: Serializer<*>, Identity("Identity", VariantMapSerializer), IdentityId("IdentityId", IntSerializer), Message("Message", MessageSerializer), - MsgId("MsgId", IntSerializer), + MsgId("MsgId", SignedId64Serializer), NetworkId("NetworkId", IntSerializer), NetworkInfo("NetworkInfo", VariantMapSerializer), Network_Server("Network::Server", VariantMapSerializer), diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/QTypes.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/QTypes.kt index 1a3adf1712ba226c91956860f2956d2137b66fdf..79a5070cf67d0a915df8faab85eec6683460bdde 100644 --- a/lib/src/main/java/de/kuschku/libquassel/protocol/QTypes.kt +++ b/lib/src/main/java/de/kuschku/libquassel/protocol/QTypes.kt @@ -35,10 +35,13 @@ typealias QVariant_ = QVariant<*> typealias QVariantMap = Map<String, QVariant_> typealias QVariantList = List<QVariant_> -typealias IdentityId = Int -typealias BufferId = Int -typealias MsgId = Int -typealias NetworkId = Int +typealias SignedId = Int +typealias SignedId64 = Long + +typealias IdentityId = SignedId +typealias BufferId = SignedId +typealias MsgId = SignedId64 +typealias NetworkId = SignedId typealias Message_Type = Message.MessageType typealias Message_Types = Flags<Message_Type> diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/MessageSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/MessageSerializer.kt index ff317029117b110b17bf54b039df1b734cce756e..9b3381170b140ef75be7492d7e4a2ad61edf0c5d 100644 --- a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/MessageSerializer.kt +++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/MessageSerializer.kt @@ -28,7 +28,7 @@ import java.nio.ByteBuffer object MessageSerializer : Serializer<Message> { override fun serialize(buffer: ChainedByteBuffer, data: Message, features: QuasselFeatures) { - IntSerializer.serialize(buffer, data.messageId, features) + SignedId64Serializer.serialize(buffer, data.messageId, features) if (features.hasFeature(ExtendedFeature.LongMessageTime)) LongSerializer.serialize(buffer, data.time.toEpochMilli(), features) else @@ -48,7 +48,7 @@ object MessageSerializer : Serializer<Message> { override fun deserialize(buffer: ByteBuffer, features: QuasselFeatures): Message { return Message( - messageId = IntSerializer.deserialize(buffer, features), + messageId = SignedId64Serializer.deserialize(buffer, features), time = if (features.hasFeature(ExtendedFeature.LongMessageTime)) Instant.ofEpochMilli(LongSerializer.deserialize(buffer, features)) else diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/SignedId64Serializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/SignedId64Serializer.kt new file mode 100644 index 0000000000000000000000000000000000000000..bc8c21aadcf552f86ec79bf41af7bc63559c1ade --- /dev/null +++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/SignedId64Serializer.kt @@ -0,0 +1,42 @@ +/* + * Quasseldroid - Quassel client for Android + * + * Copyright (c) 2018 Janne Koschinski + * Copyright (c) 2018 The Quassel Project + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 3 as published + * by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package de.kuschku.libquassel.protocol.primitive.serializer + +import de.kuschku.libquassel.protocol.SignedId64 +import de.kuschku.libquassel.quassel.ExtendedFeature +import de.kuschku.libquassel.quassel.QuasselFeatures +import de.kuschku.libquassel.util.nio.ChainedByteBuffer +import java.nio.ByteBuffer + +object SignedId64Serializer : Serializer<SignedId64> { + override fun serialize(buffer: ChainedByteBuffer, data: SignedId64, features: QuasselFeatures) { + if (features.hasFeature(ExtendedFeature.LongMessageId)) + buffer.putLong(data) + else + buffer.putInt(data.toInt()) + } + + override fun deserialize(buffer: ByteBuffer, features: QuasselFeatures): SignedId64 { + return if (features.hasFeature(ExtendedFeature.LongMessageId)) + buffer.long + else + buffer.int.toLong() + } +} diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/ExtendedFeature.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/ExtendedFeature.kt index 1464beb49aaedacc3b19aecafc6c0b3351267bcd..92af6d3ce2bc2dd39036d91f14188a0469480267 100644 --- a/lib/src/main/java/de/kuschku/libquassel/quassel/ExtendedFeature.kt +++ b/lib/src/main/java/de/kuschku/libquassel/quassel/ExtendedFeature.kt @@ -49,7 +49,9 @@ enum class ExtendedFeature { /** Serialize message time as 64-bit */ LongMessageTime, /** Real Name and Avatar URL in backlog */ - RichMessages; + RichMessages, + /** 64-bit IDs for messages */ + LongMessageId; companion object { private val map = values().associateBy(ExtendedFeature::name) diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferSyncer.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferSyncer.kt index 6a83d348148361fb17a615cffc7cc87c22caadd8..c819cb2ca6088797cf8279db855d575eab54930b 100644 --- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferSyncer.kt +++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferSyncer.kt @@ -141,7 +141,7 @@ class BufferSyncer constructor( override fun initSetLastSeenMsg(data: QVariantList) { (0 until data.size step 2).map { - data[it].value(0) to data[it + 1].value(0) + data[it].value(0) to data[it + 1].value(0L) }.forEach { (buffer, msgId) -> setLastSeenMsg(buffer, msgId) } @@ -150,7 +150,7 @@ class BufferSyncer constructor( override fun initSetMarkerLines(data: QVariantList) { (0 until data.size step 2).map { - data[it].value(0) to data[it + 1].value(0) + data[it].value(0) to data[it + 1].value(0L) }.forEach { (buffer, msgId) -> setMarkerLine(buffer, msgId) } diff --git a/lib/src/main/java/de/kuschku/libquassel/session/NotificationManager.kt b/lib/src/main/java/de/kuschku/libquassel/session/NotificationManager.kt index b6e4f40854d1bc6c0050f0235fbec11e72bbd9a9..982505d80b3859373b9ddb720c0c3c3b62a8961f 100644 --- a/lib/src/main/java/de/kuschku/libquassel/session/NotificationManager.kt +++ b/lib/src/main/java/de/kuschku/libquassel/session/NotificationManager.kt @@ -26,5 +26,5 @@ import de.kuschku.libquassel.protocol.MsgId interface NotificationManager { fun init(session: Session) fun processMessages(session: Session, vararg messages: Message) - fun clear(buffer: BufferId, lastRead: MsgId = Int.MAX_VALUE) + fun clear(buffer: BufferId, lastRead: MsgId = MsgId.MAX_VALUE) } diff --git a/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselDatabase.kt b/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselDatabase.kt index 69078084e492281b64ae506cc99f3b02f64ffba1..7f4f76c227586200d0bae3330194154d2cd69810 100644 --- a/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselDatabase.kt +++ b/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselDatabase.kt @@ -69,7 +69,7 @@ abstract class QuasselDatabase : RoomDatabase() { @Entity(tableName = "message", indices = [Index("bufferId"), Index("ignored")]) data class MessageData( - @PrimaryKey var messageId: Int, + @PrimaryKey var messageId: MsgId, var time: Instant, var type: Message_Types, var flag: Message_Flags, @@ -223,7 +223,7 @@ abstract class QuasselDatabase : RoomDatabase() { @Entity(tableName = "notification", indices = [Index("bufferId")]) data class NotificationData( - @PrimaryKey var messageId: Int, + @PrimaryKey var messageId: MsgId, var time: Instant, var type: Message_Types, var flag: Message_Flags, diff --git a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/FormattedMessage.kt b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/FormattedMessage.kt index b31304934899ec88e703b7c331122b9cb442c291..6eda804f1afd8106f707405d901d541f34360ea0 100644 --- a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/FormattedMessage.kt +++ b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/FormattedMessage.kt @@ -20,9 +20,10 @@ package de.kuschku.quasseldroid.viewmodel.data import android.graphics.drawable.Drawable +import de.kuschku.libquassel.protocol.MsgId class FormattedMessage( - val id: Int, + val id: MsgId, val time: CharSequence, val name: CharSequence? = null, val content: CharSequence? = null,