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 @@
+
+
+
+