DetailViewExampleFragment.java revision ad31f63f5843898de645f6ee1ac244c872ded8cc
186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn/*
286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn * Copyright (C) 2015 The Android Open Source Project
386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn *
486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn * in compliance with the License. You may obtain a copy of the License at
686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn *
786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn * http://www.apache.org/licenses/LICENSE-2.0
886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn *
986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn * Unless required by applicable law or agreed to in writing, software distributed under the License
1086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
1186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn * or implied. See the License for the specific language governing permissions and limitations under
1286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn * the License.
1386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn */
1486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
15ad31f63f5843898de645f6ee1ac244c872ded8ccRobert Hahnpackage android.support.v17.leanback.supportleanbackshowcase.app.details;
1686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
1786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.os.Bundle;
1886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.app.DetailsFragment;
19ad31f63f5843898de645f6ee1ac244c872ded8ccRobert Hahnimport android.support.v17.leanback.supportleanbackshowcase.models.DetailedCard;
20ad31f63f5843898de645f6ee1ac244c872ded8ccRobert Hahnimport android.support.v17.leanback.supportleanbackshowcase.R;
21ad31f63f5843898de645f6ee1ac244c872ded8ccRobert Hahnimport android.support.v17.leanback.supportleanbackshowcase.utils.CardListRow;
22ad31f63f5843898de645f6ee1ac244c872ded8ccRobert Hahnimport android.support.v17.leanback.supportleanbackshowcase.utils.Utils;
2386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.supportleanbackshowcase.cards.presenters.CardPresenterSelector;
24ad31f63f5843898de645f6ee1ac244c872ded8ccRobert Hahnimport android.support.v17.leanback.supportleanbackshowcase.models.Card;
2586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.widget.Action;
2686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.widget.ArrayObjectAdapter;
2786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.widget.ClassPresenterSelector;
2886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.widget.DetailsOverviewRow;
2986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter;
3086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.widget.HeaderItem;
3186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.widget.ListRow;
3286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.widget.ListRowPresenter;
3386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.widget.OnItemViewClickedListener;
3486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.widget.OnItemViewSelectedListener;
3586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.widget.Presenter;
3686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.widget.Row;
3786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.widget.RowPresenter;
3886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.view.View;
3986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.view.ViewGroup;
4086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.widget.Toast;
4186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
4286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport com.google.gson.Gson;
4386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
4486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn/**
4531475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn * Displays a card with more details using a {@link DetailsFragment}.
4686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn */
4786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnpublic class DetailViewExampleFragment extends DetailsFragment implements OnItemViewClickedListener,
4886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        OnItemViewSelectedListener {
4986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
5086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn    private ArrayObjectAdapter mRowsAdapter;
5186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
5231475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn    @Override
5331475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn    public void onActivityCreated(Bundle savedInstanceState) {
5486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        super.onActivityCreated(savedInstanceState);
5586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        setupUi();
5686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        setupEventListeners();
5786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn    }
5886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
5986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn    private void setupUi() {
6031475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn        // Load the card we want to display from a JSON resource. This JSON data could come from
6131475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn        // anywhere in a real world app, e.g. a server.
6286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        String json = Utils
6386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                .inputStreamToString(getResources().openRawResource(R.raw.detail_example));
6486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        DetailedCard data = new Gson().fromJson(json, DetailedCard.class);
6531475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn
6631475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn        // Setup fragment
6786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        setTitle(getString(R.string.detail_view_title));
6886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
6986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        FullWidthDetailsOverviewRowPresenter rowPresenter = new FullWidthDetailsOverviewRowPresenter(
7086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                new DetailsDescriptionPresenter(getActivity())) {
7131475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn
7231475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn            @Override
7331475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn            protected RowPresenter.ViewHolder createRowViewHolder(ViewGroup parent) {
7431475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn                // Customize Actionbar and Content by using custom colors.
7586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                RowPresenter.ViewHolder viewHolder = super.createRowViewHolder(parent);
7686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
7731475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn                View actionsView = viewHolder.view.
7831475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn                        findViewById(R.id.details_overview_actions_background);
7931475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn                actionsView.setBackgroundColor(getActivity().getResources().
8031475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn                        getColor(R.color.detail_view_actionbar_background, null));
8186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
8286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                View detailsView = viewHolder.view.findViewById(R.id.details_frame);
8386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                detailsView.setBackgroundColor(
8431475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn                        getResources().getColor(R.color.detail_view_background, null));
8586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                return viewHolder;
8686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn            }
8786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        };
8886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        ListRowPresenter shadowDisabledRowPresenter = new ListRowPresenter();
8986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        shadowDisabledRowPresenter.setShadowEnabled(false);
9086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
9186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        // Setup PresenterSelector to distinguish between the different rows.
9286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        ClassPresenterSelector rowPresenterSelector = new ClassPresenterSelector();
9386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        rowPresenterSelector.addClassPresenter(DetailsOverviewRow.class, rowPresenter);
9486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        rowPresenterSelector.addClassPresenter(CardListRow.class, shadowDisabledRowPresenter);
9586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        rowPresenterSelector.addClassPresenter(ListRow.class, new ListRowPresenter());
9686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        mRowsAdapter = new ArrayObjectAdapter(rowPresenterSelector);
9786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
9886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        // Setup action and detail row.
9986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        DetailsOverviewRow detailsOverview = new DetailsOverviewRow(data);
10086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        int imageResId = data.getLocalImageResourceId(getActivity());
10186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        detailsOverview.setImageDrawable(getResources().getDrawable(imageResId, null));
10286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        ArrayObjectAdapter actionAdapter = new ArrayObjectAdapter();
10386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        actionAdapter.add(new Action(1, getString(R.string.action_buy) + data.getPrice()));
10486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        actionAdapter.add(new Action(2, getString(R.string.action_wishlist)));
10586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        actionAdapter.add(new Action(3, getString(R.string.action_related)));
10686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        detailsOverview.setActionsAdapter(actionAdapter);
10786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        mRowsAdapter.add(detailsOverview);
10886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
10986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        // Setup related row.
11086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(
11186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                new CardPresenterSelector(getActivity()));
11286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        for (Card characterCard : data.getCharacters()) listRowAdapter.add(characterCard);
11386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        HeaderItem header = new HeaderItem(0, getString(R.string.header_related));
11486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        mRowsAdapter.add(new CardListRow(header, listRowAdapter, null));
11586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
11686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        // Setup recommended row.
11786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        listRowAdapter = new ArrayObjectAdapter(new CardPresenterSelector(getActivity()));
11886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        for (Card card : data.getRecommended()) listRowAdapter.add(card);
11986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        header = new HeaderItem(1, getString(R.string.header_recommended));
12086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        mRowsAdapter.add(new ListRow(header, listRowAdapter));
12186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
12286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        setAdapter(mRowsAdapter);
12386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn    }
12486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
12586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn    private void setupEventListeners() {
12686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        setOnItemViewSelectedListener(this);
12786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        setOnItemViewClickedListener(this);
12886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn    }
12986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
13031475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn    @Override
13131475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn    public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
13231475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn                              RowPresenter.ViewHolder rowViewHolder, Row row) {
13386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        if (!(item instanceof Action)) return;
13486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        Action action = (Action) item;
13586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        if (action.getId() == 3) {
13686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn            setSelectedPosition(1);
13731475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn        } else {
13831475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn            Toast.makeText(getActivity(), getString(R.string.action_cicked), Toast.LENGTH_LONG)
13986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                    .show();
14031475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn        }
14186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn    }
14286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
14331475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn    @Override
14431475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn    public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
14531475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn                               RowPresenter.ViewHolder rowViewHolder, Row row) {
14686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        if (mRowsAdapter.indexOf(row) > 0) {
14731475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn            int backgroundColor = getResources().getColor(R.color.detail_view_related_background,
14831475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn                    null);
14931475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn            getView().setBackgroundColor(backgroundColor);
15086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        } else {
15186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn            getView().setBackgroundResource(R.drawable.background_canyon);
15286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        }
15386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn    }
15486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn}
155