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:
David Fairbrother
2023-03-05 02:37:55 +00:00
committed by Niels van Velzen
parent f81d27e085
commit 8767227b08
14 changed files with 187 additions and 138 deletions

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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();
}
}

View File

@@ -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();
}
}

View File

@@ -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) {

View File

@@ -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,

View File

@@ -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()
}
}

View File

@@ -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) }

View File

@@ -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())
}
}

View File

@@ -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()
}
}

View File

@@ -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

View File

@@ -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)

View File

@@ -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
)
}
}

View File

@@ -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()
}
}