Switch static dispatch onClick to use Polymorphism
Previously the glue class performed static dispatch using a switch case, despite the interface having the vars for almost every case. Switching to relying on Polymorphism allows us to drop the static dispatch and let each action encapsulate how they want to handle the fragment and/or player. At a later date this will make testing each action significantly easier too, as we can simply inject mocks or fakes per action, rather than for the CustomPlaybackTransportControlGlue class.
This commit is contained in:
committed by
Niels van Velzen
parent
f81d27e085
commit
8767227b08
@@ -26,12 +26,12 @@ import androidx.leanback.widget.RowPresenter;
|
||||
import org.jellyfin.androidtv.R;
|
||||
import org.jellyfin.androidtv.preference.UserPreferences;
|
||||
import org.jellyfin.androidtv.preference.constant.ClockBehavior;
|
||||
import org.jellyfin.androidtv.ui.livetv.TvManager;
|
||||
import org.jellyfin.androidtv.ui.playback.PlaybackController;
|
||||
import org.jellyfin.androidtv.ui.playback.PlaybackManager;
|
||||
import org.jellyfin.androidtv.ui.playback.overlay.action.ChannelBarChannelAction;
|
||||
import org.jellyfin.androidtv.ui.playback.overlay.action.ChapterAction;
|
||||
import org.jellyfin.androidtv.ui.playback.overlay.action.ClosedCaptionsAction;
|
||||
import org.jellyfin.androidtv.ui.playback.overlay.action.CustomAction;
|
||||
import org.jellyfin.androidtv.ui.playback.overlay.action.GuideAction;
|
||||
import org.jellyfin.androidtv.ui.playback.overlay.action.PlaybackSpeedAction;
|
||||
import org.jellyfin.androidtv.ui.playback.overlay.action.PreviousLiveTvChannelAction;
|
||||
@@ -226,53 +226,54 @@ public class CustomPlaybackTransportControlGlue extends PlaybackTransportControl
|
||||
|
||||
// Primary Items
|
||||
primaryActionsAdapter.add(playPauseAction);
|
||||
VideoPlayerAdapter playerAdapter = getPlayerAdapter();
|
||||
|
||||
if (canSeek()) {
|
||||
if (playerAdapter.canSeek()) {
|
||||
primaryActionsAdapter.add(rewindAction);
|
||||
primaryActionsAdapter.add(fastForwardAction);
|
||||
}
|
||||
|
||||
if (hasSubs()) {
|
||||
if (playerAdapter.hasSubs()) {
|
||||
primaryActionsAdapter.add(closedCaptionsAction);
|
||||
}
|
||||
|
||||
if (hasMultiAudio()) {
|
||||
if (playerAdapter.hasMultiAudio()) {
|
||||
primaryActionsAdapter.add(selectAudioAction);
|
||||
}
|
||||
|
||||
if (isLiveTv()) {
|
||||
if (playerAdapter.isLiveTv()) {
|
||||
primaryActionsAdapter.add(channelBarChannelAction);
|
||||
primaryActionsAdapter.add(guideAction);
|
||||
}
|
||||
|
||||
// Secondary Items
|
||||
if (isLiveTv()) {
|
||||
if (playerAdapter.isLiveTv()) {
|
||||
secondaryActionsAdapter.add(previousLiveTvChannelAction);
|
||||
if (canRecordLiveTv()) {
|
||||
if (playerAdapter.canRecordLiveTv()) {
|
||||
secondaryActionsAdapter.add(recordAction);
|
||||
recordingStateChanged();
|
||||
}
|
||||
}
|
||||
|
||||
if (hasPreviousItem()) {
|
||||
if (playerAdapter.hasPreviousItem()) {
|
||||
secondaryActionsAdapter.add(skipPreviousAction);
|
||||
}
|
||||
|
||||
if (hasNextItem()) {
|
||||
if (playerAdapter.hasNextItem()) {
|
||||
secondaryActionsAdapter.add(skipNextAction);
|
||||
}
|
||||
|
||||
if (hasChapters()) {
|
||||
if (playerAdapter.hasChapters()) {
|
||||
secondaryActionsAdapter.add(chapterAction);
|
||||
}
|
||||
|
||||
if (!isLiveTv()) {
|
||||
if (!playerAdapter.isLiveTv()) {
|
||||
secondaryActionsAdapter.add(playbackSpeedAction);
|
||||
secondaryActionsAdapter.add(selectQualityAction);
|
||||
}
|
||||
|
||||
|
||||
if (!isNativeMode()) {
|
||||
if (!playerAdapter.isNativeMode()) {
|
||||
secondaryActionsAdapter.add(settingAction);
|
||||
} else {
|
||||
secondaryActionsAdapter.add(zoomAction);
|
||||
@@ -303,43 +304,15 @@ public class CustomPlaybackTransportControlGlue extends PlaybackTransportControl
|
||||
|
||||
public void onCustomActionClicked(Action action, View view) {
|
||||
// Handle custom action clicks which require a popup menu
|
||||
if (action == selectAudioAction) {
|
||||
getPlayerAdapter().getLeanbackOverlayFragment().setFading(false);
|
||||
selectAudioAction.handleClickAction(playbackController, getPlayerAdapter().getLeanbackOverlayFragment(), getContext(), view);
|
||||
} else if (action == closedCaptionsAction) {
|
||||
getPlayerAdapter().getLeanbackOverlayFragment().setFading(false);
|
||||
closedCaptionsAction.handleClickAction(playbackController, getPlayerAdapter().getLeanbackOverlayFragment(), getContext(), view);
|
||||
} else if (action == settingAction) {
|
||||
getPlayerAdapter().getLeanbackOverlayFragment().setFading(false);
|
||||
settingAction.setSubtitlesPresent(hasSubs());
|
||||
settingAction.handleClickAction(playbackController, getPlayerAdapter().getLeanbackOverlayFragment(), getContext(), view);
|
||||
} else if (action == playbackSpeedAction) {
|
||||
getPlayerAdapter().getLeanbackOverlayFragment().setFading(false);
|
||||
playbackSpeedAction.handleClickAction(playbackController, getPlayerAdapter().getLeanbackOverlayFragment(), getContext(), view);
|
||||
if (action instanceof CustomAction){
|
||||
((CustomAction) action).handleClickAction(playbackController, getPlayerAdapter(), getPlayerAdapter().getLeanbackOverlayFragment(), getContext(), view);
|
||||
}
|
||||
|
||||
if (action == playbackSpeedAction) {
|
||||
// Post a callback to calculate the new time, since Exoplayer updates this in an async fashion.
|
||||
// This is a hack, we should instead have onPlaybackParametersChanged call out to this
|
||||
// class to notify rather than poll. But communication is unidirectional at the moment:
|
||||
mHandler.postDelayed(mRefreshEndTime, 5000); // 5 seconds
|
||||
} else if (action == selectQualityAction) {
|
||||
getPlayerAdapter().getLeanbackOverlayFragment().setFading(false);
|
||||
selectQualityAction.handleClickAction(playbackController, getPlayerAdapter().getLeanbackOverlayFragment(), getContext(), view);
|
||||
} else if (action == zoomAction) {
|
||||
getPlayerAdapter().getLeanbackOverlayFragment().setFading(false);
|
||||
zoomAction.handleClickAction(playbackController, getPlayerAdapter().getLeanbackOverlayFragment(), getContext(), view);
|
||||
} else if (action == chapterAction) {
|
||||
getPlayerAdapter().getLeanbackOverlayFragment().hideOverlay();
|
||||
getPlayerAdapter().getMasterOverlayFragment().showChapterSelector();
|
||||
} else if (action == previousLiveTvChannelAction) {
|
||||
getPlayerAdapter().getMasterOverlayFragment().switchChannel(TvManager.getPrevLiveTvChannel());
|
||||
} else if (action == channelBarChannelAction) {
|
||||
getPlayerAdapter().getLeanbackOverlayFragment().hideOverlay();
|
||||
getPlayerAdapter().getMasterOverlayFragment().showQuickChannelChanger();
|
||||
} else if (action == guideAction) {
|
||||
getPlayerAdapter().getLeanbackOverlayFragment().hideOverlay();
|
||||
getPlayerAdapter().getMasterOverlayFragment().showGuide();
|
||||
} else if (action == recordAction) {
|
||||
getPlayerAdapter().toggleRecording();
|
||||
// Icon will be updated via callback recordingStateChanged
|
||||
}
|
||||
}
|
||||
|
||||
@@ -371,42 +344,6 @@ public class CustomPlaybackTransportControlGlue extends PlaybackTransportControl
|
||||
notifyActionChanged(playPauseAction);
|
||||
}
|
||||
|
||||
private boolean hasSubs() {
|
||||
return getPlayerAdapter().hasSubs();
|
||||
}
|
||||
|
||||
private boolean hasMultiAudio() {
|
||||
return getPlayerAdapter().hasMultiAudio();
|
||||
}
|
||||
|
||||
private boolean hasNextItem() {
|
||||
return getPlayerAdapter().hasNextItem();
|
||||
}
|
||||
|
||||
private boolean hasPreviousItem() {
|
||||
return getPlayerAdapter().hasPreviousItem();
|
||||
}
|
||||
|
||||
private boolean isNativeMode() {
|
||||
return getPlayerAdapter().isNativeMode();
|
||||
}
|
||||
|
||||
private boolean canSeek() {
|
||||
return getPlayerAdapter().canSeek();
|
||||
}
|
||||
|
||||
private boolean isLiveTv() {
|
||||
return getPlayerAdapter().isLiveTv();
|
||||
}
|
||||
|
||||
private boolean canRecordLiveTv() {
|
||||
return getPlayerAdapter().canRecordLiveTv();
|
||||
}
|
||||
|
||||
private boolean hasChapters() {
|
||||
return getPlayerAdapter().hasChapters();
|
||||
}
|
||||
|
||||
void invalidatePlaybackControls() {
|
||||
if (primaryActionsAdapter.size() > 0)
|
||||
primaryActionsAdapter.clear();
|
||||
@@ -446,11 +383,18 @@ public class CustomPlaybackTransportControlGlue extends PlaybackTransportControl
|
||||
|
||||
@Override
|
||||
public boolean onKey(View v, int keyCode, KeyEvent event) {
|
||||
if (hasSubs() && event.getAction() == KeyEvent.ACTION_UP && keyCode == KoinJavaComponent.<UserPreferences>get(UserPreferences.class).get(UserPreferences.Companion.getShortcutSubtitleTrack())) {
|
||||
closedCaptionsAction.handleClickAction(playbackController, getPlayerAdapter().getLeanbackOverlayFragment(), getContext(), v);
|
||||
if (event.getAction() != KeyEvent.ACTION_UP){
|
||||
// The below actions are only handled on key up
|
||||
return super.onKey(v, keyCode, event);
|
||||
}
|
||||
if (hasMultiAudio() && event.getAction() == KeyEvent.ACTION_UP && keyCode == KoinJavaComponent.<UserPreferences>get(UserPreferences.class).get(UserPreferences.Companion.getShortcutAudioTrack())) {
|
||||
selectAudioAction.handleClickAction(playbackController, getPlayerAdapter().getLeanbackOverlayFragment(), getContext(), v);
|
||||
|
||||
VideoPlayerAdapter playerAdapter = getPlayerAdapter();
|
||||
|
||||
if (playerAdapter.hasSubs() && keyCode == KoinJavaComponent.<UserPreferences>get(UserPreferences.class).get(UserPreferences.Companion.getShortcutSubtitleTrack())) {
|
||||
closedCaptionsAction.handleClickAction(playbackController, getPlayerAdapter(), getPlayerAdapter().getLeanbackOverlayFragment(), getContext(), v);
|
||||
}
|
||||
if (playerAdapter.hasMultiAudio() && keyCode == KoinJavaComponent.<UserPreferences>get(UserPreferences.class).get(UserPreferences.Companion.getShortcutAudioTrack())) {
|
||||
selectAudioAction.handleClickAction(playbackController, getPlayerAdapter(), getPlayerAdapter().getLeanbackOverlayFragment(), getContext(), v);
|
||||
}
|
||||
return super.onKey(v, keyCode, event);
|
||||
}
|
||||
|
||||
@@ -98,11 +98,11 @@ public class VideoPlayerAdapter extends PlayerAdapter {
|
||||
getCallback().onDurationChanged(this);
|
||||
}
|
||||
|
||||
boolean hasSubs() {
|
||||
public boolean hasSubs() {
|
||||
return StreamHelper.getSubtitleStreams(playbackController.getCurrentMediaSource()).size() > 0;
|
||||
}
|
||||
|
||||
boolean hasMultiAudio() {
|
||||
public boolean hasMultiAudio() {
|
||||
return StreamHelper.getAudioStreams(playbackController.getCurrentMediaSource()).size() > 1;
|
||||
}
|
||||
|
||||
@@ -130,7 +130,7 @@ public class VideoPlayerAdapter extends PlayerAdapter {
|
||||
this.customPlaybackOverlayFragment = customPlaybackOverlayFragment;
|
||||
}
|
||||
|
||||
CustomPlaybackOverlayFragment getMasterOverlayFragment() {
|
||||
public CustomPlaybackOverlayFragment getMasterOverlayFragment() {
|
||||
return customPlaybackOverlayFragment;
|
||||
}
|
||||
|
||||
@@ -150,7 +150,7 @@ public class VideoPlayerAdapter extends PlayerAdapter {
|
||||
&& Utils.canManageRecordings(KoinJavaComponent.<UserRepository>get(UserRepository.class).getCurrentUser().getValue());
|
||||
}
|
||||
|
||||
void toggleRecording() {
|
||||
public void toggleRecording() {
|
||||
org.jellyfin.sdk.model.api.BaseItemDto currentlyPlayingItem = getCurrentlyPlayingItem();
|
||||
getMasterOverlayFragment().toggleRecording(currentlyPlayingItem);
|
||||
}
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
package org.jellyfin.androidtv.ui.playback.overlay.action
|
||||
|
||||
import android.content.Context
|
||||
import android.view.View
|
||||
import org.jellyfin.androidtv.R
|
||||
import org.jellyfin.androidtv.ui.playback.PlaybackController
|
||||
import org.jellyfin.androidtv.ui.playback.overlay.CustomPlaybackTransportControlGlue
|
||||
import org.jellyfin.androidtv.ui.playback.overlay.LeanbackOverlayFragment
|
||||
import org.jellyfin.androidtv.ui.playback.overlay.VideoPlayerAdapter
|
||||
|
||||
class ChannelBarChannelAction(
|
||||
context: Context,
|
||||
@@ -11,4 +15,16 @@ class ChannelBarChannelAction(
|
||||
init {
|
||||
initializeWithIcon(R.drawable.ic_channel_bar)
|
||||
}
|
||||
|
||||
@Override
|
||||
override fun handleClickAction(
|
||||
playbackController: PlaybackController,
|
||||
videoPlayerAdapter: VideoPlayerAdapter,
|
||||
leanbackOverlayFragment: LeanbackOverlayFragment,
|
||||
context: Context,
|
||||
view: View
|
||||
) {
|
||||
leanbackOverlayFragment.hideOverlay()
|
||||
videoPlayerAdapter.masterOverlayFragment.showQuickChannelChanger();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
package org.jellyfin.androidtv.ui.playback.overlay.action
|
||||
|
||||
import android.content.Context
|
||||
import android.view.View
|
||||
import org.jellyfin.androidtv.R
|
||||
import org.jellyfin.androidtv.ui.playback.PlaybackController
|
||||
import org.jellyfin.androidtv.ui.playback.overlay.CustomPlaybackTransportControlGlue
|
||||
import org.jellyfin.androidtv.ui.playback.overlay.LeanbackOverlayFragment
|
||||
import org.jellyfin.androidtv.ui.playback.overlay.VideoPlayerAdapter
|
||||
|
||||
class ChapterAction(
|
||||
context: Context,
|
||||
@@ -11,4 +15,16 @@ class ChapterAction(
|
||||
init {
|
||||
initializeWithIcon(R.drawable.ic_select_chapter)
|
||||
}
|
||||
|
||||
@Override
|
||||
override fun handleClickAction(
|
||||
playbackController: PlaybackController,
|
||||
videoPlayerAdapter: VideoPlayerAdapter,
|
||||
leanbackOverlayFragment: LeanbackOverlayFragment,
|
||||
context: Context,
|
||||
view: View
|
||||
) {
|
||||
leanbackOverlayFragment.hideOverlay()
|
||||
videoPlayerAdapter.masterOverlayFragment.showChapterSelector();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@ import org.jellyfin.androidtv.R
|
||||
import org.jellyfin.androidtv.ui.playback.PlaybackController
|
||||
import org.jellyfin.androidtv.ui.playback.overlay.CustomPlaybackTransportControlGlue
|
||||
import org.jellyfin.androidtv.ui.playback.overlay.LeanbackOverlayFragment
|
||||
import org.jellyfin.androidtv.ui.playback.overlay.VideoPlayerAdapter
|
||||
import timber.log.Timber
|
||||
|
||||
class ClosedCaptionsAction(
|
||||
@@ -21,9 +22,10 @@ class ClosedCaptionsAction(
|
||||
|
||||
override fun handleClickAction(
|
||||
playbackController: PlaybackController,
|
||||
videoPlayerAdapter: VideoPlayerAdapter,
|
||||
leanbackOverlayFragment: LeanbackOverlayFragment,
|
||||
context: Context,
|
||||
view: View,
|
||||
view: View
|
||||
) {
|
||||
if (playbackController.currentStreamInfo == null) {
|
||||
Timber.w("StreamInfo null trying to obtain subtitles")
|
||||
@@ -31,6 +33,7 @@ class ClosedCaptionsAction(
|
||||
return
|
||||
}
|
||||
|
||||
leanbackOverlayFragment.setFading(false)
|
||||
PopupMenu(context, view, Gravity.END).apply {
|
||||
with(menu) {
|
||||
for (sub in playbackController.subtitleStreams) {
|
||||
|
||||
@@ -8,6 +8,7 @@ import androidx.leanback.widget.PlaybackControlsRow
|
||||
import org.jellyfin.androidtv.ui.playback.PlaybackController
|
||||
import org.jellyfin.androidtv.ui.playback.overlay.CustomPlaybackTransportControlGlue
|
||||
import org.jellyfin.androidtv.ui.playback.overlay.LeanbackOverlayFragment
|
||||
import org.jellyfin.androidtv.ui.playback.overlay.VideoPlayerAdapter
|
||||
|
||||
abstract class CustomAction(
|
||||
private val context: Context,
|
||||
@@ -25,6 +26,7 @@ abstract class CustomAction(
|
||||
|
||||
open fun handleClickAction(
|
||||
playbackController: PlaybackController,
|
||||
videoPlayerAdapter: VideoPlayerAdapter,
|
||||
leanbackOverlayFragment: LeanbackOverlayFragment,
|
||||
context: Context,
|
||||
view: View,
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
package org.jellyfin.androidtv.ui.playback.overlay.action
|
||||
|
||||
import android.content.Context
|
||||
import android.view.View
|
||||
import org.jellyfin.androidtv.R
|
||||
import org.jellyfin.androidtv.ui.playback.PlaybackController
|
||||
import org.jellyfin.androidtv.ui.playback.overlay.CustomPlaybackTransportControlGlue
|
||||
import org.jellyfin.androidtv.ui.playback.overlay.LeanbackOverlayFragment
|
||||
import org.jellyfin.androidtv.ui.playback.overlay.VideoPlayerAdapter
|
||||
|
||||
class GuideAction(
|
||||
context: Context,
|
||||
@@ -11,4 +15,16 @@ class GuideAction(
|
||||
init {
|
||||
initializeWithIcon(R.drawable.ic_guide)
|
||||
}
|
||||
|
||||
@Override
|
||||
override fun handleClickAction(
|
||||
playbackController: PlaybackController,
|
||||
videoPlayerAdapter: VideoPlayerAdapter,
|
||||
leanbackOverlayFragment: LeanbackOverlayFragment,
|
||||
context: Context,
|
||||
view: View
|
||||
) {
|
||||
leanbackOverlayFragment.hideOverlay()
|
||||
videoPlayerAdapter.masterOverlayFragment.showGuide()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@ import org.jellyfin.androidtv.ui.playback.PlaybackController
|
||||
import org.jellyfin.androidtv.ui.playback.VideoSpeedController
|
||||
import org.jellyfin.androidtv.ui.playback.overlay.CustomPlaybackTransportControlGlue
|
||||
import org.jellyfin.androidtv.ui.playback.overlay.LeanbackOverlayFragment
|
||||
import org.jellyfin.androidtv.ui.playback.overlay.VideoPlayerAdapter
|
||||
import java.util.Locale
|
||||
|
||||
class PlaybackSpeedAction(
|
||||
@@ -25,10 +26,12 @@ class PlaybackSpeedAction(
|
||||
|
||||
override fun handleClickAction(
|
||||
playbackController: PlaybackController,
|
||||
videoPlayerAdapter: VideoPlayerAdapter,
|
||||
leanbackOverlayFragment: LeanbackOverlayFragment,
|
||||
context: Context,
|
||||
view: View,
|
||||
) {
|
||||
leanbackOverlayFragment.setFading(false)
|
||||
val speedMenu = populateMenu(context, view, speedController)
|
||||
|
||||
speedMenu.setOnDismissListener { leanbackOverlayFragment.setFading(true) }
|
||||
|
||||
@@ -1,8 +1,13 @@
|
||||
package org.jellyfin.androidtv.ui.playback.overlay.action
|
||||
|
||||
import android.content.Context
|
||||
import android.view.View
|
||||
import org.jellyfin.androidtv.R
|
||||
import org.jellyfin.androidtv.ui.livetv.TvManager
|
||||
import org.jellyfin.androidtv.ui.playback.PlaybackController
|
||||
import org.jellyfin.androidtv.ui.playback.overlay.CustomPlaybackTransportControlGlue
|
||||
import org.jellyfin.androidtv.ui.playback.overlay.LeanbackOverlayFragment
|
||||
import org.jellyfin.androidtv.ui.playback.overlay.VideoPlayerAdapter as VideoPlayerAdapter
|
||||
|
||||
class PreviousLiveTvChannelAction(
|
||||
context: Context,
|
||||
@@ -11,4 +16,15 @@ class PreviousLiveTvChannelAction(
|
||||
init {
|
||||
initializeWithIcon(R.drawable.ic_previous_episode)
|
||||
}
|
||||
|
||||
@Override
|
||||
override fun handleClickAction(
|
||||
playbackController: PlaybackController,
|
||||
videoPlayerAdapter: VideoPlayerAdapter,
|
||||
leanbackOverlayFragment: LeanbackOverlayFragment,
|
||||
context: Context,
|
||||
view: View
|
||||
) {
|
||||
videoPlayerAdapter.masterOverlayFragment.switchChannel(TvManager.getPrevLiveTvChannel())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,13 @@
|
||||
package org.jellyfin.androidtv.ui.playback.overlay.action
|
||||
|
||||
import android.content.Context
|
||||
import android.view.View
|
||||
import androidx.core.content.ContextCompat
|
||||
import org.jellyfin.androidtv.R
|
||||
import org.jellyfin.androidtv.ui.playback.PlaybackController
|
||||
import org.jellyfin.androidtv.ui.playback.overlay.CustomPlaybackTransportControlGlue
|
||||
import org.jellyfin.androidtv.ui.playback.overlay.LeanbackOverlayFragment
|
||||
import org.jellyfin.androidtv.ui.playback.overlay.VideoPlayerAdapter
|
||||
|
||||
class RecordAction(
|
||||
context: Context,
|
||||
@@ -20,4 +24,15 @@ class RecordAction(
|
||||
|
||||
setDrawables(arrayOf(recordInactive, recordActive))
|
||||
}
|
||||
|
||||
@Override
|
||||
override fun handleClickAction(
|
||||
playbackController: PlaybackController,
|
||||
videoPlayerAdapter: VideoPlayerAdapter,
|
||||
leanbackOverlayFragment: LeanbackOverlayFragment,
|
||||
context: Context,
|
||||
view: View
|
||||
) {
|
||||
videoPlayerAdapter.toggleRecording()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@ import org.jellyfin.androidtv.ui.playback.PlaybackController
|
||||
import org.jellyfin.androidtv.ui.playback.PlaybackManager
|
||||
import org.jellyfin.androidtv.ui.playback.overlay.CustomPlaybackTransportControlGlue
|
||||
import org.jellyfin.androidtv.ui.playback.overlay.LeanbackOverlayFragment
|
||||
import org.jellyfin.androidtv.ui.playback.overlay.VideoPlayerAdapter
|
||||
|
||||
class SelectAudioAction(
|
||||
context: Context,
|
||||
@@ -21,10 +22,12 @@ class SelectAudioAction(
|
||||
|
||||
override fun handleClickAction(
|
||||
playbackController: PlaybackController,
|
||||
videoPlayerAdapter: VideoPlayerAdapter,
|
||||
leanbackOverlayFragment: LeanbackOverlayFragment,
|
||||
context: Context,
|
||||
view: View,
|
||||
view: View
|
||||
) {
|
||||
leanbackOverlayFragment.setFading(false)
|
||||
val audioTracks = playbackManager.getInPlaybackSelectableAudioStreams(playbackController.currentStreamInfo)
|
||||
?: return
|
||||
val currentAudioIndex = playbackController.audioStreamIndex
|
||||
|
||||
@@ -11,6 +11,7 @@ import org.jellyfin.androidtv.ui.playback.PlaybackController
|
||||
import org.jellyfin.androidtv.ui.playback.VideoQualityController
|
||||
import org.jellyfin.androidtv.ui.playback.overlay.CustomPlaybackTransportControlGlue
|
||||
import org.jellyfin.androidtv.ui.playback.overlay.LeanbackOverlayFragment
|
||||
import org.jellyfin.androidtv.ui.playback.overlay.VideoPlayerAdapter
|
||||
|
||||
class SelectQualityAction(
|
||||
context: Context,
|
||||
@@ -27,9 +28,12 @@ class SelectQualityAction(
|
||||
|
||||
override fun handleClickAction(
|
||||
playbackController: PlaybackController,
|
||||
videoPlayerAdapter: VideoPlayerAdapter,
|
||||
leanbackOverlayFragment: LeanbackOverlayFragment,
|
||||
context: Context, view: View
|
||||
context: Context,
|
||||
view: View
|
||||
) {
|
||||
leanbackOverlayFragment.setFading(false)
|
||||
PopupMenu(context, view, Gravity.END).apply {
|
||||
qualityProfiles.values.forEachIndexed { i, selected ->
|
||||
menu.add(0, i, i, selected)
|
||||
|
||||
@@ -7,6 +7,7 @@ import org.jellyfin.androidtv.ui.SettingsPopup
|
||||
import org.jellyfin.androidtv.ui.playback.PlaybackController
|
||||
import org.jellyfin.androidtv.ui.playback.overlay.CustomPlaybackTransportControlGlue
|
||||
import org.jellyfin.androidtv.ui.playback.overlay.LeanbackOverlayFragment
|
||||
import org.jellyfin.androidtv.ui.playback.overlay.VideoPlayerAdapter
|
||||
|
||||
class SettingAction(
|
||||
context: Context,
|
||||
@@ -20,17 +21,22 @@ class SettingAction(
|
||||
|
||||
override fun handleClickAction(
|
||||
playbackController: PlaybackController,
|
||||
videoPlayerAdapter: VideoPlayerAdapter,
|
||||
leanbackOverlayFragment: LeanbackOverlayFragment,
|
||||
context: Context,
|
||||
view: View
|
||||
) = SettingsPopup(context, view,
|
||||
{ value -> playbackController.audioDelay = value },
|
||||
{ value -> playbackController.subtitleDelay = value }
|
||||
).apply {
|
||||
popupWindow.setOnDismissListener { leanbackOverlayFragment.setFading(true) }
|
||||
}.show(
|
||||
subtitlesPresent,
|
||||
playbackController.audioDelay,
|
||||
playbackController.subtitleDelay
|
||||
)
|
||||
) {
|
||||
subtitlesPresent = videoPlayerAdapter.hasSubs()
|
||||
leanbackOverlayFragment.setFading(false)
|
||||
return SettingsPopup(context, view,
|
||||
{ value -> playbackController.audioDelay = value },
|
||||
{ value -> playbackController.subtitleDelay = value }
|
||||
).apply {
|
||||
popupWindow.setOnDismissListener { leanbackOverlayFragment.setFading(true) }
|
||||
}.show(
|
||||
subtitlesPresent,
|
||||
playbackController.audioDelay,
|
||||
playbackController.subtitleDelay
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@ import org.jellyfin.androidtv.ui.playback.PlaybackController
|
||||
import org.jellyfin.androidtv.ui.playback.VideoManager
|
||||
import org.jellyfin.androidtv.ui.playback.overlay.CustomPlaybackTransportControlGlue
|
||||
import org.jellyfin.androidtv.ui.playback.overlay.LeanbackOverlayFragment
|
||||
import org.jellyfin.androidtv.ui.playback.overlay.VideoPlayerAdapter
|
||||
|
||||
class ZoomAction(
|
||||
context: Context,
|
||||
@@ -20,45 +21,49 @@ class ZoomAction(
|
||||
|
||||
override fun handleClickAction(
|
||||
playbackController: PlaybackController,
|
||||
videoPlayerAdapter: VideoPlayerAdapter,
|
||||
leanbackOverlayFragment: LeanbackOverlayFragment,
|
||||
context: Context,
|
||||
view: View,
|
||||
) = PopupMenu(context, view, Gravity.END).apply {
|
||||
with(menu) {
|
||||
add(
|
||||
0,
|
||||
VideoManager.ZOOM_AUTO_CROP,
|
||||
VideoManager.ZOOM_AUTO_CROP,
|
||||
context.getString(R.string.lbl_auto_crop)
|
||||
).apply {
|
||||
isChecked = playbackController.zoomMode == VideoManager.ZOOM_AUTO_CROP
|
||||
view: View
|
||||
) {
|
||||
leanbackOverlayFragment.setFading(false)
|
||||
return PopupMenu(context, view, Gravity.END).apply {
|
||||
with(menu) {
|
||||
add(
|
||||
0,
|
||||
VideoManager.ZOOM_AUTO_CROP,
|
||||
VideoManager.ZOOM_AUTO_CROP,
|
||||
context.getString(R.string.lbl_auto_crop)
|
||||
).apply {
|
||||
isChecked = playbackController.zoomMode == VideoManager.ZOOM_AUTO_CROP
|
||||
}
|
||||
|
||||
add(
|
||||
0,
|
||||
VideoManager.ZOOM_FIT,
|
||||
VideoManager.ZOOM_FIT,
|
||||
context.getString(R.string.lbl_fit)
|
||||
).apply {
|
||||
isChecked = playbackController.zoomMode == VideoManager.ZOOM_FIT
|
||||
}
|
||||
|
||||
add(
|
||||
0,
|
||||
VideoManager.ZOOM_STRETCH,
|
||||
VideoManager.ZOOM_STRETCH,
|
||||
context.getString(R.string.lbl_stretch)
|
||||
).apply {
|
||||
isChecked = playbackController.zoomMode == VideoManager.ZOOM_STRETCH
|
||||
}
|
||||
|
||||
setGroupCheckable(0, true, false)
|
||||
}
|
||||
|
||||
add(
|
||||
0,
|
||||
VideoManager.ZOOM_FIT,
|
||||
VideoManager.ZOOM_FIT,
|
||||
context.getString(R.string.lbl_fit)
|
||||
).apply {
|
||||
isChecked = playbackController.zoomMode == VideoManager.ZOOM_FIT
|
||||
setOnDismissListener { leanbackOverlayFragment.setFading(true) }
|
||||
setOnMenuItemClickListener { item ->
|
||||
playbackController.setZoom(item.itemId)
|
||||
true
|
||||
}
|
||||
|
||||
add(
|
||||
0,
|
||||
VideoManager.ZOOM_STRETCH,
|
||||
VideoManager.ZOOM_STRETCH,
|
||||
context.getString(R.string.lbl_stretch)
|
||||
).apply {
|
||||
isChecked = playbackController.zoomMode == VideoManager.ZOOM_STRETCH
|
||||
}
|
||||
|
||||
setGroupCheckable(0, true, false)
|
||||
}
|
||||
|
||||
setOnDismissListener { leanbackOverlayFragment.setFading(true) }
|
||||
setOnMenuItemClickListener { item ->
|
||||
playbackController.setZoom(item.itemId)
|
||||
true
|
||||
}
|
||||
}.show()
|
||||
}.show()
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user