diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageFragment.kt index 7e5c0117a..504b09d04 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageFragment.kt @@ -257,6 +257,7 @@ class StoryViewerPageFragment : progressBar.setPosition(viewModel.getRestartIndex()) videoControlsDelegate.restart() } + viewModel.setIsFirstPage(parentState.page == 0) viewModel.setIsSelectedPage(true) when (parentState.crossfadeSource) { is StoryViewerState.CrossfadeSource.TextModel -> storyCrossfader.setSourceView(parentState.crossfadeSource.storyTextPostModel) diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageState.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageState.kt index b0921bec9..d3c1fe603 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageState.kt @@ -3,7 +3,8 @@ package org.thoughtcrime.securesms.stories.viewer.page data class StoryViewerPageState( val posts: List = emptyList(), val selectedPostIndex: Int = 0, - val replyState: ReplyState = ReplyState.NONE + val replyState: ReplyState = ReplyState.NONE, + val isFirstPage: Boolean = false ) { /** * Indicates which Reply method is available when the user swipes on the dialog 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 35b254aa3..f9ebe2132 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 @@ -116,7 +116,9 @@ class StoryViewerPageViewModel( } val postIndex = store.state.selectedPostIndex - setSelectedPostIndex(max(-1, postIndex - 1)) + val minIndex = if (store.state.isFirstPage) 0 else -1 + + setSelectedPostIndex(max(minIndex, postIndex - 1)) } fun getRestartIndex(): Int { @@ -155,6 +157,10 @@ class StoryViewerPageViewModel( storyViewerPlaybackStore.update { it.copy(isDisplayingSlate = isDisplayingSlate) } } + fun setIsFirstPage(isFirstPage: Boolean) { + store.update { it.copy(isFirstPage = isFirstPage) } + } + fun setIsSelectedPage(isSelectedPage: Boolean) { storyViewerPlaybackStore.update { it.copy(isSelectedPage = isSelectedPage) } } 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 65af310ca..43412d818 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 @@ -38,6 +38,46 @@ class StoryViewerPageViewModelTest { RxJavaPlugins.reset() } + @Test + fun `Given first page and first post, when I goToPreviousPost, then I expect storyIndex to be 0`() { + // GIVEN + val storyPosts = createStoryPosts(3) { true } + whenever(repository.getStoryPostsFor(any())).thenReturn(Observable.just(storyPosts)) + val testSubject = createTestSubject() + testSubject.setIsFirstPage(true) + testScheduler.triggerActions() + + // WHEN + testSubject.goToPreviousPost() + testScheduler.triggerActions() + + // THEN + val testSubscriber = testSubject.state.test() + + testSubscriber.assertValueAt(0) { it.selectedPostIndex == 0 } + } + + @Test + fun `Given first page and second post, when I goToPreviousPost, then I expect storyIndex to be 0`() { + // GIVEN + val storyPosts = createStoryPosts(3) { true } + whenever(repository.getStoryPostsFor(any())).thenReturn(Observable.just(storyPosts)) + val testSubject = createTestSubject() + testSubject.setIsFirstPage(true) + testScheduler.triggerActions() + testSubject.goToNextPost() + testScheduler.triggerActions() + + // WHEN + testSubject.goToPreviousPost() + testScheduler.triggerActions() + + // THEN + val testSubscriber = testSubject.state.test() + + testSubscriber.assertValueAt(0) { it.selectedPostIndex == 0 } + } + @Test fun `Given no initial story and 3 records all viewed, when I initialize, then I expect storyIndex to be 0`() { // GIVEN