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 fa26a136ddaafa059818177b42cf50ce3a62c755..bcf7feb38c749de5ecff89b7e8dc81c6ce0cf0e3 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 379f24890e6a7e3a687bea6a828135324a125b71..d689fa5a88b8d41d284aae676bcabb34fa2503bf 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 0000000000000000000000000000000000000000..9a1d83d1e88e800fbd93ac42803c6ee361e7c60a --- /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