Skip to content
Snippets Groups Projects
Commit 3084237c authored by Janne Mareike Koschinski's avatar Janne Mareike Koschinski
Browse files

Minor bugfixes and improvements

parent d1df014c
No related branches found
No related tags found
No related merge requests found
...@@ -13,12 +13,10 @@ class QuasselBacklogStorage(private val db: QuasselDatabase) : BacklogStorage { ...@@ -13,12 +13,10 @@ class QuasselBacklogStorage(private val db: QuasselDatabase) : BacklogStorage {
for ((bufferId, bufferMessages) in messages.sortedBy { it.messageId }.groupBy { it.bufferInfo.bufferId }) { for ((bufferId, bufferMessages) in messages.sortedBy { it.messageId }.groupBy { it.bufferInfo.bufferId }) {
val lastMessageId = db.message().findLastByBufferId(bufferId)?.messageId val lastMessageId = db.message().findLastByBufferId(bufferId)?.messageId
val firstMessage = bufferMessages.firstOrNull() val firstMessage = bufferMessages.firstOrNull()
if (lastMessageId != null && firstMessage != null) { if (lastMessageId == null || firstMessage == null || lastMessageId < firstMessage.messageId) {
if (lastMessageId < firstMessage.messageId) {
db.message().clearMessages(bufferId) db.message().clearMessages(bufferId)
} }
} }
}
for (message in messages) { for (message in messages) {
db.message().save( db.message().save(
......
...@@ -211,6 +211,7 @@ class BufferViewConfigFragment : ServiceBoundFragment() { ...@@ -211,6 +211,7 @@ class BufferViewConfigFragment : ServiceBoundFragment() {
) )
chatList.layoutManager = LinearLayoutManager(context) chatList.layoutManager = LinearLayoutManager(context)
chatList.itemAnimator = DefaultItemAnimator() chatList.itemAnimator = DefaultItemAnimator()
chatList.setItemViewCacheSize(10)
return view return view
} }
......
...@@ -68,5 +68,9 @@ class MessageAdapter(context: Context) : ...@@ -68,5 +68,9 @@ class MessageAdapter(context: Context) :
messageRenderer.init(viewHolder, messageType, hasHighlight) messageRenderer.init(viewHolder, messageType, hasHighlight)
return viewHolder return viewHolder
} }
operator fun get(position: Int): QuasselDatabase.DatabaseMessage? {
return getItem(position)
}
} }
...@@ -15,18 +15,20 @@ import android.view.ViewGroup ...@@ -15,18 +15,20 @@ import android.view.ViewGroup
import butterknife.BindView import butterknife.BindView
import butterknife.ButterKnife import butterknife.ButterKnife
import de.kuschku.libquassel.protocol.BufferId import de.kuschku.libquassel.protocol.BufferId
import de.kuschku.libquassel.session.Backend
import de.kuschku.libquassel.session.SessionManager
import de.kuschku.quasseldroid_ng.R import de.kuschku.quasseldroid_ng.R
import de.kuschku.quasseldroid_ng.persistence.QuasselDatabase import de.kuschku.quasseldroid_ng.persistence.QuasselDatabase
import de.kuschku.quasseldroid_ng.util.AndroidHandlerThread import de.kuschku.quasseldroid_ng.util.AndroidHandlerThread
import de.kuschku.quasseldroid_ng.util.helper.invoke import de.kuschku.quasseldroid_ng.util.helper.*
import de.kuschku.quasseldroid_ng.util.helper.switchMap
import de.kuschku.quasseldroid_ng.util.helper.toggle
import de.kuschku.quasseldroid_ng.util.service.ServiceBoundFragment import de.kuschku.quasseldroid_ng.util.service.ServiceBoundFragment
class MessageListFragment : ServiceBoundFragment() { class MessageListFragment : ServiceBoundFragment() {
val currentBuffer: MutableLiveData<LiveData<BufferId?>?> = MutableLiveData() val currentBuffer: MutableLiveData<LiveData<BufferId?>?> = MutableLiveData()
private val buffer = currentBuffer.switchMap { it } private val buffer = currentBuffer.switchMap { it }
private val sessionManager: LiveData<SessionManager?> = backend.map(Backend::sessionManager)
private val handler = AndroidHandlerThread("Chat") private val handler = AndroidHandlerThread("Chat")
private lateinit var database: QuasselDatabase private lateinit var database: QuasselDatabase
...@@ -64,6 +66,7 @@ class MessageListFragment : ServiceBoundFragment() { ...@@ -64,6 +66,7 @@ class MessageListFragment : ServiceBoundFragment() {
val linearLayoutManager = LinearLayoutManager(context) val linearLayoutManager = LinearLayoutManager(context)
linearLayoutManager.reverseLayout = true linearLayoutManager.reverseLayout = true
messageList.layoutManager = linearLayoutManager messageList.layoutManager = linearLayoutManager
messageList.setItemViewCacheSize(20)
messageList.addOnScrollListener( messageList.addOnScrollListener(
object : RecyclerView.OnScrollListener() { object : RecyclerView.OnScrollListener() {
...@@ -85,6 +88,20 @@ class MessageListFragment : ServiceBoundFragment() { ...@@ -85,6 +88,20 @@ class MessageListFragment : ServiceBoundFragment() {
.build() .build()
} }
sessionManager.zip(buffer).zip(data).observe(
this, Observer {
handler.post {
val session = it?.first?.first
val buffer = it?.first?.second
val bufferSyncer = session?.bufferSyncer
if (buffer != null && bufferSyncer != null) {
bufferSyncer.requestMarkBufferAsRead(buffer)
}
}
}
)
data.observe( data.observe(
this, Observer { list -> this, Observer { list ->
val findFirstVisibleItemPosition = linearLayoutManager.findFirstVisibleItemPosition() val findFirstVisibleItemPosition = linearLayoutManager.findFirstVisibleItemPosition()
......
...@@ -5,7 +5,7 @@ import de.kuschku.libquassel.util.compatibility.LoggingHandler ...@@ -5,7 +5,7 @@ import de.kuschku.libquassel.util.compatibility.LoggingHandler
object AndroidLoggingHandler : LoggingHandler() { object AndroidLoggingHandler : LoggingHandler() {
override fun isLoggable(logLevel: LogLevel, tag: String): Boolean { override fun isLoggable(logLevel: LogLevel, tag: String): Boolean {
return true || Log.isLoggable(tag, priority(logLevel)) return Log.isLoggable(tag, priority(logLevel))
} }
override fun log(logLevel: LogLevel, tag: String, message: String?, throwable: Throwable?) { override fun log(logLevel: LogLevel, tag: String, message: String?, throwable: Throwable?) {
......
package de.kuschku.libquassel.protocol.primitive.serializer package de.kuschku.libquassel.protocol.primitive.serializer
import de.kuschku.libquassel.protocol.Quassel_Features import de.kuschku.libquassel.protocol.Quassel_Features
import de.kuschku.libquassel.util.helpers.hexDump
import de.kuschku.libquassel.util.nio.ChainedByteBuffer import de.kuschku.libquassel.util.nio.ChainedByteBuffer
import java.nio.ByteBuffer import java.nio.ByteBuffer
import java.nio.CharBuffer import java.nio.CharBuffer
...@@ -46,6 +47,7 @@ abstract class StringSerializer( ...@@ -46,6 +47,7 @@ abstract class StringSerializer(
} }
override fun serialize(buffer: ChainedByteBuffer, data: String?, features: Quassel_Features) { override fun serialize(buffer: ChainedByteBuffer, data: String?, features: Quassel_Features) {
try {
if (data == null) { if (data == null) {
IntSerializer.serialize(buffer, -1, features) IntSerializer.serialize(buffer, -1, features)
} else { } else {
...@@ -58,18 +60,28 @@ abstract class StringSerializer( ...@@ -58,18 +60,28 @@ abstract class StringSerializer(
for (i in 0 until trailingNullBytes) for (i in 0 until trailingNullBytes)
buffer.put(0) buffer.put(0)
} }
} catch (e: Throwable) {
throw RuntimeException(data, e)
}
} }
fun serialize(data: String?): ByteBuffer = if (data == null) { fun serialize(data: String?): ByteBuffer {
ByteBuffer.allocate(0) try {
if (data == null) {
return ByteBuffer.allocate(0)
} else { } else {
val charBuffer = charBuffer(data.length) val charBuffer = charBuffer(data.length)
charBuffer.put(data) charBuffer.put(data)
charBuffer.flip() charBuffer.flip()
encoder.encode(charBuffer) return encoder.encode(charBuffer)
}
} catch (e: Throwable) {
throw RuntimeException(data, e)
}
} }
fun deserializeAll(buffer: ByteBuffer): String? { fun deserializeAll(buffer: ByteBuffer): String? {
try {
val len = buffer.remaining() val len = buffer.remaining()
return if (len == -1) { return if (len == -1) {
null null
...@@ -83,9 +95,14 @@ abstract class StringSerializer( ...@@ -83,9 +95,14 @@ abstract class StringSerializer(
charBuffer.flip() charBuffer.flip()
charBuffer.toString() charBuffer.toString()
} }
} catch (e: Throwable) {
buffer.hexDump()
throw RuntimeException(e)
}
} }
override fun deserialize(buffer: ByteBuffer, features: Quassel_Features): String? { override fun deserialize(buffer: ByteBuffer, features: Quassel_Features): String? {
try {
val len = IntSerializer.deserialize(buffer, features) val len = IntSerializer.deserialize(buffer, features)
return if (len == -1) { return if (len == -1) {
null null
...@@ -99,5 +116,9 @@ abstract class StringSerializer( ...@@ -99,5 +116,9 @@ abstract class StringSerializer(
charBuffer.flip() charBuffer.flip()
charBuffer.toString() charBuffer.toString()
} }
} catch (e: Throwable) {
buffer.hexDump()
throw RuntimeException(e)
}
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment