From 5038210d7830f1da6cc2d0e7d7c14a956d67420f Mon Sep 17 00:00:00 2001 From: Alan Evans Date: Thu, 5 Mar 2020 09:49:14 -0400 Subject: [PATCH] Add tap to pause to video trimming editor. --- .../mediasend/MediaSendVideoFragment.java | 30 +++++++++---- .../securesms/scribbles/VideoEditorHud.java | 43 ++++++++++++++++--- .../securesms/util/FeatureFlags.java | 2 +- .../securesms/video/VideoPlayer.java | 9 +++- app/src/main/res/layout/video_editor_hud.xml | 4 +- 5 files changed, 69 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendVideoFragment.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendVideoFragment.java index 7d91173110..8b2444235c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendVideoFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendVideoFragment.java @@ -34,12 +34,12 @@ public class MediaSendVideoFragment extends Fragment implements VideoEditorHud.E private final Throttler videoScanThrottle = new Throttler(150); private final Handler handler = new Handler(); - private Controller controller; - private Data data = new Data(); - private Uri uri; - private VideoPlayer player; - private VideoEditorHud hud; - private Runnable updatePosition; + private Controller controller; + private Data data = new Data(); + private Uri uri; + private VideoPlayer player; + @Nullable private VideoEditorHud hud; + private Runnable updatePosition; public static MediaSendVideoFragment newInstance(@NonNull Uri uri) { Bundle args = new Bundle(); @@ -92,16 +92,21 @@ public class MediaSendVideoFragment extends Fragment implements VideoEditorHud.E Log.w(TAG, e); } + player.setOnClickListener(v -> { + player.pause(); + hud.showPlayButton(); + }); + player.setPlayerCallback(new VideoPlayer.PlayerCallback() { @Override public void onPlaying() { - hud.playing(); + hud.fadePlayButton(); } @Override public void onStopped() { - hud.stopped(); + hud.showPlayButton(); } }); } @@ -200,6 +205,9 @@ public class MediaSendVideoFragment extends Fragment implements VideoEditorHud.E public void notifyHidden() { if (player != null) { player.pause(); + if (hud != null) { + hud.showPlayButton(); + } } } @@ -207,6 +215,10 @@ public class MediaSendVideoFragment extends Fragment implements VideoEditorHud.E public void onEditVideoDuration(long totalDurationUs, long startTimeUs, long endTimeUs, boolean fromEdited, boolean editingComplete) { controller.onTouchEventsNeeded(!editingComplete); + if (hud != null) { + hud.hidePlayButton(); + } + boolean wasEdited = data.durationEdited; boolean durationEdited = startTimeUs > 0 || endTimeUs < totalDurationUs; @@ -241,7 +253,7 @@ public class MediaSendVideoFragment extends Fragment implements VideoEditorHud.E @Override public void onPlay() { - player.playFromStart(); + player.play(); } @Override diff --git a/app/src/main/java/org/thoughtcrime/securesms/scribbles/VideoEditorHud.java b/app/src/main/java/org/thoughtcrime/securesms/scribbles/VideoEditorHud.java index ebb78d369e..ef5b9a72c7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/scribbles/VideoEditorHud.java +++ b/app/src/main/java/org/thoughtcrime/securesms/scribbles/VideoEditorHud.java @@ -1,9 +1,11 @@ package org.thoughtcrime.securesms.scribbles; +import android.animation.Animator; import android.content.Context; import android.net.Uri; import android.util.AttributeSet; import android.view.View; +import android.view.animation.OvershootInterpolator; import android.widget.LinearLayout; import androidx.annotation.NonNull; @@ -50,7 +52,7 @@ public final class VideoEditorHud extends LinearLayout { setOrientation(VERTICAL); videoTimeLine = root.findViewById(R.id.video_timeline); - playOverlay = root.findViewById(R.id.play_overlay); + playOverlay = root.findViewById(R.id.play_overlay); playOverlay.setOnClickListener(v -> eventListener.onPlay()); } @@ -101,12 +103,43 @@ public final class VideoEditorHud extends LinearLayout { }); } - public void playing() { - playOverlay.setVisibility(INVISIBLE); + public void showPlayButton() { + playOverlay.setVisibility(VISIBLE); + playOverlay.animate() + .setListener(null) + .alpha(1) + .scaleX(1).scaleY(1) + .setInterpolator(new OvershootInterpolator()) + .start(); } - public void stopped() { - playOverlay.setVisibility(VISIBLE); + public void fadePlayButton() { + playOverlay.animate() + .setListener(new Animator.AnimatorListener() { + @Override + public void onAnimationEnd(Animator animation) { + playOverlay.setVisibility(GONE); + } + + @Override + public void onAnimationStart(Animator animation) {} + + @Override + public void onAnimationCancel(Animator animation) {} + + @Override + public void onAnimationRepeat(Animator animation) {} + }) + .alpha(0) + .scaleX(0.8f).scaleY(0.8f) + .start(); + } + + public void hidePlayButton() { + playOverlay.setVisibility(GONE); + playOverlay.setAlpha(0); + playOverlay.setScaleX(0.8f); + playOverlay.setScaleY(0.8f); } @RequiresApi(api = 23) diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java b/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java index f9ddb89cca..e034770008 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java @@ -52,7 +52,7 @@ public final class FeatureFlags { private static final String PINS_FOR_ALL = "android.pinsForAll"; private static final String PINS_MEGAPHONE_KILL_SWITCH = "android.pinsMegaphoneKillSwitch"; private static final String PROFILE_NAMES_MEGAPHONE = "android.profileNamesMegaphone"; - private static final String VIDEO_TRIMMING = "android.videoTrimming"; + private static final String VIDEO_TRIMMING = "android.videoTrimming.2"; private static final String STORAGE_SERVICE = "android.storageService.2"; /** 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 491e251a70..730d7960fe 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/video/VideoPlayer.java +++ b/app/src/main/java/org/thoughtcrime/securesms/video/VideoPlayer.java @@ -216,10 +216,15 @@ public class VideoPlayer extends FrameLayout { this.playerCallback = playerCallback; } - public void playFromStart() { + /** + * Resumes a paused video, or restarts if at end of video. + */ + public void play() { if (exoPlayer != null) { exoPlayer.setPlayWhenReady(true); - exoPlayer.seekTo(0); + if (exoPlayer.getCurrentPosition() >= exoPlayer.getDuration()) { + exoPlayer.seekTo(0); + } } } diff --git a/app/src/main/res/layout/video_editor_hud.xml b/app/src/main/res/layout/video_editor_hud.xml index 3537f493ba..2ffa95a3ba 100644 --- a/app/src/main/res/layout/video_editor_hud.xml +++ b/app/src/main/res/layout/video_editor_hud.xml @@ -33,14 +33,14 @@ android:layout_width="48dp" android:layout_height="48dp" android:layout_gravity="center" + android:alpha="0" android:background="@drawable/circle_white" android:longClickable="false" - android:visibility="invisible" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" - tools:visibility="visible"> + tools:alpha="1">