/* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package android.support.v17.leanback.supportleanbackshowcase.app.details; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.os.Handler; import android.support.v17.leanback.app.DetailsFragment; import android.support.v17.leanback.supportleanbackshowcase.models.DetailedCard; import android.support.v17.leanback.supportleanbackshowcase.R; import android.support.v17.leanback.supportleanbackshowcase.utils.CardListRow; import android.support.v17.leanback.supportleanbackshowcase.utils.Utils; import android.support.v17.leanback.supportleanbackshowcase.cards.presenters.CardPresenterSelector; import android.support.v17.leanback.supportleanbackshowcase.models.Card; import android.support.v17.leanback.widget.Action; import android.support.v17.leanback.widget.ArrayObjectAdapter; import android.support.v17.leanback.widget.ClassPresenterSelector; import android.support.v17.leanback.widget.DetailsOverviewRow; import android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter; import android.support.v17.leanback.widget.FullWidthDetailsOverviewSharedElementHelper; import android.support.v17.leanback.widget.HeaderItem; import android.support.v17.leanback.widget.ListRow; import android.support.v17.leanback.widget.ListRowPresenter; import android.support.v17.leanback.widget.OnItemViewClickedListener; import android.support.v17.leanback.widget.OnItemViewSelectedListener; import android.support.v17.leanback.widget.Presenter; import android.support.v17.leanback.widget.Row; import android.support.v17.leanback.widget.RowPresenter; import android.view.View; import android.view.ViewGroup; import android.widget.Toast; import com.google.gson.Gson; /** * Displays a card with more details using a {@link DetailsFragment}. */ public class DetailViewExampleFragment extends DetailsFragment implements OnItemViewClickedListener, OnItemViewSelectedListener { public static final String TRANSITION_NAME = "t_for_transition"; public static final String EXTRA_CARD = "card"; private ArrayObjectAdapter mRowsAdapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setupUi(); setupEventListeners(); } private void setupUi() { // Load the card we want to display from a JSON resource. This JSON data could come from // anywhere in a real world app, e.g. a server. String json = Utils .inputStreamToString(getResources().openRawResource(R.raw.detail_example)); DetailedCard data = new Gson().fromJson(json, DetailedCard.class); // Setup fragment setTitle(getString(R.string.detail_view_title)); FullWidthDetailsOverviewRowPresenter rowPresenter = new FullWidthDetailsOverviewRowPresenter( new DetailsDescriptionPresenter(getActivity())) { @Override protected RowPresenter.ViewHolder createRowViewHolder(ViewGroup parent) { // Customize Actionbar and Content by using custom colors. RowPresenter.ViewHolder viewHolder = super.createRowViewHolder(parent); View actionsView = viewHolder.view. findViewById(R.id.details_overview_actions_background); actionsView.setBackgroundColor(getActivity().getResources(). getColor(R.color.detail_view_actionbar_background, null)); View detailsView = viewHolder.view.findViewById(R.id.details_frame); detailsView.setBackgroundColor( getResources().getColor(R.color.detail_view_background, null)); return viewHolder; } }; FullWidthDetailsOverviewSharedElementHelper mHelper = new FullWidthDetailsOverviewSharedElementHelper(); mHelper.setSharedElementEnterTransition(getActivity(), TRANSITION_NAME); rowPresenter.setListener(mHelper); rowPresenter.setParticipatingEntranceTransition(false); prepareEntranceTransition(); ListRowPresenter shadowDisabledRowPresenter = new ListRowPresenter(); shadowDisabledRowPresenter.setShadowEnabled(false); // Setup PresenterSelector to distinguish between the different rows. ClassPresenterSelector rowPresenterSelector = new ClassPresenterSelector(); rowPresenterSelector.addClassPresenter(DetailsOverviewRow.class, rowPresenter); rowPresenterSelector.addClassPresenter(CardListRow.class, shadowDisabledRowPresenter); rowPresenterSelector.addClassPresenter(ListRow.class, new ListRowPresenter()); mRowsAdapter = new ArrayObjectAdapter(rowPresenterSelector); // Setup action and detail row. DetailsOverviewRow detailsOverview = new DetailsOverviewRow(data); int imageResId = data.getLocalImageResourceId(getActivity()); Bundle extras = getActivity().getIntent().getExtras(); if (extras != null && extras.containsKey(EXTRA_CARD)) { imageResId = extras.getInt(EXTRA_CARD, imageResId); } detailsOverview.setImageDrawable(getResources().getDrawable(imageResId, null)); ArrayObjectAdapter actionAdapter = new ArrayObjectAdapter(); actionAdapter.add(new Action(1, getString(R.string.action_buy) + data.getPrice())); actionAdapter.add(new Action(2, getString(R.string.action_wishlist))); actionAdapter.add(new Action(3, getString(R.string.action_related))); detailsOverview.setActionsAdapter(actionAdapter); mRowsAdapter.add(detailsOverview); // Setup related row. ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter( new CardPresenterSelector(getActivity())); for (Card characterCard : data.getCharacters()) listRowAdapter.add(characterCard); HeaderItem header = new HeaderItem(0, getString(R.string.header_related)); mRowsAdapter.add(new CardListRow(header, listRowAdapter, null)); // Setup recommended row. listRowAdapter = new ArrayObjectAdapter(new CardPresenterSelector(getActivity())); for (Card card : data.getRecommended()) listRowAdapter.add(card); header = new HeaderItem(1, getString(R.string.header_recommended)); mRowsAdapter.add(new ListRow(header, listRowAdapter)); setAdapter(mRowsAdapter); new Handler().postDelayed(new Runnable() { @Override public void run() { startEntranceTransition(); } }, 500); } private void setupEventListeners() { setOnItemViewSelectedListener(this); setOnItemViewClickedListener(this); } @Override public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item, RowPresenter.ViewHolder rowViewHolder, Row row) { if (!(item instanceof Action)) return; Action action = (Action) item; if (action.getId() == 3) { setSelectedPosition(1); } else { Toast.makeText(getActivity(), getString(R.string.action_cicked), Toast.LENGTH_LONG) .show(); } } @Override public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item, RowPresenter.ViewHolder rowViewHolder, Row row) { if (mRowsAdapter.indexOf(row) > 0) { int backgroundColor = getResources().getColor(R.color.detail_view_related_background, null); getView().setBackgroundColor(backgroundColor); } else { getView().setBackground(null); } } }