diff --git a/app/src/main/java/org/jellyfin/androidtv/ui/itemdetail/FullDetailsActivity.kt b/app/src/main/java/org/jellyfin/androidtv/ui/itemdetail/FullDetailsActivity.kt new file mode 100644 index 0000000000..f4a81e0949 --- /dev/null +++ b/app/src/main/java/org/jellyfin/androidtv/ui/itemdetail/FullDetailsActivity.kt @@ -0,0 +1,31 @@ +package org.jellyfin.androidtv.ui.itemdetail + +import android.os.Bundle +import android.view.KeyEvent +import android.view.View +import androidx.fragment.app.add +import androidx.fragment.app.commit +import org.jellyfin.androidtv.R +import org.jellyfin.androidtv.ui.shared.BaseActivity + +class FullDetailsActivity : BaseActivity(R.layout.fragment_content_view) { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + supportFragmentManager.commit { + add(R.id.content_view) + } + } + + // Forward key events to fragments + private fun onKeyEvent(keyCode: Int, event: KeyEvent?): Boolean = supportFragmentManager.fragments + .filter { it.isVisible } + .filterIsInstance() + .any { it.onKey(currentFocus, keyCode, event) } + + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean = + onKeyEvent(keyCode, event) || super.onKeyDown(keyCode, event) + + override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean = + onKeyEvent(keyCode, event) || super.onKeyUp(keyCode, event) +} diff --git a/app/src/main/java/org/jellyfin/androidtv/ui/itemdetail/FullDetailsActivity.java b/app/src/main/java/org/jellyfin/androidtv/ui/itemdetail/FullDetailsFragment.java similarity index 86% rename from app/src/main/java/org/jellyfin/androidtv/ui/itemdetail/FullDetailsActivity.java rename to app/src/main/java/org/jellyfin/androidtv/ui/itemdetail/FullDetailsFragment.java index ad06420ae9..0f45625353 100644 --- a/app/src/main/java/org/jellyfin/androidtv/ui/itemdetail/FullDetailsActivity.java +++ b/app/src/main/java/org/jellyfin/androidtv/ui/itemdetail/FullDetailsFragment.java @@ -13,12 +13,17 @@ import android.util.DisplayMetrics; import android.view.Gravity; import android.view.KeyEvent; +import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; +import android.view.ViewGroup; import android.widget.PopupMenu; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.core.view.ViewKt; +import androidx.fragment.app.Fragment; import androidx.leanback.app.RowsSupportFragment; import androidx.leanback.widget.ArrayObjectAdapter; import androidx.leanback.widget.ClassPresenterSelector; @@ -112,7 +117,7 @@ import kotlin.Lazy; import timber.log.Timber; -public class FullDetailsActivity extends BaseActivity implements RecordingIndicatorView { +public class FullDetailsFragment extends Fragment implements RecordingIndicatorView, View.OnKeyListener { private int BUTTON_SIZE; @@ -140,7 +145,6 @@ public class FullDetailsActivity extends BaseActivity implements RecordingIndica private MyDetailsOverviewRow mDetailsOverviewRow; private CustomListRowPresenter mListRowPresenter; - private FullDetailsActivity mActivity; private Handler mLoopHandler = new Handler(); private Runnable mClockLoop; @@ -159,46 +163,37 @@ public class FullDetailsActivity extends BaseActivity implements RecordingIndica private Lazy mediaManager = inject(MediaManager.class); private Lazy markdownRenderer = inject(MarkdownRenderer.class); + @Nullable @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + ActivityFullDetailsBinding binding = ActivityFullDetailsBinding.inflate(getLayoutInflater(), container, false); - // Prevent activity from crashing after recovering from a crash - if (KoinJavaComponent.get(UserRepository.class).getCurrentUser().getValue() == null) { - finish(); - return; - } - - ActivityFullDetailsBinding binding = ActivityFullDetailsBinding.inflate(getLayoutInflater()); - setContentView(binding.getRoot()); - - BUTTON_SIZE = Utils.convertDpToPixel(this, 40); - mActivity = this; - backgroundService.getValue().attach(this); + BUTTON_SIZE = Utils.convertDpToPixel(requireContext(), 40); + backgroundService.getValue().attach(requireActivity()); mMetrics = new DisplayMetrics(); - getWindowManager().getDefaultDisplay().getMetrics(mMetrics); + requireActivity().getWindowManager().getDefaultDisplay().getMetrics(mMetrics); mRowsFragment = new RowsSupportFragment(); - getSupportFragmentManager().beginTransaction().add(R.id.rowsFragment, mRowsFragment).commit(); + requireActivity().getSupportFragmentManager().beginTransaction().add(R.id.rowsFragment, mRowsFragment).commit(); mRowsFragment.setOnItemViewClickedListener(new ItemViewClickedListener()); mRowsFragment.setOnItemViewSelectedListener(new ItemViewSelectedListener()); mDorPresenter = new MyDetailsOverviewRowPresenter(markdownRenderer.getValue()); - mItemId = getIntent().getStringExtra("ItemId"); - mChannelId = getIntent().getStringExtra("ChannelId"); - String programJson = getIntent().getStringExtra("ProgramInfo"); + mItemId = requireActivity().getIntent().getStringExtra("ItemId"); + mChannelId = requireActivity().getIntent().getStringExtra("ChannelId"); + String programJson = requireActivity().getIntent().getStringExtra("ProgramInfo"); if (programJson != null) { mProgramInfo = serializer.getValue().DeserializeFromString(programJson, BaseItemDto.class); } - String timerJson = getIntent().getStringExtra("SeriesTimer"); + String timerJson = requireActivity().getIntent().getStringExtra("SeriesTimer"); if (timerJson != null) { mSeriesTimerInfo = serializer.getValue().DeserializeFromString(timerJson, SeriesTimerInfoDto.class); } - registerMessageListener(new MessageListener() { + ((BaseActivity)requireActivity()).registerMessageListener(new MessageListener() { @Override public void onMessageReceived(CustomMessage message) { if (message == CustomMessage.ActionComplete && mSeriesTimerInfo != null && mBaseItem.getBaseItemType() == BaseItemType.SeriesTimer) { @@ -207,7 +202,7 @@ public void onMessageReceived(CustomMessage message) { @Override public void onResponse(SeriesTimerInfoDto response) { mSeriesTimerInfo = response; - mBaseItem.setOverview(BaseItemUtils.getSeriesOverview(mSeriesTimerInfo, mActivity)); + mBaseItem.setOverview(BaseItemUtils.getSeriesOverview(mSeriesTimerInfo, requireContext())); mDorPresenter.getSummaryView().setText(mBaseItem.getOverview()); } }); @@ -229,6 +224,7 @@ public void run() { loadItem(mItemId); + return binding.getRoot(); } private int getResumePreroll() { @@ -241,7 +237,7 @@ private int getResumePreroll() { } @Override - protected void onResume() { + public void onResume() { super.onResume(); ClockBehavior clockBehavior = userPreferences.getValue().get(UserPreferences.Companion.getClockBehavior()); @@ -269,7 +265,7 @@ public void run() { apiClient.getValue().GetItemAsync(mBaseItem.getId(), KoinJavaComponent.get(UserRepository.class).getCurrentUser().getValue().getId().toString(), new Response() { @Override public void onResponse(BaseItemDto response) { - if (!isFinishing()) { + if (!requireActivity().isFinishing()) { mBaseItem = response; if (mResumeButton != null) { boolean resumeVisible = (ModelCompat.asSdk(mBaseItem).getType() == BaseItemKind.SERIES && !mBaseItem.getUserData().getPlayed()) || response.getCanResume(); @@ -298,21 +294,23 @@ public void onResponse(BaseItemDto response) { } @Override - protected void onPause() { + public void onPause() { super.onPause(); stopClock(); } @Override - protected void onStop() { + public void onStop() { super.onStop(); stopClock(); } @Override - public boolean onKeyUp(int keyCode, KeyEvent event) { + public boolean onKey(View v, int keyCode, KeyEvent event) { + if (event.getAction() != KeyEvent.ACTION_UP) return false; + if (mCurrentItem != null) { - return KeyProcessor.HandleKey(keyCode, mCurrentItem, this) || super.onKeyUp(keyCode, event); + return KeyProcessor.HandleKey(keyCode, mCurrentItem, requireActivity()); } else if ((keyCode == KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE || keyCode == KeyEvent.KEYCODE_MEDIA_PLAY) && BaseItemExtensionsKt.canPlay(ModelCompat.asSdk(mBaseItem))) { //default play action Long pos = mBaseItem.getUserData().getPlaybackPositionTicks() / 10000; @@ -320,7 +318,7 @@ public boolean onKeyUp(int keyCode, KeyEvent event) { return true; } - return super.onKeyUp(keyCode, event); + return false; } private void startClock() { @@ -361,7 +359,7 @@ private void stopClock() { private static List buttonTypeList = Arrays.asList(buttonTypes); private void updateWatched() { - if (mWatchedToggleButton != null && mBaseItem != null && mBaseItem.getUserData() != null && !isFinishing()) { + if (mWatchedToggleButton != null && mBaseItem != null && mBaseItem.getUserData() != null && !requireActivity().isFinishing()) { mWatchedToggleButton.setActivated(mBaseItem.getUserData().getPlayed()); } } @@ -369,7 +367,7 @@ private void updateWatched() { private void loadItem(String id) { if (mChannelId != null && mProgramInfo == null) { // if we are displaying a live tv channel - we want to get whatever is showing now on that channel - final FullDetailsActivity us = this; + final FullDetailsFragment us = this; apiClient.getValue().GetLiveTvChannelAsync(mChannelId, KoinJavaComponent.get(UserRepository.class).getCurrentUser().getValue().getId().toString(), new Response() { @Override public void onResponse(ChannelInfoDto response) { @@ -391,7 +389,7 @@ public void onResponse(BaseItemDto response) { item.setSeriesTimerId(mSeriesTimerInfo.getId()); item.setBaseItemType(BaseItemType.SeriesTimer); item.setName(mSeriesTimerInfo.getName()); - item.setOverview(BaseItemUtils.getSeriesOverview(mSeriesTimerInfo, this)); + item.setOverview(BaseItemUtils.getSeriesOverview(mSeriesTimerInfo, requireContext())); setBaseItem(item); } else { @@ -431,9 +429,9 @@ protected MyDetailsOverviewRow doInBackground(BaseItemDto... params) { // Figure image size Double aspect = ImageUtils.getImageAspectRatio(ModelCompat.asSdk(item), false); - posterHeight = aspect > 1 ? Utils.convertDpToPixel(mActivity, 160) : Utils.convertDpToPixel(mActivity, ModelCompat.asSdk(item).getType() == BaseItemKind.PERSON || ModelCompat.asSdk(item).getType() == BaseItemKind.MUSIC_ARTIST ? 300 : 200); + posterHeight = aspect > 1 ? Utils.convertDpToPixel(requireContext(), 160) : Utils.convertDpToPixel(requireContext(), ModelCompat.asSdk(item).getType() == BaseItemKind.PERSON || ModelCompat.asSdk(item).getType() == BaseItemKind.MUSIC_ARTIST ? 300 : 200); posterWidth = (int)((aspect) * posterHeight); - if (posterHeight < 10) posterWidth = Utils.convertDpToPixel(mActivity, 150); //Guard against zero size images causing picasso to barf + if (posterHeight < 10) posterWidth = Utils.convertDpToPixel(requireContext(), 150); //Guard against zero size images causing picasso to barf mDetailsOverviewRow = new MyDetailsOverviewRow(ModelCompat.asSdk(item)); @@ -489,11 +487,11 @@ protected MyDetailsOverviewRow doInBackground(BaseItemDto... params) { protected void onPostExecute(MyDetailsOverviewRow detailsOverviewRow) { super.onPostExecute(detailsOverviewRow); - if (isFinishing()) return; + if (requireActivity().isFinishing()) return; ClassPresenterSelector ps = new ClassPresenterSelector(); ps.addClassPresenter(MyDetailsOverviewRow.class, mDorPresenter); - mListRowPresenter = new CustomListRowPresenter(Utils.convertDpToPixel(mActivity, 10)); + mListRowPresenter = new CustomListRowPresenter(Utils.convertDpToPixel(requireContext(), 10)); ps.addClassPresenter(ListRow.class, mListRowPresenter); mRowsAdapter = new MutableObjectAdapter(ps); mRowsFragment.setAdapter(mRowsAdapter); @@ -534,30 +532,30 @@ protected void addAdditionalRows(MutableObjectAdapter adapter) { //Additional Parts if (mBaseItem.getPartCount() != null && mBaseItem.getPartCount() > 0) { - ItemRowAdapter additionalPartsAdapter = new ItemRowAdapter(this, new AdditionalPartsQuery(mBaseItem.getId()), new CardPresenter(), adapter); + ItemRowAdapter additionalPartsAdapter = new ItemRowAdapter(requireContext(), new AdditionalPartsQuery(mBaseItem.getId()), new CardPresenter(), adapter); addItemRow(adapter, additionalPartsAdapter, 0, getString(R.string.lbl_additional_parts)); } //Cast/Crew if (mBaseItem.getPeople() != null && mBaseItem.getPeople().length > 0) { - ItemRowAdapter castAdapter = new ItemRowAdapter(this, ModelCompat.asSdk(mBaseItem.getPeople()), new CardPresenter(true, 260), adapter); + ItemRowAdapter castAdapter = new ItemRowAdapter(requireContext(), ModelCompat.asSdk(mBaseItem.getPeople()), new CardPresenter(true, 260), adapter); addItemRow(adapter, castAdapter, 1, getString(R.string.lbl_cast_crew)); } //Specials if (mBaseItem.getSpecialFeatureCount() != null && mBaseItem.getSpecialFeatureCount() > 0) { - addItemRow(adapter, new ItemRowAdapter(this, new SpecialsQuery(mBaseItem.getId()), new CardPresenter(), adapter), 3, getString(R.string.lbl_specials)); + addItemRow(adapter, new ItemRowAdapter(requireContext(), new SpecialsQuery(mBaseItem.getId()), new CardPresenter(), adapter), 3, getString(R.string.lbl_specials)); } //Trailers if (mBaseItem.getLocalTrailerCount() != null && mBaseItem.getLocalTrailerCount() > 1) { - addItemRow(adapter, new ItemRowAdapter(this, new TrailersQuery(mBaseItem.getId()), new CardPresenter(), adapter), 4, getString(R.string.lbl_trailers)); + addItemRow(adapter, new ItemRowAdapter(requireContext(), new TrailersQuery(mBaseItem.getId()), new CardPresenter(), adapter), 4, getString(R.string.lbl_trailers)); } //Chapters if (mBaseItem.getChapters() != null && mBaseItem.getChapters().size() > 0) { List chapters = BaseItemExtensionsKt.buildChapterItems(ModelCompat.asSdk(mBaseItem), api.getValue()); - ItemRowAdapter chapterAdapter = new ItemRowAdapter(this, chapters, new CardPresenter(true, 240), adapter); + ItemRowAdapter chapterAdapter = new ItemRowAdapter(requireContext(), chapters, new CardPresenter(true, 240), adapter); addItemRow(adapter, chapterAdapter, 2, getString(R.string.lbl_chapters)); } @@ -571,7 +569,7 @@ protected void addAdditionalRows(MutableObjectAdapter adapter) { similar.setId(mBaseItem.getId()); similar.setLimit(10); - ItemRowAdapter similarMoviesAdapter = new ItemRowAdapter(this, similar, QueryType.SimilarMovies, new CardPresenter(), adapter); + ItemRowAdapter similarMoviesAdapter = new ItemRowAdapter(requireContext(), similar, QueryType.SimilarMovies, new CardPresenter(), adapter); addItemRow(adapter, similarMoviesAdapter, 5, getString(R.string.lbl_more_like_this)); addInfoRows(adapter); @@ -580,7 +578,7 @@ protected void addAdditionalRows(MutableObjectAdapter adapter) { //Cast/Crew if (mBaseItem.getPeople() != null && mBaseItem.getPeople().length > 0) { - ItemRowAdapter castAdapter = new ItemRowAdapter(this, ModelCompat.asSdk(mBaseItem.getPeople()), new CardPresenter(true, 260), adapter); + ItemRowAdapter castAdapter = new ItemRowAdapter(requireContext(), ModelCompat.asSdk(mBaseItem.getPeople()), new CardPresenter(true, 260), adapter); addItemRow(adapter, castAdapter, 0, getString(R.string.lbl_cast_crew)); } @@ -594,7 +592,7 @@ protected void addAdditionalRows(MutableObjectAdapter adapter) { similarTrailer.setId(mBaseItem.getId()); similarTrailer.setLimit(10); - ItemRowAdapter similarTrailerAdapter = new ItemRowAdapter(this, similarTrailer, QueryType.SimilarMovies, new CardPresenter(), adapter); + ItemRowAdapter similarTrailerAdapter = new ItemRowAdapter(requireContext(), similarTrailer, QueryType.SimilarMovies, new CardPresenter(), adapter); addItemRow(adapter, similarTrailerAdapter, 4, getString(R.string.lbl_more_like_this)); addInfoRows(adapter); break; @@ -610,7 +608,7 @@ protected void addAdditionalRows(MutableObjectAdapter adapter) { personMovies.setRecursive(true); personMovies.setIncludeItemTypes(new String[] {"Movie"}); personMovies.setSortBy(new String[] {ItemSortBy.SortName}); - ItemRowAdapter personMoviesAdapter = new ItemRowAdapter(this, personMovies, 100, false, new CardPresenter(), adapter); + ItemRowAdapter personMoviesAdapter = new ItemRowAdapter(requireContext(), personMovies, 100, false, new CardPresenter(), adapter); addItemRow(adapter, personMoviesAdapter, 0, getString(R.string.lbl_movies)); ItemQuery personSeries = new ItemQuery(); @@ -624,7 +622,7 @@ protected void addAdditionalRows(MutableObjectAdapter adapter) { personSeries.setRecursive(true); personSeries.setIncludeItemTypes(new String[] {"Series"}); personSeries.setSortBy(new String[] {ItemSortBy.SortName}); - ItemRowAdapter personSeriesAdapter = new ItemRowAdapter(this, personSeries, 100, false, new CardPresenter(), adapter); + ItemRowAdapter personSeriesAdapter = new ItemRowAdapter(requireContext(), personSeries, 100, false, new CardPresenter(), adapter); addItemRow(adapter, personSeriesAdapter, 1, getString(R.string.lbl_tv_series)); ItemQuery personEpisodes = new ItemQuery(); @@ -638,7 +636,7 @@ protected void addAdditionalRows(MutableObjectAdapter adapter) { personEpisodes.setRecursive(true); personEpisodes.setIncludeItemTypes(new String[] {"Episode"}); personEpisodes.setSortBy(new String[] {ItemSortBy.SeriesSortName, ItemSortBy.SortName}); - ItemRowAdapter personEpisodesAdapter = new ItemRowAdapter(this, personEpisodes, 100, false, new CardPresenter(), adapter); + ItemRowAdapter personEpisodesAdapter = new ItemRowAdapter(requireContext(), personEpisodes, 100, false, new CardPresenter(), adapter); addItemRow(adapter, personEpisodesAdapter, 2, getString(R.string.lbl_episodes)); break; @@ -653,7 +651,7 @@ protected void addAdditionalRows(MutableObjectAdapter adapter) { artistAlbums.setArtistIds(new String[]{mBaseItem.getId()}); artistAlbums.setRecursive(true); artistAlbums.setIncludeItemTypes(new String[]{"MusicAlbum"}); - ItemRowAdapter artistAlbumsAdapter = new ItemRowAdapter(this, artistAlbums, 100, false, new CardPresenter(), adapter); + ItemRowAdapter artistAlbumsAdapter = new ItemRowAdapter(requireContext(), artistAlbums, 100, false, new CardPresenter(), adapter); addItemRow(adapter, artistAlbumsAdapter, 0, getString(R.string.lbl_albums)); break; @@ -665,7 +663,7 @@ protected void addAdditionalRows(MutableObjectAdapter adapter) { ItemFields.PrimaryImageAspectRatio, ItemFields.ChildCount }); - ItemRowAdapter nextUpAdapter = new ItemRowAdapter(this, nextUpQuery, false, new CardPresenter(true, 260), adapter); + ItemRowAdapter nextUpAdapter = new ItemRowAdapter(requireContext(), nextUpQuery, false, new CardPresenter(true, 260), adapter); addItemRow(adapter, nextUpAdapter, 0, getString(R.string.lbl_next_up)); SeasonQuery seasons = new SeasonQuery(); @@ -676,7 +674,7 @@ protected void addAdditionalRows(MutableObjectAdapter adapter) { ItemFields.DisplayPreferencesId, ItemFields.ChildCount }); - ItemRowAdapter seasonsAdapter = new ItemRowAdapter(this, seasons, new CardPresenter(), adapter); + ItemRowAdapter seasonsAdapter = new ItemRowAdapter(requireContext(), seasons, new CardPresenter(), adapter); addItemRow(adapter, seasonsAdapter, 1, getString(R.string.lbl_seasons)); UpcomingEpisodesQuery upcoming = new UpcomingEpisodesQuery(); @@ -686,11 +684,11 @@ protected void addAdditionalRows(MutableObjectAdapter adapter) { ItemFields.PrimaryImageAspectRatio, ItemFields.ChildCount }); - ItemRowAdapter upcomingAdapter = new ItemRowAdapter(this, upcoming, new CardPresenter(), adapter); + ItemRowAdapter upcomingAdapter = new ItemRowAdapter(requireContext(), upcoming, new CardPresenter(), adapter); addItemRow(adapter, upcomingAdapter, 2, getString(R.string.lbl_upcoming)); if (mBaseItem.getPeople() != null && mBaseItem.getPeople().length > 0) { - ItemRowAdapter seriesCastAdapter = new ItemRowAdapter(this, ModelCompat.asSdk(mBaseItem.getPeople()), new CardPresenter(true, 260), adapter); + ItemRowAdapter seriesCastAdapter = new ItemRowAdapter(requireContext(), ModelCompat.asSdk(mBaseItem.getPeople()), new CardPresenter(true, 260), adapter); addItemRow(adapter, seriesCastAdapter, 3, getString(R.string.lbl_cast_crew)); } @@ -704,7 +702,7 @@ protected void addAdditionalRows(MutableObjectAdapter adapter) { similarSeries.setUserId(KoinJavaComponent.get(UserRepository.class).getCurrentUser().getValue().getId().toString()); similarSeries.setId(mBaseItem.getId()); similarSeries.setLimit(20); - ItemRowAdapter similarAdapter = new ItemRowAdapter(this, similarSeries, QueryType.SimilarSeries, new CardPresenter(), adapter); + ItemRowAdapter similarAdapter = new ItemRowAdapter(requireContext(), similarSeries, QueryType.SimilarSeries, new CardPresenter(), adapter); addItemRow(adapter, similarAdapter, 4, getString(R.string.lbl_more_like_this)); break; @@ -715,7 +713,7 @@ protected void addAdditionalRows(MutableObjectAdapter adapter) { nextEpisodes.setIncludeItemTypes(new String[]{"Episode"}); nextEpisodes.setStartIndex(mBaseItem.getIndexNumber()); // query index is zero-based but episode no is not nextEpisodes.setLimit(20); - ItemRowAdapter nextAdapter = new ItemRowAdapter(this, nextEpisodes, 0 , false, true, new CardPresenter(true, 240), adapter); + ItemRowAdapter nextAdapter = new ItemRowAdapter(requireContext(), nextEpisodes, 0 , false, true, new CardPresenter(true, 240), adapter); addItemRow(adapter, nextAdapter, 5, getString(R.string.lbl_next_episode)); } @@ -726,7 +724,7 @@ protected void addAdditionalRows(MutableObjectAdapter adapter) { if (person.getType() == PersonType.GuestStar) guests.add(person); } if (guests.size() > 0) { - ItemRowAdapter castAdapter = new ItemRowAdapter(this, guests.toArray(new BaseItemPerson[guests.size()]), new CardPresenter(true, 260), adapter); + ItemRowAdapter castAdapter = new ItemRowAdapter(requireContext(), guests.toArray(new BaseItemPerson[guests.size()]), new CardPresenter(true, 260), adapter); addItemRow(adapter, castAdapter, 0, getString(R.string.lbl_guest_stars)); } } @@ -734,7 +732,7 @@ protected void addAdditionalRows(MutableObjectAdapter adapter) { //Chapters if (mBaseItem.getChapters() != null && mBaseItem.getChapters().size() > 0) { List chapters = BaseItemExtensionsKt.buildChapterItems(ModelCompat.asSdk(mBaseItem), api.getValue()); - ItemRowAdapter chapterAdapter = new ItemRowAdapter(this, chapters, new CardPresenter(true, 240), adapter); + ItemRowAdapter chapterAdapter = new ItemRowAdapter(requireContext(), chapters, new CardPresenter(true, 240), adapter); addItemRow(adapter, chapterAdapter, 1, getString(R.string.lbl_chapters)); } @@ -744,7 +742,7 @@ protected void addAdditionalRows(MutableObjectAdapter adapter) { case SeriesTimer: TimerQuery scheduled = new TimerQuery(); scheduled.setSeriesTimerId(mSeriesTimerInfo.getId()); - TvManager.getScheduleRowsAsync(this, scheduled, new CardPresenter(true), adapter, new Response()); + TvManager.getScheduleRowsAsync(requireContext(), scheduled, new CardPresenter(true), adapter, new Response()); break; } @@ -792,13 +790,13 @@ private void updatePlayedDate() { private void playTrailers() { // External trailer if (mBaseItem.getLocalTrailerCount() == null || mBaseItem.getLocalTrailerCount() < 1) { - Intent intent = TrailerUtils.getExternalTrailerIntent(this, ModelCompat.asSdk(mBaseItem)); + Intent intent = TrailerUtils.getExternalTrailerIntent(requireContext(), ModelCompat.asSdk(mBaseItem)); try { startActivity(intent); } catch (ActivityNotFoundException exception) { Timber.w(exception, "Unable to open external trailer"); - Utils.showToast(mActivity, getString(R.string.no_player_message)); + Utils.showToast(requireContext(), getString(R.string.no_player_message)); } return; @@ -814,7 +812,7 @@ public void onResponse(BaseItemDto[] response) { @Override public void onError(Exception exception) { Timber.e(exception, "Error retrieving trailers for playback"); - Utils.showToast(mActivity, R.string.msg_video_playback_error); + Utils.showToast(requireContext(), R.string.msg_video_playback_error); } }); } @@ -832,7 +830,7 @@ private String getEndTime() { if (mBaseItem.getCanResume()) { endTimeTicks = System.currentTimeMillis() + ((runtime - mBaseItem.getUserData().getPlaybackPositionTicks()) / 10000); } - return android.text.format.DateFormat.getTimeFormat(this).format(new Date(endTimeTicks)); + return android.text.format.DateFormat.getTimeFormat(requireContext()).format(new Date(endTimeTicks)); } } @@ -870,9 +868,9 @@ public void onResponse(UserItemDataDto response) { } private void gotoSeries() { - Intent intent = new Intent(mActivity, FullDetailsActivity.class); + Intent intent = new Intent(requireContext(), FullDetailsFragment.class); intent.putExtra("ItemId", mBaseItem.getSeriesId()); - mActivity.startActivity(intent); + requireContext().startActivity(intent); } private TextUnderButton favButton = null; @@ -895,7 +893,7 @@ private void addButtons(int buttonSize) { } buttonLabel = getString(R.string.lbl_resume_from, TimeUtils.formatMillis(startPos)); } - mResumeButton = TextUnderButton.create(this, R.drawable.ic_resume, buttonSize, 2, buttonLabel, new View.OnClickListener() { + mResumeButton = TextUnderButton.create(requireContext(), R.drawable.ic_resume, buttonSize, 2, buttonLabel, new View.OnClickListener() { @Override public void onClick(View v) { if (baseItem.getType() == BaseItemKind.SERIES) { @@ -909,14 +907,14 @@ public void onResponse(ItemsResult response) { if (response.getItems().length > 0) { play(response.getItems()[0], 0 , false); } else { - Utils.showToast(FullDetailsActivity.this, "Unable to find next up episode"); + Utils.showToast(requireContext(), "Unable to find next up episode"); } } @Override public void onError(Exception exception) { Timber.e(exception, "Error playing next up episode"); - Utils.showToast(FullDetailsActivity.this, getString(R.string.msg_video_playback_error)); + Utils.showToast(requireContext(), getString(R.string.msg_video_playback_error)); } }); } else { @@ -930,10 +928,10 @@ public void onError(Exception exception) { //playButton becomes playWith button if (userPreferences.getValue().get(UserPreferences.Companion.getVideoPlayer()) == PreferredVideoPlayer.CHOOSE && (baseItem.getType() == BaseItemKind.SERIES || baseItem.getType() == BaseItemKind.MOVIE || baseItem.getType() == BaseItemKind.VIDEO || baseItem.getType() == BaseItemKind.EPISODE)) { - playButton = TextUnderButton.create(this, R.drawable.ic_play, buttonSize, 3, getString(R.string.play_with), new View.OnClickListener() { + playButton = TextUnderButton.create(requireContext(), R.drawable.ic_play, buttonSize, 3, getString(R.string.play_with), new View.OnClickListener() { @Override public void onClick(View view) { - PopupMenu more = new PopupMenu(mActivity, view); + PopupMenu more = new PopupMenu(requireContext(), view); more.inflate(R.menu.menu_details_play_with); more.setOnMenuItemClickListener(playWithMenuListener); more.show(); @@ -946,7 +944,7 @@ public void onClick(View view) { boolean resumeButtonVisible = (baseItem.getType() == BaseItemKind.SERIES && !mBaseItem.getUserData().getPlayed()) || (mBaseItem.getCanResume()); mResumeButton.setVisibility(resumeButtonVisible ? View.VISIBLE : View.GONE); - playButton = TextUnderButton.create(this, R.drawable.ic_play, buttonSize, 2, getString(BaseItemExtensionsKt.isLiveTv(ModelCompat.asSdk(mBaseItem)) ? R.string.lbl_tune_to_channel : mBaseItem.getIsFolderItem() ? R.string.lbl_play_all : R.string.lbl_play), new View.OnClickListener() { + playButton = TextUnderButton.create(requireContext(), R.drawable.ic_play, buttonSize, 2, getString(BaseItemExtensionsKt.isLiveTv(ModelCompat.asSdk(mBaseItem)) ? R.string.lbl_tune_to_channel : mBaseItem.getIsFolderItem() ? R.string.lbl_play_all : R.string.lbl_play), new View.OnClickListener() { @Override public void onClick(View v) { play(mBaseItem, 0, false); @@ -967,7 +965,7 @@ public void onClick(View v) { || (baseItem.getType() == BaseItemKind.PLAYLIST && MediaType.Audio.equals(mBaseItem.getMediaType())); if (isMusic) { - queueButton = TextUnderButton.create(this, R.drawable.ic_add, buttonSize, 2, getString(R.string.lbl_add_to_queue), new View.OnClickListener() { + queueButton = TextUnderButton.create(requireContext(), R.drawable.ic_add, buttonSize, 2, getString(R.string.lbl_add_to_queue), new View.OnClickListener() { @Override public void onClick(View v) { addItemToQueue(); @@ -977,7 +975,7 @@ public void onClick(View v) { } if (mBaseItem.getIsFolderItem() || baseItem.getType() == BaseItemKind.MUSIC_ARTIST) { - shuffleButton = TextUnderButton.create(this, R.drawable.ic_shuffle, buttonSize, 2, getString(R.string.lbl_shuffle_all), new View.OnClickListener() { + shuffleButton = TextUnderButton.create(requireContext(), R.drawable.ic_shuffle, buttonSize, 2, getString(R.string.lbl_shuffle_all), new View.OnClickListener() { @Override public void onClick(View v) { play(mBaseItem, 0, true); @@ -987,10 +985,10 @@ public void onClick(View v) { } if (baseItem.getType() == BaseItemKind.MUSIC_ARTIST) { - TextUnderButton imix = TextUnderButton.create(this, R.drawable.ic_mix, buttonSize, 0, getString(R.string.lbl_instant_mix), new View.OnClickListener() { + TextUnderButton imix = TextUnderButton.create(requireContext(), R.drawable.ic_mix, buttonSize, 0, getString(R.string.lbl_instant_mix), new View.OnClickListener() { @Override public void onClick(View v) { - PlaybackHelper.playInstantMix(FullDetailsActivity.this, baseItem); + PlaybackHelper.playInstantMix(requireContext(), baseItem); } }); mDetailsOverviewRow.addAction(imix); @@ -1000,7 +998,7 @@ public void onClick(View v) { } //Video versions button if (mBaseItem.getMediaSources() != null && mBaseItem.getMediaSources().size() > 1) { - TextUnderButton versionsButton = TextUnderButton.create(this, R.drawable.ic_guide, buttonSize, 0, getString(R.string.select_version), new View.OnClickListener() { + TextUnderButton versionsButton = TextUnderButton.create(requireContext(), R.drawable.ic_guide, buttonSize, 0, getString(R.string.select_version), new View.OnClickListener() { @Override public void onClick(View v) { if (versions != null ) { @@ -1014,8 +1012,8 @@ public void onClick(View v) { mDetailsOverviewRow.addAction(versionsButton); } - if (TrailerUtils.hasPlayableTrailers(this, ModelCompat.asSdk(mBaseItem))) { - trailerButton = TextUnderButton.create(this, R.drawable.ic_trailer, buttonSize, 0, getString(R.string.lbl_play_trailers), new View.OnClickListener() { + if (TrailerUtils.hasPlayableTrailers(requireContext(), ModelCompat.asSdk(mBaseItem))) { + trailerButton = TextUnderButton.create(requireContext(), R.drawable.ic_trailer, buttonSize, 0, getString(R.string.lbl_play_trailers), new View.OnClickListener() { @Override public void onClick(View v) { playTrailers(); @@ -1028,7 +1026,7 @@ public void onClick(View v) { if (mProgramInfo != null && Utils.canManageRecordings(KoinJavaComponent.get(UserRepository.class).getCurrentUser().getValue())) { if (TimeUtils.convertToLocalDate(mBaseItem.getEndDate()).getTime() > System.currentTimeMillis()) { //Record button - mRecordButton = TextUnderButton.create(this, R.drawable.ic_record, buttonSize, 4, getString(R.string.lbl_record), new View.OnClickListener() { + mRecordButton = TextUnderButton.create(requireContext(), R.drawable.ic_record, buttonSize, 4, getString(R.string.lbl_record), new View.OnClickListener() { @Override public void onClick(View v) { if (mProgramInfo.getTimerId() == null) { @@ -1046,7 +1044,7 @@ public void onResponse(BaseItemDto response) { mProgramInfo = response; setRecSeriesTimer(response.getSeriesTimerId()); setRecTimer(response.getTimerId()); - Utils.showToast(mActivity, R.string.msg_set_to_record); + Utils.showToast(requireContext(), R.string.msg_set_to_record); } }); @@ -1055,7 +1053,7 @@ public void onResponse(BaseItemDto response) { @Override public void onError(Exception ex) { Timber.e(ex, "Error creating recording"); - Utils.showToast(mActivity, R.string.msg_unable_to_create_recording); + Utils.showToast(requireContext(), R.string.msg_unable_to_create_recording); } }); } @@ -1063,7 +1061,7 @@ public void onError(Exception ex) { @Override public void onError(Exception exception) { Timber.e(exception, "Error creating recording"); - Utils.showToast(mActivity, R.string.msg_unable_to_create_recording); + Utils.showToast(requireContext(), R.string.msg_unable_to_create_recording); } }); } else { @@ -1072,12 +1070,12 @@ public void onError(Exception exception) { public void onResponse() { setRecTimer(null); dataRefreshService.getValue().setLastDeletedItemId(mProgramInfo.getId()); - Utils.showToast(mActivity, R.string.msg_recording_cancelled); + Utils.showToast(requireContext(), R.string.msg_recording_cancelled); } @Override public void onError(Exception ex) { - Utils.showToast(mActivity, R.string.msg_unable_to_cancel); + Utils.showToast(requireContext(), R.string.msg_unable_to_cancel); } }); @@ -1090,7 +1088,7 @@ public void onError(Exception ex) { } if (mProgramInfo.getIsSeries() != null && mProgramInfo.getIsSeries()) { - mRecSeriesButton= TextUnderButton.create(this, R.drawable.ic_record_series, buttonSize, 4, getString(R.string.lbl_record_series), new View.OnClickListener() { + mRecSeriesButton= TextUnderButton.create(requireContext(), R.drawable.ic_record_series, buttonSize, 4, getString(R.string.lbl_record_series), new View.OnClickListener() { @Override public void onClick(View v) { if (mProgramInfo.getSeriesTimerId() == null) { @@ -1108,7 +1106,7 @@ public void onResponse(BaseItemDto response) { mProgramInfo = response; setRecSeriesTimer(response.getSeriesTimerId()); setRecTimer(response.getTimerId()); - Utils.showToast(mActivity, R.string.msg_set_to_record); + Utils.showToast(requireContext(), R.string.msg_set_to_record); } }); } @@ -1116,7 +1114,7 @@ public void onResponse(BaseItemDto response) { @Override public void onError(Exception ex) { Timber.e(ex, "Error creating recording"); - Utils.showToast(mActivity, R.string.msg_unable_to_create_recording); + Utils.showToast(requireContext(), R.string.msg_unable_to_create_recording); } }); } @@ -1124,12 +1122,12 @@ public void onError(Exception ex) { @Override public void onError(Exception exception) { Timber.e(exception, "Error creating recording"); - Utils.showToast(mActivity, R.string.msg_unable_to_create_recording); + Utils.showToast(requireContext(), R.string.msg_unable_to_create_recording); } }); } else { - new AlertDialog.Builder(mActivity) + new AlertDialog.Builder(requireContext()) .setTitle(getString(R.string.lbl_cancel_series)) .setMessage(getString(R.string.msg_cancel_entire_series)) .setNegativeButton(R.string.lbl_no, null) @@ -1142,12 +1140,12 @@ public void onResponse() { setRecSeriesTimer(null); setRecTimer(null); dataRefreshService.getValue().setLastDeletedItemId(mProgramInfo.getId()); - Utils.showToast(mActivity, R.string.msg_recording_cancelled); + Utils.showToast(requireContext(), R.string.msg_recording_cancelled); } @Override public void onError(Exception ex) { - Utils.showToast(mActivity, R.string.msg_unable_to_cancel); + Utils.showToast(requireContext(), R.string.msg_unable_to_cancel); } }); } @@ -1160,7 +1158,7 @@ public void onError(Exception ex) { mDetailsOverviewRow.addAction(mRecSeriesButton); - mSeriesSettingsButton = TextUnderButton.create(this, R.drawable.ic_settings, buttonSize, 2, getString(R.string.lbl_series_settings), new View.OnClickListener() { + mSeriesSettingsButton = TextUnderButton.create(requireContext(), R.drawable.ic_settings, buttonSize, 2, getString(R.string.lbl_series_settings), new View.OnClickListener() { @Override public void onClick(View v) { showRecordingOptions(mProgramInfo.getSeriesTimerId(), mProgramInfo, true); @@ -1176,13 +1174,13 @@ public void onClick(View v) { UserItemDataDto userData = mBaseItem.getUserData(); if (userData != null && mProgramInfo == null) { if (ModelCompat.asSdk(mBaseItem).getType() != BaseItemKind.MUSIC_ARTIST && ModelCompat.asSdk(mBaseItem).getType() != BaseItemKind.PERSON) { - mWatchedToggleButton = TextUnderButton.create(this, R.drawable.ic_watch, buttonSize, 0, getString(R.string.lbl_watched), markWatchedListener); + mWatchedToggleButton = TextUnderButton.create(requireContext(), R.drawable.ic_watch, buttonSize, 0, getString(R.string.lbl_watched), markWatchedListener); mWatchedToggleButton.setActivated(userData.getPlayed()); mDetailsOverviewRow.addAction(mWatchedToggleButton); } //Favorite - favButton = TextUnderButton.create(this, R.drawable.ic_heart, buttonSize, 2, getString(R.string.lbl_favorite), new View.OnClickListener() { + favButton = TextUnderButton.create(requireContext(), R.drawable.ic_heart, buttonSize, 2, getString(R.string.lbl_favorite), new View.OnClickListener() { @Override public void onClick(final View v) { toggleFavorite(); @@ -1194,13 +1192,13 @@ public void onClick(final View v) { if (ModelCompat.asSdk(mBaseItem).getType() == BaseItemKind.EPISODE && mBaseItem.getSeriesId() != null) { //add the prev button first so it will be there in proper position - we'll show it later if needed - mPrevButton = TextUnderButton.create(this, R.drawable.ic_previous_episode, buttonSize, 3, getString(R.string.lbl_previous_episode), new View.OnClickListener() { + mPrevButton = TextUnderButton.create(requireContext(), R.drawable.ic_previous_episode, buttonSize, 3, getString(R.string.lbl_previous_episode), new View.OnClickListener() { @Override public void onClick(View v) { if (mPrevItemId != null) { - Intent intent = new Intent(mActivity, FullDetailsActivity.class); + Intent intent = new Intent(requireContext(), FullDetailsFragment.class); intent.putExtra("ItemId", mPrevItemId); - mActivity.startActivity(intent); + requireContext().startActivity(intent); } } }); @@ -1228,7 +1226,7 @@ public void onResponse(ItemsResult response) { } }); - goToSeriesButton = TextUnderButton.create(this, R.drawable.ic_tv, buttonSize, 0, getString(R.string.lbl_goto_series), new View.OnClickListener() { + goToSeriesButton = TextUnderButton.create(requireContext(), R.drawable.ic_tv, buttonSize, 0, getString(R.string.lbl_goto_series), new View.OnClickListener() { @Override public void onClick(View v) { gotoSeries(); @@ -1239,7 +1237,7 @@ public void onClick(View v) { if (mSeriesTimerInfo != null && mBaseItem.getBaseItemType() == BaseItemType.SeriesTimer) { //Settings - mDetailsOverviewRow.addAction(TextUnderButton.create(this, R.drawable.ic_settings, buttonSize, 0, getString(R.string.lbl_series_settings), new View.OnClickListener() { + mDetailsOverviewRow.addAction(TextUnderButton.create(requireContext(), R.drawable.ic_settings, buttonSize, 0, getString(R.string.lbl_series_settings), new View.OnClickListener() { @Override public void onClick(View v) { //show recording options @@ -1248,10 +1246,10 @@ public void onClick(View v) { })); //Delete - TextUnderButton del = TextUnderButton.create(this, R.drawable.ic_trash, buttonSize, 0, getString(R.string.lbl_cancel_series), new View.OnClickListener() { + TextUnderButton del = TextUnderButton.create(requireContext(), R.drawable.ic_trash, buttonSize, 0, getString(R.string.lbl_cancel_series), new View.OnClickListener() { @Override public void onClick(View v) { - new AlertDialog.Builder(FullDetailsActivity.this) + new AlertDialog.Builder(requireContext()) .setTitle(R.string.lbl_delete) .setMessage(getString(R.string.msg_cancel_entire_series)) .setPositiveButton(R.string.lbl_cancel_series, new DialogInterface.OnClickListener() { @@ -1259,14 +1257,14 @@ public void onClick(DialogInterface dialog, int whichButton) { apiClient.getValue().CancelLiveTvSeriesTimerAsync(mSeriesTimerInfo.getId(), new EmptyResponse() { @Override public void onResponse() { - Utils.showToast(FullDetailsActivity.this, mSeriesTimerInfo.getName() + " Canceled"); + Utils.showToast(requireContext(), mSeriesTimerInfo.getName() + " Canceled"); dataRefreshService.getValue().setLastDeletedItemId(mSeriesTimerInfo.getId()); - finish(); + requireActivity().finish(); } @Override public void onError(Exception ex) { - Utils.showToast(FullDetailsActivity.this, ex.getLocalizedMessage()); + Utils.showToast(requireContext(), ex.getLocalizedMessage()); } }); } @@ -1281,11 +1279,11 @@ public void onError(Exception ex) { } //Now, create a more button to show if needed - moreButton = TextUnderButton.create(this, R.drawable.ic_more, buttonSize, 0, getString(R.string.lbl_other_options), new View.OnClickListener() { + moreButton = TextUnderButton.create(requireContext(), R.drawable.ic_more, buttonSize, 0, getString(R.string.lbl_other_options), new View.OnClickListener() { @Override public void onClick(View v) { //show popup - PopupMenu more = new PopupMenu(mActivity, v); + PopupMenu more = new PopupMenu(requireContext(), v); more.inflate(R.menu.menu_details_more); more.setOnMenuItemClickListener(moreMenuListener); @@ -1336,7 +1334,7 @@ public void onClick(View v) { } private void addVersionsMenu(View v) { - PopupMenu menu = new PopupMenu(this, v, Gravity.END); + PopupMenu menu = new PopupMenu(requireContext(), v, Gravity.END); for (int i = 0; i< versions.size(); i++) { MenuItem item = menu.getMenu().add(Menu.NONE, i, Menu.NONE, versions.get(i).getName()); @@ -1438,9 +1436,9 @@ public boolean onMenuItemClick(MenuItem item) { @Override public void onResponse(List response) { if (ModelCompat.asSdk(mBaseItem).getType() == BaseItemKind.MUSIC_ARTIST) { - mediaManager.getValue().playNow(FullDetailsActivity.this, response, false); + mediaManager.getValue().playNow(requireContext(), response, false); } else { - Intent intent = new Intent(FullDetailsActivity.this, ExternalPlayerActivity.class); + Intent intent = new Intent(requireContext(), ExternalPlayerActivity.class); mediaManager.getValue().setCurrentVideoQueue(response); intent.putExtra("Position", 0); startActivity(intent); @@ -1457,16 +1455,16 @@ public void onResponse(List response) { RecordPopup mRecordPopup; public void showRecordingOptions(String id, final BaseItemDto program, final boolean recordSeries) { if (mRecordPopup == null) { - int width = Utils.convertDpToPixel(this, 600); + int width = Utils.convertDpToPixel(requireContext(), 600); Point size = new Point(); - getWindowManager().getDefaultDisplay().getSize(size); - mRecordPopup = new RecordPopup(this, mRowsFragment.getView(), (size.x/2) - (width/2), mRowsFragment.getView().getTop()+40, width); + requireActivity().getWindowManager().getDefaultDisplay().getSize(size); + mRecordPopup = new RecordPopup((BaseActivity) (requireActivity()), mRowsFragment.getView(), (size.x/2) - (width/2), mRowsFragment.getView().getTop()+40, width); } apiClient.getValue().GetLiveTvSeriesTimerAsync(id, new Response() { @Override public void onResponse(SeriesTimerInfoDto response) { if (recordSeries || Utils.isTrue(program.getIsSports())) { - mRecordPopup.setContent(mActivity, program, response, mActivity, recordSeries); + mRecordPopup.setContent(requireContext(), program, response, FullDetailsFragment.this, recordSeries); mRecordPopup.show(); } else { //just record with defaults @@ -1480,12 +1478,12 @@ public void onResponse(BaseItemDto response) { setRecTimer(response.getTimerId()); } }); - Utils.showToast(mActivity, R.string.msg_set_to_record); + Utils.showToast(requireContext(), R.string.msg_set_to_record); } @Override public void onError(Exception ex) { - Utils.showToast(mActivity, R.string.msg_unable_to_create_recording); + Utils.showToast(requireContext(), R.string.msg_unable_to_create_recording); } }); @@ -1502,7 +1500,7 @@ public void onItemClicked(final Presenter.ViewHolder itemViewHolder, Object item RowPresenter.ViewHolder rowViewHolder, Row row) { if (!(item instanceof BaseRowItem)) return; - ItemLauncher.launch((BaseRowItem) item, (ItemRowAdapter) ((ListRow)row).getAdapter(), ((BaseRowItem)item).getIndex(), mActivity); + ItemLauncher.launch((BaseRowItem) item, (ItemRowAdapter) ((ListRow)row).getAdapter(), ((BaseRowItem)item).getIndex(), requireActivity()); } } @@ -1593,13 +1591,13 @@ protected void play(final BaseItemDto item, final int pos, final boolean shuffle @Override public void onResponse(List response) { PlaybackLauncher playbackLauncher = KoinJavaComponent.get(PlaybackLauncher.class); - if (playbackLauncher.interceptPlayRequest(FullDetailsActivity.this, ModelCompat.asSdk(item))) return; + if (playbackLauncher.interceptPlayRequest(requireContext(), ModelCompat.asSdk(item))) return; if (ModelCompat.asSdk(item).getType() == BaseItemKind.MUSIC_ARTIST) { - mediaManager.getValue().playNow(FullDetailsActivity.this, response, shuffle); + mediaManager.getValue().playNow(requireContext(), response, shuffle); } else { Class activity = KoinJavaComponent.get(PlaybackLauncher.class).getPlaybackActivityClass(ModelCompat.asSdk(item).getType()); - Intent intent = new Intent(FullDetailsActivity.this, activity); + Intent intent = new Intent(requireContext(), activity); mediaManager.getValue().setCurrentVideoQueue(response); intent.putExtra("Position", pos); startActivity(intent); @@ -1612,7 +1610,7 @@ public void onResponse(List response) { protected void play(final BaseItemDto[] items, final int pos, final boolean shuffle) { List itemsToPlay = Arrays.asList(items); Class activity = KoinJavaComponent.get(PlaybackLauncher.class).getPlaybackActivityClass(ModelCompat.asSdk(items[0]).getType()); - Intent intent = new Intent(this, activity); + Intent intent = new Intent(requireContext(), activity); if (shuffle) Collections.shuffle(itemsToPlay); mediaManager.getValue().setCurrentVideoQueue(JavaCompat.mapBaseItemCollection(itemsToPlay)); intent.putExtra("Position", pos);