Implement better stability while scrolling between pages.

fork-5.53.8
Alex Hart 2022-02-25 16:33:33 -04:00
rodzic 69dc31681d
commit 0ddfb4456b
5 zmienionych plików z 57 dodań i 11 usunięć

Wyświetl plik

@ -47,11 +47,13 @@ class StoryViewerFragment : Fragment(R.layout.stories_viewer_fragment), StoryVie
override fun onResume() {
super.onResume()
viewModel.setIsScrolling(false)
storyPager.registerOnPageChangeCallback(onPageChanged)
}
override fun onPause() {
super.onPause()
viewModel.setIsScrolling(false)
storyPager.unregisterOnPageChangeCallback(onPageChanged)
}
@ -67,6 +69,10 @@ class StoryViewerFragment : Fragment(R.layout.stories_viewer_fragment), StoryVie
override fun onPageSelected(position: Int) {
viewModel.setSelectedPage(position)
}
override fun onPageScrollStateChanged(state: Int) {
viewModel.setIsScrolling(state == ViewPager2.SCROLL_STATE_DRAGGING)
}
}
companion object {

Wyświetl plik

@ -1,6 +1,7 @@
package org.thoughtcrime.securesms.stories.viewer
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import io.reactivex.rxjava3.disposables.CompositeDisposable
@ -18,10 +19,17 @@ class StoryViewerViewModel(
val state: LiveData<StoryViewerState> = store.stateLiveData
private val scrollStatePublisher: MutableLiveData<Boolean> = MutableLiveData(false)
val isScrolling: LiveData<Boolean> = scrollStatePublisher
init {
refresh()
}
fun setIsScrolling(isScrolling: Boolean) {
scrollStatePublisher.value = isScrolling
}
private fun refresh() {
disposables.clear()
disposables += repository.getStories().subscribe { recipientIds ->

Wyświetl plik

@ -37,6 +37,7 @@ import org.thoughtcrime.securesms.mediapreview.VideoControlsDelegate
import org.thoughtcrime.securesms.recipients.Recipient
import org.thoughtcrime.securesms.recipients.RecipientId
import org.thoughtcrime.securesms.stories.dialogs.StoryContextMenu
import org.thoughtcrime.securesms.stories.viewer.StoryViewerViewModel
import org.thoughtcrime.securesms.stories.viewer.reply.direct.StoryDirectReplyDialogFragment
import org.thoughtcrime.securesms.stories.viewer.reply.group.StoryGroupReplyBottomSheetDialogFragment
import org.thoughtcrime.securesms.stories.viewer.reply.tabs.StoryViewsAndRepliesDialogFragment
@ -67,6 +68,10 @@ class StoryViewerPageFragment : Fragment(R.layout.stories_viewer_fragment_page),
}
)
private val sharedViewModel: StoryViewerViewModel by viewModels(
ownerProducer = { requireParentFragment() }
)
private val videoControlsDelegate = VideoControlsDelegate()
private val lifecycleDisposable = LifecycleDisposable()
@ -162,6 +167,25 @@ class StoryViewerPageFragment : Fragment(R.layout.stories_viewer_fragment_page),
}
}
sharedViewModel.isScrolling.observe(viewLifecycleOwner) { isScrolling ->
viewModel.setIsUserScrollingParent(isScrolling)
}
sharedViewModel.state.observe(viewLifecycleOwner) { parentState ->
if (parentState.pages.size <= parentState.page) {
viewModel.setIsSelectedPage(false)
} else if (storyRecipientId == parentState.pages[parentState.page]) {
if (progressBar.segmentCount != 0) {
progressBar.reset()
progressBar.setPosition(viewModel.getRestartIndex())
videoControlsDelegate.restart()
}
viewModel.setIsSelectedPage(true)
} else {
viewModel.setIsSelectedPage(false)
}
}
viewModel.state.observe(viewLifecycleOwner) { state ->
if (state.posts.isNotEmpty() && state.selectedPostIndex < state.posts.size) {
val post = state.posts[state.selectedPostIndex]
@ -221,15 +245,7 @@ class StoryViewerPageFragment : Fragment(R.layout.stories_viewer_fragment_page),
override fun onPause() {
super.onPause()
}
override fun onResume() {
super.onResume()
if (progressBar.segmentCount != 0) {
progressBar.reset()
progressBar.setPosition(viewModel.getRestartIndex())
}
pauseProgress()
}
override fun onFinishForwardAction() = Unit

Wyświetl plik

@ -73,6 +73,10 @@ class StoryViewerPageViewModel(
}
}
fun kickPlaybackState() {
storyViewerPlaybackStore.update { it }
}
override fun onCleared() {
disposables.clear()
}
@ -107,6 +111,14 @@ class StoryViewerPageViewModel(
storyViewerDialogSubject.onNext(Optional.of(StoryViewerDialog.GroupDirectReply(recipientId, storyId)))
}
fun setIsUserScrollingParent(isUserScrollingParent: Boolean) {
storyViewerPlaybackStore.update { it.copy(isUserScrollingParent = isUserScrollingParent) }
}
fun setIsSelectedPage(isSelectedPage: Boolean) {
storyViewerPlaybackStore.update { it.copy(isSelectedPage = isSelectedPage) }
}
fun setIsDisplayingContextMenu(isDisplayingContextMenu: Boolean) {
storyViewerPlaybackStore.update { it.copy(isDisplayingContextMenu = isDisplayingContextMenu) }
}

Wyświetl plik

@ -8,7 +8,9 @@ data class StoryViewerPlaybackState(
val isDisplayingContextMenu: Boolean = false,
val isDisplayingViewsAndRepliesDialog: Boolean = false,
val isDisplayingDirectReplyDialog: Boolean = false,
val isDisplayingCaptionOverlay: Boolean = false
val isDisplayingCaptionOverlay: Boolean = false,
val isUserScrollingParent: Boolean = false,
val isSelectedPage: Boolean = false
) {
val isPaused: Boolean = !areSegmentsInitialized ||
isUserTouching ||
@ -18,5 +20,7 @@ data class StoryViewerPlaybackState(
isDisplayingContextMenu ||
isDisplayingViewsAndRepliesDialog ||
isDisplayingDirectReplyDialog ||
isDisplayingCaptionOverlay
isDisplayingCaptionOverlay ||
isUserScrollingParent ||
!isSelectedPage
}