Guest User

Untitled

a guest
Sep 17th, 2016
270
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. public class DetailsFragment extends android.support.v17.leanback.app.DetailsFragment {
  2.  
  3.     private static final String TAG = "DetailsFragment";
  4.     private static final int DETAIL_THUMB_HEIGHT = 274;
  5.  
  6.     private BaseItemDto mSelectedItem;
  7.     private BaseItemDto parentSeries;
  8.     private BaseItemPerson mSelectedPerson;
  9.  
  10.     private boolean isPersonDetails = false;
  11.     private boolean isFresh = true;
  12.  
  13.     private DetailsOverviewRow detailsOverview;
  14.     private ArrayObjectAdapter mAdapter;
  15.     private ClassPresenterSelector mPresenterSelector;
  16.     private FullWidthDetailsOverviewSharedElementHelper helper;
  17.  
  18.     public static Fragment create(BaseItemDto item) {
  19.         // Don't like this, but we need to handle a BaseItemDto that is a person. It's what we end up with when coming
  20.         // from a search result.
  21.         if ("person".equalsIgnoreCase(item.getType())) {
  22.             BaseItemPerson person = new BaseItemPerson();
  23.             person.setId(item.getId());
  24.             return create(person);
  25.         }
  26.         String json = App.getInstance().getJsonSerializer().SerializeToString(item);
  27.         Bundle args = new Bundle();
  28.         args.putString(NavigationManager.KEY_PARENT_ID, json);
  29.         Fragment fragment = new DetailsFragment();
  30.         fragment.setArguments(args);
  31.         return fragment;
  32.     }
  33.  
  34.     public static Fragment create(BaseItemPerson item) {
  35.         String json = App.getInstance().getJsonSerializer().SerializeToString(item);
  36.         Bundle args = new Bundle();
  37.         args.putString(NavigationManager.KEY_PARENT_ID, json);
  38.         DetailsFragment fragment = new DetailsFragment();
  39.         fragment.setArguments(args);
  40.         fragment.isPersonDetails = true;
  41.         return fragment;
  42.     }
  43.  
  44.     @Override
  45.     public void onCreate(Bundle savedInstanceState) {
  46.         super.onCreate(savedInstanceState);
  47.  
  48.         String json = getArguments().getString(NavigationManager.KEY_PARENT_ID);
  49.         if (isPersonDetails) {
  50.             mSelectedPerson = App.getInstance().getJsonSerializer().DeserializeFromString(json, BaseItemPerson.class);
  51.         } else {
  52.             mSelectedItem = App.getInstance().getJsonSerializer().DeserializeFromString(json, BaseItemDto.class);
  53.             getThemeVideo();
  54.         }
  55.         helper = new FullWidthDetailsOverviewSharedElementHelper();
  56.         helper.setSharedElementEnterTransition(getActivity(), "HERO_IMAGE");
  57.     }
  58.  
  59.     @Override
  60.     public void onResume() {
  61.         super.onResume();
  62.         if (mSelectedItem != null) {
  63.             getFullItem();
  64.             BackgroundManager.getInstance().setBackgroundItem(mSelectedItem);
  65.         } else if (mSelectedPerson != null) {
  66.             getFullItem();
  67.         } else {
  68.             Log.d(TAG, "mSelectedItem and mSelectedPerson are null... Not loading details");
  69.             getActivity().onBackPressed();
  70.         }
  71.     }
  72.  
  73.     @Override
  74.     public void onStop() {
  75.         super.onStop();
  76.     }
  77.  
  78.     @Override
  79.     public void onDestroy() {
  80.         if (mSelectedItem != null && "series".equalsIgnoreCase(mSelectedItem.getType())) {
  81.             PlayerManager.getInstance().stopThemePlayback();
  82.         }
  83.         super.onDestroy();
  84.     }
  85.  
  86.     private void getFullItem() {
  87.         App.getInstance().getApiClient().GetItemAsync(
  88.                 mSelectedPerson != null ? mSelectedPerson.getId() : mSelectedItem.getId(),
  89.                 App.getInstance().getApiClient().getCurrentUserId(),
  90.                 new Response<BaseItemDto>() {
  91.                     @Override
  92.                     public void onResponse(BaseItemDto item) {
  93.                         if (item != null) mSelectedItem = item;
  94.                         if (isFresh) {
  95.                             setupAdapter();
  96.                             setupDetailsOverviewRow();
  97.                             setupDetailsOverviewRowPresenter();
  98.                             setupSeasonsRow();
  99.                             setupAlbumsRow();
  100.                             setupPersonMediaRow();
  101.                             setupCastAndCrewRow();
  102.                             setupExtrasRow();
  103.                             setupSimilarMediaRow();
  104.                             setupListRowPresenter();
  105.                             setOnItemViewClickedListener(new ItemViewClickedListener());
  106.                             isFresh = false;
  107.                         } else {
  108.                             updateDetailsOverviewPrimaryImage(parentSeries != null ? parentSeries : mSelectedItem);
  109.                             updateActionAdapter();
  110.                         }
  111.                     }
  112.                 });
  113.     }
  114.  
  115.     private void setupAdapter() {
  116.         mPresenterSelector = new ClassPresenterSelector();
  117.         mAdapter = new ArrayObjectAdapter(mPresenterSelector);
  118.         setAdapter(mAdapter);
  119.     }
  120.  
  121.     private void setupDetailsOverviewRow() {
  122.         Log.d(TAG, "doInBackground: " + mSelectedItem.toString());
  123.         detailsOverview = new DetailsOverviewRow(mSelectedItem);
  124.         detailsOverview.setImageDrawable(ContextCompat.getDrawable(getActivity(),
  125.                 isPersonDetails ? R.drawable.default_person : R.drawable.default_film));
  126.         if ("episode".equalsIgnoreCase(mSelectedItem.getType()) && parentSeries == null) {
  127.             getSeriesDto();
  128.         } else {
  129.             updateDetailsOverviewPrimaryImage(mSelectedItem);
  130.         }
  131.         updateActionAdapter();
  132.         mAdapter.add(detailsOverview);
  133.         setSelectedPosition(0, true);
  134.     }
  135.  
  136.     private void setupDetailsOverviewRowPresenter() {
  137.         // Set detail background and style.
  138.         FullWidthDetailsOverviewRowPresenter detailsPresenter =
  139.                 new FullWidthDetailsOverviewRowPresenter(new DetailsDescriptionPresenter());
  140.         detailsPresenter.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.colorPrimary90));
  141.         detailsPresenter.setListener(helper);
  142.         detailsPresenter.setOnActionClickedListener(new OnActionClickedListener() {
  143.             @Override
  144.             public void onActionClicked(Action action) {
  145.                 switch ((int)action.getId()) {
  146.                     case Actions.ACTION_WATCH_TRAILER:
  147.                         onPlayTrailer();
  148.                         break;
  149.                     case Actions.ACTION_RESUME:
  150.                         PlayerManager.getInstance().playItem(mSelectedItem, mSelectedItem.getResumePositionTicks());
  151.                         break;
  152.                     case Actions.ACTION_PLAY:
  153.                         if (mSelectedItem.getIsFolder()) {
  154.                             PlayerManager.getInstance().playFolder(mSelectedItem, false);
  155.                         } else {
  156.                             PlayerManager.getInstance().playItem(mSelectedItem);
  157.                         }
  158.                         break;
  159.                     case Actions.ACTION_ACTIONS:
  160.                         onActionsClicked();
  161.                         break;
  162.                     default:
  163.                         Toast.makeText(getActivity(), action.toString(), Toast.LENGTH_SHORT).show();
  164.                         break;
  165.                 }
  166.             }
  167.         });
  168.         mPresenterSelector.addClassPresenter(DetailsOverviewRow.class, detailsPresenter);
  169.     }
  170.  
  171.     private void setupSeasonsRow() {
  172.         if (!"series".equalsIgnoreCase(mSelectedItem.getType())) {
  173.             return;
  174.         }
  175.         PresenterOptions options = new PresenterOptions();
  176.         options.setEpisodesShowAirDate(true);
  177.         options.setEpisodesShowSeriesName(false);
  178.         options.setPreferredEpisodeImageType(ImageType.Primary);
  179.  
  180.         if (mSelectedItem.getChildCount() != null && mSelectedItem.getChildCount() == 1) {
  181.             ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(new CardPresenter(options));
  182.             HeaderItem header = new HeaderItem(1, "Episodes");
  183.             mAdapter.add(1, new ListRow(header, listRowAdapter));
  184.             getEpisodes(listRowAdapter);
  185.         } else {
  186.             options.setAspectRatio(0.66666666667f);
  187.             ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(new CardPresenter(options));
  188.             HeaderItem header = new HeaderItem(1, "Seasons");
  189.             mAdapter.add(1, new ListRow(header, listRowAdapter));
  190.             getSeasons(listRowAdapter);
  191.         }
  192.     }
  193.  
  194.     private void setupAlbumsRow() {
  195.         if (!"musicartist".equalsIgnoreCase(mSelectedItem.getType())) {
  196.             return;
  197.         }
  198.         PresenterOptions options = new PresenterOptions();
  199.         options.setAspectRatio(1f);
  200.         final ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(new CardPresenter(options));
  201.         HeaderItem header = new HeaderItem(0, "Albums");
  202.         mAdapter.add(new ListRow(header, listRowAdapter));
  203.  
  204.         ItemQuery query = new ItemQuery();
  205.         query.setParentId(mSelectedItem.getId());
  206.         query.setUserId(App.getInstance().getApiClient().getCurrentUserId());
  207.         query.setFields(new ItemFields[] {ItemFields.PrimaryImageAspectRatio});
  208.         query.setSortBy(new String[] {ItemSortBy.ProductionYear});
  209.         query.setSortOrder(SortOrder.Descending);
  210.         App.getInstance().getApiClient().GetItemsAsync(query, new Response<ItemsResult>() {
  211.             @Override
  212.             public void onResponse(ItemsResult result) {
  213.                 if (result == null || result.getItems() == null || result.getItems().length == 0) {
  214.                     return;
  215.                 }
  216.  
  217.                 for (BaseItemDto item : result.getItems()) {
  218.                     listRowAdapter.add(item);
  219.                 }
  220.             }
  221.         });
  222.     }
  223.  
  224.     private void setupPersonMediaRow() {
  225.         if (!isPersonDetails) return;
  226.         PresenterOptions options = new PresenterOptions();
  227.         options.setPreferredEpisodeImageType(ImageType.Primary);
  228.         options.setEpisodesShowAirDate(false);
  229.         options.setEpisodesShowSeriesName(true);
  230.         final ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(new CardPresenter(options));
  231.         HeaderItem header = new HeaderItem(2, "Known for");
  232.         mAdapter.add(new ListRow(header, listRowAdapter));
  233.  
  234.         ItemQuery query = new ItemQuery();
  235.         query.setUserId(App.getInstance().getApiClient().getCurrentUserId());
  236.         query.setPersonIds(new String[]{mSelectedPerson.getId()});
  237.         query.setRecursive(true);
  238.         query.setExcludeItemTypes(new String[]{"Trailer"});
  239.         query.setSortBy(new String[]{ItemSortBy.PremiereDate});
  240.         query.setSortOrder(SortOrder.Descending);
  241.  
  242.         App.getInstance().getApiClient().GetItemsAsync(query, new Response<ItemsResult>() {
  243.             @Override
  244.             public void onResponse(ItemsResult result) {
  245.                 if (result == null || result.getItems() == null) return;
  246.                 for (BaseItemDto item : result.getItems()) {
  247.                     listRowAdapter.add(item);
  248.                 }
  249.  
  250.             }
  251.         });
  252.     }
  253.  
  254.     private void setupCastAndCrewRow() {
  255.         if (mSelectedItem.getPeople() == null || mSelectedItem.getPeople().length == 0) {
  256.             return;
  257.         }
  258.         ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(new PeopleCardPresenter());
  259.         HeaderItem header = new HeaderItem(2, "Cast & Crew");
  260.         mAdapter.add(new ListRow(header, listRowAdapter));
  261.         for (BaseItemPerson person : mSelectedItem.getPeople()) {
  262.             // Filter out all the garbage people that Emby wants to show. No one fucking cares who served the food.
  263.             if (PersonType.Actor.equalsIgnoreCase(person.getType())
  264.                     || PersonType.Director.equalsIgnoreCase(person.getType())
  265.                     || PersonType.GuestStar.equalsIgnoreCase(person.getType())
  266.                     || PersonType.Producer.equalsIgnoreCase(person.getType())
  267.                     || PersonType.Writer.equalsIgnoreCase(person.getType()))
  268.             listRowAdapter.add(person);
  269.         }
  270.     }
  271.  
  272.     private void setupExtrasRow() {
  273.         if (mSelectedItem.getSpecialFeatureCount() == null || mSelectedItem.getSpecialFeatureCount() < 1) {
  274.             return;
  275.         }
  276.         final ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(new CardPresenter());
  277.         HeaderItem header = new HeaderItem(3, "Special Features");
  278.         mAdapter.add(new ListRow(header, listRowAdapter));
  279.  
  280.         App.getInstance().getApiClient().GetSpecialFeaturesAsync(
  281.                 App.getInstance().getApiClient().getCurrentUserId(),
  282.                 mSelectedItem.getId(),
  283.                 new Response<BaseItemDto[]>() {
  284.                     @Override
  285.                     public void onResponse(BaseItemDto[] items) {
  286.                         if (items == null || items.length == 0) return;
  287.                         for (BaseItemDto item : items) {
  288.                             listRowAdapter.add(item);
  289.                         }
  290.                     }
  291.                 });
  292.     }
  293.  
  294.     private void setupSimilarMediaRow() {
  295.         if (!mSelectedItem.getSupportsSimilarItems()) {
  296.             return;
  297.         }
  298.         final ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(new CardPresenter());
  299.         HeaderItem header = new HeaderItem(4, "Similar to " + mSelectedItem.getName());
  300.         mAdapter.add(new ListRow(header, listRowAdapter));
  301.  
  302.         SimilarItemsQuery query = new SimilarItemsQuery();
  303.         query.setId(mSelectedItem.getId());
  304.         query.setUserId(App.getInstance().getApiClient().getCurrentUserId());
  305.         query.setLimit(25);
  306.         query.setFields(new ItemFields[] {ItemFields.PrimaryImageAspectRatio});
  307.         App.getInstance().getApiClient().GetSimilarItems(query, new Response<ItemsResult>() {
  308.             @Override
  309.             public void onResponse(ItemsResult result) {
  310.                 if (result == null || result.getItems() == null) return;
  311.                 for (BaseItemDto item : result.getItems()) {
  312.                     listRowAdapter.add(item);
  313.                 }
  314.             }
  315.         });
  316.     }
  317.  
  318.     private void setupListRowPresenter() {
  319.         mPresenterSelector.addClassPresenter(ListRow.class, new ListRowPresenter());
  320.     }
  321.  
  322.     private void onPlayTrailer() {
  323.         App.getInstance().getApiClient().GetLocalTrailersAsync(
  324.                 App.getInstance().getApiClient().getCurrentUserId(),
  325.                 mSelectedItem.getId(),
  326.                 new Response<BaseItemDto[]>() {
  327.                     @Override
  328.                     public void onResponse(BaseItemDto[] items) {
  329.                         if (items == null || items.length == 0) {
  330.                             return;
  331.                         }
  332.                         Random rand = new Random();
  333.                         rand.setSeed(System.currentTimeMillis());
  334.                         PlayerManager.getInstance().playItem(items[rand.nextInt(items.length)]);
  335.                     }
  336.                 }
  337.         );
  338.     }
  339.  
  340.     private void onActionsClicked() {
  341.         PopupMenuDialogOptions options = new PopupMenuDialogOptions();
  342.         options.setActionMenu(true);
  343.         options.setPlayMenu(false);
  344.         options.setImageVisible(false);
  345.         NavigationManager.getInstance().showPopupMenuDialog(mSelectedItem, options, new Response<UserItemDataDto>() {
  346.             @Override
  347.             public void onResponse(UserItemDataDto userData) {
  348.                 if (userData != null) {
  349.                     mSelectedItem.setUserData(userData);
  350.                     updateDetailsOverviewPrimaryImage(parentSeries != null ? parentSeries : mSelectedItem);
  351.                     updateActionAdapter();
  352.                 }
  353.             }
  354.         });
  355.     }
  356.  
  357.     private void updateDetailsOverviewPrimaryImage(BaseItemDto imageItem) {
  358.         int height = Utils.convertDpToPixel(DETAIL_THUMB_HEIGHT);
  359.         int width = imageItem.getPrimaryImageAspectRatio() != null
  360.                 ? Math.round((float)(height * imageItem.getPrimaryImageAspectRatio()))
  361.                 : height;
  362.         if (imageItem.getHasPrimaryImage()) {
  363.             String url = Utils.getPrimaryImageUrl(imageItem.getId(), height, null, mSelectedItem);
  364.             Glide.with(getActivity())
  365.                     .load(url)
  366.                     .centerCrop()
  367.                     .error(R.drawable.default_wallpaper)
  368.                     .into(new SimpleTarget<GlideDrawable>(width, height) {
  369.                         @Override
  370.                         public void onResourceReady(GlideDrawable resource,
  371.                                                     GlideAnimation<? super GlideDrawable>
  372.                                                             glideAnimation) {
  373.                             Log.d(TAG, "details overview card image url ready: " + resource);
  374.                             detailsOverview.setImageDrawable(resource);
  375.                             mAdapter.notifyArrayItemRangeChanged(0, mAdapter.size());
  376.                         }
  377.                     });
  378.         }
  379.     }
  380.  
  381.     private void updateActionAdapter() {
  382.         int id = 0;
  383.         SparseArrayObjectAdapter actionAdapter = new SparseArrayObjectAdapter();
  384.         if (mSelectedPerson != null && mSelectedItem != null && mSelectedItem.getUserData() != null) {
  385.             actionAdapter.set(id, new Action(Actions.ACTION_ACTIONS, "Actions", ""));
  386.         } else if (mSelectedItem != null) {
  387.             if (mSelectedItem.getCanResume() && mSelectedItem.getResumePositionTicks() > 0) {
  388.                 actionAdapter.set(id++, new Action(Actions.ACTION_RESUME, "Resume",
  389.                         Utils.msToMinutesString((int) (mSelectedItem.getResumePositionTicks() / 10000))));
  390.             }
  391.             if (!LocationType.Virtual.equals(mSelectedItem.getLocationType())) {
  392.                 actionAdapter.set(id++, new Action(Actions.ACTION_PLAY, "Play", ""));
  393.             }
  394.             if (mSelectedItem.getLocalTrailerCount() != null && mSelectedItem.getLocalTrailerCount() > 0) {
  395.                 actionAdapter.set(id++, new Action(Actions.ACTION_WATCH_TRAILER, "Trailer", ""));
  396.             }
  397.             actionAdapter.set(id, new Action(Actions.ACTION_ACTIONS, "Actions", ""));
  398.         }
  399.  
  400.         detailsOverview.setActionsAdapter(actionAdapter);
  401.     }
  402.  
  403.     private void getSeriesDto() {
  404.         App.getInstance().getApiClient().GetItemAsync(
  405.                 mSelectedItem.getSeriesId(),
  406.                 App.getInstance().getApiClient().getCurrentUserId(),
  407.                 new Response<BaseItemDto>() {
  408.                     @Override
  409.                     public void onResponse(BaseItemDto series) {
  410.                         if (series != null) {
  411.                             parentSeries = series;
  412.  
  413.                         }
  414.                         updateDetailsOverviewPrimaryImage(parentSeries != null ? parentSeries : mSelectedItem);
  415.                     }
  416.                 });
  417.     }
  418.  
  419.     private void getSeasons(final ArrayObjectAdapter listRowAdapter) {
  420.  
  421.         SeasonQuery query = new SeasonQuery();
  422.         query.setSeriesId(mSelectedItem.getId());
  423.         query.setUserId(App.getInstance().getApiClient().getCurrentUserId());
  424.         query.setFields(new ItemFields[] {ItemFields.PrimaryImageAspectRatio});
  425.         App.getInstance().getApiClient().GetSeasonsAsync(query, new Response<ItemsResult>() {
  426.             @Override
  427.             public void onResponse(final ItemsResult response) {
  428.                 if (response == null || response.getItems() == null) {
  429.                     return;
  430.                 }
  431.                 for (BaseItemDto item : response.getItems()) {
  432.                     listRowAdapter.add(item);
  433.                 }
  434.             }
  435.         });
  436.     }
  437.  
  438.     private void getEpisodes(final ArrayObjectAdapter listRowAdapter) {
  439.         EpisodeQuery query = new EpisodeQuery();
  440.         query.setUserId(App.getInstance().getApiClient().getCurrentUserId());
  441.         query.setSeriesId(mSelectedItem.getId());
  442.         query.setFields(new ItemFields[] { ItemFields.PrimaryImageAspectRatio });
  443.  
  444.         App.getInstance().getApiClient().GetEpisodesAsync(query, new Response<ItemsResult>() {
  445.             @Override
  446.             public void onResponse(final ItemsResult response) {
  447.                 if (response == null || response.getItems() == null) {
  448.                     return;
  449.                 }
  450.                 for (BaseItemDto item : response.getItems()) {
  451.                     listRowAdapter.add(item);
  452.                 }
  453.  
  454.             }
  455.         });
  456.     }
  457.  
  458.     private void getThemeVideo() {
  459.         if (!"series".equalsIgnoreCase(mSelectedItem.getType())) {
  460.             return;
  461.         }
  462.         App.getInstance().getApiClient().GetThemeVideosAsync(
  463.                 App.getInstance().getApiClient().getCurrentUserId(),
  464.                 mSelectedItem.getId(),
  465.                 false,
  466.                 new Response<ThemeMediaResult>() {
  467.                     @Override
  468.                     public void onResponse(ThemeMediaResult result) {
  469.                         if (result.getItems() != null && result.getItems().length > 0) {
  470.                             PlayerManager.getInstance().playThemeVideo(result.getItems()[0]);
  471.                         }
  472.                     }
  473.                 }
  474.         );
  475.     }
  476.  
  477.     private final class ItemViewClickedListener implements OnItemViewClickedListener {
  478.         @Override
  479.         public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
  480.                                   RowPresenter.ViewHolder rowViewHolder, Row row) {
  481.  
  482.             if (item instanceof BaseItemPerson) {
  483.                 NavigationManager.getInstance().navigate((BaseItemPerson)item);
  484.             } else if (item instanceof BaseItemDto) {
  485.                 if ("video".equalsIgnoreCase(((BaseItemDto) item).getType())) {
  486.                     PlayerManager.getInstance().playItem((BaseItemDto)item);
  487.                 } else {
  488.                     NavigationManager.getInstance().navigate((BaseItemDto) item);
  489.                 }
  490.             }
  491.         }
  492.     }
  493. }
RAW Paste Data