Solve some Sonarlint warnings
This commit is contained in:
parent
a19073ec01
commit
4979f84e41
10 changed files with 86 additions and 95 deletions
|
@ -9,15 +9,20 @@ import android.view.Window;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.fragment.app.DialogFragment;
|
import androidx.fragment.app.DialogFragment;
|
||||||
|
import androidx.fragment.app.FragmentManager;
|
||||||
|
|
||||||
import org.schabi.newpipe.NewPipeDatabase;
|
import org.schabi.newpipe.NewPipeDatabase;
|
||||||
import org.schabi.newpipe.database.stream.model.StreamEntity;
|
import org.schabi.newpipe.database.stream.model.StreamEntity;
|
||||||
import org.schabi.newpipe.local.playlist.LocalPlaylistManager;
|
import org.schabi.newpipe.local.playlist.LocalPlaylistManager;
|
||||||
|
import org.schabi.newpipe.player.Player;
|
||||||
import org.schabi.newpipe.util.StateSaver;
|
import org.schabi.newpipe.util.StateSaver;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
import java.util.Queue;
|
import java.util.Queue;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
|
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
|
||||||
import io.reactivex.rxjava3.disposables.Disposable;
|
import io.reactivex.rxjava3.disposables.Disposable;
|
||||||
|
@ -131,13 +136,13 @@ public abstract class PlaylistDialog extends DialogFragment implements StateSave
|
||||||
* @param context context used for accessing the database
|
* @param context context used for accessing the database
|
||||||
* @param streamEntities used for crating the dialog
|
* @param streamEntities used for crating the dialog
|
||||||
* @param onExec execution that should occur after a dialog got created, e.g. showing it
|
* @param onExec execution that should occur after a dialog got created, e.g. showing it
|
||||||
* @return Disposable
|
* @return the disposable that was created
|
||||||
*/
|
*/
|
||||||
public static Disposable createCorrespondingDialog(
|
public static Disposable createCorrespondingDialog(
|
||||||
final Context context,
|
final Context context,
|
||||||
final List<StreamEntity> streamEntities,
|
final List<StreamEntity> streamEntities,
|
||||||
final Consumer<PlaylistDialog> onExec
|
final Consumer<PlaylistDialog> onExec) {
|
||||||
) {
|
|
||||||
return new LocalPlaylistManager(NewPipeDatabase.getInstance(context))
|
return new LocalPlaylistManager(NewPipeDatabase.getInstance(context))
|
||||||
.hasPlaylists()
|
.hasPlaylists()
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
|
@ -147,4 +152,30 @@ public abstract class PlaylistDialog extends DialogFragment implements StateSave
|
||||||
: PlaylistCreationDialog.newInstance(streamEntities))
|
: PlaylistCreationDialog.newInstance(streamEntities))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a {@link PlaylistAppendDialog} when playlists exists,
|
||||||
|
* otherwise a {@link PlaylistCreationDialog}. If the player's play queue is null or empty, no
|
||||||
|
* dialog will be created.
|
||||||
|
*
|
||||||
|
* @param player the player from which to extract the context and the play queue
|
||||||
|
* @param fragmentManager the fragment manager to use to show the dialog
|
||||||
|
* @return the disposable that was created
|
||||||
|
*/
|
||||||
|
public static Disposable showForPlayQueue(
|
||||||
|
final Player player,
|
||||||
|
@NonNull final FragmentManager fragmentManager) {
|
||||||
|
|
||||||
|
final List<StreamEntity> streamEntities = Stream.of(player.getPlayQueue())
|
||||||
|
.filter(Objects::nonNull)
|
||||||
|
.flatMap(playQueue -> Objects.requireNonNull(playQueue).getStreams().stream())
|
||||||
|
.map(StreamEntity::new)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
if (streamEntities.isEmpty()) {
|
||||||
|
return Disposable.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
return PlaylistDialog.createCorrespondingDialog(player.getContext(), streamEntities,
|
||||||
|
dialog -> dialog.show(fragmentManager, "PlaylistDialog"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,7 @@ import org.schabi.newpipe.R;
|
||||||
import org.schabi.newpipe.databinding.ActivityPlayerQueueControlBinding;
|
import org.schabi.newpipe.databinding.ActivityPlayerQueueControlBinding;
|
||||||
import org.schabi.newpipe.extractor.stream.StreamInfo;
|
import org.schabi.newpipe.extractor.stream.StreamInfo;
|
||||||
import org.schabi.newpipe.fragments.OnScrollBelowItemsListener;
|
import org.schabi.newpipe.fragments.OnScrollBelowItemsListener;
|
||||||
|
import org.schabi.newpipe.local.dialog.PlaylistDialog;
|
||||||
import org.schabi.newpipe.player.event.PlayerEventListener;
|
import org.schabi.newpipe.player.event.PlayerEventListener;
|
||||||
import org.schabi.newpipe.player.helper.PlaybackParameterDialog;
|
import org.schabi.newpipe.player.helper.PlaybackParameterDialog;
|
||||||
import org.schabi.newpipe.player.playqueue.PlayQueue;
|
import org.schabi.newpipe.player.playqueue.PlayQueue;
|
||||||
|
@ -53,8 +54,6 @@ public final class PlayQueueActivity extends AppCompatActivity
|
||||||
|
|
||||||
private Player player;
|
private Player player;
|
||||||
|
|
||||||
private PlayQueueAdapter adapter = null;
|
|
||||||
|
|
||||||
private boolean serviceBound;
|
private boolean serviceBound;
|
||||||
private ServiceConnection serviceConnection;
|
private ServiceConnection serviceConnection;
|
||||||
|
|
||||||
|
@ -128,7 +127,7 @@ public final class PlayQueueActivity extends AppCompatActivity
|
||||||
NavigationHelper.openSettings(this);
|
NavigationHelper.openSettings(this);
|
||||||
return true;
|
return true;
|
||||||
case R.id.action_append_playlist:
|
case R.id.action_append_playlist:
|
||||||
player.onAddToPlaylistClicked(getSupportFragmentManager());
|
PlaylistDialog.showForPlayQueue(player, getSupportFragmentManager());
|
||||||
return true;
|
return true;
|
||||||
case R.id.action_playback_speed:
|
case R.id.action_playback_speed:
|
||||||
openPlaybackParameterDialog();
|
openPlaybackParameterDialog();
|
||||||
|
@ -441,10 +440,9 @@ public final class PlayQueueActivity extends AppCompatActivity
|
||||||
@Override
|
@Override
|
||||||
public void onQueueUpdate(@Nullable final PlayQueue queue) {
|
public void onQueueUpdate(@Nullable final PlayQueue queue) {
|
||||||
if (queue == null) {
|
if (queue == null) {
|
||||||
adapter = null;
|
|
||||||
queueControlBinding.playQueue.setAdapter(null);
|
queueControlBinding.playQueue.setAdapter(null);
|
||||||
} else {
|
} else {
|
||||||
adapter = new PlayQueueAdapter(this, queue);
|
final PlayQueueAdapter adapter = new PlayQueueAdapter(this, queue);
|
||||||
adapter.setSelectedListener(getOnSelectedListener());
|
adapter.setSelectedListener(getOnSelectedListener());
|
||||||
queueControlBinding.playQueue.setAdapter(adapter);
|
queueControlBinding.playQueue.setAdapter(adapter);
|
||||||
}
|
}
|
||||||
|
|
|
@ -63,16 +63,6 @@ import android.view.LayoutInflater;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.appcompat.app.AppCompatActivity;
|
|
||||||
import androidx.appcompat.content.res.AppCompatResources;
|
|
||||||
import androidx.appcompat.view.ContextThemeWrapper;
|
|
||||||
import androidx.appcompat.widget.AppCompatImageButton;
|
|
||||||
import androidx.appcompat.widget.PopupMenu;
|
|
||||||
import androidx.core.content.ContextCompat;
|
|
||||||
import androidx.core.graphics.Insets;
|
|
||||||
import androidx.core.view.ViewCompat;
|
|
||||||
import androidx.core.view.WindowInsetsCompat;
|
|
||||||
import androidx.fragment.app.FragmentManager;
|
|
||||||
import androidx.preference.PreferenceManager;
|
import androidx.preference.PreferenceManager;
|
||||||
|
|
||||||
import com.google.android.exoplayer2.C;
|
import com.google.android.exoplayer2.C;
|
||||||
|
@ -96,7 +86,6 @@ import com.squareup.picasso.Target;
|
||||||
|
|
||||||
import org.schabi.newpipe.MainActivity;
|
import org.schabi.newpipe.MainActivity;
|
||||||
import org.schabi.newpipe.R;
|
import org.schabi.newpipe.R;
|
||||||
import org.schabi.newpipe.database.stream.model.StreamEntity;
|
|
||||||
import org.schabi.newpipe.databinding.PlayerBinding;
|
import org.schabi.newpipe.databinding.PlayerBinding;
|
||||||
import org.schabi.newpipe.error.ErrorInfo;
|
import org.schabi.newpipe.error.ErrorInfo;
|
||||||
import org.schabi.newpipe.error.ErrorUtil;
|
import org.schabi.newpipe.error.ErrorUtil;
|
||||||
|
@ -105,7 +94,6 @@ import org.schabi.newpipe.extractor.stream.StreamInfo;
|
||||||
import org.schabi.newpipe.extractor.stream.StreamType;
|
import org.schabi.newpipe.extractor.stream.StreamType;
|
||||||
import org.schabi.newpipe.extractor.stream.VideoStream;
|
import org.schabi.newpipe.extractor.stream.VideoStream;
|
||||||
import org.schabi.newpipe.fragments.detail.VideoDetailFragment;
|
import org.schabi.newpipe.fragments.detail.VideoDetailFragment;
|
||||||
import org.schabi.newpipe.local.dialog.PlaylistDialog;
|
|
||||||
import org.schabi.newpipe.local.history.HistoryRecordManager;
|
import org.schabi.newpipe.local.history.HistoryRecordManager;
|
||||||
import org.schabi.newpipe.player.PlayerService.PlayerType;
|
import org.schabi.newpipe.player.PlayerService.PlayerType;
|
||||||
import org.schabi.newpipe.player.event.PlayerEventListener;
|
import org.schabi.newpipe.player.event.PlayerEventListener;
|
||||||
|
@ -116,6 +104,7 @@ import org.schabi.newpipe.player.helper.MediaSessionManager;
|
||||||
import org.schabi.newpipe.player.helper.PlayerDataSource;
|
import org.schabi.newpipe.player.helper.PlayerDataSource;
|
||||||
import org.schabi.newpipe.player.helper.PlayerHelper;
|
import org.schabi.newpipe.player.helper.PlayerHelper;
|
||||||
import org.schabi.newpipe.player.mediaitem.MediaItemTag;
|
import org.schabi.newpipe.player.mediaitem.MediaItemTag;
|
||||||
|
import org.schabi.newpipe.player.notification.NotificationPlayerUi;
|
||||||
import org.schabi.newpipe.player.playback.MediaSourceManager;
|
import org.schabi.newpipe.player.playback.MediaSourceManager;
|
||||||
import org.schabi.newpipe.player.playback.PlaybackListener;
|
import org.schabi.newpipe.player.playback.PlaybackListener;
|
||||||
import org.schabi.newpipe.player.playback.PlayerMediaSession;
|
import org.schabi.newpipe.player.playback.PlayerMediaSession;
|
||||||
|
@ -125,7 +114,6 @@ import org.schabi.newpipe.player.resolver.AudioPlaybackResolver;
|
||||||
import org.schabi.newpipe.player.resolver.VideoPlaybackResolver;
|
import org.schabi.newpipe.player.resolver.VideoPlaybackResolver;
|
||||||
import org.schabi.newpipe.player.resolver.VideoPlaybackResolver.SourceType;
|
import org.schabi.newpipe.player.resolver.VideoPlaybackResolver.SourceType;
|
||||||
import org.schabi.newpipe.player.ui.MainPlayerUi;
|
import org.schabi.newpipe.player.ui.MainPlayerUi;
|
||||||
import org.schabi.newpipe.player.notification.NotificationPlayerUi;
|
|
||||||
import org.schabi.newpipe.player.ui.PlayerUi;
|
import org.schabi.newpipe.player.ui.PlayerUi;
|
||||||
import org.schabi.newpipe.player.ui.PlayerUiList;
|
import org.schabi.newpipe.player.ui.PlayerUiList;
|
||||||
import org.schabi.newpipe.player.ui.PopupPlayerUi;
|
import org.schabi.newpipe.player.ui.PopupPlayerUi;
|
||||||
|
@ -137,10 +125,8 @@ import org.schabi.newpipe.util.PicassoHelper;
|
||||||
import org.schabi.newpipe.util.SerializedCache;
|
import org.schabi.newpipe.util.SerializedCache;
|
||||||
import org.schabi.newpipe.util.StreamTypeUtil;
|
import org.schabi.newpipe.util.StreamTypeUtil;
|
||||||
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.stream.Collectors;
|
|
||||||
import java.util.stream.IntStream;
|
import java.util.stream.IntStream;
|
||||||
|
|
||||||
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
|
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
|
||||||
|
@ -1192,32 +1178,6 @@ public final class Player implements PlaybackListener, Listener {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*//////////////////////////////////////////////////////////////////////////
|
|
||||||
// Playlist append TODO this does not make sense here
|
|
||||||
//////////////////////////////////////////////////////////////////////////*/
|
|
||||||
//region Playlist append
|
|
||||||
|
|
||||||
public void onAddToPlaylistClicked(@NonNull final FragmentManager fragmentManager) {
|
|
||||||
if (DEBUG) {
|
|
||||||
Log.d(TAG, "onAddToPlaylistClicked() called");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (getPlayQueue() != null) {
|
|
||||||
PlaylistDialog.createCorrespondingDialog(
|
|
||||||
getContext(),
|
|
||||||
getPlayQueue()
|
|
||||||
.getStreams()
|
|
||||||
.stream()
|
|
||||||
.map(StreamEntity::new)
|
|
||||||
.collect(Collectors.toList()),
|
|
||||||
dialog -> dialog.show(fragmentManager, TAG)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//endregion
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*//////////////////////////////////////////////////////////////////////////
|
/*//////////////////////////////////////////////////////////////////////////
|
||||||
// Mute / Unmute
|
// Mute / Unmute
|
||||||
//////////////////////////////////////////////////////////////////////////*/
|
//////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
|
@ -71,16 +71,17 @@ public final class PlayerService extends Service {
|
||||||
Log.d(TAG, "onStartCommand() called with: intent = [" + intent
|
Log.d(TAG, "onStartCommand() called with: intent = [" + intent
|
||||||
+ "], flags = [" + flags + "], startId = [" + startId + "]");
|
+ "], flags = [" + flags + "], startId = [" + startId + "]");
|
||||||
}
|
}
|
||||||
if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())
|
|
||||||
&& player.getPlayQueue() == null) {
|
if (!Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())
|
||||||
// Player is not working, no need to process media button's action
|
|| player.getPlayQueue() != null) {
|
||||||
return START_NOT_STICKY;
|
// ^ no need to process media button's action if player is not working
|
||||||
}
|
|
||||||
|
|
||||||
player.handleIntent(intent);
|
player.handleIntent(intent);
|
||||||
if (player.getMediaSessionManager() != null) {
|
if (player.getMediaSessionManager() != null) {
|
||||||
player.getMediaSessionManager().handleMediaButtonIntent(intent);
|
player.getMediaSessionManager().handleMediaButtonIntent(intent);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return START_NOT_STICKY;
|
return START_NOT_STICKY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -92,7 +92,10 @@ abstract class BasePlayerGestureListener(
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
return if (onDownNotDoubleTapping(e)) super.onDown(e) else true
|
if (onDownNotDoubleTapping(e)) {
|
||||||
|
return super.onDown(e)
|
||||||
|
}
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -266,6 +266,7 @@ public final class NotificationUtil {
|
||||||
null);
|
null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// fallthrough
|
||||||
case NotificationConstants.PLAY_PAUSE:
|
case NotificationConstants.PLAY_PAUSE:
|
||||||
if (player.getCurrentState() == Player.STATE_COMPLETED) {
|
if (player.getCurrentState() == Player.STATE_COMPLETED) {
|
||||||
return getAction(R.drawable.ic_replay,
|
return getAction(R.drawable.ic_replay,
|
||||||
|
|
|
@ -51,6 +51,7 @@ import org.schabi.newpipe.fragments.OnScrollBelowItemsListener;
|
||||||
import org.schabi.newpipe.fragments.detail.VideoDetailFragment;
|
import org.schabi.newpipe.fragments.detail.VideoDetailFragment;
|
||||||
import org.schabi.newpipe.info_list.StreamSegmentAdapter;
|
import org.schabi.newpipe.info_list.StreamSegmentAdapter;
|
||||||
import org.schabi.newpipe.ktx.AnimationType;
|
import org.schabi.newpipe.ktx.AnimationType;
|
||||||
|
import org.schabi.newpipe.local.dialog.PlaylistDialog;
|
||||||
import org.schabi.newpipe.player.Player;
|
import org.schabi.newpipe.player.Player;
|
||||||
import org.schabi.newpipe.player.event.PlayerServiceEventListener;
|
import org.schabi.newpipe.player.event.PlayerServiceEventListener;
|
||||||
import org.schabi.newpipe.player.gesture.BasePlayerGestureListener;
|
import org.schabi.newpipe.player.gesture.BasePlayerGestureListener;
|
||||||
|
@ -147,7 +148,8 @@ public final class MainPlayerUi extends VideoPlayerUi implements View.OnLayoutCh
|
||||||
|
|
||||||
binding.addToPlaylistButton.setOnClickListener(v ->
|
binding.addToPlaylistButton.setOnClickListener(v ->
|
||||||
getParentActivity().map(FragmentActivity::getSupportFragmentManager)
|
getParentActivity().map(FragmentActivity::getSupportFragmentManager)
|
||||||
.ifPresent(player::onAddToPlaylistClicked));
|
.ifPresent(fragmentManager ->
|
||||||
|
PlaylistDialog.showForPlayQueue(player, fragmentManager)));
|
||||||
|
|
||||||
settingsContentObserver = new ContentObserver(new Handler()) {
|
settingsContentObserver = new ContentObserver(new Handler()) {
|
||||||
@Override
|
@Override
|
||||||
|
@ -401,6 +403,7 @@ public final class MainPlayerUi extends VideoPlayerUi implements View.OnLayoutCh
|
||||||
//////////////////////////////////////////////////////////////////////////*/
|
//////////////////////////////////////////////////////////////////////////*/
|
||||||
//region Controls showing / hiding
|
//region Controls showing / hiding
|
||||||
|
|
||||||
|
@Override
|
||||||
protected void showOrHideButtons() {
|
protected void showOrHideButtons() {
|
||||||
super.showOrHideButtons();
|
super.showOrHideButtons();
|
||||||
@Nullable final PlayQueue playQueue = player.getPlayQueue();
|
@Nullable final PlayQueue playQueue = player.getPlayQueue();
|
||||||
|
@ -667,12 +670,11 @@ public final class MainPlayerUi extends VideoPlayerUi implements View.OnLayoutCh
|
||||||
}
|
}
|
||||||
|
|
||||||
animate(binding.itemsListPanel, false, DEFAULT_CONTROLS_DURATION,
|
animate(binding.itemsListPanel, false, DEFAULT_CONTROLS_DURATION,
|
||||||
AnimationType.SLIDE_AND_ALPHA, 0, () -> {
|
AnimationType.SLIDE_AND_ALPHA, 0, () ->
|
||||||
// Even when queueLayout is GONE it receives touch events
|
// Even when queueLayout is GONE it receives touch events
|
||||||
// and ruins normal behavior of the app. This line fixes it
|
// and ruins normal behavior of the app. This line fixes it
|
||||||
binding.itemsListPanel.setTranslationY(
|
binding.itemsListPanel.setTranslationY(
|
||||||
-binding.itemsListPanel.getHeight() * 5);
|
-binding.itemsListPanel.getHeight() * 5.0f));
|
||||||
});
|
|
||||||
|
|
||||||
// clear focus, otherwise a white rectangle remains on top of the player
|
// clear focus, otherwise a white rectangle remains on top of the player
|
||||||
binding.itemsListClose.clearFocus();
|
binding.itemsListClose.clearFocus();
|
||||||
|
@ -845,8 +847,7 @@ public final class MainPlayerUi extends VideoPlayerUi implements View.OnLayoutCh
|
||||||
}
|
}
|
||||||
|
|
||||||
PlaybackParameterDialog.newInstance(player.getPlaybackSpeed(), player.getPlaybackPitch(),
|
PlaybackParameterDialog.newInstance(player.getPlaybackSpeed(), player.getPlaybackPitch(),
|
||||||
player.getPlaybackSkipSilence(), (speed, pitch, skipSilence)
|
player.getPlaybackSkipSilence(), player::setPlaybackParameters)
|
||||||
-> player.setPlaybackParameters(speed, pitch, skipSilence))
|
|
||||||
.show(activity.getSupportFragmentManager(), null);
|
.show(activity.getSupportFragmentManager(), null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -31,7 +31,7 @@ public abstract class PlayerUi {
|
||||||
/**
|
/**
|
||||||
* @param player the player instance that will be usable throughout the lifetime of this UI
|
* @param player the player instance that will be usable throughout the lifetime of this UI
|
||||||
*/
|
*/
|
||||||
public PlayerUi(@NonNull final Player player) {
|
protected PlayerUi(@NonNull final Player player) {
|
||||||
this.context = player.getContext();
|
this.context = player.getContext();
|
||||||
this.player = player;
|
this.player = player;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package org.schabi.newpipe.player.ui;
|
package org.schabi.newpipe.player.ui;
|
||||||
|
|
||||||
|
import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
|
||||||
import static org.schabi.newpipe.MainActivity.DEBUG;
|
import static org.schabi.newpipe.MainActivity.DEBUG;
|
||||||
import static org.schabi.newpipe.player.helper.PlayerHelper.buildCloseOverlayLayoutParams;
|
import static org.schabi.newpipe.player.helper.PlayerHelper.buildCloseOverlayLayoutParams;
|
||||||
import static org.schabi.newpipe.player.helper.PlayerHelper.getMinimumVideoHeight;
|
import static org.schabi.newpipe.player.helper.PlayerHelper.getMinimumVideoHeight;
|
||||||
|
@ -140,8 +141,7 @@ public final class PopupPlayerUi extends VideoPlayerUi {
|
||||||
binding.segmentsButton.setVisibility(View.GONE);
|
binding.segmentsButton.setVisibility(View.GONE);
|
||||||
binding.moreOptionsButton.setVisibility(View.GONE);
|
binding.moreOptionsButton.setVisibility(View.GONE);
|
||||||
binding.topControls.setOrientation(LinearLayout.HORIZONTAL);
|
binding.topControls.setOrientation(LinearLayout.HORIZONTAL);
|
||||||
binding.primaryControls.getLayoutParams().width
|
binding.primaryControls.getLayoutParams().width = WRAP_CONTENT;
|
||||||
= LinearLayout.LayoutParams.WRAP_CONTENT;
|
|
||||||
binding.secondaryControls.setAlpha(1.0f);
|
binding.secondaryControls.setAlpha(1.0f);
|
||||||
binding.secondaryControls.setVisibility(View.VISIBLE);
|
binding.secondaryControls.setVisibility(View.VISIBLE);
|
||||||
binding.secondaryControls.setTranslationY(0);
|
binding.secondaryControls.setTranslationY(0);
|
||||||
|
@ -193,14 +193,12 @@ public final class PopupPlayerUi extends VideoPlayerUi {
|
||||||
updateScreenSize();
|
updateScreenSize();
|
||||||
changePopupSize(popupLayoutParams.width);
|
changePopupSize(popupLayoutParams.width);
|
||||||
checkPopupPositionBounds();
|
checkPopupPositionBounds();
|
||||||
} else if (Intent.ACTION_SCREEN_OFF.equals(intent.getAction())) {
|
} else if (player.isPlaying() || player.isLoading()) {
|
||||||
|
if (Intent.ACTION_SCREEN_OFF.equals(intent.getAction())) {
|
||||||
// Use only audio source when screen turns off while popup player is playing
|
// Use only audio source when screen turns off while popup player is playing
|
||||||
if (player.isPlaying() || player.isLoading()) {
|
|
||||||
player.useVideoSource(false);
|
player.useVideoSource(false);
|
||||||
}
|
|
||||||
} else if (Intent.ACTION_SCREEN_ON.equals(intent.getAction())) {
|
} else if (Intent.ACTION_SCREEN_ON.equals(intent.getAction())) {
|
||||||
// Restore video source when screen turns on and user is watching video in popup player
|
// Restore video source when screen turns on and user was watching video in popup
|
||||||
if (player.isPlaying() || player.isLoading()) {
|
|
||||||
player.useVideoSource(true);
|
player.useVideoSource(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,7 +41,6 @@ import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.appcompat.content.res.AppCompatResources;
|
import androidx.appcompat.content.res.AppCompatResources;
|
||||||
import androidx.appcompat.view.ContextThemeWrapper;
|
import androidx.appcompat.view.ContextThemeWrapper;
|
||||||
import androidx.appcompat.widget.AppCompatImageButton;
|
|
||||||
import androidx.appcompat.widget.PopupMenu;
|
import androidx.appcompat.widget.PopupMenu;
|
||||||
import androidx.core.graphics.Insets;
|
import androidx.core.graphics.Insets;
|
||||||
import androidx.core.view.ViewCompat;
|
import androidx.core.view.ViewCompat;
|
||||||
|
@ -142,7 +141,7 @@ public abstract class VideoPlayerUi extends PlayerUi
|
||||||
//////////////////////////////////////////////////////////////////////////*/
|
//////////////////////////////////////////////////////////////////////////*/
|
||||||
//region Constructor, setup, destroy
|
//region Constructor, setup, destroy
|
||||||
|
|
||||||
public VideoPlayerUi(@NonNull final Player player,
|
protected VideoPlayerUi(@NonNull final Player player,
|
||||||
@NonNull final PlayerBinding playerBinding) {
|
@NonNull final PlayerBinding playerBinding) {
|
||||||
super(player);
|
super(player);
|
||||||
binding = playerBinding;
|
binding = playerBinding;
|
||||||
|
@ -912,7 +911,20 @@ public abstract class VideoPlayerUi extends PlayerUi
|
||||||
@Override
|
@Override
|
||||||
public void onRepeatModeChanged(@RepeatMode final int repeatMode) {
|
public void onRepeatModeChanged(@RepeatMode final int repeatMode) {
|
||||||
super.onRepeatModeChanged(repeatMode);
|
super.onRepeatModeChanged(repeatMode);
|
||||||
setRepeatModeButton(binding.repeatButton, repeatMode);
|
|
||||||
|
switch (repeatMode) {
|
||||||
|
case REPEAT_MODE_OFF:
|
||||||
|
binding.repeatButton.setImageResource(R.drawable.exo_controls_repeat_off);
|
||||||
|
break;
|
||||||
|
case REPEAT_MODE_ONE:
|
||||||
|
binding.repeatButton.setImageResource(R.drawable.exo_controls_repeat_one);
|
||||||
|
break;
|
||||||
|
case REPEAT_MODE_ALL:
|
||||||
|
binding.repeatButton.setImageResource(R.drawable.exo_controls_repeat_all);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break; // unreachable
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -927,21 +939,6 @@ public abstract class VideoPlayerUi extends PlayerUi
|
||||||
setMuteButton(isMuted);
|
setMuteButton(isMuted);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setRepeatModeButton(final AppCompatImageButton imageButton,
|
|
||||||
@RepeatMode final int repeatMode) {
|
|
||||||
switch (repeatMode) {
|
|
||||||
case REPEAT_MODE_OFF:
|
|
||||||
imageButton.setImageResource(R.drawable.exo_controls_repeat_off);
|
|
||||||
break;
|
|
||||||
case REPEAT_MODE_ONE:
|
|
||||||
imageButton.setImageResource(R.drawable.exo_controls_repeat_one);
|
|
||||||
break;
|
|
||||||
case REPEAT_MODE_ALL:
|
|
||||||
imageButton.setImageResource(R.drawable.exo_controls_repeat_all);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setMuteButton(final boolean isMuted) {
|
private void setMuteButton(final boolean isMuted) {
|
||||||
binding.switchMute.setImageDrawable(AppCompatResources.getDrawable(context, isMuted
|
binding.switchMute.setImageDrawable(AppCompatResources.getDrawable(context, isMuted
|
||||||
? R.drawable.ic_volume_off : R.drawable.ic_volume_up));
|
? R.drawable.ic_volume_off : R.drawable.ic_volume_up));
|
||||||
|
@ -1037,6 +1034,7 @@ public abstract class VideoPlayerUi extends PlayerUi
|
||||||
|
|
||||||
binding.qualityTextView.setVisibility(View.VISIBLE);
|
binding.qualityTextView.setVisibility(View.VISIBLE);
|
||||||
binding.surfaceView.setVisibility(View.VISIBLE);
|
binding.surfaceView.setVisibility(View.VISIBLE);
|
||||||
|
// fallthrough
|
||||||
default:
|
default:
|
||||||
binding.endScreen.setVisibility(View.GONE);
|
binding.endScreen.setVisibility(View.GONE);
|
||||||
binding.playbackEndTime.setVisibility(View.VISIBLE);
|
binding.playbackEndTime.setVisibility(View.VISIBLE);
|
||||||
|
@ -1426,8 +1424,6 @@ public abstract class VideoPlayerUi extends PlayerUi
|
||||||
|
|
||||||
public boolean onKeyDown(final int keyCode) {
|
public boolean onKeyDown(final int keyCode) {
|
||||||
switch (keyCode) {
|
switch (keyCode) {
|
||||||
default:
|
|
||||||
break;
|
|
||||||
case KeyEvent.KEYCODE_BACK:
|
case KeyEvent.KEYCODE_BACK:
|
||||||
if (DeviceUtils.isTv(context) && isControlsVisible()) {
|
if (DeviceUtils.isTv(context) && isControlsVisible()) {
|
||||||
hideControls(0, 0);
|
hideControls(0, 0);
|
||||||
|
@ -1442,7 +1438,7 @@ public abstract class VideoPlayerUi extends PlayerUi
|
||||||
if ((binding.getRoot().hasFocus() && !binding.playbackControlRoot.hasFocus())
|
if ((binding.getRoot().hasFocus() && !binding.playbackControlRoot.hasFocus())
|
||||||
|| isAnyListViewOpen()) {
|
|| isAnyListViewOpen()) {
|
||||||
// do not interfere with focus in playlist and play queue etc.
|
// do not interfere with focus in playlist and play queue etc.
|
||||||
return false;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (player.getCurrentState() == org.schabi.newpipe.player.Player.STATE_BLOCKED) {
|
if (player.getCurrentState() == org.schabi.newpipe.player.Player.STATE_BLOCKED) {
|
||||||
|
@ -1458,6 +1454,8 @@ public abstract class VideoPlayerUi extends PlayerUi
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
break; // ignore other keys
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
|
Loading…
Reference in a new issue