8383import org .schabi .newpipe .views .player .PlayerFastSeekOverlay ;
8484
8585import java .util .List ;
86+ import java .util .Objects ;
8687import java .util .Optional ;
8788import 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