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