diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageViewModel.kt index 11f12cc21f..76b3e522b7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageViewModel.kt @@ -10,6 +10,7 @@ import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.disposables.CompositeDisposable import io.reactivex.rxjava3.kotlin.plusAssign +import io.reactivex.rxjava3.schedulers.Schedulers import io.reactivex.rxjava3.subjects.PublishSubject import io.reactivex.rxjava3.subjects.Subject import org.signal.core.util.logging.Log @@ -70,37 +71,40 @@ class StoryViewerPageViewModel( fun refresh() { disposables.clear() - disposables += repository.getStoryPostsFor(args.recipientId, args.isOutgoingOnly).subscribe { posts -> - store.update { state -> - val isDisplayingInitialState = state.posts.isEmpty() && posts.isNotEmpty() - val startIndex = if (state.posts.isEmpty() && args.initialStoryId > 0) { - val initialIndex = posts.indexOfFirst { it.id == args.initialStoryId } - initialIndex.takeIf { it > -1 } ?: state.selectedPostIndex - } else if (state.posts.isEmpty()) { - val initialPost = getNextUnreadPost(posts) - val initialIndex = initialPost?.let { posts.indexOf(it) } ?: -1 - initialIndex.takeIf { it > -1 } ?: state.selectedPostIndex - } else { - state.selectedPostIndex + disposables += repository.getStoryPostsFor(args.recipientId, args.isOutgoingOnly) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { posts -> + store.update { state -> + val isDisplayingInitialState = state.posts.isEmpty() && posts.isNotEmpty() + val startIndex = if (state.posts.isEmpty() && args.initialStoryId > 0) { + val initialIndex = posts.indexOfFirst { it.id == args.initialStoryId } + initialIndex.takeIf { it > -1 } ?: state.selectedPostIndex + } else if (state.posts.isEmpty()) { + val initialPost = getNextUnreadPost(posts) + val initialIndex = initialPost?.let { posts.indexOf(it) } ?: -1 + initialIndex.takeIf { it > -1 } ?: state.selectedPostIndex + } else { + state.selectedPostIndex + } + + state.copy( + isReady = true, + posts = posts, + replyState = resolveSwipeToReplyState(state, startIndex), + selectedPostIndex = startIndex, + isDisplayingInitialState = isDisplayingInitialState + ) } - state.copy( - isReady = true, - posts = posts, - replyState = resolveSwipeToReplyState(state, startIndex), - selectedPostIndex = startIndex, - isDisplayingInitialState = isDisplayingInitialState - ) - } + val attachments: List = posts.map { it.content } + .filterIsInstance() + .map { it.attachment } - val attachments: List = posts.map { it.content } - .filterIsInstance() - .map { it.attachment } - - if (attachments.isNotEmpty()) { - storyCache.prefetch(attachments) + if (attachments.isNotEmpty()) { + storyCache.prefetch(attachments) + } } - } disposables += storyLongPressSubject.debounce(150, TimeUnit.MILLISECONDS).subscribe { isLongPress -> storyViewerPlaybackStore.update { it.copy(isUserLongTouching = isLongPress) } diff --git a/app/src/test/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageViewModelTest.kt b/app/src/test/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageViewModelTest.kt index 3282640e79..f746129b99 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageViewModelTest.kt +++ b/app/src/test/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageViewModelTest.kt @@ -1,6 +1,7 @@ package org.thoughtcrime.securesms.stories.viewer.page import android.app.Application +import io.reactivex.rxjava3.android.plugins.RxAndroidPlugins import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.plugins.RxJavaPlugins @@ -28,9 +29,14 @@ class StoryViewerPageViewModelTest { @Before fun setUp() { + RxJavaPlugins.setInitIoSchedulerHandler { testScheduler } + RxJavaPlugins.setIoSchedulerHandler { testScheduler } + RxJavaPlugins.setInitComputationSchedulerHandler { testScheduler } RxJavaPlugins.setComputationSchedulerHandler { testScheduler } + RxAndroidPlugins.setMainThreadSchedulerHandler { testScheduler } + whenever(repository.forceDownload(any())).thenReturn(Completable.complete()) }