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
1722f51aab96c6bb84d0ad3d5aa81afd0ca9d9002fRobert Hahnimport android.graphics.Bitmap;
1822f51aab96c6bb84d0ad3d5aa81afd0ca9d9002fRobert Hahnimport android.graphics.BitmapFactory;
1986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.os.Bundle;
2022f51aab96c6bb84d0ad3d5aa81afd0ca9d9002fRobert Hahnimport android.os.Handler;
2186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.app.DetailsFragment;
22ad31f63f5843898de645f6ee1ac244c872ded8ccRobert Hahnimport android.support.v17.leanback.supportleanbackshowcase.models.DetailedCard;
23ad31f63f5843898de645f6ee1ac244c872ded8ccRobert Hahnimport android.support.v17.leanback.supportleanbackshowcase.R;
24ad31f63f5843898de645f6ee1ac244c872ded8ccRobert Hahnimport android.support.v17.leanback.supportleanbackshowcase.utils.CardListRow;
25ad31f63f5843898de645f6ee1ac244c872ded8ccRobert Hahnimport android.support.v17.leanback.supportleanbackshowcase.utils.Utils;
2686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.supportleanbackshowcase.cards.presenters.CardPresenterSelector;
27ad31f63f5843898de645f6ee1ac244c872ded8ccRobert Hahnimport android.support.v17.leanback.supportleanbackshowcase.models.Card;
2886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.widget.Action;
2986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.widget.ArrayObjectAdapter;
3086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.widget.ClassPresenterSelector;
3186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.widget.DetailsOverviewRow;
3286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter;
3322f51aab96c6bb84d0ad3d5aa81afd0ca9d9002fRobert Hahnimport android.support.v17.leanback.widget.FullWidthDetailsOverviewSharedElementHelper;
3486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.widget.HeaderItem;
3586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.widget.ListRow;
3686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.widget.ListRowPresenter;
3786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.widget.OnItemViewClickedListener;
3886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.widget.OnItemViewSelectedListener;
3986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.widget.Presenter;
4086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.widget.Row;
4186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.widget.RowPresenter;
4286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.view.View;
4386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.view.ViewGroup;
4486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.widget.Toast;
4586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
4686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport com.google.gson.Gson;
4786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
4886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn/**
4931475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn * Displays a card with more details using a {@link DetailsFragment}.
5086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn */
5186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnpublic class DetailViewExampleFragment extends DetailsFragment implements OnItemViewClickedListener,
5286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        OnItemViewSelectedListener {
5386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
5422f51aab96c6bb84d0ad3d5aa81afd0ca9d9002fRobert Hahn    public static final String TRANSITION_NAME = "t_for_transition";
5522f51aab96c6bb84d0ad3d5aa81afd0ca9d9002fRobert Hahn    public static final String EXTRA_CARD = "card";
5622f51aab96c6bb84d0ad3d5aa81afd0ca9d9002fRobert Hahn
5786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn    private ArrayObjectAdapter mRowsAdapter;
5886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
5931475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn    @Override
6022f51aab96c6bb84d0ad3d5aa81afd0ca9d9002fRobert Hahn    public void onCreate(Bundle savedInstanceState) {
6122f51aab96c6bb84d0ad3d5aa81afd0ca9d9002fRobert Hahn        super.onCreate(savedInstanceState);
6286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        setupUi();
6386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        setupEventListeners();
6486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn    }
6586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
6686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn    private void setupUi() {
6731475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn        // Load the card we want to display from a JSON resource. This JSON data could come from
6831475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn        // anywhere in a real world app, e.g. a server.
6986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        String json = Utils
7086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                .inputStreamToString(getResources().openRawResource(R.raw.detail_example));
7186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        DetailedCard data = new Gson().fromJson(json, DetailedCard.class);
7231475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn
7331475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn        // Setup fragment
7486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        setTitle(getString(R.string.detail_view_title));
7586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
7686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        FullWidthDetailsOverviewRowPresenter rowPresenter = new FullWidthDetailsOverviewRowPresenter(
7786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                new DetailsDescriptionPresenter(getActivity())) {
7831475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn
7931475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn            @Override
8031475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn            protected RowPresenter.ViewHolder createRowViewHolder(ViewGroup parent) {
8131475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn                // Customize Actionbar and Content by using custom colors.
8286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                RowPresenter.ViewHolder viewHolder = super.createRowViewHolder(parent);
8386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
8431475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn                View actionsView = viewHolder.view.
8531475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn                        findViewById(R.id.details_overview_actions_background);
8631475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn                actionsView.setBackgroundColor(getActivity().getResources().
8731475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn                        getColor(R.color.detail_view_actionbar_background, null));
8886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
8986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                View detailsView = viewHolder.view.findViewById(R.id.details_frame);
9086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                detailsView.setBackgroundColor(
9131475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn                        getResources().getColor(R.color.detail_view_background, null));
9286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                return viewHolder;
9386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn            }
9486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        };
9522f51aab96c6bb84d0ad3d5aa81afd0ca9d9002fRobert Hahn
9622f51aab96c6bb84d0ad3d5aa81afd0ca9d9002fRobert Hahn        FullWidthDetailsOverviewSharedElementHelper mHelper = new FullWidthDetailsOverviewSharedElementHelper();
9722f51aab96c6bb84d0ad3d5aa81afd0ca9d9002fRobert Hahn        mHelper.setSharedElementEnterTransition(getActivity(), TRANSITION_NAME);
9822f51aab96c6bb84d0ad3d5aa81afd0ca9d9002fRobert Hahn        rowPresenter.setListener(mHelper);
9922f51aab96c6bb84d0ad3d5aa81afd0ca9d9002fRobert Hahn        rowPresenter.setParticipatingEntranceTransition(false);
10022f51aab96c6bb84d0ad3d5aa81afd0ca9d9002fRobert Hahn        prepareEntranceTransition();
10122f51aab96c6bb84d0ad3d5aa81afd0ca9d9002fRobert Hahn
10286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        ListRowPresenter shadowDisabledRowPresenter = new ListRowPresenter();
10386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        shadowDisabledRowPresenter.setShadowEnabled(false);
10486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
10586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        // Setup PresenterSelector to distinguish between the different rows.
10686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        ClassPresenterSelector rowPresenterSelector = new ClassPresenterSelector();
10786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        rowPresenterSelector.addClassPresenter(DetailsOverviewRow.class, rowPresenter);
10886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        rowPresenterSelector.addClassPresenter(CardListRow.class, shadowDisabledRowPresenter);
10986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        rowPresenterSelector.addClassPresenter(ListRow.class, new ListRowPresenter());
11086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        mRowsAdapter = new ArrayObjectAdapter(rowPresenterSelector);
11186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
11286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        // Setup action and detail row.
11386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        DetailsOverviewRow detailsOverview = new DetailsOverviewRow(data);
11486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        int imageResId = data.getLocalImageResourceId(getActivity());
11522f51aab96c6bb84d0ad3d5aa81afd0ca9d9002fRobert Hahn
11622f51aab96c6bb84d0ad3d5aa81afd0ca9d9002fRobert Hahn        Bundle extras = getActivity().getIntent().getExtras();
11722f51aab96c6bb84d0ad3d5aa81afd0ca9d9002fRobert Hahn        if (extras != null && extras.containsKey(EXTRA_CARD)) {
11822f51aab96c6bb84d0ad3d5aa81afd0ca9d9002fRobert Hahn            imageResId = extras.getInt(EXTRA_CARD, imageResId);
11922f51aab96c6bb84d0ad3d5aa81afd0ca9d9002fRobert Hahn        }
12086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        detailsOverview.setImageDrawable(getResources().getDrawable(imageResId, null));
12186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        ArrayObjectAdapter actionAdapter = new ArrayObjectAdapter();
12286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        actionAdapter.add(new Action(1, getString(R.string.action_buy) + data.getPrice()));
12386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        actionAdapter.add(new Action(2, getString(R.string.action_wishlist)));
12486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        actionAdapter.add(new Action(3, getString(R.string.action_related)));
12586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        detailsOverview.setActionsAdapter(actionAdapter);
12686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        mRowsAdapter.add(detailsOverview);
12786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
12886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        // Setup related row.
12986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(
13086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                new CardPresenterSelector(getActivity()));
13186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        for (Card characterCard : data.getCharacters()) listRowAdapter.add(characterCard);
13286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        HeaderItem header = new HeaderItem(0, getString(R.string.header_related));
13386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        mRowsAdapter.add(new CardListRow(header, listRowAdapter, null));
13486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
13586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        // Setup recommended row.
13686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        listRowAdapter = new ArrayObjectAdapter(new CardPresenterSelector(getActivity()));
13786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        for (Card card : data.getRecommended()) listRowAdapter.add(card);
13886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        header = new HeaderItem(1, getString(R.string.header_recommended));
13986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        mRowsAdapter.add(new ListRow(header, listRowAdapter));
14086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
14186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        setAdapter(mRowsAdapter);
14222f51aab96c6bb84d0ad3d5aa81afd0ca9d9002fRobert Hahn        new Handler().postDelayed(new Runnable() {
14322f51aab96c6bb84d0ad3d5aa81afd0ca9d9002fRobert Hahn            @Override
14422f51aab96c6bb84d0ad3d5aa81afd0ca9d9002fRobert Hahn            public void run() {
14522f51aab96c6bb84d0ad3d5aa81afd0ca9d9002fRobert Hahn                startEntranceTransition();
14622f51aab96c6bb84d0ad3d5aa81afd0ca9d9002fRobert Hahn            }
14722f51aab96c6bb84d0ad3d5aa81afd0ca9d9002fRobert Hahn        }, 500);
14886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn    }
14986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
15086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn    private void setupEventListeners() {
15186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        setOnItemViewSelectedListener(this);
15286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        setOnItemViewClickedListener(this);
15386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn    }
15486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
15531475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn    @Override
15631475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn    public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
15731475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn                              RowPresenter.ViewHolder rowViewHolder, Row row) {
15886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        if (!(item instanceof Action)) return;
15986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        Action action = (Action) item;
16086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        if (action.getId() == 3) {
16186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn            setSelectedPosition(1);
16231475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn        } else {
16331475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn            Toast.makeText(getActivity(), getString(R.string.action_cicked), Toast.LENGTH_LONG)
16486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                    .show();
16531475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn        }
16686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn    }
16786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
16831475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn    @Override
16931475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn    public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
17031475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn                               RowPresenter.ViewHolder rowViewHolder, Row row) {
17186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        if (mRowsAdapter.indexOf(row) > 0) {
17231475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn            int backgroundColor = getResources().getColor(R.color.detail_view_related_background,
17331475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn                    null);
17431475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn            getView().setBackgroundColor(backgroundColor);
17586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        } else {
176fd6954036f5be6b2ca578d76e70510fa23051911Robert Hahn            getView().setBackground(null);
17786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        }
17886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn    }
17986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn}
180