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.cards;
16
17import android.content.Intent;
18import android.os.Bundle;
19import android.os.Handler;
20import android.support.v17.leanback.app.BrowseFragment;
21import android.support.v17.leanback.supportleanbackshowcase.R;
22import android.support.v17.leanback.supportleanbackshowcase.app.details.DetailViewExampleActivity;
23import android.support.v17.leanback.supportleanbackshowcase.app.details.DetailViewExampleFragment;
24import android.support.v17.leanback.supportleanbackshowcase.app.details.ShadowRowPresenterSelector;
25import android.support.v17.leanback.supportleanbackshowcase.cards.presenters.CardPresenterSelector;
26import android.support.v17.leanback.supportleanbackshowcase.models.Card;
27import android.support.v17.leanback.supportleanbackshowcase.models.CardRow;
28import android.support.v17.leanback.supportleanbackshowcase.utils.CardListRow;
29import android.support.v17.leanback.supportleanbackshowcase.utils.Utils;
30import android.support.v17.leanback.widget.ArrayObjectAdapter;
31import android.support.v17.leanback.widget.HeaderItem;
32import android.support.v17.leanback.widget.ImageCardView;
33import android.support.v17.leanback.widget.DividerRow;
34import android.support.v17.leanback.widget.SectionRow;
35import android.support.v17.leanback.widget.ListRow;
36import android.support.v17.leanback.widget.OnItemViewClickedListener;
37import android.support.v17.leanback.widget.Presenter;
38import android.support.v17.leanback.widget.PresenterSelector;
39import android.support.v17.leanback.widget.Row;
40import android.support.v17.leanback.widget.RowPresenter;
41import android.support.v17.leanback.widget.SearchOrbView;
42import android.support.v4.app.ActivityOptionsCompat;
43import android.view.View;
44import android.widget.ImageView;
45import android.widget.Toast;
46
47import com.google.gson.Gson;
48
49/**
50 * This fragment will be shown when the "Card Examples" card is selected at the home menu. It will
51 * display multiple card types.
52 */
53public class CardExampleFragment extends BrowseFragment {
54
55    private ArrayObjectAdapter mRowsAdapter;
56
57    @Override public void onActivityCreated(Bundle savedInstanceState) {
58        super.onActivityCreated(savedInstanceState);
59        setupUi();
60        setupRowAdapter();
61    }
62
63    private void setupUi() {
64        setHeadersState(HEADERS_ENABLED);
65        setHeadersTransitionOnBackEnabled(true);
66        setTitle(getString(R.string.card_examples_title));
67        setOnSearchClickedListener(new View.OnClickListener() {
68            @Override
69            public void onClick(View v) {
70                Toast.makeText(getActivity(), getString(R.string.implement_search),
71                        Toast.LENGTH_LONG).show();
72            }
73        });
74        setOnItemViewClickedListener(new OnItemViewClickedListener() {
75
76            @Override
77            public void onItemClicked(Presenter.ViewHolder viewHolder, Object item, RowPresenter.ViewHolder viewHolder1, Row row) {
78                if (!(item instanceof Card)) return;
79                if (!(viewHolder.view instanceof ImageCardView)) return;
80
81                ImageView imageView = ((ImageCardView) viewHolder.view).getMainImageView();
82                Bundle bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity(),
83                        imageView, DetailViewExampleFragment.TRANSITION_NAME).toBundle();
84                Intent intent = new Intent(getActivity().getBaseContext(),
85                        DetailViewExampleActivity.class);
86                Card card = (Card) item;
87                int imageResId = card.getLocalImageResourceId(getContext());
88                intent.putExtra(DetailViewExampleFragment.EXTRA_CARD, imageResId);
89                startActivity(intent, bundle);
90            }
91
92        });
93
94        prepareEntranceTransition();
95    }
96
97    private void setupRowAdapter() {
98        mRowsAdapter = new ArrayObjectAdapter(new ShadowRowPresenterSelector());
99        setAdapter(mRowsAdapter);
100        new Handler().postDelayed(new Runnable() {
101            @Override
102            public void run() {
103                createRows();
104                startEntranceTransition();
105            }
106        }, 500);
107    }
108
109    private void createRows() {
110        String json = Utils
111                .inputStreamToString(getResources().openRawResource(R.raw.cards_example));
112        CardRow[] rows = new Gson().fromJson(json, CardRow[].class);
113        for (CardRow row : rows) {
114            mRowsAdapter.add(createCardRow(row));
115        }
116    }
117
118    private Row createCardRow(final CardRow cardRow) {
119        switch (cardRow.getType()) {
120            case CardRow.TYPE_SECTION_HEADER:
121                return new SectionRow(new HeaderItem(cardRow.getTitle()));
122            case CardRow.TYPE_DIVIDER:
123                return new DividerRow();
124            case CardRow.TYPE_DEFAULT:
125            default:
126                // Build main row using the ImageCardViewPresenter.
127                PresenterSelector presenterSelector = new CardPresenterSelector(getActivity());
128                ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(presenterSelector);
129                for (Card card : cardRow.getCards()) {
130                    listRowAdapter.add(card);
131                }
132                return new CardListRow(new HeaderItem(cardRow.getTitle()), listRowAdapter, cardRow);
133        }
134    }
135
136}
137