Skip to content

Commit 102204e

Browse files
authored
Merge pull request #8011 from XiangRongLin/extract_view_listeners
Extract view click listeners from Player
2 parents 37aca3f + 6765135 commit 102204e

4 files changed

Lines changed: 172 additions & 108 deletions

File tree

app/src/main/java/org/schabi/newpipe/player/Player.java

Lines changed: 53 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -164,9 +164,10 @@
164164
import org.schabi.newpipe.player.helper.AudioReactor;
165165
import org.schabi.newpipe.player.helper.LoadController;
166166
import org.schabi.newpipe.player.helper.MediaSessionManager;
167-
import org.schabi.newpipe.player.helper.PlaybackParameterDialog;
168167
import org.schabi.newpipe.player.helper.PlayerDataSource;
169168
import org.schabi.newpipe.player.helper.PlayerHelper;
169+
import org.schabi.newpipe.player.listeners.view.PlaybackSpeedClickListener;
170+
import org.schabi.newpipe.player.listeners.view.QualityClickListener;
170171
import org.schabi.newpipe.player.playback.CustomTrackSelector;
171172
import org.schabi.newpipe.player.playback.MediaSourceManager;
172173
import org.schabi.newpipe.player.playback.PlaybackListener;
@@ -530,9 +531,12 @@ private void initPlayer(final boolean playOnReady) {
530531
}
531532

532533
private void initListeners() {
534+
binding.qualityTextView.setOnClickListener(
535+
new QualityClickListener(this, qualityPopupMenu));
536+
binding.playbackSpeed.setOnClickListener(
537+
new PlaybackSpeedClickListener(this, playbackSpeedPopupMenu));
538+
533539
binding.playbackSeekBar.setOnSeekBarChangeListener(this);
534-
binding.playbackSpeed.setOnClickListener(this);
535-
binding.qualityTextView.setOnClickListener(this);
536540
binding.captionTextView.setOnClickListener(this);
537541
binding.resizeTextView.setOnClickListener(this);
538542
binding.playbackLiveSync.setOnClickListener(this);
@@ -541,11 +545,15 @@ private void initListeners() {
541545
gestureDetector = new GestureDetectorCompat(context, playerGestureListener);
542546
binding.getRoot().setOnTouchListener(playerGestureListener);
543547

544-
binding.queueButton.setOnClickListener(this);
545-
binding.segmentsButton.setOnClickListener(this);
546-
binding.repeatButton.setOnClickListener(this);
547-
binding.shuffleButton.setOnClickListener(this);
548-
binding.addToPlaylistButton.setOnClickListener(this);
548+
binding.queueButton.setOnClickListener(v -> onQueueClicked());
549+
binding.segmentsButton.setOnClickListener(v -> onSegmentsClicked());
550+
binding.repeatButton.setOnClickListener(v -> onRepeatClicked());
551+
binding.shuffleButton.setOnClickListener(v -> onShuffleClicked());
552+
binding.addToPlaylistButton.setOnClickListener(v -> {
553+
if (getParentActivity() != null) {
554+
onAddToPlaylistClicked(getParentActivity().getSupportFragmentManager());
555+
}
556+
});
549557

550558
binding.playPauseButton.setOnClickListener(this);
551559
binding.playPreviousButton.setOnClickListener(this);
@@ -1926,7 +1934,7 @@ public void hideControls(final long duration, final long delay) {
19261934
}, delay);
19271935
}
19281936

