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;
1686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
1786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.content.Intent;
1886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.os.Bundle;
1986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.app.BrowseFragment;
20fd6954036f5be6b2ca578d76e70510fa23051911Robert Hahnimport android.support.v17.leanback.supportleanbackshowcase.R;
21fd6954036f5be6b2ca578d76e70510fa23051911Robert Hahnimport android.support.v17.leanback.supportleanbackshowcase.app.cards.CardExampleActivity;
22ad31f63f5843898de645f6ee1ac244c872ded8ccRobert Hahnimport android.support.v17.leanback.supportleanbackshowcase.app.details.DetailViewExampleActivity;
23ad31f63f5843898de645f6ee1ac244c872ded8ccRobert Hahnimport android.support.v17.leanback.supportleanbackshowcase.app.dialog.DialogExampleActivity;
24fd6954036f5be6b2ca578d76e70510fa23051911Robert Hahnimport android.support.v17.leanback.supportleanbackshowcase.app.grid.GridExampleActivity;
25fd6954036f5be6b2ca578d76e70510fa23051911Robert Hahnimport android.support.v17.leanback.supportleanbackshowcase.app.media.MusicExampleActivity;
26fd6954036f5be6b2ca578d76e70510fa23051911Robert Hahnimport android.support.v17.leanback.supportleanbackshowcase.app.media.VideoExampleActivity;
27d0b7372b46c0c2ca913efec14fd0becf4164b121susnataimport android.support.v17.leanback.supportleanbackshowcase.app.page.PageAndListRowActivity;
28ad31f63f5843898de645f6ee1ac244c872ded8ccRobert Hahnimport android.support.v17.leanback.supportleanbackshowcase.app.settings.SettingsExampleActivity;
29ad31f63f5843898de645f6ee1ac244c872ded8ccRobert Hahnimport android.support.v17.leanback.supportleanbackshowcase.app.wizard.WizardExampleActivity;
30fd6954036f5be6b2ca578d76e70510fa23051911Robert Hahnimport android.support.v17.leanback.supportleanbackshowcase.cards.presenters.CardPresenterSelector;
31ad31f63f5843898de645f6ee1ac244c872ded8ccRobert Hahnimport android.support.v17.leanback.supportleanbackshowcase.models.Card;
32ad31f63f5843898de645f6ee1ac244c872ded8ccRobert Hahnimport android.support.v17.leanback.supportleanbackshowcase.models.CardRow;
33fd6954036f5be6b2ca578d76e70510fa23051911Robert Hahnimport android.support.v17.leanback.supportleanbackshowcase.models.Movie;
34fd6954036f5be6b2ca578d76e70510fa23051911Robert Hahnimport android.support.v17.leanback.supportleanbackshowcase.utils.Utils;
3586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.widget.ArrayObjectAdapter;
363f7de3bbcb5b30979f827fe3725bfa520349f55aRobert Hahnimport android.support.v17.leanback.widget.ImageCardView;
3786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.widget.ListRow;
3886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.widget.ListRowPresenter;
3986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.widget.OnItemViewClickedListener;
4086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.widget.OnItemViewSelectedListener;
4186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.widget.Presenter;
4286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.widget.PresenterSelector;
4386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.widget.Row;
4486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.widget.RowPresenter;
453f7de3bbcb5b30979f827fe3725bfa520349f55aRobert Hahnimport android.support.v4.app.ActivityOptionsCompat;
4686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
4786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport com.google.gson.Gson;
4886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
4986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
5086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnpublic class MainFragment extends BrowseFragment {
5186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
5286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn    private ArrayObjectAdapter mRowsAdapter;
5386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
54fd6954036f5be6b2ca578d76e70510fa23051911Robert Hahn    @Override
55fd6954036f5be6b2ca578d76e70510fa23051911Robert Hahn    public void onActivityCreated(Bundle savedInstanceState) {
5686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        super.onActivityCreated(savedInstanceState);
5786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
5886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        setupUIElements();
5986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        setupRowAdapter();
6086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        setupEventListeners();
6186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn    }
6286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
6386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn    private void setupRowAdapter() {
6486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter());
6586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        createRows();
6686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        setAdapter(mRowsAdapter);
6786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn    }
6886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
6986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn    private void createRows() {
7086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        String json = Utils
71c5dfae438096bb2b3507afd16c0a2057f225bf63Robert Hahn                .inputStreamToString(getResources().openRawResource(R.raw.launcher_cards));
7286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        CardRow[] rows = new Gson().fromJson(json, CardRow[].class);
7386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        for (CardRow row : rows) {
7486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn            mRowsAdapter.add(createCardRow(row));
7586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        }
7686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn    }
7786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
7886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn    private ListRow createCardRow(CardRow cardRow) {
7986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        PresenterSelector presenterSelector = new CardPresenterSelector(getActivity());
8086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(presenterSelector);
8186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        for (Card card : cardRow.getCards()) {
8286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn            listRowAdapter.add(card);
8386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        }
8486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        return new ListRow(listRowAdapter);
8586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn    }
8686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
8786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn    private void setupUIElements() {
8886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        setTitle(getString(R.string.browse_title));
8986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        setBadgeDrawable(getResources().getDrawable(R.drawable.title_android_tv, null));
9086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        setHeadersState(HEADERS_DISABLED);
9186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        setHeadersTransitionOnBackEnabled(false);
9286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        setBrandColor(getResources().getColor(R.color.fastlane_background));
9386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn    }
9486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
9586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn    private void setupEventListeners() {
9686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        setOnItemViewClickedListener(new ItemViewClickedListener());
9786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        setOnItemViewSelectedListener(new ItemViewSelectedListener());
9886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn    }
9986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
10086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn    private final class ItemViewClickedListener implements OnItemViewClickedListener {
10186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
102fd6954036f5be6b2ca578d76e70510fa23051911Robert Hahn        @Override
103fd6954036f5be6b2ca578d76e70510fa23051911Robert Hahn        public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
104fd6954036f5be6b2ca578d76e70510fa23051911Robert Hahn                                  RowPresenter.ViewHolder rowViewHolder, Row row) {
1053f7de3bbcb5b30979f827fe3725bfa520349f55aRobert Hahn            Intent intent = null;
10686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn            Card card = (Card) item;
10786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn            int id = card.getId();
10886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn            switch (id) {
10986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                case 0: {
1103f7de3bbcb5b30979f827fe3725bfa520349f55aRobert Hahn                    intent = new Intent(getActivity().getBaseContext(),
111fd6954036f5be6b2ca578d76e70510fa23051911Robert Hahn                            CardExampleActivity.class);
11286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                    break;
11386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                }
114d0b7372b46c0c2ca913efec14fd0becf4164b121susnata                case 1:
115d0b7372b46c0c2ca913efec14fd0becf4164b121susnata                    intent = new Intent(getActivity().getBaseContext(),
116d0b7372b46c0c2ca913efec14fd0becf4164b121susnata                            PageAndListRowActivity.class);
117d0b7372b46c0c2ca913efec14fd0becf4164b121susnata                    break;
11886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                case 2: {
1193f7de3bbcb5b30979f827fe3725bfa520349f55aRobert Hahn                    intent = new Intent(getActivity().getBaseContext(),
120fd6954036f5be6b2ca578d76e70510fa23051911Robert Hahn                            GridExampleActivity.class);
12186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                    break;
12286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                }
12386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                case 3: {
1243f7de3bbcb5b30979f827fe3725bfa520349f55aRobert Hahn                    intent = new Intent(getActivity().getBaseContext(),
12531475959eb09fd873551909dd21d00304b6a4ee9Robert Hahn                            DetailViewExampleActivity.class);
12686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                    break;
12786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                }
12886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                case 4: {
1293f7de3bbcb5b30979f827fe3725bfa520349f55aRobert Hahn                    intent = new Intent(getActivity().getBaseContext(),
130fd6954036f5be6b2ca578d76e70510fa23051911Robert Hahn                            VideoExampleActivity.class);
13186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                    break;
13286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                }
13386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                case 5: {
1343f7de3bbcb5b30979f827fe3725bfa520349f55aRobert Hahn                    intent = new Intent(getActivity().getBaseContext(),
135fd6954036f5be6b2ca578d76e70510fa23051911Robert Hahn                            MusicExampleActivity.class);
13686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                    break;
13786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                }
13886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                case 6: {
13986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                    // Let's create a new Wizard for a given Movie. The movie can come from any sort
14086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                    // of data source. To simplify this example we decode it from a JSON source
14186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                    // which might be loaded from a server in a real world example.
1423f7de3bbcb5b30979f827fe3725bfa520349f55aRobert Hahn                    intent = new Intent(getActivity().getBaseContext(),
14386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                            WizardExampleActivity.class);
14486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
14586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                    // Prepare extras which contains the Movie and will be passed to the Activity
14686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                    // which is started through the Intent/.
14786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                    Bundle extras = new Bundle();
14886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                    String json = Utils.inputStreamToString(
14986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                            getResources().openRawResource(R.raw.wizard_example));
15086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                    Movie movie = new Gson().fromJson(json, Movie.class);
15186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                    extras.putSerializable("movie", movie);
15286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                    intent.putExtras(extras);
15386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
15486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                    // Finally, start the wizard Activity.
15586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                    break;
15686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                }
15786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                case 7: {
1583f7de3bbcb5b30979f827fe3725bfa520349f55aRobert Hahn                    intent = new Intent(getActivity().getBaseContext(),
15986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                            SettingsExampleActivity.class);
16086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                    startActivity(intent);
1613f7de3bbcb5b30979f827fe3725bfa520349f55aRobert Hahn                    return;
16286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                }
16386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                case 8: {
1643f7de3bbcb5b30979f827fe3725bfa520349f55aRobert Hahn                    intent = new Intent(getActivity().getBaseContext(),
16586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                            DialogExampleActivity.class);
16686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                    break;
16786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                }
16886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                default:
16986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                    break;
17086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn            }
1713f7de3bbcb5b30979f827fe3725bfa520349f55aRobert Hahn            if (intent != null) {
17222f51aab96c6bb84d0ad3d5aa81afd0ca9d9002fRobert Hahn                Bundle bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity())
1733f7de3bbcb5b30979f827fe3725bfa520349f55aRobert Hahn                        .toBundle();
1743f7de3bbcb5b30979f827fe3725bfa520349f55aRobert Hahn                startActivity(intent, bundle);
1753f7de3bbcb5b30979f827fe3725bfa520349f55aRobert Hahn            }
17686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        }
17786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn    }
17886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
17986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn    private final class ItemViewSelectedListener implements OnItemViewSelectedListener {
18086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
181fd6954036f5be6b2ca578d76e70510fa23051911Robert Hahn        @Override
182fd6954036f5be6b2ca578d76e70510fa23051911Robert Hahn        public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
183fd6954036f5be6b2ca578d76e70510fa23051911Robert Hahn                                   RowPresenter.ViewHolder rowViewHolder, Row row) {
18486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        }
18586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn    }
18686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn}
187