1/* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 * in compliance with the License. You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software distributed under the License 10 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 * or implied. See the License for the specific language governing permissions and limitations under 12 * the License. 13 */ 14 15package android.support.v17.leanback.supportleanbackshowcase.app.details; 16 17import android.graphics.Bitmap; 18import android.graphics.BitmapFactory; 19import android.os.Bundle; 20import android.os.Handler; 21import android.support.v17.leanback.app.DetailsFragment; 22import android.support.v17.leanback.supportleanbackshowcase.models.DetailedCard; 23import android.support.v17.leanback.supportleanbackshowcase.R; 24import android.support.v17.leanback.supportleanbackshowcase.utils.CardListRow; 25import android.support.v17.leanback.supportleanbackshowcase.utils.Utils; 26import android.support.v17.leanback.supportleanbackshowcase.cards.presenters.CardPresenterSelector; 27import android.support.v17.leanback.supportleanbackshowcase.models.Card; 28import android.support.v17.leanback.widget.Action; 29import android.support.v17.leanback.widget.ArrayObjectAdapter; 30import android.support.v17.leanback.widget.ClassPresenterSelector; 31import android.support.v17.leanback.widget.DetailsOverviewRow; 32import android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter; 33import android.support.v17.leanback.widget.FullWidthDetailsOverviewSharedElementHelper; 34import android.support.v17.leanback.widget.HeaderItem; 35import android.support.v17.leanback.widget.ListRow; 36import android.support.v17.leanback.widget.ListRowPresenter; 37import android.support.v17.leanback.widget.OnItemViewClickedListener; 38import android.support.v17.leanback.widget.OnItemViewSelectedListener; 39import android.support.v17.leanback.widget.Presenter; 40import android.support.v17.leanback.widget.Row; 41import android.support.v17.leanback.widget.RowPresenter; 42import android.view.View; 43import android.view.ViewGroup; 44import android.widget.Toast; 45 46import com.google.gson.Gson; 47 48/** 49 * Displays a card with more details using a {@link DetailsFragment}. 50 */ 51public class DetailViewExampleFragment extends DetailsFragment implements OnItemViewClickedListener, 52 OnItemViewSelectedListener { 53 54 public static final String TRANSITION_NAME = "t_for_transition"; 55 public static final String EXTRA_CARD = "card"; 56 57 private ArrayObjectAdapter mRowsAdapter; 58 59 @Override 60 public void onCreate(Bundle savedInstanceState) { 61 super.onCreate(savedInstanceState); 62 setupUi(); 63 setupEventListeners(); 64 } 65 66 private void setupUi() { 67 // Load the card we want to display from a JSON resource. This JSON data could come from 68 // anywhere in a real world app, e.g. a server. 69 String json = Utils 70 .inputStreamToString(getResources().openRawResource(R.raw.detail_example)); 71 DetailedCard data = new Gson().fromJson(json, DetailedCard.class); 72 73 // Setup fragment 74 setTitle(getString(R.string.detail_view_title)); 75 76 FullWidthDetailsOverviewRowPresenter rowPresenter = new FullWidthDetailsOverviewRowPresenter( 77 new DetailsDescriptionPresenter(getActivity())) { 78 79 @Override 80 protected RowPresenter.ViewHolder createRowViewHolder(ViewGroup parent) { 81 // Customize Actionbar and Content by using custom colors. 82 RowPresenter.ViewHolder viewHolder = super.createRowViewHolder(parent); 83 84 View actionsView = viewHolder.view. 85 findViewById(R.id.details_overview_actions_background); 86 actionsView.setBackgroundColor(getActivity().getResources(). 87 getColor(R.color.detail_view_actionbar_background, null)); 88 89 View detailsView = viewHolder.view.findViewById(R.id.details_frame); 90 detailsView.setBackgroundColor( 91 getResources().getColor(R.color.detail_view_background, null)); 92 return viewHolder; 93 } 94 }; 95 96 FullWidthDetailsOverviewSharedElementHelper mHelper = new FullWidthDetailsOverviewSharedElementHelper(); 97 mHelper.setSharedElementEnterTransition(getActivity(), TRANSITION_NAME); 98 rowPresenter.setListener(mHelper); 99 rowPresenter.setParticipatingEntranceTransition(false); 100 prepareEntranceTransition(); 101 102 ListRowPresenter shadowDisabledRowPresenter = new ListRowPresenter(); 103 shadowDisabledRowPresenter.setShadowEnabled(false); 104 105 // Setup PresenterSelector to distinguish between the different rows. 106 ClassPresenterSelector rowPresenterSelector = new ClassPresenterSelector(); 107 rowPresenterSelector.addClassPresenter(DetailsOverviewRow.class, rowPresenter); 108 rowPresenterSelector.addClassPresenter(CardListRow.class, shadowDisabledRowPresenter); 109 rowPresenterSelector.addClassPresenter(ListRow.class, new ListRowPresenter()); 110 mRowsAdapter = new ArrayObjectAdapter(rowPresenterSelector); 111 112 // Setup action and detail row. 113 DetailsOverviewRow detailsOverview = new DetailsOverviewRow(data); 114 int imageResId = data.getLocalImageResourceId(getActivity()); 115 116 Bundle extras = getActivity().getIntent().getExtras(); 117 if (extras != null && extras.containsKey(EXTRA_CARD)) { 118 imageResId = extras.getInt(EXTRA_CARD, imageResId); 119 } 120 detailsOverview.setImageDrawable(getResources().getDrawable(imageResId, null)); 121 ArrayObjectAdapter actionAdapter = new ArrayObjectAdapter(); 122 actionAdapter.add(new Action(1, getString(R.string.action_buy) + data.getPrice())); 123 actionAdapter.add(new Action(2, getString(R.string.action_wishlist))); 124 actionAdapter.add(new Action(3, getString(R.string.action_related))); 125 detailsOverview.setActionsAdapter(actionAdapter); 126 mRowsAdapter.add(detailsOverview); 127 128 // Setup related row. 129 ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter( 130 new CardPresenterSelector(getActivity())); 131 for (Card characterCard : data.getCharacters()) listRowAdapter.add(characterCard); 132 HeaderItem header = new HeaderItem(0, getString(R.string.header_related)); 133 mRowsAdapter.add(new CardListRow(header, listRowAdapter, null)); 134 135 // Setup recommended row. 136 listRowAdapter = new ArrayObjectAdapter(new CardPresenterSelector(getActivity())); 137 for (Card card : data.getRecommended()) listRowAdapter.add(card); 138 header = new HeaderItem(1, getString(R.string.header_recommended)); 139 mRowsAdapter.add(new ListRow(header, listRowAdapter)); 140 141 setAdapter(mRowsAdapter); 142 new Handler().postDelayed(new Runnable() { 143 @Override 144 public void run() { 145 startEntranceTransition(); 146 } 147 }, 500); 148 } 149 150 private void setupEventListeners() { 151 setOnItemViewSelectedListener(this); 152 setOnItemViewClickedListener(this); 153 } 154 155 @Override 156 public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item, 157 RowPresenter.ViewHolder rowViewHolder, Row row) { 158 if (!(item instanceof Action)) return; 159 Action action = (Action) item; 160 if (action.getId() == 3) { 161 setSelectedPosition(1); 162 } else { 163 Toast.makeText(getActivity(), getString(R.string.action_cicked), Toast.LENGTH_LONG) 164 .show(); 165 } 166 } 167 168 @Override 169 public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item, 170 RowPresenter.ViewHolder rowViewHolder, Row row) { 171 if (mRowsAdapter.indexOf(row) > 0) { 172 int backgroundColor = getResources().getColor(R.color.detail_view_related_background, 173 null); 174 getView().setBackgroundColor(backgroundColor); 175 } else { 176 getView().setBackground(null); 177 } 178 } 179} 180