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 51b6544c5..952fc5bd0 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 @@ -17,7 +17,6 @@ import android.view.GestureDetector import android.view.MotionEvent import android.view.ScaleGestureDetector import android.view.View -import android.view.ViewConfiguration import android.view.animation.Interpolator import android.widget.FrameLayout import android.widget.TextView @@ -227,6 +226,8 @@ class StoryViewerPageFragment : ) ) + gestureDetector.setOnDoubleTapListener(null) + val scaleListener = StoryScaleListener( viewModel, sharedViewModel, card ) @@ -248,10 +249,6 @@ class StoryViewerPageFragment : if (event.actionMasked == MotionEvent.ACTION_DOWN) { viewModel.setIsUserTouching(true) } else if (event.actionMasked == MotionEvent.ACTION_UP || event.actionMasked == MotionEvent.ACTION_CANCEL) { - if (event.actionMasked == MotionEvent.ACTION_UP) { - singleTapHandler.onActionUp(event) - } - viewModel.setIsUserTouching(false) val canCloseFromHorizontalSlide = requireView().translationX > DimensionUnit.DP.toPixels(56f) @@ -1074,21 +1071,7 @@ class StoryViewerPageFragment : private const val BOUNDARY_PREV = 1f - BOUNDARY_NEXT } - private var tapStart: Long = 0L - - fun onGestureHappened() { - tapStart = 0L - } - - fun onDown() { - tapStart = System.currentTimeMillis() - } - fun onActionUp(e: MotionEvent) { - if (System.currentTimeMillis() - tapStart > ViewConfiguration.getTapTimeout()) { - return - } - if (e.x < container.measuredWidth * getLeftBoundary()) { performLeftAction() } else if (e.x > container.measuredWidth - (container.measuredWidth * getRightBoundary())) { @@ -1213,7 +1196,11 @@ class StoryViewerPageFragment : private val maxSlide = DimensionUnit.DP.toPixels(56f * 2) override fun onDown(e: MotionEvent): Boolean { - singleTapHandler.onDown() + return true + } + + override fun onSingleTapUp(e: MotionEvent): Boolean { + singleTapHandler.onActionUp(e) return true } @@ -1252,7 +1239,6 @@ class StoryViewerPageFragment : onContentTranslation(viewToTranslate.translationX, viewToTranslate.translationY) - singleTapHandler.onGestureHappened() return true } @@ -1274,7 +1260,6 @@ class StoryViewerPageFragment : onReplyToPost() } - singleTapHandler.onGestureHappened() return true } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/post/StoryImageLoader.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/post/StoryImageLoader.kt index 3d0a7d744..cda477220 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/post/StoryImageLoader.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/post/StoryImageLoader.kt @@ -73,6 +73,9 @@ class StoryImageLoader( fun clear() { GlideApp.with(postImage).clear(postImage) GlideApp.with(blurImage).clear(blurImage) + + postImage.setImageDrawable(null) + blurImage.setImageDrawable(null) } private fun loadViaCache(cacheValue: StoryCache.StoryCacheValue) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/post/StoryPostFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/post/StoryPostFragment.kt index 5f39e4119..d79013798 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/post/StoryPostFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/post/StoryPostFragment.kt @@ -31,6 +31,7 @@ class StoryPostFragment : Fragment(R.layout.stories_post_fragment) { }) private val binding by ViewBinderDelegate(StoriesPostFragmentBinding::bind) { + it.video.cleanup() presentNone() } diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/post/StoryVideoLoader.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/post/StoryVideoLoader.kt index e722afecc..432a7865a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/post/StoryVideoLoader.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/post/StoryVideoLoader.kt @@ -23,11 +23,13 @@ class StoryVideoLoader( fun load() { fragment.viewLifecycleOwner.lifecycle.addObserver(this) videoPlayer.setVideoSource(VideoSlide(fragment.requireContext(), videoPost.videoUri, videoPost.size, false), true, TAG, videoPost.clipStart.inWholeMilliseconds, videoPost.clipEnd.inWholeMilliseconds) + videoPlayer.hideControls() + videoPlayer.setKeepContentOnPlayerReset(false) } fun clear() { fragment.viewLifecycleOwner.lifecycle.removeObserver(this) - videoPlayer.cleanup() + videoPlayer.stop() } override fun onResume(lifecycleOwner: LifecycleOwner) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/video/VideoPlayer.java b/app/src/main/java/org/thoughtcrime/securesms/video/VideoPlayer.java index d39eec27c..026736942 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/video/VideoPlayer.java +++ b/app/src/main/java/org/thoughtcrime/securesms/video/VideoPlayer.java @@ -17,6 +17,7 @@ package org.thoughtcrime.securesms.video; import android.content.Context; +import android.content.res.TypedArray; import android.util.AttributeSet; import android.view.View; import android.view.Window; @@ -25,6 +26,8 @@ import android.widget.FrameLayout; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.core.content.res.TypedArrayKt; +import androidx.core.content.res.TypedArrayUtils; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ExoPlayer; @@ -35,7 +38,6 @@ import com.google.android.exoplayer2.Tracks; import com.google.android.exoplayer2.source.ClippingMediaSource; import com.google.android.exoplayer2.source.DefaultMediaSourceFactory; import com.google.android.exoplayer2.source.MediaSource; -import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.ui.AspectRatioFrameLayout; import com.google.android.exoplayer2.ui.PlayerControlView; import com.google.android.exoplayer2.ui.PlayerView; @@ -44,7 +46,6 @@ import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.mms.VideoSlide; -import org.thoughtcrime.securesms.util.MediaUtil; import java.util.Objects; import java.util.concurrent.TimeUnit; @@ -80,7 +81,11 @@ public class VideoPlayer extends FrameLayout { public VideoPlayer(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); - inflate(context, R.layout.video_player, this); + TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.VideoPlayer); + int videPlayerLayout = typedArray.getResourceId(R.styleable.VideoPlayer_playerLayoutId, R.layout.video_player); + + typedArray.recycle(); + inflate(context, videPlayerLayout, this); this.mediaSourceFactory = new DefaultMediaSourceFactory(context); @@ -202,6 +207,12 @@ public class VideoPlayer extends FrameLayout { } } + public void setKeepContentOnPlayerReset(boolean keepContentOnPlayerReset) { + if (this.exoView != null) { + this.exoView.setKeepContentOnPlayerReset(keepContentOnPlayerReset); + } + } + @Override public void setOnClickListener(@Nullable OnClickListener l) { if (this.exoView != null) { @@ -215,11 +226,15 @@ public class VideoPlayer extends FrameLayout { return this.exoControls; } - public void cleanup() { + public void stop() { if (this.exoPlayer != null) { exoPlayer.stop(); exoPlayer.clearMediaItems(); + } + } + public void cleanup() { + if (this.exoPlayer != null) { exoView.setPlayer(null); exoControls.setPlayer(null); @@ -319,9 +334,9 @@ public class VideoPlayer extends FrameLayout { private @NonNull MediaItem.ClippingConfiguration getClippingConfiguration(long startMs, long endMs) { return startMs != endMs ? new MediaItem.ClippingConfiguration.Builder() - .setStartPositionMs(startMs) - .setEndPositionMs(endMs) - .build() + .setStartPositionMs(startMs) + .setEndPositionMs(endMs) + .build() : MediaItem.ClippingConfiguration.UNSET; } diff --git a/app/src/main/res/layout/stories_post_fragment.xml b/app/src/main/res/layout/stories_post_fragment.xml index 794ae043a..549b0e051 100644 --- a/app/src/main/res/layout/stories_post_fragment.xml +++ b/app/src/main/res/layout/stories_post_fragment.xml @@ -1,5 +1,6 @@ @@ -25,6 +26,7 @@ + android:layout_height="match_parent" + app:playerLayoutId="@layout/story_video_player" /> \ No newline at end of file diff --git a/app/src/main/res/layout/story_exoplayer_layout.xml b/app/src/main/res/layout/story_exoplayer_layout.xml new file mode 100644 index 000000000..06a9be896 --- /dev/null +++ b/app/src/main/res/layout/story_exoplayer_layout.xml @@ -0,0 +1,19 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/story_video_player.xml b/app/src/main/res/layout/story_video_player.xml new file mode 100644 index 000000000..4e9a7f40a --- /dev/null +++ b/app/src/main/res/layout/story_video_player.xml @@ -0,0 +1,20 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index 0bb46aee0..ff97072e9 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -293,6 +293,10 @@ + + + +