12223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn/*
22223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn * Copyright (C) 2014 The Android Open Source Project
32223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn *
42223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
52223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn * in compliance with the License. You may obtain a copy of the License at
62223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn *
72223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn * http://www.apache.org/licenses/LICENSE-2.0
82223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn *
92223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn * Unless required by applicable law or agreed to in writing, software distributed under the License
102223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
112223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn * or implied. See the License for the specific language governing permissions and limitations under
122223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn * the License.
132223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn */
142223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbournpackage com.example.android.leanback;
152223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn
16c578ad430b51de0151ca9b3299d84f73bb71286bsusnataimport android.app.Fragment;
171684edec87235b40126662107630cf0f603c45eaTim Kilbournimport android.content.Intent;
182223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbournimport android.os.Bundle;
1967a49ad87bfde1a06a5c4b423184a89b15328604Dake Guimport android.os.Handler;
20def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport android.util.Log;
21def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport android.view.LayoutInflater;
22def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport android.view.View;
23def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport android.view.ViewGroup;
24def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikas
25def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport androidx.core.app.ActivityOptionsCompat;
26def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport androidx.core.content.res.ResourcesCompat;
27ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.app.GuidedStepFragment;
28ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.app.RowsFragment;
29ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.ArrayObjectAdapter;
30ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.DividerRow;
31ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.HeaderItem;
32ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.ImageCardView;
33ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.ListRow;
34ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.ListRowPresenter;
35ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.OnItemViewClickedListener;
36ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.OnItemViewSelectedListener;
37ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.PageRow;
38ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.Presenter;
39ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.Row;
40ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.RowPresenter;
41ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.SectionRow;
422223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn
43ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikaspublic class BrowseFragment extends androidx.leanback.app.BrowseFragment {
442223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn    private static final String TAG = "leanback.BrowseFragment";
452223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn
4667a49ad87bfde1a06a5c4b423184a89b15328604Dake Gu    private static final boolean TEST_ENTRANCE_TRANSITION = true;
47380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata    private static final int NUM_ROWS = 8;
48380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata    private static final long HEADER_ID1 = 1001;
49380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata    private static final long HEADER_ID2 = 1002;
508f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata    private static final long HEADER_ID3 = 1003;
51005084f6f0860a69c80492d3549a687ffb283c40Craig Stout
522223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn    private ArrayObjectAdapter mRowsAdapter;
53181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu    private BackgroundHelper mBackgroundHelper;
542223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn
55da2c70f656f02c377b796694ca27d93e2b698733Dake Gu    // For good performance, it's important to use a single instance of
56da2c70f656f02c377b796694ca27d93e2b698733Dake Gu    // a card presenter for all rows using that presenter.
5787b904ffa106f12f2fecfe8b9a46084863678f29Dake Gu    final CardPresenter mCardPresenter = new CardPresenter();
5887b904ffa106f12f2fecfe8b9a46084863678f29Dake Gu    final CardPresenter mCardPresenter2 = new CardPresenter(R.style.MyImageCardViewTheme);
59da2c70f656f02c377b796694ca27d93e2b698733Dake Gu
60c578ad430b51de0151ca9b3299d84f73bb71286bsusnata    public BrowseFragment() {
61380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata        getMainFragmentRegistry().registerFragment(PageRow.class, new PageRowFragmentFactory());
62c578ad430b51de0151ca9b3299d84f73bb71286bsusnata    }
63c578ad430b51de0151ca9b3299d84f73bb71286bsusnata
642223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn    @Override
652223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn    public void onCreate(Bundle savedInstanceState) {
662223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn        Log.i(TAG, "onCreate");
672223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn        super.onCreate(savedInstanceState);
682223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn
69181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu        mBackgroundHelper = new BackgroundHelper(getActivity());
70181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu        mBackgroundHelper.attachToWindow();
71181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu
72b7087e036a48f5a3db28d02ff7f9b97fbbc46c4fDake Gu        setBadgeDrawable(ResourcesCompat.getDrawable(getActivity().getResources(),
73b7087e036a48f5a3db28d02ff7f9b97fbbc46c4fDake Gu                R.drawable.ic_title, getActivity().getTheme()));
742085f1d8c47e93c8bf94d137533fd126d32a48b4Craig Stout        setTitle("Leanback Sample App");
752085f1d8c47e93c8bf94d137533fd126d32a48b4Craig Stout        setHeadersState(HEADERS_ENABLED);
76816bfc28b79d802b4366684775df74cf40109e6eJerome Poichet        setOnSearchClickedListener(new View.OnClickListener() {
77816bfc28b79d802b4366684775df74cf40109e6eJerome Poichet            @Override
78816bfc28b79d802b4366684775df74cf40109e6eJerome Poichet            public void onClick(View view) {
79816bfc28b79d802b4366684775df74cf40109e6eJerome Poichet                Intent intent = new Intent(getActivity(), SearchActivity.class);
80816bfc28b79d802b4366684775df74cf40109e6eJerome Poichet                startActivity(intent);
81816bfc28b79d802b4366684775df74cf40109e6eJerome Poichet            }
82816bfc28b79d802b4366684775df74cf40109e6eJerome Poichet        });
83816bfc28b79d802b4366684775df74cf40109e6eJerome Poichet
847f3028385b0349cfc6c0d6784840be148943b296Dake Gu        setOnItemViewClickedListener(new ItemViewClickedListener());
85ffd20ebba154edf2374a53d4bb1c682b6737ab77Craig Stout        setOnItemViewSelectedListener(new OnItemViewSelectedListener() {
86ffd20ebba154edf2374a53d4bb1c682b6737ab77Craig Stout            @Override
87ffd20ebba154edf2374a53d4bb1c682b6737ab77Craig Stout            public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
88ffd20ebba154edf2374a53d4bb1c682b6737ab77Craig Stout                    RowPresenter.ViewHolder rowViewHolder, Row row) {
89ffd20ebba154edf2374a53d4bb1c682b6737ab77Craig Stout                Log.i(TAG, "onItemSelected: " + item + " row " + row);
90af136b73e6c8e377914e494f9870da1618be20d0Craig Stout
91181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu                updateBackgroundToSelection();
92181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu            }
93181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu        });
94181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu        setBrowseTransitionListener(new BrowseTransitionListener() {
95181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu            @Override
96181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu            public void onHeadersTransitionStop(boolean withHeaders) {
97181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu                updateBackgroundToSelection();
98ffd20ebba154edf2374a53d4bb1c682b6737ab77Craig Stout            }
99ffd20ebba154edf2374a53d4bb1c682b6737ab77Craig Stout        });
10067a49ad87bfde1a06a5c4b423184a89b15328604Dake Gu        if (TEST_ENTRANCE_TRANSITION) {
101da2c70f656f02c377b796694ca27d93e2b698733Dake Gu            // don't run entrance transition if fragment is restored.
10267a49ad87bfde1a06a5c4b423184a89b15328604Dake Gu            if (savedInstanceState == null) {
1039744dea0e0ea62d654a1bb352cb60201d869e390Dake Gu                prepareEntranceTransition();
10467a49ad87bfde1a06a5c4b423184a89b15328604Dake Gu            }
10567a49ad87bfde1a06a5c4b423184a89b15328604Dake Gu        }
106380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata
107da2c70f656f02c377b796694ca27d93e2b698733Dake Gu        // simulates in a real world use case  data being loaded two seconds later
108da2c70f656f02c377b796694ca27d93e2b698733Dake Gu        new Handler().postDelayed(new Runnable() {
109e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas            @Override
110da2c70f656f02c377b796694ca27d93e2b698733Dake Gu            public void run() {
11135d7a6c31606ed4ca38deda3cacae080a95c95c9susnata                setupRows();
112da2c70f656f02c377b796694ca27d93e2b698733Dake Gu                loadData();
113da2c70f656f02c377b796694ca27d93e2b698733Dake Gu                startEntranceTransition();
114da2c70f656f02c377b796694ca27d93e2b698733Dake Gu            }
115da2c70f656f02c377b796694ca27d93e2b698733Dake Gu        }, 2000);
1162223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn    }
1172223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn
118c578ad430b51de0151ca9b3299d84f73bb71286bsusnata    @Override
119181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu    public void onStart() {
120181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu        super.onStart();
121181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu        updateBackgroundToSelection();
122181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu    }
123181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu
124181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu    void updateBackgroundToSelection() {
125181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu        if (!isShowingHeaders()) {
126181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu            RowPresenter.ViewHolder rowViewHolder = getSelectedRowViewHolder();
127181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu            Object item = rowViewHolder == null ? null : rowViewHolder.getSelectedItem();
128181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu            if (item != null) {
129181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu                mBackgroundHelper.setBackground(((PhotoItem) item).getImageResourceId());
130181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu            } else {
131181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu                mBackgroundHelper.clearDrawable();
132181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu            }
133181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu        } else {
134181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu            mBackgroundHelper.clearDrawable();
135181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu        }
136181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu    }
137181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu
138181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu    @Override
139c578ad430b51de0151ca9b3299d84f73bb71286bsusnata    public View onCreateView(
140c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
141c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        return super.onCreateView(inflater, container, savedInstanceState);
142c578ad430b51de0151ca9b3299d84f73bb71286bsusnata    }
1432223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn
144c578ad430b51de0151ca9b3299d84f73bb71286bsusnata    private void setupRows() {
1454ff7f6d210b75531b3dce98f8028804f55c72051susnata        ListRowPresenter listRowPresenter = new ListRowPresenter();
14648cbca8d2f412611a09e4f231055f10573a1f45asusnata        listRowPresenter.setNumRows(1);
1474ff7f6d210b75531b3dce98f8028804f55c72051susnata        mRowsAdapter = new ArrayObjectAdapter(listRowPresenter);
148da2c70f656f02c377b796694ca27d93e2b698733Dake Gu    }
1490cd6f9d62c8b026d4e94f424c91f4083f26f61aaCraig Stout
150da2c70f656f02c377b796694ca27d93e2b698733Dake Gu    private void loadData() {
151c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        int i = 0;
152380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata
1535635fbd2da9e73c8f68287626728f909565c7a8aDake Gu        mRowsAdapter.add(new PageRow(new HeaderItem(HEADER_ID1, "Page Row 0")));
1545635fbd2da9e73c8f68287626728f909565c7a8aDake Gu        mRowsAdapter.add(new DividerRow());
155380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata
1565635fbd2da9e73c8f68287626728f909565c7a8aDake Gu        mRowsAdapter.add(new SectionRow(new HeaderItem("section 0")));
157c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        for (; i < NUM_ROWS; ++i) {
15848cbca8d2f412611a09e4f231055f10573a1f45asusnata            HeaderItem headerItem = new HeaderItem(i, "Row " + i);
15948cbca8d2f412611a09e4f231055f10573a1f45asusnata            headerItem.setDescription("Description for Row "+i);
16048cbca8d2f412611a09e4f231055f10573a1f45asusnata            mRowsAdapter.add(new ListRow(headerItem, createListRowAdapter(i)));
1612223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn        }
1622223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn
1635635fbd2da9e73c8f68287626728f909565c7a8aDake Gu        mRowsAdapter.add(new DividerRow());
1645635fbd2da9e73c8f68287626728f909565c7a8aDake Gu        mRowsAdapter.add(new PageRow(new HeaderItem(HEADER_ID2, "Page Row 1")));
1658f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata
1668f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata        mRowsAdapter.add(new PageRow(new HeaderItem(HEADER_ID3, "Page Row 2")));
16799e222d5b14544bbb89d402eb704829c642f8abfDake Gu        setAdapter(mRowsAdapter);
168c578ad430b51de0151ca9b3299d84f73bb71286bsusnata    }
169c578ad430b51de0151ca9b3299d84f73bb71286bsusnata
170c578ad430b51de0151ca9b3299d84f73bb71286bsusnata    private ArrayObjectAdapter createListRowAdapter(int i) {
171c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter((i & 1) == 0 ?
172c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                mCardPresenter : mCardPresenter2);
173c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        listRowAdapter.add(new PhotoItem(
174c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                "Hello world",
175c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                R.drawable.gallery_photo_1));
176c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        listRowAdapter.add(new PhotoItem(
177c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                "This is a test",
178c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                "Only a test",
179c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                R.drawable.gallery_photo_2));
180c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        listRowAdapter.add(new PhotoItem(
181c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                "Android TV",
182c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                "by Google",
183c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                R.drawable.gallery_photo_3));
184c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        listRowAdapter.add(new PhotoItem(
185c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                "Leanback",
186c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                R.drawable.gallery_photo_4));
187c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        listRowAdapter.add(new PhotoItem(
188c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                "GuidedStep (Slide left/right)",
189c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                R.drawable.gallery_photo_5));
190c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        listRowAdapter.add(new PhotoItem(
191c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                "GuidedStep (Slide bottom up)",
192c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                "Open GuidedStepFragment",
193c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                R.drawable.gallery_photo_6));
194c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        listRowAdapter.add(new PhotoItem(
195c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                "Android TV",
196c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                "open RowsActivity",
197c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                R.drawable.gallery_photo_7));
198c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        listRowAdapter.add(new PhotoItem(
199c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                "Leanback",
200c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                "open BrowseActivity",
201c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                R.drawable.gallery_photo_8));
2028f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata        listRowAdapter.add(new PhotoItem(
2034ff7f6d210b75531b3dce98f8028804f55c72051susnata                "Hello world",
2044ff7f6d210b75531b3dce98f8028804f55c72051susnata                R.drawable.gallery_photo_1));
2054ff7f6d210b75531b3dce98f8028804f55c72051susnata        listRowAdapter.add(new PhotoItem(
2064ff7f6d210b75531b3dce98f8028804f55c72051susnata                "This is a test",
2074ff7f6d210b75531b3dce98f8028804f55c72051susnata                "Only a test",
2084ff7f6d210b75531b3dce98f8028804f55c72051susnata                R.drawable.gallery_photo_2));
2094ff7f6d210b75531b3dce98f8028804f55c72051susnata        listRowAdapter.add(new PhotoItem(
2104ff7f6d210b75531b3dce98f8028804f55c72051susnata                "Android TV",
2114ff7f6d210b75531b3dce98f8028804f55c72051susnata                "by Google",
2124ff7f6d210b75531b3dce98f8028804f55c72051susnata                R.drawable.gallery_photo_3));
2138f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata        listRowAdapter.add(new PhotoItem(
2148f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                "Leanback",
2154ff7f6d210b75531b3dce98f8028804f55c72051susnata                R.drawable.gallery_photo_4));
216c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        return listRowAdapter;
2172223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn    }
2181684edec87235b40126662107630cf0f603c45eaTim Kilbourn
2197f3028385b0349cfc6c0d6784840be148943b296Dake Gu    private final class ItemViewClickedListener implements OnItemViewClickedListener {
2207f3028385b0349cfc6c0d6784840be148943b296Dake Gu        @Override
2217f3028385b0349cfc6c0d6784840be148943b296Dake Gu        public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
2227f3028385b0349cfc6c0d6784840be148943b296Dake Gu                RowPresenter.ViewHolder rowViewHolder, Row row) {
2237f3028385b0349cfc6c0d6784840be148943b296Dake Gu
224f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu            Intent intent;
225f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu            Bundle bundle;
226da2c70f656f02c377b796694ca27d93e2b698733Dake Gu            if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_6) {
227da2c70f656f02c377b796694ca27d93e2b698733Dake Gu                GuidedStepFragment.add(getFragmentManager(),
22820767a171ab46addb5d50248d4267db14c0c8883susnata                        new GuidedStepHalfScreenActivity.FirstStepFragment(),
229ee3c13ee552002263be40f6a5986f61c605b0bacDake Gu                        R.id.lb_guidedstep_host);
230da2c70f656f02c377b796694ca27d93e2b698733Dake Gu                return;
23120767a171ab46addb5d50248d4267db14c0c8883susnata            } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_5) {
23220767a171ab46addb5d50248d4267db14c0c8883susnata                GuidedStepFragment.add(getFragmentManager(),
233c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                        new GuidedStepActivity.FirstStepFragment(), R.id.lb_guidedstep_host);
234c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                return;
235c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_8) {
236f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu                intent = new Intent(getActivity(), BrowseActivity.class);
237f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu                bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity())
238f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu                        .toBundle();
239c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_7) {
240f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu                intent = new Intent(getActivity(), RowsActivity.class);
241f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu                bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity())
242f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu                        .toBundle();
24367a49ad87bfde1a06a5c4b423184a89b15328604Dake Gu            } else {
244f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu                intent = new Intent(getActivity(), DetailsActivity.class);
245f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu                intent.putExtra(DetailsActivity.EXTRA_ITEM, (PhotoItem) item);
246f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu                bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(
247f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu                        getActivity(),
248c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                        ((ImageCardView) itemViewHolder.view).getMainImageView(),
249f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu                        DetailsActivity.SHARED_ELEMENT_NAME).toBundle();
25067a49ad87bfde1a06a5c4b423184a89b15328604Dake Gu            }
251f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu            getActivity().startActivity(intent, bundle);
2521684edec87235b40126662107630cf0f603c45eaTim Kilbourn        }
2531684edec87235b40126662107630cf0f603c45eaTim Kilbourn    }
254c578ad430b51de0151ca9b3299d84f73bb71286bsusnata
255380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata    public static class PageRowFragmentFactory extends FragmentFactory {
256c578ad430b51de0151ca9b3299d84f73bb71286bsusnata
257c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        @Override
258380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata        public Fragment createFragment(Object rowObj) {
259380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata            Row row = (Row) rowObj;
260380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata            if (row.getHeaderItem().getId() == HEADER_ID1) {
2615f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu                return new SampleRowsFragment();
262380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata            } else if (row.getHeaderItem().getId() == HEADER_ID2) {
263380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata                return new SampleRowsFragment();
2648f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata            } else if (row.getHeaderItem().getId() == HEADER_ID3) {
2658f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                return new SampleFragment();
266c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            }
267380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata
268380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata            return null;
269c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        }
270c578ad430b51de0151ca9b3299d84f73bb71286bsusnata    }
271c578ad430b51de0151ca9b3299d84f73bb71286bsusnata
272380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata    public static class SampleRowsFragment extends RowsFragment {
273c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        final CardPresenter mCardPresenter = new CardPresenter();
274c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        final CardPresenter mCardPresenter2 = new CardPresenter(R.style.MyImageCardViewTheme);
275c578ad430b51de0151ca9b3299d84f73bb71286bsusnata
2765f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu        void loadFragmentData() {
27799e222d5b14544bbb89d402eb704829c642f8abfDake Gu            ArrayObjectAdapter adapter = new ArrayObjectAdapter(new ListRowPresenter());
278380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata            for (int i = 0; i < 4; i++) {
279380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata                ListRow row = new ListRow(new HeaderItem("Row " + i), createListRowAdapter(i));
280380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata                adapter.add(row);
281c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            }
2825f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu            if (getMainFragmentAdapter() != null) {
2835f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu                getMainFragmentAdapter().getFragmentHost()
2845f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu                        .notifyDataReady(getMainFragmentAdapter());
2855f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu            }
28699e222d5b14544bbb89d402eb704829c642f8abfDake Gu            setAdapter(adapter);
2875f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu        }
2885f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu
2895f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu        public SampleRowsFragment() {
2905f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu            // simulates late data loading:
2915f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu            new Handler().postDelayed(new Runnable() {
292e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas                @Override
2935f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu                public void run() {
2945f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu                    loadFragmentData();
2955f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu                }
2965f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu            }, 500);
297380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata
298380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata            setOnItemViewClickedListener(new OnItemViewClickedListener() {
299380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata                @Override
3004ff7f6d210b75531b3dce98f8028804f55c72051susnata                public void onItemClicked(
3014ff7f6d210b75531b3dce98f8028804f55c72051susnata                        Presenter.ViewHolder itemViewHolder,
3024ff7f6d210b75531b3dce98f8028804f55c72051susnata                        Object item,
3034ff7f6d210b75531b3dce98f8028804f55c72051susnata                        RowPresenter.ViewHolder rowViewHolder,
3044ff7f6d210b75531b3dce98f8028804f55c72051susnata                        Row row) {
3058f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                    Intent intent;
3068f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                    Bundle bundle;
3078f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                    if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_6) {
3085f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu                        GuidedStepFragment.add(getActivity().getFragmentManager(),
3098f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                                new GuidedStepHalfScreenActivity.FirstStepFragment(),
3108f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                                R.id.lb_guidedstep_host);
3118f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                        return;
3128f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                    } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_5) {
3135f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu                        GuidedStepFragment.add(getActivity().getFragmentManager(),
3148f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                                new GuidedStepActivity.FirstStepFragment(), R.id.lb_guidedstep_host);
3158f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                        return;
3168f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                    } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_8) {
3178f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                        intent = new Intent(getActivity(), BrowseActivity.class);
3188f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                        bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity())
3198f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                                .toBundle();
3208f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                    } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_7) {
3218f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                        intent = new Intent(getActivity(), RowsActivity.class);
3228f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                        bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity())
3238f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                                .toBundle();
3248f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                    } else {
3258f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                        intent = new Intent(getActivity(), DetailsActivity.class);
3268f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                        intent.putExtra(DetailsActivity.EXTRA_ITEM, (PhotoItem) item);
3278f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                        bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(
3288f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                                getActivity(),
3298f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                                ((ImageCardView) itemViewHolder.view).getMainImageView(),
3308f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                                DetailsActivity.SHARED_ELEMENT_NAME).toBundle();
3318f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                    }
3328f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                    getActivity().startActivity(intent, bundle);
333380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata                }
334380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata            });
335c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        }
336c578ad430b51de0151ca9b3299d84f73bb71286bsusnata
337c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        private ArrayObjectAdapter createListRowAdapter(int i) {
338c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter((i & 1) == 0 ?
339c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    mCardPresenter : mCardPresenter2);
340c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            listRowAdapter.add(new PhotoItem(
341c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    "Hello world",
342c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    R.drawable.gallery_photo_1));
343c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            listRowAdapter.add(new PhotoItem(
344c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    "This is a test",
345c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    "Only a test",
346c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    R.drawable.gallery_photo_2));
347c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            listRowAdapter.add(new PhotoItem(
348c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    "Android TV",
349c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    "by Google",
350c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    R.drawable.gallery_photo_3));
351c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            listRowAdapter.add(new PhotoItem(
352c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    "Leanback",
353c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    R.drawable.gallery_photo_4));
354c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            listRowAdapter.add(new PhotoItem(
355c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    "GuidedStep (Slide left/right)",
356c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    R.drawable.gallery_photo_5));
357c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            listRowAdapter.add(new PhotoItem(
358c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    "GuidedStep (Slide bottom up)",
359c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    "Open GuidedStepFragment",
360c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    R.drawable.gallery_photo_6));
361c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            listRowAdapter.add(new PhotoItem(
362c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    "Android TV",
363c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    "open RowsActivity",
364c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    R.drawable.gallery_photo_7));
365c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            listRowAdapter.add(new PhotoItem(
366c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    "Leanback",
367c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    "open BrowseActivity",
368c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    R.drawable.gallery_photo_8));
369c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            return listRowAdapter;
370c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        }
371c578ad430b51de0151ca9b3299d84f73bb71286bsusnata    }
372c578ad430b51de0151ca9b3299d84f73bb71286bsusnata
3735f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu    public static class PageFragmentAdapterImpl extends MainFragmentAdapter<SampleFragment> {
3745f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu
3755f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu        public PageFragmentAdapterImpl(SampleFragment fragment) {
3765f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu            super(fragment);
3775f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu            setScalingEnabled(true);
3785f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu        }
3795f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu
3805f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu        @Override
3815f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu        public void setEntranceTransitionState(boolean state) {
3825f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu            getFragment().setEntranceTransitionState(state);
3835f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu        }
3845f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu    }
3855f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu
3868f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata    public static class SampleFragment extends Fragment implements MainFragmentAdapterProvider {
387380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata
388380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata        final PageFragmentAdapterImpl mMainFragmentAdapter = new PageFragmentAdapterImpl(this);
389c578ad430b51de0151ca9b3299d84f73bb71286bsusnata
390acccd0ab69d4c55e763b452c007aed7d14cf6654Dake Gu        public void setEntranceTransitionState(boolean state) {
391acccd0ab69d4c55e763b452c007aed7d14cf6654Dake Gu            final View view = getView();
392acccd0ab69d4c55e763b452c007aed7d14cf6654Dake Gu            int visibility = state ? View.VISIBLE : View.INVISIBLE;
393acccd0ab69d4c55e763b452c007aed7d14cf6654Dake Gu            view.findViewById(R.id.tv1).setVisibility(visibility);
394acccd0ab69d4c55e763b452c007aed7d14cf6654Dake Gu            view.findViewById(R.id.tv2).setVisibility(visibility);
395acccd0ab69d4c55e763b452c007aed7d14cf6654Dake Gu            view.findViewById(R.id.tv3).setVisibility(visibility);
396acccd0ab69d4c55e763b452c007aed7d14cf6654Dake Gu        }
397acccd0ab69d4c55e763b452c007aed7d14cf6654Dake Gu
398c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        @Override
399c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        public View onCreateView(
400380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata                final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
401380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata            View view = inflater.inflate(R.layout.page_fragment, container, false);
402380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata            view.findViewById(R.id.tv1).setOnClickListener(new View.OnClickListener() {
403380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata                @Override
404380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata                public void onClick(View view) {
405380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata                    Intent intent = new Intent(inflater.getContext(), GuidedStepActivity.class);
406380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata                    startActivity(intent);
407380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata                }
408380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata            });
409380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata
410380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata            return view;
411380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata        }
412380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata
413380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata        @Override
414aadab57a5c879a377588d7e5d21b7e8b09b94170Dake Gu        public void onViewCreated(View view, Bundle savedInstanceState) {
4155f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu            // static layout has view and data ready immediately
4165f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu            mMainFragmentAdapter.getFragmentHost().notifyViewCreated(mMainFragmentAdapter);
4175f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu            mMainFragmentAdapter.getFragmentHost().notifyDataReady(mMainFragmentAdapter);
418acccd0ab69d4c55e763b452c007aed7d14cf6654Dake Gu        }
419acccd0ab69d4c55e763b452c007aed7d14cf6654Dake Gu
420acccd0ab69d4c55e763b452c007aed7d14cf6654Dake Gu        @Override
4218f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata        public MainFragmentAdapter getMainFragmentAdapter() {
4228f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata            return mMainFragmentAdapter;
423c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        }
424c578ad430b51de0151ca9b3299d84f73bb71286bsusnata    }
4252223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn}
426