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;
16
17import android.content.Intent;
18import android.os.Bundle;
19import android.support.v17.leanback.app.BrowseFragment;
20import android.support.v17.leanback.supportleanbackshowcase.R;
21import android.support.v17.leanback.supportleanbackshowcase.app.cards.CardExampleActivity;
22import android.support.v17.leanback.supportleanbackshowcase.app.details.DetailViewExampleActivity;
23import android.support.v17.leanback.supportleanbackshowcase.app.dialog.DialogExampleActivity;
24import android.support.v17.leanback.supportleanbackshowcase.app.grid.GridExampleActivity;
25import android.support.v17.leanback.supportleanbackshowcase.app.media.MusicExampleActivity;
26import android.support.v17.leanback.supportleanbackshowcase.app.media.VideoExampleActivity;
27import android.support.v17.leanback.supportleanbackshowcase.app.page.PageAndListRowActivity;
28import android.support.v17.leanback.supportleanbackshowcase.app.settings.SettingsExampleActivity;
29import android.support.v17.leanback.supportleanbackshowcase.app.wizard.WizardExampleActivity;
30import android.support.v17.leanback.supportleanbackshowcase.cards.presenters.CardPresenterSelector;
31import android.support.v17.leanback.supportleanbackshowcase.models.Card;
32import android.support.v17.leanback.supportleanbackshowcase.models.CardRow;
33import android.support.v17.leanback.supportleanbackshowcase.models.Movie;
34import android.support.v17.leanback.supportleanbackshowcase.utils.Utils;
35import android.support.v17.leanback.widget.ArrayObjectAdapter;
36import android.support.v17.leanback.widget.ImageCardView;
37import android.support.v17.leanback.widget.ListRow;
38import android.support.v17.leanback.widget.ListRowPresenter;
39import android.support.v17.leanback.widget.OnItemViewClickedListener;
40import android.support.v17.leanback.widget.OnItemViewSelectedListener;
41import android.support.v17.leanback.widget.Presenter;
42import android.support.v17.leanback.widget.PresenterSelector;
43import android.support.v17.leanback.widget.Row;
44import android.support.v17.leanback.widget.RowPresenter;
45import android.support.v4.app.ActivityOptionsCompat;
46
47import com.google.gson.Gson;
48
49
50public class MainFragment extends BrowseFragment {
51
52    private ArrayObjectAdapter mRowsAdapter;
53
54    @Override
55    public void onActivityCreated(Bundle savedInstanceState) {
56        super.onActivityCreated(savedInstanceState);
57
58        setupUIElements();
59        setupRowAdapter();
60        setupEventListeners();
61    }
62
63    private void setupRowAdapter() {
64        mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter());
65        createRows();
66        setAdapter(mRowsAdapter);
67    }
68
69    private void createRows() {
70        String json = Utils
71                .inputStreamToString(getResources().openRawResource(R.raw.launcher_cards));
72        CardRow[] rows = new Gson().fromJson(json, CardRow[].class);
73        for (CardRow row : rows) {
74            mRowsAdapter.add(createCardRow(row));
75        }
76    }
77
78    private ListRow createCardRow(CardRow cardRow) {
79        PresenterSelector presenterSelector = new CardPresenterSelector(getActivity());
80        ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(presenterSelector);
81        for (Card card : cardRow.getCards()) {
82            listRowAdapter.add(card);
83        }
84        return new ListRow(listRowAdapter);
85    }
86
87    private void setupUIElements() {
88        setTitle(getString(R.string.browse_title));
89        setBadgeDrawable(getResources().getDrawable(R.drawable.title_android_tv, null));
90        setHeadersState(HEADERS_DISABLED);
91        setHeadersTransitionOnBackEnabled(false);
92        setBrandColor(getResources().getColor(R.color.fastlane_background));
93    }
94
95    private void setupEventListeners() {
96        setOnItemViewClickedListener(new ItemViewClickedListener());
97        setOnItemViewSelectedListener(new ItemViewSelectedListener());
98    }
99
100    private final class ItemViewClickedListener implements OnItemViewClickedListener {
101
102        @Override
103        public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
104                                  RowPresenter.ViewHolder rowViewHolder, Row row) {
105            Intent intent = null;
106            Card card = (Card) item;
107            int id = card.getId();
108            switch (id) {
109                case 0: {
110                    intent = new Intent(getActivity().getBaseContext(),
111                            CardExampleActivity.class);
112                    break;
113                }
114                case 1:
115                    intent = new Intent(getActivity().getBaseContext(),
116                            PageAndListRowActivity.class);
117                    break;
118                case 2: {
119                    intent = new Intent(getActivity().getBaseContext(),
120                            GridExampleActivity.class);
121                    break;
122                }
123                case 3: {
124                    intent = new Intent(getActivity().getBaseContext(),
125                            DetailViewExampleActivity.class);
126                    break;
127                }
128                case 4: {
129                    intent = new Intent(getActivity().getBaseContext(),
130                            VideoExampleActivity.class);
131                    break;
132                }
133                case 5: {
134                    intent = new Intent(getActivity().getBaseContext(),
135                            MusicExampleActivity.class);
136                    break;
137                }
138                case 6: {
139                    // Let's create a new Wizard for a given Movie. The movie can come from any sort
140                    // of data source. To simplify this example we decode it from a JSON source
141                    // which might be loaded from a server in a real world example.
142                    intent = new Intent(getActivity().getBaseContext(),
143                            WizardExampleActivity.class);
144
145                    // Prepare extras which contains the Movie and will be passed to the Activity
146                    // which is started through the Intent/.
147                    Bundle extras = new Bundle();
148                    String json = Utils.inputStreamToString(
149                            getResources().openRawResource(R.raw.wizard_example));
150                    Movie movie = new Gson().fromJson(json, Movie.class);
151                    extras.putSerializable("movie", movie);
152                    intent.putExtras(extras);
153
154                    // Finally, start the wizard Activity.
155                    break;
156                }
157                case 7: {
158                    intent = new Intent(getActivity().getBaseContext(),
159                            SettingsExampleActivity.class);
160                    startActivity(intent);
161                    return;
162                }
163                case 8: {
164                    intent = new Intent(getActivity().getBaseContext(),
165                            DialogExampleActivity.class);
166                    break;
167                }
168                default:
169                    break;
170            }
171            if (intent != null) {
172                Bundle bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity())
173                        .toBundle();
174                startActivity(intent, bundle);
175            }
176        }
177    }
178
179    private final class ItemViewSelectedListener implements OnItemViewSelectedListener {
180
181        @Override
182        public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
183                                   RowPresenter.ViewHolder rowViewHolder, Row row) {
184        }
185    }
186}
187