Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class DetailsFragment extends android.support.v17.leanback.app.DetailsFragment {
- private static final String TAG = "DetailsFragment";
- private static final int DETAIL_THUMB_HEIGHT = 274;
- private BaseItemDto mSelectedItem;
- private BaseItemDto parentSeries;
- private BaseItemPerson mSelectedPerson;
- private boolean isPersonDetails = false;
- private boolean isFresh = true;
- private DetailsOverviewRow detailsOverview;
- private ArrayObjectAdapter mAdapter;
- private ClassPresenterSelector mPresenterSelector;
- private FullWidthDetailsOverviewSharedElementHelper helper;
- public static Fragment create(BaseItemDto item) {
- // Don't like this, but we need to handle a BaseItemDto that is a person. It's what we end up with when coming
- // from a search result.
- if ("person".equalsIgnoreCase(item.getType())) {
- BaseItemPerson person = new BaseItemPerson();
- person.setId(item.getId());
- return create(person);
- }
- String json = App.getInstance().getJsonSerializer().SerializeToString(item);
- Bundle args = new Bundle();
- args.putString(NavigationManager.KEY_PARENT_ID, json);
- Fragment fragment = new DetailsFragment();
- fragment.setArguments(args);
- return fragment;
- }
- public static Fragment create(BaseItemPerson item) {
- String json = App.getInstance().getJsonSerializer().SerializeToString(item);
- Bundle args = new Bundle();
- args.putString(NavigationManager.KEY_PARENT_ID, json);
- DetailsFragment fragment = new DetailsFragment();
- fragment.setArguments(args);
- fragment.isPersonDetails = true;
- return fragment;
- }
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- String json = getArguments().getString(NavigationManager.KEY_PARENT_ID);
- if (isPersonDetails) {
- mSelectedPerson = App.getInstance().getJsonSerializer().DeserializeFromString(json, BaseItemPerson.class);
- } else {
- mSelectedItem = App.getInstance().getJsonSerializer().DeserializeFromString(json, BaseItemDto.class);
- getThemeVideo();
- }
- helper = new FullWidthDetailsOverviewSharedElementHelper();
- helper.setSharedElementEnterTransition(getActivity(), "HERO_IMAGE");
- }
- @Override
- public void onResume() {
- super.onResume();
- if (mSelectedItem != null) {
- getFullItem();
- BackgroundManager.getInstance().setBackgroundItem(mSelectedItem);
- } else if (mSelectedPerson != null) {
- getFullItem();
- } else {
- Log.d(TAG, "mSelectedItem and mSelectedPerson are null... Not loading details");
- getActivity().onBackPressed();
- }
- }
- @Override
- public void onStop() {
- super.onStop();
- }
- @Override
- public void onDestroy() {
- if (mSelectedItem != null && "series".equalsIgnoreCase(mSelectedItem.getType())) {
- PlayerManager.getInstance().stopThemePlayback();
- }
- super.onDestroy();
- }
- private void getFullItem() {
- App.getInstance().getApiClient().GetItemAsync(
- mSelectedPerson != null ? mSelectedPerson.getId() : mSelectedItem.getId(),
- App.getInstance().getApiClient().getCurrentUserId(),
- new Response<BaseItemDto>() {
- @Override
- public void onResponse(BaseItemDto item) {
- if (item != null) mSelectedItem = item;
- if (isFresh) {
- setupAdapter();
- setupDetailsOverviewRow();
- setupDetailsOverviewRowPresenter();
- setupSeasonsRow();
- setupAlbumsRow();
- setupPersonMediaRow();
- setupCastAndCrewRow();
- setupExtrasRow();
- setupSimilarMediaRow();
- setupListRowPresenter();
- setOnItemViewClickedListener(new ItemViewClickedListener());
- isFresh = false;
- } else {
- updateDetailsOverviewPrimaryImage(parentSeries != null ? parentSeries : mSelectedItem);
- updateActionAdapter();
- }
- }
- });
- }
- private void setupAdapter() {
- mPresenterSelector = new ClassPresenterSelector();
- mAdapter = new ArrayObjectAdapter(mPresenterSelector);
- setAdapter(mAdapter);
- }
- private void setupDetailsOverviewRow() {
- Log.d(TAG, "doInBackground: " + mSelectedItem.toString());
- detailsOverview = new DetailsOverviewRow(mSelectedItem);
- detailsOverview.setImageDrawable(ContextCompat.getDrawable(getActivity(),
- isPersonDetails ? R.drawable.default_person : R.drawable.default_film));
- if ("episode".equalsIgnoreCase(mSelectedItem.getType()) && parentSeries == null) {
- getSeriesDto();
- } else {
- updateDetailsOverviewPrimaryImage(mSelectedItem);
- }
- updateActionAdapter();
- mAdapter.add(detailsOverview);
- setSelectedPosition(0, true);
- }
- private void setupDetailsOverviewRowPresenter() {
- // Set detail background and style.
- FullWidthDetailsOverviewRowPresenter detailsPresenter =
- new FullWidthDetailsOverviewRowPresenter(new DetailsDescriptionPresenter());
- detailsPresenter.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.colorPrimary90));
- detailsPresenter.setListener(helper);
- detailsPresenter.setOnActionClickedListener(new OnActionClickedListener() {
- @Override
- public void onActionClicked(Action action) {
- switch ((int)action.getId()) {
- case Actions.ACTION_WATCH_TRAILER:
- onPlayTrailer();
- break;
- case Actions.ACTION_RESUME:
- PlayerManager.getInstance().playItem(mSelectedItem, mSelectedItem.getResumePositionTicks());
- break;
- case Actions.ACTION_PLAY:
- if (mSelectedItem.getIsFolder()) {
- PlayerManager.getInstance().playFolder(mSelectedItem, false);
- } else {
- PlayerManager.getInstance().playItem(mSelectedItem);
- }
- break;
- case Actions.ACTION_ACTIONS:
- onActionsClicked();
- break;
- default:
- Toast.makeText(getActivity(), action.toString(), Toast.LENGTH_SHORT).show();
- break;
- }
- }
- });
- mPresenterSelector.addClassPresenter(DetailsOverviewRow.class, detailsPresenter);
- }
- private void setupSeasonsRow() {
- if (!"series".equalsIgnoreCase(mSelectedItem.getType())) {
- return;
- }
- PresenterOptions options = new PresenterOptions();
- options.setEpisodesShowAirDate(true);
- options.setEpisodesShowSeriesName(false);
- options.setPreferredEpisodeImageType(ImageType.Primary);
- if (mSelectedItem.getChildCount() != null && mSelectedItem.getChildCount() == 1) {
- ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(new CardPresenter(options));
- HeaderItem header = new HeaderItem(1, "Episodes");
- mAdapter.add(1, new ListRow(header, listRowAdapter));
- getEpisodes(listRowAdapter);
- } else {
- options.setAspectRatio(0.66666666667f);
- ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(new CardPresenter(options));
- HeaderItem header = new HeaderItem(1, "Seasons");
- mAdapter.add(1, new ListRow(header, listRowAdapter));
- getSeasons(listRowAdapter);
- }
- }
- private void setupAlbumsRow() {
- if (!"musicartist".equalsIgnoreCase(mSelectedItem.getType())) {
- return;
- }
- PresenterOptions options = new PresenterOptions();
- options.setAspectRatio(1f);
- final ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(new CardPresenter(options));
- HeaderItem header = new HeaderItem(0, "Albums");
- mAdapter.add(new ListRow(header, listRowAdapter));
- ItemQuery query = new ItemQuery();
- query.setParentId(mSelectedItem.getId());
- query.setUserId(App.getInstance().getApiClient().getCurrentUserId());
- query.setFields(new ItemFields[] {ItemFields.PrimaryImageAspectRatio});
- query.setSortBy(new String[] {ItemSortBy.ProductionYear});
- query.setSortOrder(SortOrder.Descending);
- App.getInstance().getApiClient().GetItemsAsync(query, new Response<ItemsResult>() {
- @Override
- public void onResponse(ItemsResult result) {
- if (result == null || result.getItems() == null || result.getItems().length == 0) {
- return;
- }
- for (BaseItemDto item : result.getItems()) {
- listRowAdapter.add(item);
- }
- }
- });
- }
- private void setupPersonMediaRow() {
- if (!isPersonDetails) return;
- PresenterOptions options = new PresenterOptions();
- options.setPreferredEpisodeImageType(ImageType.Primary);
- options.setEpisodesShowAirDate(false);
- options.setEpisodesShowSeriesName(true);
- final ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(new CardPresenter(options));
- HeaderItem header = new HeaderItem(2, "Known for");
- mAdapter.add(new ListRow(header, listRowAdapter));
- ItemQuery query = new ItemQuery();
- query.setUserId(App.getInstance().getApiClient().getCurrentUserId());
- query.setPersonIds(new String[]{mSelectedPerson.getId()});
- query.setRecursive(true);
- query.setExcludeItemTypes(new String[]{"Trailer"});
- query.setSortBy(new String[]{ItemSortBy.PremiereDate});
- query.setSortOrder(SortOrder.Descending);
- App.getInstance().getApiClient().GetItemsAsync(query, new Response<ItemsResult>() {
- @Override
- public void onResponse(ItemsResult result) {
- if (result == null || result.getItems() == null) return;
- for (BaseItemDto item : result.getItems()) {
- listRowAdapter.add(item);
- }
- }
- });
- }
- private void setupCastAndCrewRow() {
- if (mSelectedItem.getPeople() == null || mSelectedItem.getPeople().length == 0) {
- return;
- }
- ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(new PeopleCardPresenter());
- HeaderItem header = new HeaderItem(2, "Cast & Crew");
- mAdapter.add(new ListRow(header, listRowAdapter));
- for (BaseItemPerson person : mSelectedItem.getPeople()) {
- // Filter out all the garbage people that Emby wants to show. No one fucking cares who served the food.
- if (PersonType.Actor.equalsIgnoreCase(person.getType())
- || PersonType.Director.equalsIgnoreCase(person.getType())
- || PersonType.GuestStar.equalsIgnoreCase(person.getType())
- || PersonType.Producer.equalsIgnoreCase(person.getType())
- || PersonType.Writer.equalsIgnoreCase(person.getType()))
- listRowAdapter.add(person);
- }
- }
- private void setupExtrasRow() {
- if (mSelectedItem.getSpecialFeatureCount() == null || mSelectedItem.getSpecialFeatureCount() < 1) {
- return;
- }
- final ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(new CardPresenter());
- HeaderItem header = new HeaderItem(3, "Special Features");
- mAdapter.add(new ListRow(header, listRowAdapter));
- App.getInstance().getApiClient().GetSpecialFeaturesAsync(
- App.getInstance().getApiClient().getCurrentUserId(),
- mSelectedItem.getId(),
- new Response<BaseItemDto[]>() {
- @Override
- public void onResponse(BaseItemDto[] items) {
- if (items == null || items.length == 0) return;
- for (BaseItemDto item : items) {
- listRowAdapter.add(item);
- }
- }
- });
- }
- private void setupSimilarMediaRow() {
- if (!mSelectedItem.getSupportsSimilarItems()) {
- return;
- }
- final ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(new CardPresenter());
- HeaderItem header = new HeaderItem(4, "Similar to " + mSelectedItem.getName());
- mAdapter.add(new ListRow(header, listRowAdapter));
- SimilarItemsQuery query = new SimilarItemsQuery();
- query.setId(mSelectedItem.getId());
- query.setUserId(App.getInstance().getApiClient().getCurrentUserId());
- query.setLimit(25);
- query.setFields(new ItemFields[] {ItemFields.PrimaryImageAspectRatio});
- App.getInstance().getApiClient().GetSimilarItems(query, new Response<ItemsResult>() {
- @Override
- public void onResponse(ItemsResult result) {
- if (result == null || result.getItems() == null) return;
- for (BaseItemDto item : result.getItems()) {
- listRowAdapter.add(item);
- }
- }
- });
- }
- private void setupListRowPresenter() {
- mPresenterSelector.addClassPresenter(ListRow.class, new ListRowPresenter());
- }
- private void onPlayTrailer() {
- App.getInstance().getApiClient().GetLocalTrailersAsync(
- App.getInstance().getApiClient().getCurrentUserId(),
- mSelectedItem.getId(),
- new Response<BaseItemDto[]>() {
- @Override
- public void onResponse(BaseItemDto[] items) {
- if (items == null || items.length == 0) {
- return;
- }
- Random rand = new Random();
- rand.setSeed(System.currentTimeMillis());
- PlayerManager.getInstance().playItem(items[rand.nextInt(items.length)]);
- }
- }
- );
- }
- private void onActionsClicked() {
- PopupMenuDialogOptions options = new PopupMenuDialogOptions();
- options.setActionMenu(true);
- options.setPlayMenu(false);
- options.setImageVisible(false);
- NavigationManager.getInstance().showPopupMenuDialog(mSelectedItem, options, new Response<UserItemDataDto>() {
- @Override
- public void onResponse(UserItemDataDto userData) {
- if (userData != null) {
- mSelectedItem.setUserData(userData);
- updateDetailsOverviewPrimaryImage(parentSeries != null ? parentSeries : mSelectedItem);
- updateActionAdapter();
- }
- }
- });
- }
- private void updateDetailsOverviewPrimaryImage(BaseItemDto imageItem) {
- int height = Utils.convertDpToPixel(DETAIL_THUMB_HEIGHT);
- int width = imageItem.getPrimaryImageAspectRatio() != null
- ? Math.round((float)(height * imageItem.getPrimaryImageAspectRatio()))
- : height;
- if (imageItem.getHasPrimaryImage()) {
- String url = Utils.getPrimaryImageUrl(imageItem.getId(), height, null, mSelectedItem);
- Glide.with(getActivity())
- .load(url)
- .centerCrop()
- .error(R.drawable.default_wallpaper)
- .into(new SimpleTarget<GlideDrawable>(width, height) {
- @Override
- public void onResourceReady(GlideDrawable resource,
- GlideAnimation<? super GlideDrawable>
- glideAnimation) {
- Log.d(TAG, "details overview card image url ready: " + resource);
- detailsOverview.setImageDrawable(resource);
- mAdapter.notifyArrayItemRangeChanged(0, mAdapter.size());
- }
- });
- }
- }
- private void updateActionAdapter() {
- int id = 0;
- SparseArrayObjectAdapter actionAdapter = new SparseArrayObjectAdapter();
- if (mSelectedPerson != null && mSelectedItem != null && mSelectedItem.getUserData() != null) {
- actionAdapter.set(id, new Action(Actions.ACTION_ACTIONS, "Actions", ""));
- } else if (mSelectedItem != null) {
- if (mSelectedItem.getCanResume() && mSelectedItem.getResumePositionTicks() > 0) {
- actionAdapter.set(id++, new Action(Actions.ACTION_RESUME, "Resume",
- Utils.msToMinutesString((int) (mSelectedItem.getResumePositionTicks() / 10000))));
- }
- if (!LocationType.Virtual.equals(mSelectedItem.getLocationType())) {
- actionAdapter.set(id++, new Action(Actions.ACTION_PLAY, "Play", ""));
- }
- if (mSelectedItem.getLocalTrailerCount() != null && mSelectedItem.getLocalTrailerCount() > 0) {
- actionAdapter.set(id++, new Action(Actions.ACTION_WATCH_TRAILER, "Trailer", ""));
- }
- actionAdapter.set(id, new Action(Actions.ACTION_ACTIONS, "Actions", ""));
- }
- detailsOverview.setActionsAdapter(actionAdapter);
- }
- private void getSeriesDto() {
- App.getInstance().getApiClient().GetItemAsync(
- mSelectedItem.getSeriesId(),
- App.getInstance().getApiClient().getCurrentUserId(),
- new Response<BaseItemDto>() {
- @Override
- public void onResponse(BaseItemDto series) {
- if (series != null) {
- parentSeries = series;
- }
- updateDetailsOverviewPrimaryImage(parentSeries != null ? parentSeries : mSelectedItem);
- }
- });
- }
- private void getSeasons(final ArrayObjectAdapter listRowAdapter) {
- SeasonQuery query = new SeasonQuery();
- query.setSeriesId(mSelectedItem.getId());
- query.setUserId(App.getInstance().getApiClient().getCurrentUserId());
- query.setFields(new ItemFields[] {ItemFields.PrimaryImageAspectRatio});
- App.getInstance().getApiClient().GetSeasonsAsync(query, new Response<ItemsResult>() {
- @Override
- public void onResponse(final ItemsResult response) {
- if (response == null || response.getItems() == null) {
- return;
- }
- for (BaseItemDto item : response.getItems()) {
- listRowAdapter.add(item);
- }
- }
- });
- }
- private void getEpisodes(final ArrayObjectAdapter listRowAdapter) {
- EpisodeQuery query = new EpisodeQuery();
- query.setUserId(App.getInstance().getApiClient().getCurrentUserId());
- query.setSeriesId(mSelectedItem.getId());
- query.setFields(new ItemFields[] { ItemFields.PrimaryImageAspectRatio });
- App.getInstance().getApiClient().GetEpisodesAsync(query, new Response<ItemsResult>() {
- @Override
- public void onResponse(final ItemsResult response) {
- if (response == null || response.getItems() == null) {
- return;
- }
- for (BaseItemDto item : response.getItems()) {
- listRowAdapter.add(item);
- }
- }
- });
- }
- private void getThemeVideo() {
- if (!"series".equalsIgnoreCase(mSelectedItem.getType())) {
- return;
- }
- App.getInstance().getApiClient().GetThemeVideosAsync(
- App.getInstance().getApiClient().getCurrentUserId(),
- mSelectedItem.getId(),
- false,
- new Response<ThemeMediaResult>() {
- @Override
- public void onResponse(ThemeMediaResult result) {
- if (result.getItems() != null && result.getItems().length > 0) {
- PlayerManager.getInstance().playThemeVideo(result.getItems()[0]);
- }
- }
- }
- );
- }
- private final class ItemViewClickedListener implements OnItemViewClickedListener {
- @Override
- public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
- RowPresenter.ViewHolder rowViewHolder, Row row) {
- if (item instanceof BaseItemPerson) {
- NavigationManager.getInstance().navigate((BaseItemPerson)item);
- } else if (item instanceof BaseItemDto) {
- if ("video".equalsIgnoreCase(((BaseItemDto) item).getType())) {
- PlayerManager.getInstance().playItem((BaseItemDto)item);
- } else {
- NavigationManager.getInstance().navigate((BaseItemDto) item);
- }
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement