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

Automatically load backlog until some results are visible

parent 503ce6a1
No related branches found
No related tags found
No related merge requests found
...@@ -27,6 +27,8 @@ import de.kuschku.quasseldroid.util.helper.* ...@@ -27,6 +27,8 @@ import de.kuschku.quasseldroid.util.helper.*
import de.kuschku.quasseldroid.util.service.ServiceBoundFragment import de.kuschku.quasseldroid.util.service.ServiceBoundFragment
import de.kuschku.quasseldroid.util.ui.SpanFormatter import de.kuschku.quasseldroid.util.ui.SpanFormatter
import de.kuschku.quasseldroid.viewmodel.QuasselViewModel import de.kuschku.quasseldroid.viewmodel.QuasselViewModel
import io.reactivex.BackpressureStrategy
import java.util.concurrent.TimeUnit
import javax.inject.Inject import javax.inject.Inject
class MessageListFragment : ServiceBoundFragment() { class MessageListFragment : ServiceBoundFragment() {
...@@ -163,6 +165,17 @@ class MessageListFragment : ServiceBoundFragment() { ...@@ -163,6 +165,17 @@ class MessageListFragment : ServiceBoundFragment() {
messageList.itemAnimator = null messageList.itemAnimator = null
messageList.setItemViewCacheSize(20) messageList.setItemViewCacheSize(20)
val senderColors = requireContext().theme.styledAttributes(
R.attr.senderColor0, R.attr.senderColor1, R.attr.senderColor2, R.attr.senderColor3,
R.attr.senderColor4, R.attr.senderColor5, R.attr.senderColor6, R.attr.senderColor7,
R.attr.senderColor8, R.attr.senderColor9, R.attr.senderColorA, R.attr.senderColorB,
R.attr.senderColorC, R.attr.senderColorD, R.attr.senderColorE, R.attr.senderColorF
) {
IntArray(16) {
getColor(it, 0)
}
}
var isScrolling = false var isScrolling = false
messageList.addOnScrollListener( messageList.addOnScrollListener(
object : RecyclerView.OnScrollListener() { object : RecyclerView.OnScrollListener() {
...@@ -189,7 +202,6 @@ class MessageListFragment : ServiceBoundFragment() { ...@@ -189,7 +202,6 @@ class MessageListFragment : ServiceBoundFragment() {
viewModel.markerLine) viewModel.markerLine)
.toLiveData().switchMapNotNull { (buffer, selected, expanded, markerLine) -> .toLiveData().switchMapNotNull { (buffer, selected, expanded, markerLine) ->
database.filtered().listen(accountId, buffer).switchMapNotNull { filtered -> database.filtered().listen(accountId, buffer).switchMapNotNull { filtered ->
LivePagedListBuilder( LivePagedListBuilder(
database.message().findByBufferIdPagedWithDayChange(buffer, filtered).map { database.message().findByBufferIdPagedWithDayChange(buffer, filtered).map {
DisplayMessage( DisplayMessage(
...@@ -213,7 +225,31 @@ class MessageListFragment : ServiceBoundFragment() { ...@@ -213,7 +225,31 @@ class MessageListFragment : ServiceBoundFragment() {
database.message().lastMsgId(it) database.message().lastMsgId(it)
} }
viewModel.sessionManager_liveData.zip(lastMessageId).observe( var previousVisible = -1
viewModel.buffer.toFlowable(BackpressureStrategy.LATEST).switchMap { buffer ->
database.filtered().listenRx(accountId, buffer).switchMap { filtered ->
database.message().firstMsgId(buffer).map {
Pair(it, database.message().firstVisibleMsgId(buffer, filtered))
}
}
}.distinctUntilChanged()
.throttleLast(1, TimeUnit.SECONDS)
.toLiveData().observe(this, Observer {
runInBackground {
val first = it?.first
val visible = it?.second ?: -1
if (first != null) {
if (previousVisible == visible) {
loadMore()
}
previousVisible = visible
}
}
})
viewModel.session.toLiveData().zip(lastMessageId).observe(
this, Observer { this, Observer {
runInBackground { runInBackground {
val session = it?.first?.orNull() val session = it?.first?.orNull()
......
...@@ -11,8 +11,10 @@ import android.content.Context ...@@ -11,8 +11,10 @@ import android.content.Context
import android.support.annotation.IntRange import android.support.annotation.IntRange
import de.kuschku.libquassel.protocol.Message_Flag import de.kuschku.libquassel.protocol.Message_Flag
import de.kuschku.libquassel.protocol.Message_Type import de.kuschku.libquassel.protocol.Message_Type
import de.kuschku.libquassel.protocol.MsgId
import de.kuschku.quasseldroid.persistence.QuasselDatabase.DatabaseMessage import de.kuschku.quasseldroid.persistence.QuasselDatabase.DatabaseMessage
import de.kuschku.quasseldroid.persistence.QuasselDatabase.Filtered import de.kuschku.quasseldroid.persistence.QuasselDatabase.Filtered
import io.reactivex.Flowable
import org.threeten.bp.Instant import org.threeten.bp.Instant
@Database(entities = [DatabaseMessage::class, Filtered::class], version = 3) @Database(entities = [DatabaseMessage::class, Filtered::class], version = 3)
...@@ -77,6 +79,12 @@ abstract class QuasselDatabase : RoomDatabase() { ...@@ -77,6 +79,12 @@ abstract class QuasselDatabase : RoomDatabase() {
@Query("SELECT * FROM message WHERE bufferId = :bufferId ORDER BY messageId DESC LIMIT 1") @Query("SELECT * FROM message WHERE bufferId = :bufferId ORDER BY messageId DESC LIMIT 1")
fun lastMsgId(bufferId: Int): LiveData<DatabaseMessage> fun lastMsgId(bufferId: Int): LiveData<DatabaseMessage>
@Query("SELECT messageId FROM message WHERE bufferId = :bufferId ORDER BY messageId ASC LIMIT 1")
fun firstMsgId(bufferId: Int): Flowable<MsgId>
@Query("SELECT messageId FROM message WHERE bufferId = :bufferId AND type & ~ :type > 0 ORDER BY messageId ASC LIMIT 1")
fun firstVisibleMsgId(bufferId: Int, type: Int): MsgId?
@Query("SELECT * FROM message WHERE bufferId = :bufferId ORDER BY messageId ASC LIMIT 1") @Query("SELECT * FROM message WHERE bufferId = :bufferId ORDER BY messageId ASC LIMIT 1")
fun findFirstByBufferId(bufferId: Int): DatabaseMessage? fun findFirstByBufferId(bufferId: Int): DatabaseMessage?
...@@ -123,6 +131,11 @@ abstract class QuasselDatabase : RoomDatabase() { ...@@ -123,6 +131,11 @@ abstract class QuasselDatabase : RoomDatabase() {
) )
fun listen(accountId: Long, bufferId: Int): LiveData<Int> fun listen(accountId: Long, bufferId: Int): LiveData<Int>
@Query(
"SELECT filtered FROM filtered WHERE bufferId = :bufferId AND accountId = :accountId UNION SELECT 0 as filtered ORDER BY filtered DESC LIMIT 1"
)
fun listenRx(accountId: Long, bufferId: Int): Flowable<Int>
@Query("SELECT * FROM filtered WHERE accountId = :accountId") @Query("SELECT * FROM filtered WHERE accountId = :accountId")
fun listen(accountId: Long): LiveData<List<Filtered>> fun listen(accountId: Long): LiveData<List<Filtered>>
......
...@@ -3,6 +3,7 @@ package de.kuschku.quasseldroid.util.helper ...@@ -3,6 +3,7 @@ package de.kuschku.quasseldroid.util.helper
import android.arch.lifecycle.LiveData import android.arch.lifecycle.LiveData
import android.arch.lifecycle.LiveDataReactiveStreams import android.arch.lifecycle.LiveDataReactiveStreams
import io.reactivex.BackpressureStrategy import io.reactivex.BackpressureStrategy
import io.reactivex.Flowable
import io.reactivex.Observable import io.reactivex.Observable
import io.reactivex.ObservableSource import io.reactivex.ObservableSource
import io.reactivex.functions.BiFunction import io.reactivex.functions.BiFunction
...@@ -11,6 +12,8 @@ inline fun <T> Observable<T>.toLiveData( ...@@ -11,6 +12,8 @@ inline fun <T> Observable<T>.toLiveData(
strategy: BackpressureStrategy = BackpressureStrategy.LATEST strategy: BackpressureStrategy = BackpressureStrategy.LATEST
): LiveData<T> = LiveDataReactiveStreams.fromPublisher(toFlowable(strategy)) ): LiveData<T> = LiveDataReactiveStreams.fromPublisher(toFlowable(strategy))
inline fun <T> Flowable<T>.toLiveData(): LiveData<T> = LiveDataReactiveStreams.fromPublisher(this)
inline fun <reified A, B> combineLatest( inline fun <reified A, B> combineLatest(
a: ObservableSource<A>, a: ObservableSource<A>,
b: ObservableSource<B> b: ObservableSource<B>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment