Remember paused state for autoplay videos (#1331)

* Remember paused state for autoplay videos

* Update cached playback info

Update cached playback info instead of keeping track of it with a local variable

* Add missing null check

* Move logic into play()
This commit is contained in:
scria1000 2023-01-25 17:11:13 +00:00 committed by GitHub
parent ed738437e6
commit c382512292
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 322 additions and 29 deletions

View File

@ -47,7 +47,9 @@ import com.bumptech.glide.request.RequestOptions;
import com.bumptech.glide.request.target.Target; import com.bumptech.glide.request.target.Target;
import com.google.android.exoplayer2.Tracks; import com.google.android.exoplayer2.Tracks;
import com.google.android.exoplayer2.ui.AspectRatioFrameLayout; import com.google.android.exoplayer2.ui.AspectRatioFrameLayout;
import com.google.android.exoplayer2.ui.DefaultTimeBar;
import com.google.android.exoplayer2.ui.PlayerView; import com.google.android.exoplayer2.ui.PlayerView;
import com.google.android.exoplayer2.ui.TimeBar;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.libRG.CustomTextView; import com.libRG.CustomTextView;
@ -708,10 +710,12 @@ public class HistoryPostRecyclerViewAdapter extends PagingDataAdapter<Post, Recy
} else { } else {
((PostVideoAutoplayViewHolder) holder).aspectRatioFrameLayout.setAspectRatio(1); ((PostVideoAutoplayViewHolder) holder).aspectRatioFrameLayout.setAspectRatio(1);
} }
if (mFragment.getMasterMutingOption() == null) { if (!((PostVideoAutoplayViewHolder) holder).isManuallyPaused) {
((PostVideoAutoplayViewHolder) holder).setVolume(mMuteAutoplayingVideos || (post.isNSFW() && mMuteNSFWVideo) ? 0f : 1f); if (mFragment.getMasterMutingOption() == null) {
} else { ((PostVideoAutoplayViewHolder) holder).setVolume(mMuteAutoplayingVideos || (post.isNSFW() && mMuteNSFWVideo) ? 0f : 1f);
((PostVideoAutoplayViewHolder) holder).setVolume(mFragment.getMasterMutingOption() ? 0f : 1f); } else {
((PostVideoAutoplayViewHolder) holder).setVolume(mFragment.getMasterMutingOption() ? 0f : 1f);
}
} }
if ((post.isGfycat() || post.isRedgifs()) && !post.isLoadGfycatOrStreamableVideoSuccess()) { if ((post.isGfycat() || post.isRedgifs()) && !post.isLoadGfycatOrStreamableVideoSuccess()) {
@ -883,10 +887,12 @@ public class HistoryPostRecyclerViewAdapter extends PagingDataAdapter<Post, Recy
} else { } else {
((PostCard2VideoAutoplayViewHolder) holder).aspectRatioFrameLayout.setAspectRatio(1); ((PostCard2VideoAutoplayViewHolder) holder).aspectRatioFrameLayout.setAspectRatio(1);
} }
if (mFragment.getMasterMutingOption() == null) { if (!((PostCard2VideoAutoplayViewHolder) holder).isManuallyPaused) {
((PostCard2VideoAutoplayViewHolder) holder).setVolume(mMuteAutoplayingVideos || (post.isNSFW() && mMuteNSFWVideo) ? 0f : 1f); if (mFragment.getMasterMutingOption() == null) {
} else { ((PostCard2VideoAutoplayViewHolder) holder).setVolume(mMuteAutoplayingVideos || (post.isNSFW() && mMuteNSFWVideo) ? 0f : 1f);
((PostCard2VideoAutoplayViewHolder) holder).setVolume(mFragment.getMasterMutingOption() ? 0f : 1f); } else {
((PostCard2VideoAutoplayViewHolder) holder).setVolume(mFragment.getMasterMutingOption() ? 0f : 1f);
}
} }
if ((post.isGfycat() || post.isRedgifs()) && !post.isLoadGfycatOrStreamableVideoSuccess()) { if ((post.isGfycat() || post.isRedgifs()) && !post.isLoadGfycatOrStreamableVideoSuccess()) {
@ -1820,7 +1826,9 @@ public class HistoryPostRecyclerViewAdapter extends PagingDataAdapter<Post, Recy
} }
((PostVideoAutoplayViewHolder) holder).errorLoadingGfycatImageView.setVisibility(View.GONE); ((PostVideoAutoplayViewHolder) holder).errorLoadingGfycatImageView.setVisibility(View.GONE);
((PostVideoAutoplayViewHolder) holder).muteButton.setVisibility(View.GONE); ((PostVideoAutoplayViewHolder) holder).muteButton.setVisibility(View.GONE);
((PostVideoAutoplayViewHolder) holder).resetVolume(); if (!((PostVideoAutoplayViewHolder) holder).isManuallyPaused) {
((PostVideoAutoplayViewHolder) holder).resetVolume();
}
mGlide.clear(((PostVideoAutoplayViewHolder) holder).previewImageView); mGlide.clear(((PostVideoAutoplayViewHolder) holder).previewImageView);
((PostVideoAutoplayViewHolder) holder).previewImageView.setVisibility(View.GONE); ((PostVideoAutoplayViewHolder) holder).previewImageView.setVisibility(View.GONE);
} else if (holder instanceof PostWithPreviewTypeViewHolder) { } else if (holder instanceof PostWithPreviewTypeViewHolder) {
@ -2643,6 +2651,12 @@ public class HistoryPostRecyclerViewAdapter extends PagingDataAdapter<Post, Recy
ImageView muteButton; ImageView muteButton;
@BindView(R.id.fullscreen_exo_playback_control_view) @BindView(R.id.fullscreen_exo_playback_control_view)
ImageView fullscreenButton; ImageView fullscreenButton;
@BindView(R.id.exo_pause)
ImageView pauseButton;
@BindView(R.id.exo_play)
ImageView playButton;
@BindView(R.id.exo_progress)
DefaultTimeBar progressBar;
@BindView(R.id.bottom_constraint_layout_item_post_video_type_autoplay) @BindView(R.id.bottom_constraint_layout_item_post_video_type_autoplay)
ConstraintLayout bottomConstraintLayout; ConstraintLayout bottomConstraintLayout;
@BindView(R.id.plus_button_item_post_video_type_autoplay) @BindView(R.id.plus_button_item_post_video_type_autoplay)
@ -2658,11 +2672,14 @@ public class HistoryPostRecyclerViewAdapter extends PagingDataAdapter<Post, Recy
@BindView(R.id.share_button_item_post_video_type_autoplay) @BindView(R.id.share_button_item_post_video_type_autoplay)
ImageView shareButton; ImageView shareButton;
@Nullable
Container container;
@Nullable @Nullable
ExoPlayerViewHelper helper; ExoPlayerViewHelper helper;
private Uri mediaUri; private Uri mediaUri;
private float volume; private float volume;
public Call<String> fetchGfycatOrStreamableVideoCall; public Call<String> fetchGfycatOrStreamableVideoCall;
private boolean isManuallyPaused;
PostVideoAutoplayViewHolder(View itemView) { PostVideoAutoplayViewHolder(View itemView) {
super(itemView); super(itemView);
@ -2754,6 +2771,36 @@ public class HistoryPostRecyclerViewAdapter extends PagingDataAdapter<Post, Recy
} }
}); });
pauseButton.setOnClickListener(view -> {
pause();
isManuallyPaused = true;
savePlaybackInfo(getPlayerOrder(), getCurrentPlaybackInfo());
});
playButton.setOnClickListener(view -> {
isManuallyPaused = false;
play();
});
progressBar.addListener(new TimeBar.OnScrubListener() {
@Override
public void onScrubStart(TimeBar timeBar, long position) {
}
@Override
public void onScrubMove(TimeBar timeBar, long position) {
}
@Override
public void onScrubStop(TimeBar timeBar, long position, boolean canceled) {
if (!canceled) {
savePlaybackInfo(getPlayerOrder(), getCurrentPlaybackInfo());
}
}
});
previewImageView.setOnClickListener(view -> fullscreenButton.performClick()); previewImageView.setOnClickListener(view -> fullscreenButton.performClick());
videoPlayer.setOnClickListener(view -> { videoPlayer.setOnClickListener(view -> {
@ -2775,6 +2822,10 @@ public class HistoryPostRecyclerViewAdapter extends PagingDataAdapter<Post, Recy
volume = 0f; volume = 0f;
} }
private void savePlaybackInfo(int order, @Nullable PlaybackInfo playbackInfo) {
if (container != null) container.savePlaybackInfo(order, playbackInfo);
}
@NonNull @NonNull
@Override @Override
public View getPlayerView() { public View getPlayerView() {
@ -2792,6 +2843,9 @@ public class HistoryPostRecyclerViewAdapter extends PagingDataAdapter<Post, Recy
if (mediaUri == null) { if (mediaUri == null) {
return; return;
} }
if (this.container == null) {
this.container = container;
}
if (helper == null) { if (helper == null) {
helper = new ExoPlayerViewHelper(this, mediaUri, null, mExoCreator); helper = new ExoPlayerViewHelper(this, mediaUri, null, mExoCreator);
helper.addEventListener(new Playable.DefaultEventListener() { helper.addEventListener(new Playable.DefaultEventListener() {
@ -2833,7 +2887,13 @@ public class HistoryPostRecyclerViewAdapter extends PagingDataAdapter<Post, Recy
@Override @Override
public void play() { public void play() {
if (helper != null && mediaUri != null) { if (helper != null && mediaUri != null) {
helper.play(); if (!isPlaying() && isManuallyPaused) {
helper.play();
pause();
helper.setVolume(volume);
} else {
helper.play();
}
} }
} }
@ -2853,11 +2913,13 @@ public class HistoryPostRecyclerViewAdapter extends PagingDataAdapter<Post, Recy
helper.release(); helper.release();
helper = null; helper = null;
} }
isManuallyPaused = false;
container = null;
} }
@Override @Override
public boolean wantsToPlay() { public boolean wantsToPlay() {
return canPlayVideo && mediaUri != null && ToroUtil.visibleAreaOffset(this, itemView.getParent()) >= mStartAutoplayVisibleAreaOffset; return canPlayVideo && ToroUtil.visibleAreaOffset(this, itemView.getParent()) >= mStartAutoplayVisibleAreaOffset;
} }
@Override @Override
@ -4296,6 +4358,12 @@ public class HistoryPostRecyclerViewAdapter extends PagingDataAdapter<Post, Recy
ImageView muteButton; ImageView muteButton;
@BindView(R.id.fullscreen_exo_playback_control_view) @BindView(R.id.fullscreen_exo_playback_control_view)
ImageView fullscreenButton; ImageView fullscreenButton;
@BindView(R.id.exo_pause)
ImageView pauseButton;
@BindView(R.id.exo_play)
ImageView playButton;
@BindView(R.id.exo_progress)
DefaultTimeBar progressBar;
@BindView(R.id.bottom_constraint_layout_item_post_card_2_video_autoplay) @BindView(R.id.bottom_constraint_layout_item_post_card_2_video_autoplay)
ConstraintLayout bottomConstraintLayout; ConstraintLayout bottomConstraintLayout;
@BindView(R.id.plus_button_item_post_card_2_video_autoplay) @BindView(R.id.plus_button_item_post_card_2_video_autoplay)
@ -4313,11 +4381,14 @@ public class HistoryPostRecyclerViewAdapter extends PagingDataAdapter<Post, Recy
@BindView(R.id.divider_item_post_card_2_video_autoplay) @BindView(R.id.divider_item_post_card_2_video_autoplay)
View divider; View divider;
@Nullable
Container container;
@Nullable @Nullable
ExoPlayerViewHelper helper; ExoPlayerViewHelper helper;
private Uri mediaUri; private Uri mediaUri;
private float volume; private float volume;
public Call<String> fetchGfycatOrStreamableVideoCall; public Call<String> fetchGfycatOrStreamableVideoCall;
private boolean isManuallyPaused;
PostCard2VideoAutoplayViewHolder(View itemView) { PostCard2VideoAutoplayViewHolder(View itemView) {
super(itemView); super(itemView);
@ -4366,6 +4437,36 @@ public class HistoryPostRecyclerViewAdapter extends PagingDataAdapter<Post, Recy
} }
}); });
pauseButton.setOnClickListener(view -> {
pause();
isManuallyPaused = true;
savePlaybackInfo(getPlayerOrder(), getCurrentPlaybackInfo());
});
playButton.setOnClickListener(view -> {
isManuallyPaused = false;
play();
});
progressBar.addListener(new TimeBar.OnScrubListener() {
@Override
public void onScrubStart(TimeBar timeBar, long position) {
}
@Override
public void onScrubMove(TimeBar timeBar, long position) {
}
@Override
public void onScrubStop(TimeBar timeBar, long position, boolean canceled) {
if (!canceled) {
savePlaybackInfo(getPlayerOrder(), getCurrentPlaybackInfo());
}
}
});
fullscreenButton.setOnClickListener(view -> { fullscreenButton.setOnClickListener(view -> {
int position = getBindingAdapterPosition(); int position = getBindingAdapterPosition();
if (position < 0) { if (position < 0) {
@ -4430,6 +4531,10 @@ public class HistoryPostRecyclerViewAdapter extends PagingDataAdapter<Post, Recy
volume = 0f; volume = 0f;
} }
private void savePlaybackInfo(int order, @Nullable PlaybackInfo playbackInfo) {
if (container != null) container.savePlaybackInfo(order, playbackInfo);
}
@NonNull @NonNull
@Override @Override
public View getPlayerView() { public View getPlayerView() {
@ -4447,6 +4552,9 @@ public class HistoryPostRecyclerViewAdapter extends PagingDataAdapter<Post, Recy
if (mediaUri == null) { if (mediaUri == null) {
return; return;
} }
if (this.container == null) {
this.container = container;
}
if (helper == null) { if (helper == null) {
helper = new ExoPlayerViewHelper(this, mediaUri, null, mExoCreator); helper = new ExoPlayerViewHelper(this, mediaUri, null, mExoCreator);
helper.addEventListener(new Playable.DefaultEventListener() { helper.addEventListener(new Playable.DefaultEventListener() {
@ -4488,7 +4596,13 @@ public class HistoryPostRecyclerViewAdapter extends PagingDataAdapter<Post, Recy
@Override @Override
public void play() { public void play() {
if (helper != null && mediaUri != null) { if (helper != null && mediaUri != null) {
helper.play(); if (!isPlaying() && isManuallyPaused) {
helper.play();
pause();
helper.setVolume(volume);
} else {
helper.play();
}
} }
} }
@ -4508,11 +4622,13 @@ public class HistoryPostRecyclerViewAdapter extends PagingDataAdapter<Post, Recy
helper.release(); helper.release();
helper = null; helper = null;
} }
isManuallyPaused = false;
container = null;
} }
@Override @Override
public boolean wantsToPlay() { public boolean wantsToPlay() {
return canPlayVideo && mediaUri != null && ToroUtil.visibleAreaOffset(this, itemView.getParent()) >= mStartAutoplayVisibleAreaOffset; return canPlayVideo && ToroUtil.visibleAreaOffset(this, itemView.getParent()) >= mStartAutoplayVisibleAreaOffset;
} }
@Override @Override

View File

@ -45,7 +45,9 @@ import com.bumptech.glide.request.RequestOptions;
import com.bumptech.glide.request.target.Target; import com.bumptech.glide.request.target.Target;
import com.google.android.exoplayer2.Tracks; import com.google.android.exoplayer2.Tracks;
import com.google.android.exoplayer2.ui.AspectRatioFrameLayout; import com.google.android.exoplayer2.ui.AspectRatioFrameLayout;
import com.google.android.exoplayer2.ui.DefaultTimeBar;
import com.google.android.exoplayer2.ui.PlayerView; import com.google.android.exoplayer2.ui.PlayerView;
import com.google.android.exoplayer2.ui.TimeBar;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.libRG.CustomTextView; import com.libRG.CustomTextView;
@ -656,7 +658,9 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
} else { } else {
((PostDetailVideoAutoplayViewHolder) holder).aspectRatioFrameLayout.setAspectRatio(1); ((PostDetailVideoAutoplayViewHolder) holder).aspectRatioFrameLayout.setAspectRatio(1);
} }
((PostDetailVideoAutoplayViewHolder) holder).setVolume(mMuteAutoplayingVideos || (mPost.isNSFW() && mMuteNSFWVideo) ? 0f : 1f); if (!((PostDetailVideoAutoplayViewHolder) holder).isManuallyPaused) {
((PostDetailVideoAutoplayViewHolder) holder).setVolume((mMuteAutoplayingVideos || (mPost.isNSFW() && mMuteNSFWVideo)) ? 0f : 1f);
}
if (mPost.isGfycat() || mPost.isRedgifs() && !mPost.isLoadGfycatOrStreamableVideoSuccess()) { if (mPost.isGfycat() || mPost.isRedgifs() && !mPost.isLoadGfycatOrStreamableVideoSuccess()) {
((PostDetailVideoAutoplayViewHolder) holder).fetchGfycatOrStreamableVideoCall = ((PostDetailVideoAutoplayViewHolder) holder).fetchGfycatOrStreamableVideoCall =
@ -994,7 +998,9 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
} }
((PostDetailVideoAutoplayViewHolder) holder).mErrorLoadingGfycatImageView.setVisibility(View.GONE); ((PostDetailVideoAutoplayViewHolder) holder).mErrorLoadingGfycatImageView.setVisibility(View.GONE);
((PostDetailVideoAutoplayViewHolder) holder).muteButton.setVisibility(View.GONE); ((PostDetailVideoAutoplayViewHolder) holder).muteButton.setVisibility(View.GONE);
((PostDetailVideoAutoplayViewHolder) holder).resetVolume(); if (!((PostDetailVideoAutoplayViewHolder) holder).isManuallyPaused) {
((PostDetailVideoAutoplayViewHolder) holder).resetVolume();
}
mGlide.clear(((PostDetailVideoAutoplayViewHolder) holder).previewImageView); mGlide.clear(((PostDetailVideoAutoplayViewHolder) holder).previewImageView);
((PostDetailVideoAutoplayViewHolder) holder).previewImageView.setVisibility(View.GONE); ((PostDetailVideoAutoplayViewHolder) holder).previewImageView.setVisibility(View.GONE);
} else if (holder instanceof PostDetailVideoAndGifPreviewHolder) { } else if (holder instanceof PostDetailVideoAndGifPreviewHolder) {
@ -1559,6 +1565,12 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
ImageView muteButton; ImageView muteButton;
@BindView(R.id.fullscreen_exo_playback_control_view) @BindView(R.id.fullscreen_exo_playback_control_view)
ImageView fullscreenButton; ImageView fullscreenButton;
@BindView(R.id.exo_pause)
ImageView pauseButton;
@BindView(R.id.exo_play)
ImageView playButton;
@BindView(R.id.exo_progress)
DefaultTimeBar progressBar;
@BindView(R.id.content_markdown_view_item_post_detail_video_autoplay) @BindView(R.id.content_markdown_view_item_post_detail_video_autoplay)
RecyclerView mContentMarkdownView; RecyclerView mContentMarkdownView;
@BindView(R.id.bottom_constraint_layout_item_post_detail_video_autoplay) @BindView(R.id.bottom_constraint_layout_item_post_detail_video_autoplay)
@ -1576,9 +1588,12 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
@BindView(R.id.share_button_item_post_detail_video_autoplay) @BindView(R.id.share_button_item_post_detail_video_autoplay)
ImageView mShareButton; ImageView mShareButton;
@Nullable @Nullable
Container container;
@Nullable
ExoPlayerViewHelper helper; ExoPlayerViewHelper helper;
private Uri mediaUri; private Uri mediaUri;
private float volume; private float volume;
private boolean isManuallyPaused;
public PostDetailVideoAutoplayViewHolder(@NonNull View itemView) { public PostDetailVideoAutoplayViewHolder(@NonNull View itemView) {
super(itemView); super(itemView);
@ -1662,6 +1677,36 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
} }
}); });
pauseButton.setOnClickListener(view -> {
pause();
isManuallyPaused = true;
savePlaybackInfo(getPlayerOrder(), getCurrentPlaybackInfo());
});
playButton.setOnClickListener(view -> {
isManuallyPaused = false;
play();
});
progressBar.addListener(new TimeBar.OnScrubListener() {
@Override
public void onScrubStart(TimeBar timeBar, long position) {
}
@Override
public void onScrubMove(TimeBar timeBar, long position) {
}
@Override
public void onScrubStop(TimeBar timeBar, long position, boolean canceled) {
if (!canceled) {
savePlaybackInfo(getPlayerOrder(), getCurrentPlaybackInfo());
}
}
});
previewImageView.setOnClickListener(view -> fullscreenButton.performClick()); previewImageView.setOnClickListener(view -> fullscreenButton.performClick());
playerView.setOnClickListener(view -> { playerView.setOnClickListener(view -> {
if (mEasierToWatchInFullScreen && playerView.isControllerVisible()) { if (mEasierToWatchInFullScreen && playerView.isControllerVisible()) {
@ -1682,6 +1727,10 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
volume = 0f; volume = 0f;
} }
private void savePlaybackInfo(int order, @Nullable PlaybackInfo playbackInfo) {
if (container != null) container.savePlaybackInfo(order, playbackInfo);
}
@NonNull @NonNull
@Override @Override
public View getPlayerView() { public View getPlayerView() {
@ -1699,6 +1748,9 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
if (mediaUri == null) { if (mediaUri == null) {
return; return;
} }
if (this.container == null) {
this.container = container;
}
if (helper == null) { if (helper == null) {
helper = new ExoPlayerViewHelper(this, mediaUri, null, mExoCreator); helper = new ExoPlayerViewHelper(this, mediaUri, null, mExoCreator);
helper.addEventListener(new Playable.DefaultEventListener() { helper.addEventListener(new Playable.DefaultEventListener() {
@ -1736,7 +1788,15 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
@Override @Override
public void play() { public void play() {
if (helper != null && mediaUri != null) helper.play(); if (helper != null && mediaUri != null) {
if (!isPlaying() && isManuallyPaused) {
helper.play();
pause();
helper.setVolume(volume);
} else {
helper.play();
}
}
} }
@Override @Override
@ -1755,6 +1815,7 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
helper.release(); helper.release();
helper = null; helper = null;
} }
container = null;
} }
@Override @Override

View File

@ -47,7 +47,9 @@ import com.bumptech.glide.request.RequestOptions;
import com.bumptech.glide.request.target.Target; import com.bumptech.glide.request.target.Target;
import com.google.android.exoplayer2.Tracks; import com.google.android.exoplayer2.Tracks;
import com.google.android.exoplayer2.ui.AspectRatioFrameLayout; import com.google.android.exoplayer2.ui.AspectRatioFrameLayout;
import com.google.android.exoplayer2.ui.DefaultTimeBar;
import com.google.android.exoplayer2.ui.PlayerView; import com.google.android.exoplayer2.ui.PlayerView;
import com.google.android.exoplayer2.ui.TimeBar;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.libRG.CustomTextView; import com.libRG.CustomTextView;
@ -739,10 +741,12 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
} else { } else {
((PostVideoAutoplayViewHolder) holder).aspectRatioFrameLayout.setAspectRatio(1); ((PostVideoAutoplayViewHolder) holder).aspectRatioFrameLayout.setAspectRatio(1);
} }
if (mFragment.getMasterMutingOption() == null) { if (!((PostVideoAutoplayViewHolder) holder).isManuallyPaused) {
((PostVideoAutoplayViewHolder) holder).setVolume(mMuteAutoplayingVideos || (post.isNSFW() && mMuteNSFWVideo) ? 0f : 1f); if (mFragment.getMasterMutingOption() == null) {
} else { ((PostVideoAutoplayViewHolder) holder).setVolume(mMuteAutoplayingVideos || (post.isNSFW() && mMuteNSFWVideo) ? 0f : 1f);
((PostVideoAutoplayViewHolder) holder).setVolume(mFragment.getMasterMutingOption() ? 0f : 1f); } else {
((PostVideoAutoplayViewHolder) holder).setVolume(mFragment.getMasterMutingOption() ? 0f : 1f);
}
} }
if ((post.isGfycat() || post.isRedgifs()) && !post.isLoadGfycatOrStreamableVideoSuccess()) { if ((post.isGfycat() || post.isRedgifs()) && !post.isLoadGfycatOrStreamableVideoSuccess()) {
@ -920,10 +924,12 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
} else { } else {
((PostCard2VideoAutoplayViewHolder) holder).aspectRatioFrameLayout.setAspectRatio(1); ((PostCard2VideoAutoplayViewHolder) holder).aspectRatioFrameLayout.setAspectRatio(1);
} }
if (mFragment.getMasterMutingOption() == null) { if (!((PostCard2VideoAutoplayViewHolder) holder).isManuallyPaused) {
((PostCard2VideoAutoplayViewHolder) holder).setVolume(mMuteAutoplayingVideos || (post.isNSFW() && mMuteNSFWVideo) ? 0f : 1f); if (mFragment.getMasterMutingOption() == null) {
} else { ((PostCard2VideoAutoplayViewHolder) holder).setVolume(mMuteAutoplayingVideos || (post.isNSFW() && mMuteNSFWVideo) ? 0f : 1f);
((PostCard2VideoAutoplayViewHolder) holder).setVolume(mFragment.getMasterMutingOption() ? 0f : 1f); } else {
((PostCard2VideoAutoplayViewHolder) holder).setVolume(mFragment.getMasterMutingOption() ? 0f : 1f);
}
} }
if ((post.isGfycat() || post.isRedgifs()) && !post.isLoadGfycatOrStreamableVideoSuccess()) { if ((post.isGfycat() || post.isRedgifs()) && !post.isLoadGfycatOrStreamableVideoSuccess()) {
@ -1898,7 +1904,9 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
} }
((PostVideoAutoplayViewHolder) holder).errorLoadingGfycatImageView.setVisibility(View.GONE); ((PostVideoAutoplayViewHolder) holder).errorLoadingGfycatImageView.setVisibility(View.GONE);
((PostVideoAutoplayViewHolder) holder).muteButton.setVisibility(View.GONE); ((PostVideoAutoplayViewHolder) holder).muteButton.setVisibility(View.GONE);
((PostVideoAutoplayViewHolder) holder).resetVolume(); if (!((PostVideoAutoplayViewHolder) holder).isManuallyPaused) {
((PostVideoAutoplayViewHolder) holder).resetVolume();
}
mGlide.clear(((PostVideoAutoplayViewHolder) holder).previewImageView); mGlide.clear(((PostVideoAutoplayViewHolder) holder).previewImageView);
((PostVideoAutoplayViewHolder) holder).previewImageView.setVisibility(View.GONE); ((PostVideoAutoplayViewHolder) holder).previewImageView.setVisibility(View.GONE);
} else if (holder instanceof PostWithPreviewTypeViewHolder) { } else if (holder instanceof PostWithPreviewTypeViewHolder) {
@ -2777,6 +2785,12 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
ImageView muteButton; ImageView muteButton;
@BindView(R.id.fullscreen_exo_playback_control_view) @BindView(R.id.fullscreen_exo_playback_control_view)
ImageView fullscreenButton; ImageView fullscreenButton;
@BindView(R.id.exo_pause)
ImageView pauseButton;
@BindView(R.id.exo_play)
ImageView playButton;
@BindView(R.id.exo_progress)
DefaultTimeBar progressBar;
@BindView(R.id.bottom_constraint_layout_item_post_video_type_autoplay) @BindView(R.id.bottom_constraint_layout_item_post_video_type_autoplay)
ConstraintLayout bottomConstraintLayout; ConstraintLayout bottomConstraintLayout;
@BindView(R.id.plus_button_item_post_video_type_autoplay) @BindView(R.id.plus_button_item_post_video_type_autoplay)
@ -2792,11 +2806,14 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
@BindView(R.id.share_button_item_post_video_type_autoplay) @BindView(R.id.share_button_item_post_video_type_autoplay)
ImageView shareButton; ImageView shareButton;
@Nullable
Container container;
@Nullable @Nullable
ExoPlayerViewHelper helper; ExoPlayerViewHelper helper;
private Uri mediaUri; private Uri mediaUri;
private float volume; private float volume;
public Call<String> fetchGfycatOrStreamableVideoCall; public Call<String> fetchGfycatOrStreamableVideoCall;
private boolean isManuallyPaused;
PostVideoAutoplayViewHolder(View itemView) { PostVideoAutoplayViewHolder(View itemView) {
super(itemView); super(itemView);
@ -2889,6 +2906,36 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
} }
}); });
pauseButton.setOnClickListener(view -> {
pause();
isManuallyPaused = true;
savePlaybackInfo(getPlayerOrder(), getCurrentPlaybackInfo());
});
playButton.setOnClickListener(view -> {
isManuallyPaused = false;
play();
});
progressBar.addListener(new TimeBar.OnScrubListener() {
@Override
public void onScrubStart(TimeBar timeBar, long position) {
}
@Override
public void onScrubMove(TimeBar timeBar, long position) {
}
@Override
public void onScrubStop(TimeBar timeBar, long position, boolean canceled) {
if (!canceled) {
savePlaybackInfo(getPlayerOrder(), getCurrentPlaybackInfo());
}
}
});
previewImageView.setOnClickListener(view -> fullscreenButton.performClick()); previewImageView.setOnClickListener(view -> fullscreenButton.performClick());
videoPlayer.setOnClickListener(view -> { videoPlayer.setOnClickListener(view -> {
@ -2910,6 +2957,10 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
volume = 0f; volume = 0f;
} }
private void savePlaybackInfo(int order, @Nullable PlaybackInfo playbackInfo) {
if (container != null) container.savePlaybackInfo(order, playbackInfo);
}
@NonNull @NonNull
@Override @Override
public View getPlayerView() { public View getPlayerView() {
@ -2927,6 +2978,9 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
if (mediaUri == null) { if (mediaUri == null) {
return; return;
} }
if (this.container == null) {
this.container = container;
}
if (helper == null) { if (helper == null) {
helper = new ExoPlayerViewHelper(this, mediaUri, null, mExoCreator); helper = new ExoPlayerViewHelper(this, mediaUri, null, mExoCreator);
helper.addEventListener(new Playable.DefaultEventListener() { helper.addEventListener(new Playable.DefaultEventListener() {
@ -2968,7 +3022,13 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
@Override @Override
public void play() { public void play() {
if (helper != null && mediaUri != null) { if (helper != null && mediaUri != null) {
helper.play(); if (!isPlaying() && isManuallyPaused) {
helper.play();
pause();
helper.setVolume(volume);
} else {
helper.play();
}
} }
} }
@ -2988,11 +3048,13 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
helper.release(); helper.release();
helper = null; helper = null;
} }
isManuallyPaused = false;
container = null;
} }
@Override @Override
public boolean wantsToPlay() { public boolean wantsToPlay() {
return canPlayVideo && mediaUri != null && ToroUtil.visibleAreaOffset(this, itemView.getParent()) >= mStartAutoplayVisibleAreaOffset; return canPlayVideo && ToroUtil.visibleAreaOffset(this, itemView.getParent()) >= mStartAutoplayVisibleAreaOffset;
} }
@Override @Override
@ -4497,6 +4559,12 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
ImageView muteButton; ImageView muteButton;
@BindView(R.id.fullscreen_exo_playback_control_view) @BindView(R.id.fullscreen_exo_playback_control_view)
ImageView fullscreenButton; ImageView fullscreenButton;
@BindView(R.id.exo_pause)
ImageView pauseButton;
@BindView(R.id.exo_play)
ImageView playButton;
@BindView(R.id.exo_progress)
DefaultTimeBar progressBar;
@BindView(R.id.bottom_constraint_layout_item_post_card_2_video_autoplay) @BindView(R.id.bottom_constraint_layout_item_post_card_2_video_autoplay)
ConstraintLayout bottomConstraintLayout; ConstraintLayout bottomConstraintLayout;
@BindView(R.id.plus_button_item_post_card_2_video_autoplay) @BindView(R.id.plus_button_item_post_card_2_video_autoplay)
@ -4514,11 +4582,14 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
@BindView(R.id.divider_item_post_card_2_video_autoplay) @BindView(R.id.divider_item_post_card_2_video_autoplay)
View divider; View divider;
@Nullable
Container container;
@Nullable @Nullable
ExoPlayerViewHelper helper; ExoPlayerViewHelper helper;
private Uri mediaUri; private Uri mediaUri;
private float volume; private float volume;
public Call<String> fetchGfycatOrStreamableVideoCall; public Call<String> fetchGfycatOrStreamableVideoCall;
private boolean isManuallyPaused;
PostCard2VideoAutoplayViewHolder(View itemView) { PostCard2VideoAutoplayViewHolder(View itemView) {
super(itemView); super(itemView);
@ -4611,6 +4682,36 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
} }
}); });
pauseButton.setOnClickListener(view -> {
pause();
isManuallyPaused = true;
savePlaybackInfo(getPlayerOrder(), getCurrentPlaybackInfo());
});
playButton.setOnClickListener(view -> {
isManuallyPaused = false;
play();
});
progressBar.addListener(new TimeBar.OnScrubListener() {
@Override
public void onScrubStart(TimeBar timeBar, long position) {
}
@Override
public void onScrubMove(TimeBar timeBar, long position) {
}
@Override
public void onScrubStop(TimeBar timeBar, long position, boolean canceled) {
if (!canceled) {
savePlaybackInfo(getPlayerOrder(), getCurrentPlaybackInfo());
}
}
});
previewImageView.setOnClickListener(view -> fullscreenButton.performClick()); previewImageView.setOnClickListener(view -> fullscreenButton.performClick());
videoPlayer.setOnClickListener(view -> { videoPlayer.setOnClickListener(view -> {
@ -4632,6 +4733,10 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
volume = 0f; volume = 0f;
} }
private void savePlaybackInfo(int order, @Nullable PlaybackInfo playbackInfo) {
if (container != null) container.savePlaybackInfo(order, playbackInfo);
}
@NonNull @NonNull
@Override @Override
public View getPlayerView() { public View getPlayerView() {
@ -4649,6 +4754,9 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
if (mediaUri == null) { if (mediaUri == null) {
return; return;
} }
if (this.container == null) {
this.container = container;
}
if (helper == null) { if (helper == null) {
helper = new ExoPlayerViewHelper(this, mediaUri, null, mExoCreator); helper = new ExoPlayerViewHelper(this, mediaUri, null, mExoCreator);
helper.addEventListener(new Playable.DefaultEventListener() { helper.addEventListener(new Playable.DefaultEventListener() {
@ -4690,7 +4798,13 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
@Override @Override
public void play() { public void play() {
if (helper != null && mediaUri != null) { if (helper != null && mediaUri != null) {
helper.play(); if (!isPlaying() && isManuallyPaused) {
helper.play();
pause();
helper.setVolume(volume);
} else {
helper.play();
}
} }
} }
@ -4710,11 +4824,13 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
helper.release(); helper.release();
helper = null; helper = null;
} }
isManuallyPaused = false;
container = null;
} }
@Override @Override
public boolean wantsToPlay() { public boolean wantsToPlay() {
return canPlayVideo && mediaUri != null && ToroUtil.visibleAreaOffset(this, itemView.getParent()) >= mStartAutoplayVisibleAreaOffset; return canPlayVideo && ToroUtil.visibleAreaOffset(this, itemView.getParent()) >= mStartAutoplayVisibleAreaOffset;
} }
@Override @Override