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;
20da2c70f656f02c377b796694ca27d93e2b698733Dake Guimport android.support.v17.leanback.app.GuidedStepFragment;
21c578ad430b51de0151ca9b3299d84f73bb71286bsusnataimport android.support.v17.leanback.app.RowsFragment;
222223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbournimport android.support.v17.leanback.widget.ArrayObjectAdapter;
238f94d180902da7469b67f7c47c93a3a0b9acdb3asusnataimport android.support.v17.leanback.widget.DividerRow;
242223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbournimport android.support.v17.leanback.widget.HeaderItem;
257f3028385b0349cfc6c0d6784840be148943b296Dake Guimport android.support.v17.leanback.widget.ImageCardView;
262223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbournimport android.support.v17.leanback.widget.ListRow;
272223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbournimport android.support.v17.leanback.widget.ListRowPresenter;
287f3028385b0349cfc6c0d6784840be148943b296Dake Guimport android.support.v17.leanback.widget.OnItemViewClickedListener;
29ffd20ebba154edf2374a53d4bb1c682b6737ab77Craig Stoutimport android.support.v17.leanback.widget.OnItemViewSelectedListener;
30c578ad430b51de0151ca9b3299d84f73bb71286bsusnataimport android.support.v17.leanback.widget.PageRow;
317f3028385b0349cfc6c0d6784840be148943b296Dake Guimport android.support.v17.leanback.widget.Presenter;
321684edec87235b40126662107630cf0f603c45eaTim Kilbournimport android.support.v17.leanback.widget.Row;
337f3028385b0349cfc6c0d6784840be148943b296Dake Guimport android.support.v17.leanback.widget.RowPresenter;
348f94d180902da7469b67f7c47c93a3a0b9acdb3asusnataimport android.support.v17.leanback.widget.SectionRow;
3520767a171ab46addb5d50248d4267db14c0c8883susnataimport android.support.v4.app.ActivityOptionsCompat;
362223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbournimport android.util.Log;
37c578ad430b51de0151ca9b3299d84f73bb71286bsusnataimport android.view.LayoutInflater;
38816bfc28b79d802b4366684775df74cf40109e6eJerome Poichetimport android.view.View;
397f3028385b0349cfc6c0d6784840be148943b296Dake Guimport android.view.ViewGroup;
402223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn
412223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbournpublic class BrowseFragment extends android.support.v17.leanback.app.BrowseFragment {
422223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn    private static final String TAG = "leanback.BrowseFragment";
432223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn
4467a49ad87bfde1a06a5c4b423184a89b15328604Dake Gu    private static final boolean TEST_ENTRANCE_TRANSITION = true;
45380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata    private static final int NUM_ROWS = 8;
46380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata    private static final long HEADER_ID1 = 1001;
47380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata    private static final long HEADER_ID2 = 1002;
488f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata    private static final long HEADER_ID3 = 1003;
49005084f6f0860a69c80492d3549a687ffb283c40Craig Stout
502223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn    private ArrayObjectAdapter mRowsAdapter;
51af136b73e6c8e377914e494f9870da1618be20d0Craig Stout    private BackgroundHelper mBackgroundHelper = new BackgroundHelper();
522223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn
53da2c70f656f02c377b796694ca27d93e2b698733Dake Gu    // For good performance, it's important to use a single instance of
54da2c70f656f02c377b796694ca27d93e2b698733Dake Gu    // a card presenter for all rows using that presenter.
5587b904ffa106f12f2fecfe8b9a46084863678f29Dake Gu    final CardPresenter mCardPresenter = new CardPresenter();
5687b904ffa106f12f2fecfe8b9a46084863678f29Dake Gu    final CardPresenter mCardPresenter2 = new CardPresenter(R.style.MyImageCardViewTheme);
57da2c70f656f02c377b796694ca27d93e2b698733Dake Gu
58c578ad430b51de0151ca9b3299d84f73bb71286bsusnata    public BrowseFragment() {
59380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata        getMainFragmentRegistry().registerFragment(PageRow.class, new PageRowFragmentFactory());
60c578ad430b51de0151ca9b3299d84f73bb71286bsusnata    }
61c578ad430b51de0151ca9b3299d84f73bb71286bsusnata
622223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn    @Override
632223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn    public void onCreate(Bundle savedInstanceState) {
642223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn        Log.i(TAG, "onCreate");
652223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn        super.onCreate(savedInstanceState);
662223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn
672085f1d8c47e93c8bf94d137533fd126d32a48b4Craig Stout        setBadgeDrawable(getActivity().getResources().getDrawable(R.drawable.ic_title));
682085f1d8c47e93c8bf94d137533fd126d32a48b4Craig Stout        setTitle("Leanback Sample App");
692085f1d8c47e93c8bf94d137533fd126d32a48b4Craig Stout        setHeadersState(HEADERS_ENABLED);
70816bfc28b79d802b4366684775df74cf40109e6eJerome Poichet        setOnSearchClickedListener(new View.OnClickListener() {
71816bfc28b79d802b4366684775df74cf40109e6eJerome Poichet            @Override
72816bfc28b79d802b4366684775df74cf40109e6eJerome Poichet            public void onClick(View view) {
73816bfc28b79d802b4366684775df74cf40109e6eJerome Poichet                Intent intent = new Intent(getActivity(), SearchActivity.class);
74816bfc28b79d802b4366684775df74cf40109e6eJerome Poichet                startActivity(intent);
75816bfc28b79d802b4366684775df74cf40109e6eJerome Poichet            }
76816bfc28b79d802b4366684775df74cf40109e6eJerome Poichet        });
77816bfc28b79d802b4366684775df74cf40109e6eJerome Poichet
787f3028385b0349cfc6c0d6784840be148943b296Dake Gu        setOnItemViewClickedListener(new ItemViewClickedListener());
79ffd20ebba154edf2374a53d4bb1c682b6737ab77Craig Stout        setOnItemViewSelectedListener(new OnItemViewSelectedListener() {
80ffd20ebba154edf2374a53d4bb1c682b6737ab77Craig Stout            @Override
81ffd20ebba154edf2374a53d4bb1c682b6737ab77Craig Stout            public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
82ffd20ebba154edf2374a53d4bb1c682b6737ab77Craig Stout                    RowPresenter.ViewHolder rowViewHolder, Row row) {
83ffd20ebba154edf2374a53d4bb1c682b6737ab77Craig Stout                Log.i(TAG, "onItemSelected: " + item + " row " + row);
84af136b73e6c8e377914e494f9870da1618be20d0Craig Stout
85a5e729eb7c417a872876ac6f2b904bc8d232aa06Craig Stout                if (isShowingHeaders()) {
86a5e729eb7c417a872876ac6f2b904bc8d232aa06Craig Stout                    mBackgroundHelper.setBackground(getActivity(), null);
87c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                } else if (item instanceof PhotoItem) {
88af136b73e6c8e377914e494f9870da1618be20d0Craig Stout                    mBackgroundHelper.setBackground(
89af136b73e6c8e377914e494f9870da1618be20d0Craig Stout                            getActivity(), ((PhotoItem) item).getImageResourceId());
90af136b73e6c8e377914e494f9870da1618be20d0Craig Stout                }
91ffd20ebba154edf2374a53d4bb1c682b6737ab77Craig Stout            }
92ffd20ebba154edf2374a53d4bb1c682b6737ab77Craig Stout        });
9367a49ad87bfde1a06a5c4b423184a89b15328604Dake Gu        if (TEST_ENTRANCE_TRANSITION) {
94da2c70f656f02c377b796694ca27d93e2b698733Dake Gu            // don't run entrance transition if fragment is restored.
9567a49ad87bfde1a06a5c4b423184a89b15328604Dake Gu            if (savedInstanceState == null) {
969744dea0e0ea62d654a1bb352cb60201d869e390Dake Gu                prepareEntranceTransition();
9767a49ad87bfde1a06a5c4b423184a89b15328604Dake Gu            }
9867a49ad87bfde1a06a5c4b423184a89b15328604Dake Gu        }
99380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata
100da2c70f656f02c377b796694ca27d93e2b698733Dake Gu        // simulates in a real world use case  data being loaded two seconds later
101da2c70f656f02c377b796694ca27d93e2b698733Dake Gu        new Handler().postDelayed(new Runnable() {
102da2c70f656f02c377b796694ca27d93e2b698733Dake Gu            public void run() {
10335d7a6c31606ed4ca38deda3cacae080a95c95c9susnata                setupRows();
104da2c70f656f02c377b796694ca27d93e2b698733Dake Gu                loadData();
105da2c70f656f02c377b796694ca27d93e2b698733Dake Gu                startEntranceTransition();
106da2c70f656f02c377b796694ca27d93e2b698733Dake Gu            }
107da2c70f656f02c377b796694ca27d93e2b698733Dake Gu        }, 2000);
1082223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn    }
1092223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn
110c578ad430b51de0151ca9b3299d84f73bb71286bsusnata    @Override
111c578ad430b51de0151ca9b3299d84f73bb71286bsusnata    public View onCreateView(
112c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
113c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        return super.onCreateView(inflater, container, savedInstanceState);
114c578ad430b51de0151ca9b3299d84f73bb71286bsusnata    }
1152223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn
116c578ad430b51de0151ca9b3299d84f73bb71286bsusnata    private void setupRows() {
1174ff7f6d210b75531b3dce98f8028804f55c72051susnata        ListRowPresenter listRowPresenter = new ListRowPresenter();
1184ff7f6d210b75531b3dce98f8028804f55c72051susnata        listRowPresenter.setNumRows(2);
1194ff7f6d210b75531b3dce98f8028804f55c72051susnata        mRowsAdapter = new ArrayObjectAdapter(listRowPresenter);
120da2c70f656f02c377b796694ca27d93e2b698733Dake Gu        setAdapter(mRowsAdapter);
121da2c70f656f02c377b796694ca27d93e2b698733Dake Gu    }
1220cd6f9d62c8b026d4e94f424c91f4083f26f61aaCraig Stout
123da2c70f656f02c377b796694ca27d93e2b698733Dake Gu    private void loadData() {
124c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        int i = 0;
125380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata
1265635fbd2da9e73c8f68287626728f909565c7a8aDake Gu        mRowsAdapter.add(new PageRow(new HeaderItem(HEADER_ID1, "Page Row 0")));
1275635fbd2da9e73c8f68287626728f909565c7a8aDake Gu        mRowsAdapter.add(new DividerRow());
128380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata
1295635fbd2da9e73c8f68287626728f909565c7a8aDake Gu        mRowsAdapter.add(new SectionRow(new HeaderItem("section 0")));
130c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        for (; i < NUM_ROWS; ++i) {
1315635fbd2da9e73c8f68287626728f909565c7a8aDake Gu            mRowsAdapter.add(new ListRow(new HeaderItem(i, "Row " + i), createListRowAdapter(i)));
1322223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn        }
1332223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn
1345635fbd2da9e73c8f68287626728f909565c7a8aDake Gu        mRowsAdapter.add(new DividerRow());
1355635fbd2da9e73c8f68287626728f909565c7a8aDake Gu        mRowsAdapter.add(new PageRow(new HeaderItem(HEADER_ID2, "Page Row 1")));
1368f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata
1378f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata        mRowsAdapter.add(new PageRow(new HeaderItem(HEADER_ID3, "Page Row 2")));
138c578ad430b51de0151ca9b3299d84f73bb71286bsusnata    }
139c578ad430b51de0151ca9b3299d84f73bb71286bsusnata
140c578ad430b51de0151ca9b3299d84f73bb71286bsusnata    private ArrayObjectAdapter createListRowAdapter(int i) {
141c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter((i & 1) == 0 ?
142c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                mCardPresenter : mCardPresenter2);
143c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        listRowAdapter.add(new PhotoItem(
144c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                "Hello world",
145c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                R.drawable.gallery_photo_1));
146c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        listRowAdapter.add(new PhotoItem(
147c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                "This is a test",
148c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                "Only a test",
149c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                R.drawable.gallery_photo_2));
150c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        listRowAdapter.add(new PhotoItem(
151c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                "Android TV",
152c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                "by Google",
153c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                R.drawable.gallery_photo_3));
154c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        listRowAdapter.add(new PhotoItem(
155c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                "Leanback",
156c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                R.drawable.gallery_photo_4));
157c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        listRowAdapter.add(new PhotoItem(
158c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                "GuidedStep (Slide left/right)",
159c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                R.drawable.gallery_photo_5));
160c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        listRowAdapter.add(new PhotoItem(
161c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                "GuidedStep (Slide bottom up)",
162c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                "Open GuidedStepFragment",
163c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                R.drawable.gallery_photo_6));
164c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        listRowAdapter.add(new PhotoItem(
165c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                "Android TV",
166c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                "open RowsActivity",
167c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                R.drawable.gallery_photo_7));
168c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        listRowAdapter.add(new PhotoItem(
169c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                "Leanback",
170c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                "open BrowseActivity",
171c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                R.drawable.gallery_photo_8));
1728f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata        listRowAdapter.add(new PhotoItem(
1734ff7f6d210b75531b3dce98f8028804f55c72051susnata                "Hello world",
1744ff7f6d210b75531b3dce98f8028804f55c72051susnata                R.drawable.gallery_photo_1));
1754ff7f6d210b75531b3dce98f8028804f55c72051susnata        listRowAdapter.add(new PhotoItem(
1764ff7f6d210b75531b3dce98f8028804f55c72051susnata                "This is a test",
1774ff7f6d210b75531b3dce98f8028804f55c72051susnata                "Only a test",
1784ff7f6d210b75531b3dce98f8028804f55c72051susnata                R.drawable.gallery_photo_2));
1794ff7f6d210b75531b3dce98f8028804f55c72051susnata        listRowAdapter.add(new PhotoItem(
1804ff7f6d210b75531b3dce98f8028804f55c72051susnata                "Android TV",
1814ff7f6d210b75531b3dce98f8028804f55c72051susnata                "by Google",
1824ff7f6d210b75531b3dce98f8028804f55c72051susnata                R.drawable.gallery_photo_3));
1838f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata        listRowAdapter.add(new PhotoItem(
1848f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                "Leanback",
1854ff7f6d210b75531b3dce98f8028804f55c72051susnata                R.drawable.gallery_photo_4));
186c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        return listRowAdapter;
1872223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn    }
1881684edec87235b40126662107630cf0f603c45eaTim Kilbourn
1897f3028385b0349cfc6c0d6784840be148943b296Dake Gu    private final class ItemViewClickedListener implements OnItemViewClickedListener {
1907f3028385b0349cfc6c0d6784840be148943b296Dake Gu        @Override
1917f3028385b0349cfc6c0d6784840be148943b296Dake Gu        public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
1927f3028385b0349cfc6c0d6784840be148943b296Dake Gu                RowPresenter.ViewHolder rowViewHolder, Row row) {
1937f3028385b0349cfc6c0d6784840be148943b296Dake Gu
194f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu            Intent intent;
195f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu            Bundle bundle;
196da2c70f656f02c377b796694ca27d93e2b698733Dake Gu            if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_6) {
197da2c70f656f02c377b796694ca27d93e2b698733Dake Gu                GuidedStepFragment.add(getFragmentManager(),
19820767a171ab46addb5d50248d4267db14c0c8883susnata                        new GuidedStepHalfScreenActivity.FirstStepFragment(),
199ee3c13ee552002263be40f6a5986f61c605b0bacDake Gu                        R.id.lb_guidedstep_host);
200da2c70f656f02c377b796694ca27d93e2b698733Dake Gu                return;
20120767a171ab46addb5d50248d4267db14c0c8883susnata            } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_5) {
20220767a171ab46addb5d50248d4267db14c0c8883susnata                GuidedStepFragment.add(getFragmentManager(),
203c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                        new GuidedStepActivity.FirstStepFragment(), R.id.lb_guidedstep_host);
204c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                return;
205c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_8) {
206f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu                intent = new Intent(getActivity(), BrowseActivity.class);
207f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu                bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity())
208f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu                        .toBundle();
209c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_7) {
210f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu                intent = new Intent(getActivity(), RowsActivity.class);
211f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu                bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity())
212f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu                        .toBundle();
21367a49ad87bfde1a06a5c4b423184a89b15328604Dake Gu            } else {
214f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu                intent = new Intent(getActivity(), DetailsActivity.class);
215f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu                intent.putExtra(DetailsActivity.EXTRA_ITEM, (PhotoItem) item);
216f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu                bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(
217f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu                        getActivity(),
218c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                        ((ImageCardView) itemViewHolder.view).getMainImageView(),
219f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu                        DetailsActivity.SHARED_ELEMENT_NAME).toBundle();
22067a49ad87bfde1a06a5c4b423184a89b15328604Dake Gu            }
221f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu            getActivity().startActivity(intent, bundle);
2221684edec87235b40126662107630cf0f603c45eaTim Kilbourn        }
2231684edec87235b40126662107630cf0f603c45eaTim Kilbourn    }
224c578ad430b51de0151ca9b3299d84f73bb71286bsusnata
225380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata    public static class PageRowFragmentFactory extends FragmentFactory {
226c578ad430b51de0151ca9b3299d84f73bb71286bsusnata
227c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        @Override
228380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata        public Fragment createFragment(Object rowObj) {
229380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata            Row row = (Row) rowObj;
230380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata            if (row.getHeaderItem().getId() == HEADER_ID1) {
2315f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu                return new SampleRowsFragment();
232380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata            } else if (row.getHeaderItem().getId() == HEADER_ID2) {
233380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata                return new SampleRowsFragment();
2348f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata            } else if (row.getHeaderItem().getId() == HEADER_ID3) {
2358f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                return new SampleFragment();
236c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            }
237380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata
238380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata            return null;
239c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        }
240c578ad430b51de0151ca9b3299d84f73bb71286bsusnata    }
241c578ad430b51de0151ca9b3299d84f73bb71286bsusnata
242380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata    public static class SampleRowsFragment extends RowsFragment {
243c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        final CardPresenter mCardPresenter = new CardPresenter();
244c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        final CardPresenter mCardPresenter2 = new CardPresenter(R.style.MyImageCardViewTheme);
245c578ad430b51de0151ca9b3299d84f73bb71286bsusnata
2465f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu        void loadFragmentData() {
2475f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu            ArrayObjectAdapter adapter = (ArrayObjectAdapter) getAdapter();
248380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata            for (int i = 0; i < 4; i++) {
249380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata                ListRow row = new ListRow(new HeaderItem("Row " + i), createListRowAdapter(i));
250380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata                adapter.add(row);
251c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            }
2525f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu            if (getMainFragmentAdapter() != null) {
2535f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu                getMainFragmentAdapter().getFragmentHost()
2545f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu                        .notifyDataReady(getMainFragmentAdapter());
2555f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu            }
2565f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu        }
2575f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu
2585f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu        public SampleRowsFragment() {
2595f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu            ArrayObjectAdapter adapter = new ArrayObjectAdapter(new ListRowPresenter());
260380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata            setAdapter(adapter);
2615f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu            // simulates late data loading:
2625f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu            new Handler().postDelayed(new Runnable() {
2635f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu                public void run() {
2645f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu                    loadFragmentData();
2655f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu                }
2665f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu            }, 500);
267380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata
268380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata            setOnItemViewClickedListener(new OnItemViewClickedListener() {
269380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata                @Override
2704ff7f6d210b75531b3dce98f8028804f55c72051susnata                public void onItemClicked(
2714ff7f6d210b75531b3dce98f8028804f55c72051susnata                        Presenter.ViewHolder itemViewHolder,
2724ff7f6d210b75531b3dce98f8028804f55c72051susnata                        Object item,
2734ff7f6d210b75531b3dce98f8028804f55c72051susnata                        RowPresenter.ViewHolder rowViewHolder,
2744ff7f6d210b75531b3dce98f8028804f55c72051susnata                        Row row) {
2758f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                    Intent intent;
2768f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                    Bundle bundle;
2778f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                    if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_6) {
2785f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu                        GuidedStepFragment.add(getActivity().getFragmentManager(),
2798f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                                new GuidedStepHalfScreenActivity.FirstStepFragment(),
2808f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                                R.id.lb_guidedstep_host);
2818f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                        return;
2828f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                    } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_5) {
2835f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu                        GuidedStepFragment.add(getActivity().getFragmentManager(),
2848f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                                new GuidedStepActivity.FirstStepFragment(), R.id.lb_guidedstep_host);
2858f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                        return;
2868f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                    } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_8) {
2878f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                        intent = new Intent(getActivity(), BrowseActivity.class);
2888f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                        bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity())
2898f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                                .toBundle();
2908f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                    } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_7) {
2918f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                        intent = new Intent(getActivity(), RowsActivity.class);
2928f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                        bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity())
2938f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                                .toBundle();
2948f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                    } else {
2958f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                        intent = new Intent(getActivity(), DetailsActivity.class);
2968f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                        intent.putExtra(DetailsActivity.EXTRA_ITEM, (PhotoItem) item);
2978f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                        bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(
2988f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                                getActivity(),
2998f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                                ((ImageCardView) itemViewHolder.view).getMainImageView(),
3008f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                                DetailsActivity.SHARED_ELEMENT_NAME).toBundle();
3018f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                    }
3028f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata                    getActivity().startActivity(intent, bundle);
303380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata                }
304380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata            });
305c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        }
306c578ad430b51de0151ca9b3299d84f73bb71286bsusnata
307c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        private ArrayObjectAdapter createListRowAdapter(int i) {
308c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter((i & 1) == 0 ?
309c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    mCardPresenter : mCardPresenter2);
310c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            listRowAdapter.add(new PhotoItem(
311c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    "Hello world",
312c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    R.drawable.gallery_photo_1));
313c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            listRowAdapter.add(new PhotoItem(
314c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    "This is a test",
315c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    "Only a test",
316c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    R.drawable.gallery_photo_2));
317c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            listRowAdapter.add(new PhotoItem(
318c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    "Android TV",
319c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    "by Google",
320c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    R.drawable.gallery_photo_3));
321c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            listRowAdapter.add(new PhotoItem(
322c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    "Leanback",
323c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    R.drawable.gallery_photo_4));
324c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            listRowAdapter.add(new PhotoItem(
325c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    "GuidedStep (Slide left/right)",
326c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    R.drawable.gallery_photo_5));
327c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            listRowAdapter.add(new PhotoItem(
328c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    "GuidedStep (Slide bottom up)",
329c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    "Open GuidedStepFragment",
330c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    R.drawable.gallery_photo_6));
331c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            listRowAdapter.add(new PhotoItem(
332c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    "Android TV",
333c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    "open RowsActivity",
334c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    R.drawable.gallery_photo_7));
335c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            listRowAdapter.add(new PhotoItem(
336c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    "Leanback",
337c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    "open BrowseActivity",
338c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    R.drawable.gallery_photo_8));
339c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            return listRowAdapter;
340c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        }
341c578ad430b51de0151ca9b3299d84f73bb71286bsusnata    }
342c578ad430b51de0151ca9b3299d84f73bb71286bsusnata
3435f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu    public static class PageFragmentAdapterImpl extends MainFragmentAdapter<SampleFragment> {
3445f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu
3455f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu        public PageFragmentAdapterImpl(SampleFragment fragment) {
3465f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu            super(fragment);
3475f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu            setScalingEnabled(true);
3485f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu        }
3495f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu
3505f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu        @Override
3515f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu        public void setEntranceTransitionState(boolean state) {
3525f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu            getFragment().setEntranceTransitionState(state);
3535f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu        }
3545f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu    }
3555f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu
3568f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata    public static class SampleFragment extends Fragment implements MainFragmentAdapterProvider {
357380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata
358380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata        final PageFragmentAdapterImpl mMainFragmentAdapter = new PageFragmentAdapterImpl(this);
359c578ad430b51de0151ca9b3299d84f73bb71286bsusnata
360acccd0ab69d4c55e763b452c007aed7d14cf6654Dake Gu        public void setEntranceTransitionState(boolean state) {
361acccd0ab69d4c55e763b452c007aed7d14cf6654Dake Gu            final View view = getView();
362acccd0ab69d4c55e763b452c007aed7d14cf6654Dake Gu            int visibility = state ? View.VISIBLE : View.INVISIBLE;
363acccd0ab69d4c55e763b452c007aed7d14cf6654Dake Gu            view.findViewById(R.id.tv1).setVisibility(visibility);
364acccd0ab69d4c55e763b452c007aed7d14cf6654Dake Gu            view.findViewById(R.id.tv2).setVisibility(visibility);
365acccd0ab69d4c55e763b452c007aed7d14cf6654Dake Gu            view.findViewById(R.id.tv3).setVisibility(visibility);
366acccd0ab69d4c55e763b452c007aed7d14cf6654Dake Gu        }
367acccd0ab69d4c55e763b452c007aed7d14cf6654Dake Gu
368c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        @Override
369c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        public View onCreateView(
370380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata                final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
371380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata            View view = inflater.inflate(R.layout.page_fragment, container, false);
372380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata            view.findViewById(R.id.tv1).setOnClickListener(new View.OnClickListener() {
373380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata                @Override
374380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata                public void onClick(View view) {
375380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata                    Intent intent = new Intent(inflater.getContext(), GuidedStepActivity.class);
376380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata                    startActivity(intent);
377380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata                }
378380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata            });
379380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata
380380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata            return view;
381380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata        }
382380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata
383380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata        @Override
384aadab57a5c879a377588d7e5d21b7e8b09b94170Dake Gu        public void onViewCreated(View view, Bundle savedInstanceState) {
3855f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu            // static layout has view and data ready immediately
3865f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu            mMainFragmentAdapter.getFragmentHost().notifyViewCreated(mMainFragmentAdapter);
3875f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu            mMainFragmentAdapter.getFragmentHost().notifyDataReady(mMainFragmentAdapter);
388acccd0ab69d4c55e763b452c007aed7d14cf6654Dake Gu        }
389acccd0ab69d4c55e763b452c007aed7d14cf6654Dake Gu
390acccd0ab69d4c55e763b452c007aed7d14cf6654Dake Gu        @Override
3918f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata        public MainFragmentAdapter getMainFragmentAdapter() {
3928f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata            return mMainFragmentAdapter;
393c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        }
394c578ad430b51de0151ca9b3299d84f73bb71286bsusnata    }
3952223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn}
396