Fix post video timeline issues

This commit is contained in:
Ammar Githam 2021-03-17 20:45:40 +09:00
parent 50fd282ab2
commit a271ba5ab7
3 changed files with 86 additions and 49 deletions

View File

@ -1,6 +1,8 @@
package awais.instagrabber.adapters.viewholder; package awais.instagrabber.adapters.viewholder;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.ViewGroup; import android.view.ViewGroup;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
@ -28,6 +30,14 @@ public class SliderVideoViewHolder extends SliderItemViewHolder {
private final LayoutVideoPlayerWithThumbnailBinding binding; private final LayoutVideoPlayerWithThumbnailBinding binding;
private final LayoutExoCustomControlsBinding controlsBinding; private final LayoutExoCustomControlsBinding controlsBinding;
private final boolean loadVideoOnItemClick; private final boolean loadVideoOnItemClick;
private final GestureDetector.OnGestureListener videoPlayerViewGestureListener = new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onSingleTapConfirmed(final MotionEvent e) {
binding.playerView.performClick();
return true;
}
};
private VideoPlayerViewHelper videoPlayerViewHelper; private VideoPlayerViewHelper videoPlayerViewHelper;
@SuppressLint("ClickableViewAccessibility") @SuppressLint("ClickableViewAccessibility")
@ -39,26 +49,24 @@ public class SliderVideoViewHolder extends SliderItemViewHolder {
this.binding = binding; this.binding = binding;
this.controlsBinding = controlsBinding; this.controlsBinding = controlsBinding;
this.loadVideoOnItemClick = loadVideoOnItemClick; this.loadVideoOnItemClick = loadVideoOnItemClick;
if (onVerticalDragListener != null) { // if (onVerticalDragListener != null) {
final VerticalDragHelper thumbnailVerticalDragHelper = new VerticalDragHelper(binding.thumbnailParent); // final VerticalDragHelper thumbnailVerticalDragHelper = new VerticalDragHelper(binding.thumbnailParent);
final VerticalDragHelper playerVerticalDragHelper = new VerticalDragHelper(binding.playerView); // final VerticalDragHelper playerVerticalDragHelper = new VerticalDragHelper(binding.playerView);
thumbnailVerticalDragHelper.setOnVerticalDragListener(onVerticalDragListener); // thumbnailVerticalDragHelper.setOnVerticalDragListener(onVerticalDragListener);
playerVerticalDragHelper.setOnVerticalDragListener(onVerticalDragListener); // playerVerticalDragHelper.setOnVerticalDragListener(onVerticalDragListener);
binding.thumbnailParent.setOnTouchListener((v, event) -> { // binding.thumbnailParent.setOnTouchListener((v, event) -> {
final boolean onDragTouch = thumbnailVerticalDragHelper.onDragTouch(event); // final boolean onDragTouch = thumbnailVerticalDragHelper.onDragTouch(event);
if (onDragTouch) { // if (onDragTouch) {
return true; // return true;
} // }
return thumbnailVerticalDragHelper.onGestureTouchEvent(event); // return thumbnailVerticalDragHelper.onGestureTouchEvent(event);
}); // });
binding.playerView.setOnTouchListener((v, event) -> { // }
final boolean onDragTouch = playerVerticalDragHelper.onDragTouch(event); final GestureDetector gestureDetector = new GestureDetector(itemView.getContext(), videoPlayerViewGestureListener);
if (onDragTouch) { binding.playerView.setOnTouchListener((v, event) -> {
return true; gestureDetector.onTouchEvent(event);
} return true;
return playerVerticalDragHelper.onGestureTouchEvent(event); });
});
}
} }
public void bind(@NonNull final Media media, public void bind(@NonNull final Media media,
@ -116,6 +124,7 @@ public class SliderVideoViewHolder extends SliderItemViewHolder {
videoUrl = videoVersion.getUrl(); videoUrl = videoVersion.getUrl();
} }
} }
if (videoUrl == null) return;
videoPlayerViewHelper = new VideoPlayerViewHelper(binding.getRoot().getContext(), videoPlayerViewHelper = new VideoPlayerViewHelper(binding.getRoot().getContext(),
binding, binding,
videoUrl, videoUrl,

View File

@ -57,9 +57,9 @@ public class VideoPlayerViewHelper implements Player.EventListener {
private final DefaultDataSourceFactory dataSourceFactory; private final DefaultDataSourceFactory dataSourceFactory;
private SimpleExoPlayer player; private SimpleExoPlayer player;
private PopupMenu speedPopup; private PopupMenu speedPopup;
private Runnable positionChecker; private PositionCheckRunnable positionChecker;
private Handler positionUpdateHandler;
private final Handler positionUpdateHandler = new Handler();
private final Player.EventListener listener = new Player.EventListener() { private final Player.EventListener listener = new Player.EventListener() {
@Override @Override
public void onPlaybackStateChanged(final int state) { public void onPlaybackStateChanged(final int state) {
@ -79,6 +79,11 @@ public class VideoPlayerViewHelper implements Player.EventListener {
@Override @Override
public void onPlayWhenReadyChanged(final boolean playWhenReady, final int reason) { public void onPlayWhenReadyChanged(final boolean playWhenReady, final int reason) {
updatePlayPauseDrawable(playWhenReady); updatePlayPauseDrawable(playWhenReady);
if (positionUpdateHandler == null || positionChecker == null) return;
if (playWhenReady) {
positionUpdateHandler.removeCallbacks(positionChecker);
positionUpdateHandler.postDelayed(positionChecker, INITIAL_DELAY);
}
} }
}; };
private final AudioListener audioListener = new AudioListener() { private final AudioListener audioListener = new AudioListener() {
@ -191,6 +196,7 @@ public class VideoPlayerViewHelper implements Player.EventListener {
player = new SimpleExoPlayer.Builder(context) player = new SimpleExoPlayer.Builder(context)
.setLooper(Looper.getMainLooper()) .setLooper(Looper.getMainLooper())
.build(); .build();
positionUpdateHandler = new Handler();
positionChecker = new PositionCheckRunnable(positionUpdateHandler, positionChecker = new PositionCheckRunnable(positionUpdateHandler,
player, player,
controlsBinding.timeline, controlsBinding.timeline,
@ -353,19 +359,27 @@ public class VideoPlayerViewHelper implements Player.EventListener {
// } // }
public void releasePlayer() { public void releasePlayer() {
if (player == null) return; if (player != null) {
player.release(); player.release();
player = null; player = null;
if (positionUpdateHandler != null && positionChecker != null) { }
positionUpdateHandler.removeCallbacks(positionChecker); if (positionUpdateHandler != null) {
if (positionChecker != null) {
positionUpdateHandler.removeCallbacks(positionChecker);
positionChecker = null;
}
positionUpdateHandler = null;
} }
} }
public void pause() { public void pause() {
if (player == null) return; if (player != null) {
player.pause(); player.pause();
if (positionUpdateHandler != null && positionChecker != null) { }
positionUpdateHandler.removeCallbacks(positionChecker); if (positionUpdateHandler != null) {
if (positionChecker != null) {
positionUpdateHandler.removeCallbacks(positionChecker);
}
} }
} }
@ -412,6 +426,7 @@ public class VideoPlayerViewHelper implements Player.EventListener {
@Override @Override
public void run() { public void run() {
if (positionUpdateHandler == null) return;
positionUpdateHandler.removeCallbacks(this); positionUpdateHandler.removeCallbacks(this);
if (player == null) return; if (player == null) return;
final long currentPosition = player.getCurrentPosition(); final long currentPosition = player.getCurrentPosition();

View File

@ -79,7 +79,6 @@ import awais.instagrabber.adapters.SliderCallbackAdapter;
import awais.instagrabber.adapters.SliderItemsAdapter; import awais.instagrabber.adapters.SliderItemsAdapter;
import awais.instagrabber.adapters.viewholder.SliderVideoViewHolder; import awais.instagrabber.adapters.viewholder.SliderVideoViewHolder;
import awais.instagrabber.customviews.SharedElementTransitionDialogFragment; import awais.instagrabber.customviews.SharedElementTransitionDialogFragment;
import awais.instagrabber.customviews.VerticalDragHelper;
import awais.instagrabber.customviews.VerticalImageSpan; import awais.instagrabber.customviews.VerticalImageSpan;
import awais.instagrabber.customviews.VideoPlayerCallbackAdapter; import awais.instagrabber.customviews.VideoPlayerCallbackAdapter;
import awais.instagrabber.customviews.VideoPlayerViewHelper; import awais.instagrabber.customviews.VideoPlayerViewHelper;
@ -143,6 +142,13 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment im
// clear result // clear result
backStackSavedStateResultLiveData.postValue(null); backStackSavedStateResultLiveData.postValue(null);
}; };
private final GestureDetector.OnGestureListener videoPlayerViewGestureListener = new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onSingleTapConfirmed(final MotionEvent e) {
binding.videoPost.playerView.performClick();
return true;
}
};
// private final VerticalDragHelper.OnVerticalDragListener onVerticalDragListener = new VerticalDragHelper.OnVerticalDragListener() { // private final VerticalDragHelper.OnVerticalDragListener onVerticalDragListener = new VerticalDragHelper.OnVerticalDragListener() {
// //
@ -253,7 +259,7 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment im
setStyle(DialogFragment.STYLE_NO_FRAME, R.style.PostViewV2Style); setStyle(DialogFragment.STYLE_NO_FRAME, R.style.PostViewV2Style);
viewModel = new ViewModelProvider(this).get(PostViewV2ViewModel.class); viewModel = new ViewModelProvider(this).get(PostViewV2ViewModel.class);
captionState = settingsHelper.getBoolean(Constants.SHOW_CAPTIONS) ? captionState = settingsHelper.getBoolean(Constants.SHOW_CAPTIONS) ?
BottomSheetBehavior.STATE_COLLAPSED : BottomSheetBehavior.STATE_HIDDEN; BottomSheetBehavior.STATE_COLLAPSED : BottomSheetBehavior.STATE_HIDDEN;
} }
@Nullable @Nullable
@ -1143,26 +1149,31 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment im
addSharedElement(sharedMainPostElement, binding.videoPost.thumbnailParent); addSharedElement(sharedMainPostElement, binding.videoPost.thumbnailParent);
} }
binding.videoPost.root.setVisibility(View.VISIBLE); binding.videoPost.root.setVisibility(View.VISIBLE);
final VerticalDragHelper thumbnailVerticalDragHelper = new VerticalDragHelper(binding.videoPost.thumbnailParent); // final VerticalDragHelper thumbnailVerticalDragHelper = new VerticalDragHelper(binding.videoPost.thumbnailParent);
final VerticalDragHelper playerVerticalDragHelper = new VerticalDragHelper(binding.videoPost.playerView); // final VerticalDragHelper playerVerticalDragHelper = new VerticalDragHelper(binding.videoPost.playerView);
// thumbnailVerticalDragHelper.setOnVerticalDragListener(onVerticalDragListener); // thumbnailVerticalDragHelper.setOnVerticalDragListener(onVerticalDragListener);
// playerVerticalDragHelper.setOnVerticalDragListener(onVerticalDragListener); // playerVerticalDragHelper.setOnVerticalDragListener(onVerticalDragListener);
enablePlayerControls(true); enablePlayerControls(true);
binding.videoPost.thumbnailParent.setOnTouchListener((v, event) -> { // binding.videoPost.thumbnailParent.setOnTouchListener((v, event) -> {
final boolean onDragTouch = thumbnailVerticalDragHelper.onDragTouch(event); // final boolean onDragTouch = thumbnailVerticalDragHelper.onDragTouch(event);
if (onDragTouch) { // if (onDragTouch) {
return true; // return true;
} // }
return thumbnailVerticalDragHelper.onGestureTouchEvent(event); // return thumbnailVerticalDragHelper.onGestureTouchEvent(event);
}); // });
binding.videoPost.playerView.setOnTouchListener((v, event) -> { // binding.videoPost.playerView.setOnTouchListener((v, event) -> {
final boolean onDragTouch = playerVerticalDragHelper.onDragTouch(event); // final boolean onDragTouch = playerVerticalDragHelper.onDragTouch(event);
if (onDragTouch) { // if (onDragTouch) {
return true; // return true;
} // }
return playerVerticalDragHelper.onGestureTouchEvent(event); // return playerVerticalDragHelper.onGestureTouchEvent(event);
}); // });
binding.videoPost.playerView.setOnClickListener(v -> toggleDetails()); binding.videoPost.playerView.setOnClickListener(v -> toggleDetails());
final GestureDetector gestureDetector = new GestureDetector(context, videoPlayerViewGestureListener);
binding.videoPost.playerView.setOnTouchListener((v, event) -> {
gestureDetector.onTouchEvent(event);
return true;
});
final float vol = settingsHelper.getBoolean(Constants.MUTED_VIDEOS) ? 0f : 1f; final float vol = settingsHelper.getBoolean(Constants.MUTED_VIDEOS) ? 0f : 1f;
final VideoPlayerViewHelper.VideoPlayerCallback videoPlayerCallback = new VideoPlayerCallbackAdapter() { final VideoPlayerViewHelper.VideoPlayerCallback videoPlayerCallback = new VideoPlayerCallbackAdapter() {
@Override @Override
@ -1413,6 +1424,7 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment im
binding.share.setVisibility(View.GONE); binding.share.setVisibility(View.GONE);
binding.download.setVisibility(View.GONE); binding.download.setVisibility(View.GONE);
binding.mediaCounter.setVisibility(View.GONE); binding.mediaCounter.setVisibility(View.GONE);
binding.viewsCount.setVisibility(View.GONE);
final List<Integer> options = viewModel.getOptions().getValue(); final List<Integer> options = viewModel.getOptions().getValue();
if (options != null && !options.isEmpty()) { if (options != null && !options.isEmpty()) {
binding.options.setVisibility(View.GONE); binding.options.setVisibility(View.GONE);
@ -1455,6 +1467,7 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment im
} }
if (video) { if (video) {
binding.playerControlsToggle.setVisibility(View.VISIBLE); binding.playerControlsToggle.setVisibility(View.VISIBLE);
binding.viewsCount.setVisibility(View.VISIBLE);
} }
if (wasControlsVisible) { if (wasControlsVisible) {
showPlayerControls(); showPlayerControls();