1929-
private void showHideShadow(final boolean show, final long duration) {
1937+
public void showHideShadow(final boolean show, final long duration) {
19301938
animate(binding.playbackControlsShadow, show, duration, AnimationType.ALPHA, 0, null);
19311939
animate(binding.playerTopShadow, show, duration, AnimationType.ALPHA, 0, null);
19321940
animate(binding.playerBottomShadow, show, duration, AnimationType.ALPHA, 0, null);
@@ -3607,37 +3615,6 @@ public void onDismiss(@Nullable final PopupMenu menu) {
36073615
}
36083616
}
36093617

3610-
private void onQualitySelectorClicked() {
3611-
if (DEBUG) {
3612-
Log.d(TAG, "onQualitySelectorClicked() called");
3613-
}
3614-
qualityPopupMenu.show();
3615-
isSomePopupMenuVisible = true;
3616-
3617-
final VideoStream videoStream = getSelectedVideoStream();
3618-
if (videoStream != null) {
3619-
final String qualityText = MediaFormat.getNameById(videoStream.getFormatId()) + " "
3620-
+ videoStream.resolution;
3621-
binding.qualityTextView.setText(qualityText);
3622-
}
3623-
3624-
saveWasPlaying();
3625-
}
3626-
3627-
private void onPlaybackSpeedClicked() {
3628-
if (DEBUG) {
3629-
Log.d(TAG, "onPlaybackSpeedClicked() called");
3630-
}
3631-
if (videoPlayerSelected()) {
3632-
PlaybackParameterDialog.newInstance(getPlaybackSpeed(), getPlaybackPitch(),
3633-
getPlaybackSkipSilence(), this::setPlaybackParameters)
3634-
.show(getParentActivity().getSupportFragmentManager(), null);
3635-
} else {
3636-
playbackSpeedPopupMenu.show();
3637-
isSomePopupMenuVisible = true;
3638-
}
3639-
}
3640-
36413618
private void onCaptionClicked() {
36423619
if (DEBUG) {
36433620
Log.d(TAG, "onCaptionClicked() called");
@@ -3742,11 +3719,7 @@ public void onClick(final View v) {
37423719
if (DEBUG) {
37433720
Log.d(TAG, "onClick() called with: v = [" + v + "]");
37443721
}
3745-
if (v.getId() == binding.qualityTextView.getId()) {
3746-
onQualitySelectorClicked();
3747-
} else if (v.getId() == binding.playbackSpeed.getId()) {
3748-
onPlaybackSpeedClicked();
3749-
} else if (v.getId() == binding.resizeTextView.getId()) {
3722+
if (v.getId() == binding.resizeTextView.getId()) {
37503723
onResizeClicked();
37513724
} else if (v.getId() == binding.captionTextView.getId()) {
37523725
onCaptionClicked();
@@ -3758,23 +3731,6 @@ public void onClick(final View v) {
37583731
playPrevious();
37593732
} else if (v.getId() == binding.playNextButton.getId()) {
37603733
playNext();
3761-
} else if (v.getId() == binding.queueButton.getId()) {
3762-
onQueueClicked();
3763-
return;
3764-
} else if (v.getId() == binding.segmentsButton.getId()) {
3765-
onSegmentsClicked();
3766-
return;
3767-
} else if (v.getId() == binding.repeatButton.getId()) {
3768-
onRepeatClicked();
3769-
return;
3770-
} else if (v.getId() == binding.shuffleButton.getId()) {
3771-
onShuffleClicked();
3772-
return;
3773-
} else if (v.getId() == binding.addToPlaylistButton.getId()) {
3774-
if (getParentActivity() != null) {
3775-
onAddToPlaylistClicked(getParentActivity().getSupportFragmentManager());
3776-
}
3777-
return;
37783734
} else if (v.getId() == binding.moreOptionsButton.getId()) {
37793735
onMoreOptionsClicked();
37803736
} else if (v.getId() == binding.share.getId()) {
@@ -3803,23 +3759,33 @@ public void onClick(final View v) {
38033759
context.sendBroadcast(new Intent(VideoDetailFragment.ACTION_HIDE_MAIN_PLAYER));
38043760
}
38053761

3806-
if (currentState != STATE_COMPLETED) {
3807-
controlsVisibilityHandler.removeCallbacksAndMessages(null);
3808-
showHideShadow(true, DEFAULT_CONTROLS_DURATION);
3809-
animate(binding.playbackControlRoot, true, DEFAULT_CONTROLS_DURATION,
3810-
AnimationType.ALPHA, 0, () -> {
3811-
if (currentState == STATE_PLAYING && !isSomePopupMenuVisible) {
3812-
if (v.getId() == binding.playPauseButton.getId()
3813-
// Hide controls in fullscreen immediately
3814-
|| (v.getId() == binding.screenRotationButton.getId()
3815-
&& isFullscreen)) {
3816-
hideControls(0, 0);
3817-
} else {
3818-
hideControls(DEFAULT_CONTROLS_DURATION, DEFAULT_CONTROLS_HIDE_TIME);
3819-
}
3820-
}
3821-
});
3762+
manageControlsAfterOnClick(v);
3763+
}
3764+
3765+
/**
3766+
* Manages the controls after a click occurred on the player UI.
3767+
* @param v – The view that was clicked
3768+
*/
3769+
public void manageControlsAfterOnClick(@NonNull final View v) {
3770+
if (currentState == STATE_COMPLETED) {
3771+
return;
38223772
}
3773+
3774+
controlsVisibilityHandler.removeCallbacksAndMessages(null);
3775+
showHideShadow(true, DEFAULT_CONTROLS_DURATION);
3776+
animate(binding.playbackControlRoot, true, DEFAULT_CONTROLS_DURATION,
3777+
AnimationType.ALPHA, 0, () -> {
3778+
if (currentState == STATE_PLAYING && !isSomePopupMenuVisible) {
3779+
if (v.getId() == binding.playPauseButton.getId()
3780+
// Hide controls in fullscreen immediately
3781+
|| (v.getId() == binding.screenRotationButton.getId()
3782+
&& isFullscreen)) {
3783+
hideControls(0, 0);
3784+
} else {
3785+
hideControls(DEFAULT_CONTROLS_DURATION, DEFAULT_CONTROLS_HIDE_TIME);
3786+
}
3787+
}
3788+
});
38233789
}
38243790

38253791
@Override
@@ -4446,6 +4412,10 @@ public boolean isSomePopupMenuVisible() {
44464412
return isSomePopupMenuVisible;
44474413
}
44484414

4415+
public void setSomePopupMenuVisible(final boolean somePopupMenuVisible) {
4416+
isSomePopupMenuVisible = somePopupMenuVisible;
4417+
}
4418+
44494419
public ImageButton getPlayPauseButton() {
44504420
return binding.playPauseButton;
44514421
}
@@ -4527,6 +4497,11 @@ public ExpandableSurfaceView getSurfaceView() {
45274497
public PlayQueueAdapter getPlayQueueAdapter() {
45284498
return playQueueAdapter;
45294499
}
4500+
4501+
public PlayerBinding getBinding() {
4502+
return binding;
4503+
}
4504+
45304505
//endregion
45314506

45324507

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package org.schabi.newpipe.player.listeners.view
2+
3+
import android.util.Log
4+
import android.view.View
5+
import androidx.appcompat.widget.PopupMenu
6+
import org.schabi.newpipe.MainActivity
7+
import org.schabi.newpipe.player.Player
8+
import org.schabi.newpipe.player.helper.PlaybackParameterDialog
9+
10+
/**
11+
* Click listener for the playbackSpeed textview of the player
12+
*/
13+
class PlaybackSpeedClickListener(
14+
private val player: Player,
15+
private val playbackSpeedPopupMenu: PopupMenu
16+
) : View.OnClickListener {
17+
18+
companion object {
19+
private const val TAG: String = "PlaybSpeedClickListener"
20+
}
21+
22+
override fun onClick(v: View) {
23+
if (MainActivity.DEBUG) {
24+
Log.d(TAG, "onPlaybackSpeedClicked() called")
25+
}
26+
27+
if (player.videoPlayerSelected()) {
28+
PlaybackParameterDialog.newInstance(
29+
player.playbackSpeed.toDouble(),
30+
player.playbackPitch.toDouble(),
31+
player.playbackSkipSilence
32+
) { speed: Float, pitch: Float, skipSilence: Boolean ->
33+
player.setPlaybackParameters(
34+
speed,
35+
pitch,
36+
skipSilence
37+
)
38+
}
39+
.show(player.parentActivity!!.supportFragmentManager, null)
40+
} else {
41+
playbackSpeedPopupMenu.show()
42+
player.isSomePopupMenuVisible = true
43+
}
44+
45+
player.manageControlsAfterOnClick(v)
46+
}
47+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package org.schabi.newpipe.player.listeners.view
2+
3+
import android.annotation.SuppressLint
4+
import android.util.Log
5+
import android.view.View
6+
import androidx.appcompat.widget.PopupMenu
7+
import org.schabi.newpipe.MainActivity
8+
import org.schabi.newpipe.extractor.MediaFormat
9+
import org.schabi.newpipe.player.Player
10+
11+
/**
12+
* Click listener for the qualityTextView of the player
13+
*/
14+
class QualityClickListener(
15+
private val player: Player,
16+
private val qualityPopupMenu: PopupMenu
17+
) : View.OnClickListener {
18+
19+
companion object {
20+
private const val TAG: String = "QualityClickListener"
21+
}
22+
23+
@SuppressLint("SetTextI18n") // we don't need I18N because of a " "
24+
override fun onClick(v: View) {
25+
if (MainActivity.DEBUG) {
26+
Log.d(TAG, "onQualitySelectorClicked() called")
27+
}
28+
29+
qualityPopupMenu.show()
30+
player.isSomePopupMenuVisible = true
31+
32+
val videoStream = player.selectedVideoStream
33+
if (videoStream != null) {
34+
player.binding.qualityTextView.text =
35+
MediaFormat.getNameById(videoStream.formatId) + " " + videoStream.resolution
36+
}
37+
38+
player.saveWasPlaying()
39+
player.manageControlsAfterOnClick(v)
40+
}
41+
}

0 commit comments

Comments
 (0)