From 9b64f778aa16773456844c9ee633122341c587e7 Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Wed, 6 Dec 2017 01:40:45 +0100
Subject: [PATCH] Implement Adapter for message loading

---
 .../persistence/QuasselDatabase.kt            |  6 +-
 .../ui/chat/BufferViewConfigFragment.kt       |  3 +
 .../ui/chat/MessageListFragment.kt            | 73 +++++++++++++++++++
 3 files changed, 81 insertions(+), 1 deletion(-)
 create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/MessageListFragment.kt

diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/persistence/QuasselDatabase.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/persistence/QuasselDatabase.kt
index fa26a136d..bcf7feb38 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/persistence/QuasselDatabase.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/persistence/QuasselDatabase.kt
@@ -1,5 +1,6 @@
 package de.kuschku.quasseldroid_ng.persistence
 
+import android.arch.paging.LivePagedListProvider
 import android.arch.persistence.room.*
 import android.content.Context
 import android.support.annotation.IntRange
@@ -13,7 +14,7 @@ abstract class QuasselDatabase : RoomDatabase() {
   abstract fun message(): MessageDao
 
   @Entity(tableName = "message")
-  open class DatabaseMessage(
+  data class DatabaseMessage(
     @PrimaryKey var messageId: Int,
     var time: Instant,
     var type: Int,
@@ -46,6 +47,9 @@ abstract class QuasselDatabase : RoomDatabase() {
     @Query("SELECT * FROM message WHERE bufferId = :bufferId")
     fun findByBufferId(bufferId: Int): List<DatabaseMessage>
 
+    @Query("SELECT * FROM message WHERE bufferId = :bufferId AND messageId < :messageId")
+    fun findByBufferIdPaged(bufferId: Int): LivePagedListProvider<Int, DatabaseMessage>
+
     @Query("SELECT * FROM message WHERE bufferId = :bufferId ORDER BY messageId DESC LIMIT 1")
     fun findLastByBufferId(bufferId: Int): DatabaseMessage
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferViewConfigFragment.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferViewConfigFragment.kt
index 379f24890..d689fa5a8 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferViewConfigFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferViewConfigFragment.kt
@@ -10,6 +10,7 @@ import android.view.ViewGroup
 import android.widget.AdapterView
 import butterknife.BindView
 import butterknife.ButterKnife
+import de.kuschku.libquassel.protocol.BufferId
 import de.kuschku.libquassel.protocol.NetworkId
 import de.kuschku.libquassel.quassel.syncables.BufferViewConfig
 import de.kuschku.libquassel.quassel.syncables.BufferViewManager
@@ -37,6 +38,8 @@ class BufferViewConfigFragment : ServiceBoundFragment() {
   @BindView(R.id.chatList)
   lateinit var chatList: RecyclerView
 
+  var currentBuffer: MutableLiveData<BufferId>? = null
+
   private val sessionManager: LiveData<SessionManager?>
     = backend.map(Backend::sessionManager)
   private val bufferViewManager: LiveData<BufferViewManager?>
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/MessageListFragment.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/MessageListFragment.kt
new file mode 100644
index 000000000..9a1d83d1e
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/MessageListFragment.kt
@@ -0,0 +1,73 @@
+package de.kuschku.quasseldroid_ng.ui.chat
+
+import android.arch.lifecycle.LiveData
+import android.arch.lifecycle.MutableLiveData
+import android.arch.lifecycle.Observer
+import android.arch.paging.PagedList
+import android.arch.paging.PagedListAdapter
+import android.os.Bundle
+import android.support.v7.recyclerview.extensions.DiffCallback
+import android.support.v7.widget.RecyclerView
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.TextView
+import de.kuschku.libquassel.protocol.BufferId
+import de.kuschku.quasseldroid_ng.persistence.QuasselDatabase
+import de.kuschku.quasseldroid_ng.util.helper.switchMap
+import de.kuschku.quasseldroid_ng.util.service.ServiceBoundFragment
+
+class MessageListFragment : ServiceBoundFragment() {
+  var currentBuffer: LiveData<BufferId?> = MutableLiveData()
+
+  private lateinit var database: QuasselDatabase
+
+  private val adapter = MessageAdapter()
+
+  override fun onCreate(savedInstanceState: Bundle?) {
+    super.onCreate(savedInstanceState)
+
+    database = QuasselDatabase.Creator.init(context.applicationContext)
+    val data = currentBuffer.switchMap {
+      database.message().findByBufferIdPaged(it).create(Int.MAX_VALUE,
+        PagedList.Config.Builder()
+          .setPageSize(20)
+          .setEnablePlaceholders(true)
+          .setPrefetchDistance(20)
+          .build()
+      )
+    }
+    data.observe(this, Observer { list ->
+      adapter.setList(list)
+    })
+  }
+
+  class MessageAdapter : PagedListAdapter<QuasselDatabase.DatabaseMessage, MessageViewHolder>(MessageDiffCallback) {
+    override fun onBindViewHolder(holder: MessageViewHolder?, position: Int) {
+      holder?.bind(getItem(position))
+    }
+
+    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): MessageViewHolder {
+      return MessageViewHolder(LayoutInflater.from(parent?.context).inflate(android.R.layout.simple_list_item_1, parent, false))
+    }
+  }
+
+  object MessageDiffCallback : DiffCallback<QuasselDatabase.DatabaseMessage>() {
+    override fun areContentsTheSame(oldItem: QuasselDatabase.DatabaseMessage, newItem: QuasselDatabase.DatabaseMessage)
+      = oldItem == newItem
+
+    override fun areItemsTheSame(oldItem: QuasselDatabase.DatabaseMessage, newItem: QuasselDatabase.DatabaseMessage)
+      = oldItem.messageId == newItem.messageId
+  }
+
+  class MessageViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
+    fun bind(message: QuasselDatabase.DatabaseMessage?) {
+      val text = (itemView as TextView)
+      if (message == null) {
+        text.text = "null"
+      } else {
+        text.text = "[${message.time}] <${message.senderPrefixes}${message.sender}> ${message.content}"
+      }
+    }
+  }
+}
\ No newline at end of file
-- 
GitLab