Skip to content

Commit e333197

Browse files
Use OnClickListener and OnLongClickListener lambdas in the player UIs.
1 parent 43b2176 commit e333197

2 files changed

Lines changed: 90 additions & 133 deletions

File tree

app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java

Lines changed: 18 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,16 @@ BasePlayerGestureListener buildGestureListener() {
154154
protected void initListeners() {
155155
super.initListeners();
156156

157+
binding.screenRotationButton.setOnClickListener(makeOnClickListener(() -> {
158+
// Only if it's not a vertical video or vertical video but in landscape with locked
159+
// orientation a screen orientation can be changed automatically
160+
if (!isVerticalVideo || (isLandscape() && globalScreenOrientationLocked(context))) {
161+
player.getFragmentListener()
162+
.ifPresent(PlayerServiceEventListener::onScreenRotationButtonClicked);
163+
} else {
164+
toggleFullscreen();
165+
}
166+
}));
157167
binding.queueButton.setOnClickListener(v -> onQueueClicked());
158168
binding.segmentsButton.setOnClickListener(v -> onSegmentsClicked());
159169

@@ -173,6 +183,14 @@ public void onChange(final boolean selfChange) {
173183
settingsContentObserver);
174184

175185
binding.getRoot().addOnLayoutChangeListener(this);
186+
187+
binding.moreOptionsButton.setOnLongClickListener(v -> {
188+
player.getFragmentListener()
189+
.ifPresent(PlayerServiceEventListener::onMoreOptionsLongClicked);
190+
hideControls(0, 0);
191+
hideSystemUIIfNeeded();
192+
return true;
193+
});
176194
}
177195

178196
@Override
@@ -846,23 +864,6 @@ public boolean isVerticalVideo() {
846864
//////////////////////////////////////////////////////////////////////////*/
847865
//region Click listeners
848866

849-
@Override
850-
public void onClick(final View v) {
851-
if (v.getId() == binding.screenRotationButton.getId()) {
852-
// Only if it's not a vertical video or vertical video but in landscape with locked
853-
// orientation a screen orientation can be changed automatically
854-
if (!isVerticalVideo || (isLandscape() && globalScreenOrientationLocked(context))) {
855-
player.getFragmentListener().ifPresent(
856-
PlayerServiceEventListener::onScreenRotationButtonClicked);
857-
} else {
858-
toggleFullscreen();
859-
}
860-
}
861-
862-
// call it later since it calls manageControlsAfterOnClick at the end
863-
super.onClick(v);
864-
}
865-
866867
@Override
867868
protected void onPlaybackSpeedClicked() {
868869
final AppCompatActivity activity = getParentActivity().orElse(null);
@@ -875,18 +876,6 @@ protected void onPlaybackSpeedClicked() {
875876
.show(activity.getSupportFragmentManager(), null);
876877
}
877878

878-
@Override
879-
public boolean onLongClick(final View v) {
880-
if (v.getId() == binding.moreOptionsButton.getId() && isFullscreen) {
881-
player.getFragmentListener().ifPresent(
882-
PlayerServiceEventListener::onMoreOptionsLongClicked);
883-
hideControls(0, 0);
884-
hideSystemUIIfNeeded();
885-
return true;
886-
}
887-
return super.onLongClick(v);
888-
}
889-
890879
@Override
891880
public boolean onKeyDown(final int keyCode) {
892881
if (keyCode == KeyEvent.KEYCODE_SPACE && isFullscreen) {

app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java

Lines changed: 72 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -83,11 +83,11 @@
8383
import org.schabi.newpipe.views.player.PlayerFastSeekOverlay;
8484

8585
import java.util.List;
86+
import java.util.Objects;
8687
import java.util.Optional;
8788
import java.util.stream.Collectors;
8889

89-
public abstract class VideoPlayerUi extends PlayerUi
90-
implements SeekBar.OnSeekBarChangeListener, View.OnClickListener, View.OnLongClickListener,
90+
public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBarChangeListener,
9191
PopupMenu.OnMenuItemClickListener, PopupMenu.OnDismissListener {
9292
private static final String TAG = VideoPlayerUi.class.getSimpleName();
9393

@@ -131,9 +131,11 @@ public abstract class VideoPlayerUi extends PlayerUi
131131

132132
private GestureDetector gestureDetector;
133133
private BasePlayerGestureListener playerGestureListener;
134-
@Nullable private View.OnLayoutChangeListener onLayoutChangeListener = null;
134+
@Nullable
135+
private View.OnLayoutChangeListener onLayoutChangeListener = null;
135136

136-
@NonNull private final SeekbarPreviewThumbnailHolder seekbarPreviewThumbnailHolder =
137+
@NonNull
138+
private final SeekbarPreviewThumbnailHolder seekbarPreviewThumbnailHolder =
137139
new SeekbarPreviewThumbnailHolder();
138140

139141

@@ -186,13 +188,13 @@ private void initViews() {
186188
abstract BasePlayerGestureListener buildGestureListener();
187189

188190
protected void initListeners() {
189-
binding.qualityTextView.setOnClickListener(this);
190-
binding.playbackSpeed.setOnClickListener(this);
191+
binding.qualityTextView.setOnClickListener(makeOnClickListener(this::onQualityClicked));
192+
binding.playbackSpeed.setOnClickListener(makeOnClickListener(this::onPlaybackSpeedClicked));
191193

192194
binding.playbackSeekBar.setOnSeekBarChangeListener(this);
193-
binding.captionTextView.setOnClickListener(this);
194-
binding.resizeTextView.setOnClickListener(this);
195-
binding.playbackLiveSync.setOnClickListener(this);
195+
binding.captionTextView.setOnClickListener(makeOnClickListener(this::onCaptionClicked));
196+
binding.resizeTextView.setOnClickListener(makeOnClickListener(this::onResizeClicked));
197+
binding.playbackLiveSync.setOnClickListener(makeOnClickListener(player::seekToDefault));
196198

197199
playerGestureListener = buildGestureListener();
198200
gestureDetector = new GestureDetector(context, playerGestureListener);
@@ -201,20 +203,36 @@ protected void initListeners() {
201203
binding.repeatButton.setOnClickListener(v -> onRepeatClicked());
202204
binding.shuffleButton.setOnClickListener(v -> onShuffleClicked());
203205

204-
binding.playPauseButton.setOnClickListener(this);
205-
binding.playPreviousButton.setOnClickListener(this);
206-
binding.playNextButton.setOnClickListener(this);
207-
208-
binding.moreOptionsButton.setOnClickListener(this);
209-
binding.moreOptionsButton.setOnLongClickListener(this);
210-
binding.share.setOnClickListener(this);
211-
binding.share.setOnLongClickListener(this);
212-
binding.fullScreenButton.setOnClickListener(this);
213-
binding.screenRotationButton.setOnClickListener(this);
214-
binding.playWithKodi.setOnClickListener(this);
215-
binding.openInBrowser.setOnClickListener(this);
216-
binding.playerCloseButton.setOnClickListener(this);
217-
binding.switchMute.setOnClickListener(this);
206+
binding.playPauseButton.setOnClickListener(makeOnClickListener(player::playPause));
207+
binding.playPreviousButton.setOnClickListener(makeOnClickListener(player::playPrevious));
208+
binding.playNextButton.setOnClickListener(makeOnClickListener(player::playNext));
209+
210+
binding.moreOptionsButton.setOnClickListener(
211+
makeOnClickListener(this::onMoreOptionsClicked));
212+
binding.share.setOnClickListener(makeOnClickListener(() -> {
213+
final PlayQueueItem currentItem = player.getCurrentItem();
214+
if (currentItem != null) {
215+
ShareUtils.shareText(context, currentItem.getTitle(),
216+
player.getVideoUrlAtCurrentTime(), currentItem.getThumbnailUrl());
217+
}
218+
}));
219+
binding.share.setOnLongClickListener(v -> {
220+
ShareUtils.copyToClipboard(context, player.getVideoUrlAtCurrentTime());
221+
return true;
222+
});
223+
binding.fullScreenButton.setOnClickListener(makeOnClickListener(() -> {
224+
player.setRecovery();
225+
NavigationHelper.playOnMainPlayer(context,
226+
Objects.requireNonNull(player.getPlayQueue()), true);
227+
}));
228+
binding.playWithKodi.setOnClickListener(makeOnClickListener(this::onPlayWithKodiClicked));
229+
binding.openInBrowser.setOnClickListener(makeOnClickListener(this::onOpenInBrowserClicked));
230+
binding.playerCloseButton.setOnClickListener(makeOnClickListener(() ->
231+
// set package to this app's package to prevent the intent from being seen outside
232+
context.sendBroadcast(new Intent(VideoDetailFragment.ACTION_HIDE_MAIN_PLAYER)
233+
.setPackage(App.PACKAGE_NAME))
234+
));
235+
binding.switchMute.setOnClickListener(makeOnClickListener(player::toggleMute));
218236

219237
ViewCompat.setOnApplyWindowInsetsListener(binding.itemsListPanel, (view, windowInsets) -> {
220238
final Insets cutout = windowInsets.getInsets(WindowInsetsCompat.Type.displayCutout());
@@ -228,11 +246,8 @@ protected void initListeners() {
228246
// player_overlays and fast_seek_overlay too. Without it they will be off-centered.
229247
onLayoutChangeListener =
230248
(v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> {
231-
binding.playerOverlays.setPadding(
232-
v.getPaddingLeft(),
233-
v.getPaddingTop(),
234-
v.getPaddingRight(),
235-
v.getPaddingBottom());
249+
binding.playerOverlays.setPadding(v.getPaddingLeft(), v.getPaddingTop(),
250+
v.getPaddingRight(), v.getPaddingBottom());
236251

237252
// If we added padding to the fast seek overlay, too, it would not go under the
238253
// system ui. Instead we apply negative margins equal to the window insets of
@@ -1324,86 +1339,39 @@ private void setupSubtitleView() {
13241339
//////////////////////////////////////////////////////////////////////////*/
13251340
//region Click listeners
13261341

1327-
@Override
1328-
public void onClick(final View v) {
1329-
if (DEBUG) {
1330-
Log.d(TAG, "onClick() called with: v = [" + v + "]");
1331-
}
1332-
if (v.getId() == binding.resizeTextView.getId()) {
1333-
onResizeClicked();
1334-
} else if (v.getId() == binding.captionTextView.getId()) {
1335-
onCaptionClicked();
1336-
} else if (v.getId() == binding.playbackLiveSync.getId()) {
1337-
player.seekToDefault();
1338-
} else if (v.getId() == binding.playPauseButton.getId()) {
1339-
player.playPause();
1340-
} else if (v.getId() == binding.playPreviousButton.getId()) {
1341-
player.playPrevious();
1342-
} else if (v.getId() == binding.playNextButton.getId()) {
1343-
player.playNext();
1344-
} else if (v.getId() == binding.moreOptionsButton.getId()) {
1345-
onMoreOptionsClicked();
1346-
} else if (v.getId() == binding.share.getId()) {
1347-
final PlayQueueItem currentItem = player.getCurrentItem();
1348-
if (currentItem != null) {
1349-
ShareUtils.shareText(context, currentItem.getTitle(),
1350-
player.getVideoUrlAtCurrentTime(), currentItem.getThumbnailUrl());
1351-
}
1352-
} else if (v.getId() == binding.playWithKodi.getId()) {
1353-
onPlayWithKodiClicked();
1354-
} else if (v.getId() == binding.openInBrowser.getId()) {
1355-
onOpenInBrowserClicked();
1356-
} else if (v.getId() == binding.fullScreenButton.getId()) {
1357-
player.setRecovery();
1358-
NavigationHelper.playOnMainPlayer(context, player.getPlayQueue(), true);
1359-
return;
1360-
} else if (v.getId() == binding.switchMute.getId()) {
1361-
player.toggleMute();
1362-
} else if (v.getId() == binding.playerCloseButton.getId()) {
1363-
// set package to this app's package to prevent the intent from being seen outside
1364-
context.sendBroadcast(new Intent(VideoDetailFragment.ACTION_HIDE_MAIN_PLAYER)
1365-
.setPackage(App.PACKAGE_NAME));
1366-
} else if (v.getId() == binding.playbackSpeed.getId()) {
1367-
onPlaybackSpeedClicked();
1368-
} else if (v.getId() == binding.qualityTextView.getId()) {
1369-
onQualityClicked();
1370-
}
1371-
1372-
manageControlsAfterOnClick(v);
1373-
}
1374-
13751342
/**
1376-
* Manages the controls after a click occurred on the player UI.
1377-
* @param v – The view that was clicked
1343+
* Create on-click listener which manages the player controls after the view on-click action.
1344+
*
1345+
* @param runnable The action to be executed.
1346+
* @return The view click listener.
13781347
*/
1379-
public void manageControlsAfterOnClick(@NonNull final View v) {
1380-
if (player.getCurrentState() == STATE_COMPLETED) {
1381-
return;
1382-
}
1348+
protected View.OnClickListener makeOnClickListener(@NonNull final Runnable runnable) {
1349+
return v -> {
1350+
if (DEBUG) {
1351+
Log.d(TAG, "onClick() called with: v = [" + v + "]");
1352+
}
13831353

1384-
controlsVisibilityHandler.removeCallbacksAndMessages(null);
1385-
showHideShadow(true, DEFAULT_CONTROLS_DURATION);
1386-
animate(binding.playbackControlRoot, true, DEFAULT_CONTROLS_DURATION,
1387-
AnimationType.ALPHA, 0, () -> {
1388-
if (player.getCurrentState() == STATE_PLAYING && !isSomePopupMenuVisible) {
1389-
if (v.getId() == binding.playPauseButton.getId()
1390-
// Hide controls in fullscreen immediately
1391-
|| (v.getId() == binding.screenRotationButton.getId()
1392-
&& isFullscreen())) {
1393-
hideControls(0, 0);
1394-
} else {
1395-
hideControls(DEFAULT_CONTROLS_DURATION, DEFAULT_CONTROLS_HIDE_TIME);
1396-
}
1397-
}
1398-
});
1399-
}
1354+
runnable.run();
14001355

1401-
@Override
1402-
public boolean onLongClick(final View v) {
1403-
if (v.getId() == binding.share.getId()) {
1404-
ShareUtils.copyToClipboard(context, player.getVideoUrlAtCurrentTime());
1405-
}
1406-
return true;
1356+
// Manages the player controls after handling the view click.
1357+
if (player.getCurrentState() == STATE_COMPLETED) {
1358+
return;
1359+
}
1360+
controlsVisibilityHandler.removeCallbacksAndMessages(null);
1361+
showHideShadow(true, DEFAULT_CONTROLS_DURATION);
1362+
animate(binding.playbackControlRoot, true, DEFAULT_CONTROLS_DURATION,
1363+
AnimationType.ALPHA, 0, () -> {
1364+
if (player.getCurrentState() == STATE_PLAYING && !isSomePopupMenuVisible) {
1365+
if (v == binding.playPauseButton
1366+
// Hide controls in fullscreen immediately
1367+
|| (v == binding.screenRotationButton && isFullscreen())) {
1368+
hideControls(0, 0);
1369+
} else {
1370+
hideControls(DEFAULT_CONTROLS_DURATION, DEFAULT_CONTROLS_HIDE_TIME);
1371+
}
1372+
}
1373+
});
1374+
};
14071375
}
14081376

14091377
public boolean onKeyDown(final int keyCode) {

0 commit comments

Comments
 (0)