2019-04-28 22:43:54 +02:00
|
|
|
package org.schabi.newpipe.local.feed
|
|
|
|
|
|
|
|
import android.content.Context
|
2020-03-05 23:47:00 +01:00
|
|
|
import androidx.lifecycle.LiveData
|
2019-04-28 22:43:54 +02:00
|
|
|
import androidx.lifecycle.MutableLiveData
|
|
|
|
import androidx.lifecycle.ViewModel
|
|
|
|
import androidx.lifecycle.ViewModelProvider
|
|
|
|
import io.reactivex.Flowable
|
|
|
|
import io.reactivex.android.schedulers.AndroidSchedulers
|
2019-12-16 08:36:04 +01:00
|
|
|
import io.reactivex.functions.Function4
|
2019-04-28 22:43:54 +02:00
|
|
|
import io.reactivex.schedulers.Schedulers
|
2020-10-18 08:16:55 +02:00
|
|
|
import java.time.OffsetDateTime
|
2020-05-01 20:13:21 +02:00
|
|
|
import java.util.concurrent.TimeUnit
|
2020-01-28 06:59:49 +01:00
|
|
|
import org.schabi.newpipe.database.feed.model.FeedGroupEntity
|
2019-04-28 22:43:54 +02:00
|
|
|
import org.schabi.newpipe.extractor.stream.StreamInfoItem
|
2020-10-18 08:16:55 +02:00
|
|
|
import org.schabi.newpipe.ktx.toCalendar
|
2019-04-28 22:43:54 +02:00
|
|
|
import org.schabi.newpipe.local.feed.service.FeedEventManager
|
2020-05-01 20:13:01 +02:00
|
|
|
import org.schabi.newpipe.local.feed.service.FeedEventManager.Event.ErrorResultEvent
|
|
|
|
import org.schabi.newpipe.local.feed.service.FeedEventManager.Event.IdleEvent
|
|
|
|
import org.schabi.newpipe.local.feed.service.FeedEventManager.Event.ProgressEvent
|
|
|
|
import org.schabi.newpipe.local.feed.service.FeedEventManager.Event.SuccessResultEvent
|
2019-04-28 22:43:54 +02:00
|
|
|
import org.schabi.newpipe.util.DEFAULT_THROTTLE_TIMEOUT
|
|
|
|
|
2020-01-28 06:59:49 +01:00
|
|
|
class FeedViewModel(applicationContext: Context, val groupId: Long = FeedGroupEntity.GROUP_ALL_ID) : ViewModel() {
|
|
|
|
class Factory(val context: Context, val groupId: Long = FeedGroupEntity.GROUP_ALL_ID) : ViewModelProvider.Factory {
|
2019-04-28 22:43:54 +02:00
|
|
|
@Suppress("UNCHECKED_CAST")
|
|
|
|
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
|
|
|
|
return FeedViewModel(context.applicationContext, groupId) as T
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private var feedDatabaseManager: FeedDatabaseManager = FeedDatabaseManager(applicationContext)
|
|
|
|
|
2020-03-05 23:47:00 +01:00
|
|
|
private val mutableStateLiveData = MutableLiveData<FeedState>()
|
|
|
|
val stateLiveData: LiveData<FeedState> = mutableStateLiveData
|
2019-04-28 22:43:54 +02:00
|
|
|
|
|
|
|
private var combineDisposable = Flowable
|
|
|
|
.combineLatest(
|
|
|
|
FeedEventManager.events(),
|
|
|
|
feedDatabaseManager.asStreamItems(groupId),
|
2019-12-16 08:36:04 +01:00
|
|
|
feedDatabaseManager.notLoadedCount(groupId),
|
|
|
|
feedDatabaseManager.oldestSubscriptionUpdate(groupId),
|
2019-04-28 22:43:54 +02:00
|
|
|
|
2020-10-18 08:16:55 +02:00
|
|
|
Function4 { t1: FeedEventManager.Event, t2: List<StreamInfoItem>, t3: Long, t4: List<OffsetDateTime> ->
|
2019-12-16 08:36:04 +01:00
|
|
|
return@Function4 CombineResultHolder(t1, t2, t3, t4.firstOrNull())
|
|
|
|
}
|
2019-04-28 22:43:54 +02:00
|
|
|
)
|
|
|
|
.throttleLatest(DEFAULT_THROTTLE_TIMEOUT, TimeUnit.MILLISECONDS)
|
|
|
|
.subscribeOn(Schedulers.io())
|
|
|
|
.observeOn(AndroidSchedulers.mainThread())
|
2020-11-18 23:45:19 +01:00
|
|
|
.subscribe { (event, listFromDB, notLoadedCount, oldestUpdate) ->
|
2019-04-28 22:43:54 +02:00
|
|
|
|
2020-10-18 08:16:55 +02:00
|
|
|
val oldestUpdateCalendar = oldestUpdate?.toCalendar()
|
2019-04-28 22:43:54 +02:00
|
|
|
|
2020-03-05 23:47:00 +01:00
|
|
|
mutableStateLiveData.postValue(when (event) {
|
2019-12-16 08:36:04 +01:00
|
|
|
is IdleEvent -> FeedState.LoadedState(listFromDB, oldestUpdateCalendar, notLoadedCount)
|
|
|
|
is ProgressEvent -> FeedState.ProgressState(event.currentProgress, event.maxProgress, event.progressMessage)
|
|
|
|
is SuccessResultEvent -> FeedState.LoadedState(listFromDB, oldestUpdateCalendar, notLoadedCount, event.itemsErrors)
|
|
|
|
is ErrorResultEvent -> FeedState.ErrorState(event.error)
|
2019-04-28 22:43:54 +02:00
|
|
|
})
|
|
|
|
|
2019-12-16 08:36:04 +01:00
|
|
|
if (event is ErrorResultEvent || event is SuccessResultEvent) {
|
2019-04-28 22:43:54 +02:00
|
|
|
FeedEventManager.reset()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onCleared() {
|
|
|
|
super.onCleared()
|
|
|
|
combineDisposable.dispose()
|
|
|
|
}
|
2019-12-16 08:36:04 +01:00
|
|
|
|
2020-10-18 08:16:55 +02:00
|
|
|
private data class CombineResultHolder(val t1: FeedEventManager.Event, val t2: List<StreamInfoItem>, val t3: Long, val t4: OffsetDateTime?)
|
2020-05-01 20:13:01 +02:00
|
|
|
}
|