diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerViewModel.kt index 32ce8ab8e..1eb348339 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerViewModel.kt @@ -51,6 +51,8 @@ class StoryViewerViewModel( var hasConsumedInitialState = false private set + val isChildScrolling: Observable = childScrollStatePublisher.distinctUntilChanged() + init { refresh() } 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 b310b4152..6aa32f6d8 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 @@ -235,6 +235,7 @@ class StoryViewerPageFragment : if ((canCloseFromHorizontalSlide || canCloseFromVerticalSlide) && event.actionMasked == MotionEvent.ACTION_UP) { requireActivity().onBackPressed() } else { + sharedViewModel.setIsChildScrolling(false) requireView().animate() .setInterpolator(StoryGestureListener.INTERPOLATOR) .setDuration(100) @@ -294,6 +295,10 @@ class StoryViewerPageFragment : viewModel.setIsUserScrollingParent(isScrolling) } + lifecycleDisposable += sharedViewModel.isChildScrolling.subscribe { + viewModel.setIsUserScrollingChild(it) + } + lifecycleDisposable += storyVolumeViewModel.state.distinctUntilChanged().observeOn(AndroidSchedulers.mainThread()).subscribe { volumeState -> if (volumeState.isMuted) { videoControlsDelegate.mute() 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 5294015a8..cfbbb9c3f 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 @@ -15,6 +15,7 @@ import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.util.livedata.Store import org.thoughtcrime.securesms.util.rx.RxStore import java.util.Optional +import java.util.concurrent.TimeUnit import kotlin.math.max import kotlin.math.min @@ -32,6 +33,7 @@ class StoryViewerPageViewModel( private val store = RxStore(StoryViewerPageState(isReceiptsEnabled = repository.isReadReceiptsEnabled())) private val disposables = CompositeDisposable() private val storyViewerDialogSubject: Subject> = PublishSubject.create() + private val storyLongPressSubject: Subject = PublishSubject.create() private val storyViewerPlaybackStore = Store(StoryViewerPlaybackState()) @@ -88,6 +90,10 @@ class StoryViewerPageViewModel( .map { it.attachment } ) } + + disposables += storyLongPressSubject.debounce(150, TimeUnit.MILLISECONDS).subscribe { isLongPress -> + storyViewerPlaybackStore.update { it.copy(isUserLongTouching = isLongPress) } + } } override fun onCleared() { @@ -183,6 +189,10 @@ class StoryViewerPageViewModel( storyViewerPlaybackStore.update { it.copy(isUserScrollingParent = isUserScrollingParent) } } + fun setIsUserScrollingChild(isUserScrollingChild: Boolean) { + storyViewerPlaybackStore.update { it.copy(isUserScrollingChild = isUserScrollingChild) } + } + fun setIsDisplayingSlate(isDisplayingSlate: Boolean) { storyViewerPlaybackStore.update { it.copy(isDisplayingSlate = isDisplayingSlate) } } @@ -225,6 +235,7 @@ class StoryViewerPageViewModel( fun setIsUserTouching(isUserTouching: Boolean) { storyViewerPlaybackStore.update { it.copy(isUserTouching = isUserTouching) } + storyLongPressSubject.onNext(isUserTouching) } fun setAreSegmentsInitialized(areSegmentsInitialized: Boolean) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPlaybackState.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPlaybackState.kt index 861570773..a52e29d3d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPlaybackState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPlaybackState.kt @@ -17,11 +17,13 @@ data class StoryViewerPlaybackState( val isDisplayingReactionAnimation: Boolean = false, val isRunningSharedElementAnimation: Boolean = false, val isDisplayingFirstTimeNavigation: Boolean = false, - val isDisplayingInfoDialog: Boolean = false + val isDisplayingInfoDialog: Boolean = false, + val isUserLongTouching: Boolean = false, + val isUserScrollingChild: Boolean = false ) { val hideChromeImmediate: Boolean = isRunningSharedElementAnimation - val hideChrome: Boolean = isRunningSharedElementAnimation || isUserTouching + val hideChrome: Boolean = isRunningSharedElementAnimation || isUserLongTouching || isUserScrollingChild val isPaused: Boolean = !areSegmentsInitialized || isUserTouching ||