BrowseFragment.java revision c578ad430b51de0151ca9b3299d84f73bb71286b
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;
22c578ad430b51de0151ca9b3299d84f73bb71286bsusnataimport android.support.v17.leanback.app.RowsFragmentAdapter;
232223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbournimport android.support.v17.leanback.widget.ArrayObjectAdapter;
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;
28c578ad430b51de0151ca9b3299d84f73bb71286bsusnataimport android.support.v17.leanback.widget.ObjectAdapter;
297f3028385b0349cfc6c0d6784840be148943b296Dake Guimport android.support.v17.leanback.widget.OnItemViewClickedListener;
30ffd20ebba154edf2374a53d4bb1c682b6737ab77Craig Stoutimport android.support.v17.leanback.widget.OnItemViewSelectedListener;
31c578ad430b51de0151ca9b3299d84f73bb71286bsusnataimport android.support.v17.leanback.widget.PageRow;
32c578ad430b51de0151ca9b3299d84f73bb71286bsusnataimport android.support.v17.leanback.widget.PageRowPresenter;
337f3028385b0349cfc6c0d6784840be148943b296Dake Guimport android.support.v17.leanback.widget.Presenter;
34c578ad430b51de0151ca9b3299d84f73bb71286bsusnataimport android.support.v17.leanback.widget.PresenterSelector;
351684edec87235b40126662107630cf0f603c45eaTim Kilbournimport android.support.v17.leanback.widget.Row;
367f3028385b0349cfc6c0d6784840be148943b296Dake Guimport android.support.v17.leanback.widget.RowPresenter;
3720767a171ab46addb5d50248d4267db14c0c8883susnataimport android.support.v4.app.ActivityOptionsCompat;
382223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbournimport android.util.Log;
39c578ad430b51de0151ca9b3299d84f73bb71286bsusnataimport android.view.LayoutInflater;
40816bfc28b79d802b4366684775df74cf40109e6eJerome Poichetimport android.view.View;
417f3028385b0349cfc6c0d6784840be148943b296Dake Guimport android.view.ViewGroup;
422223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn
432223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbournpublic class BrowseFragment extends android.support.v17.leanback.app.BrowseFragment {
442223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn    private static final String TAG = "leanback.BrowseFragment";
452223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn
4667a49ad87bfde1a06a5c4b423184a89b15328604Dake Gu    private static final boolean TEST_ENTRANCE_TRANSITION = true;
47c578ad430b51de0151ca9b3299d84f73bb71286bsusnata    private static final int NUM_ROWS = 4;
48005084f6f0860a69c80492d3549a687ffb283c40Craig Stout
492223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn    private ArrayObjectAdapter mRowsAdapter;
50af136b73e6c8e377914e494f9870da1618be20d0Craig Stout    private BackgroundHelper mBackgroundHelper = new BackgroundHelper();
512223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn
52da2c70f656f02c377b796694ca27d93e2b698733Dake Gu    // For good performance, it's important to use a single instance of
53da2c70f656f02c377b796694ca27d93e2b698733Dake Gu    // a card presenter for all rows using that presenter.
5487b904ffa106f12f2fecfe8b9a46084863678f29Dake Gu    final CardPresenter mCardPresenter = new CardPresenter();
5587b904ffa106f12f2fecfe8b9a46084863678f29Dake Gu    final CardPresenter mCardPresenter2 = new CardPresenter(R.style.MyImageCardViewTheme);
56da2c70f656f02c377b796694ca27d93e2b698733Dake Gu
57c578ad430b51de0151ca9b3299d84f73bb71286bsusnata    public BrowseFragment() {
58c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        setMainFragmentAdapterFactory(new MainFragmentFactorAdapterImpl());
59c578ad430b51de0151ca9b3299d84f73bb71286bsusnata    }
60c578ad430b51de0151ca9b3299d84f73bb71286bsusnata
612223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn    @Override
622223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn    public void onCreate(Bundle savedInstanceState) {
632223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn        Log.i(TAG, "onCreate");
642223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn        super.onCreate(savedInstanceState);
652223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn
662085f1d8c47e93c8bf94d137533fd126d32a48b4Craig Stout        setBadgeDrawable(getActivity().getResources().getDrawable(R.drawable.ic_title));
672085f1d8c47e93c8bf94d137533fd126d32a48b4Craig Stout        setTitle("Leanback Sample App");
682085f1d8c47e93c8bf94d137533fd126d32a48b4Craig Stout        setHeadersState(HEADERS_ENABLED);
692223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn
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
782223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn        setupRows();
797f3028385b0349cfc6c0d6784840be148943b296Dake Gu        setOnItemViewClickedListener(new ItemViewClickedListener());
80ffd20ebba154edf2374a53d4bb1c682b6737ab77Craig Stout        setOnItemViewSelectedListener(new OnItemViewSelectedListener() {
81ffd20ebba154edf2374a53d4bb1c682b6737ab77Craig Stout            @Override
82ffd20ebba154edf2374a53d4bb1c682b6737ab77Craig Stout            public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
83ffd20ebba154edf2374a53d4bb1c682b6737ab77Craig Stout                    RowPresenter.ViewHolder rowViewHolder, Row row) {
84ffd20ebba154edf2374a53d4bb1c682b6737ab77Craig Stout                Log.i(TAG, "onItemSelected: " + item + " row " + row);
85af136b73e6c8e377914e494f9870da1618be20d0Craig Stout
86a5e729eb7c417a872876ac6f2b904bc8d232aa06Craig Stout                if (isShowingHeaders()) {
87a5e729eb7c417a872876ac6f2b904bc8d232aa06Craig Stout                    mBackgroundHelper.setBackground(getActivity(), null);
88c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                } else if (item instanceof PhotoItem) {
89af136b73e6c8e377914e494f9870da1618be20d0Craig Stout                    mBackgroundHelper.setBackground(
90af136b73e6c8e377914e494f9870da1618be20d0Craig Stout                            getActivity(), ((PhotoItem) item).getImageResourceId());
91af136b73e6c8e377914e494f9870da1618be20d0Craig Stout                }
92ffd20ebba154edf2374a53d4bb1c682b6737ab77Craig Stout            }
93ffd20ebba154edf2374a53d4bb1c682b6737ab77Craig Stout        });
9467a49ad87bfde1a06a5c4b423184a89b15328604Dake Gu        if (TEST_ENTRANCE_TRANSITION) {
95da2c70f656f02c377b796694ca27d93e2b698733Dake Gu            // don't run entrance transition if fragment is restored.
9667a49ad87bfde1a06a5c4b423184a89b15328604Dake Gu            if (savedInstanceState == null) {
979744dea0e0ea62d654a1bb352cb60201d869e390Dake Gu                prepareEntranceTransition();
9867a49ad87bfde1a06a5c4b423184a89b15328604Dake Gu            }
9967a49ad87bfde1a06a5c4b423184a89b15328604Dake Gu        }
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() {
103da2c70f656f02c377b796694ca27d93e2b698733Dake Gu                loadData();
104da2c70f656f02c377b796694ca27d93e2b698733Dake Gu                startEntranceTransition();
105da2c70f656f02c377b796694ca27d93e2b698733Dake Gu            }
106da2c70f656f02c377b796694ca27d93e2b698733Dake Gu        }, 2000);
1072223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn    }
1082223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn
109c578ad430b51de0151ca9b3299d84f73bb71286bsusnata    @Override
110c578ad430b51de0151ca9b3299d84f73bb71286bsusnata    public View onCreateView(
111c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
112c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        return super.onCreateView(inflater, container, savedInstanceState);
113c578ad430b51de0151ca9b3299d84f73bb71286bsusnata    }
1142223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn
115c578ad430b51de0151ca9b3299d84f73bb71286bsusnata    private void setupRows() {
116c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        mRowsAdapter = new ArrayObjectAdapter(new MyPresenterSelector());
117da2c70f656f02c377b796694ca27d93e2b698733Dake Gu        setAdapter(mRowsAdapter);
118da2c70f656f02c377b796694ca27d93e2b698733Dake Gu    }
1190cd6f9d62c8b026d4e94f424c91f4083f26f61aaCraig Stout
120da2c70f656f02c377b796694ca27d93e2b698733Dake Gu    private void loadData() {
121c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        int i = 0;
122c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        for (; i < NUM_ROWS; ++i) {
1230a0bb90f4784d00ef2827ef300602744c37a02bdCraig Stout            HeaderItem header = new HeaderItem(i, "Row " + i);
124c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            mRowsAdapter.add(new ListRow(header, createListRowAdapter(i)));
1252223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn        }
1262223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn
127c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        HeaderItem header = new HeaderItem(NUM_ROWS, "Page Row " + 0);
128c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        mRowsAdapter.add(new PageRow(header));
129c578ad430b51de0151ca9b3299d84f73bb71286bsusnata
130c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        header = new HeaderItem(NUM_ROWS, "Page Row " + 1);
131c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        mRowsAdapter.add(new PageRow(header));
132c578ad430b51de0151ca9b3299d84f73bb71286bsusnata    }
133c578ad430b51de0151ca9b3299d84f73bb71286bsusnata
134c578ad430b51de0151ca9b3299d84f73bb71286bsusnata    private ArrayObjectAdapter createListRowAdapter(int i) {
135c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter((i & 1) == 0 ?
136c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                mCardPresenter : mCardPresenter2);
137c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        listRowAdapter.add(new PhotoItem(
138c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                "Hello world",
139c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                R.drawable.gallery_photo_1));
140c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        listRowAdapter.add(new PhotoItem(
141c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                "This is a test",
142c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                "Only a test",
143c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                R.drawable.gallery_photo_2));
144c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        listRowAdapter.add(new PhotoItem(
145c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                "Android TV",
146c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                "by Google",
147c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                R.drawable.gallery_photo_3));
148c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        listRowAdapter.add(new PhotoItem(
149c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                "Leanback",
150c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                R.drawable.gallery_photo_4));
151c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        listRowAdapter.add(new PhotoItem(
152c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                "GuidedStep (Slide left/right)",
153c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                R.drawable.gallery_photo_5));
154c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        listRowAdapter.add(new PhotoItem(
155c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                "GuidedStep (Slide bottom up)",
156c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                "Open GuidedStepFragment",
157c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                R.drawable.gallery_photo_6));
158c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        listRowAdapter.add(new PhotoItem(
159c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                "Android TV",
160c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                "open RowsActivity",
161c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                R.drawable.gallery_photo_7));
162c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        listRowAdapter.add(new PhotoItem(
163c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                "Leanback",
164c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                "open BrowseActivity",
165c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                R.drawable.gallery_photo_8));
166c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        return listRowAdapter;
1672223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn    }
1681684edec87235b40126662107630cf0f603c45eaTim Kilbourn
1697f3028385b0349cfc6c0d6784840be148943b296Dake Gu    private final class ItemViewClickedListener implements OnItemViewClickedListener {
1707f3028385b0349cfc6c0d6784840be148943b296Dake Gu        @Override
1717f3028385b0349cfc6c0d6784840be148943b296Dake Gu        public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
1727f3028385b0349cfc6c0d6784840be148943b296Dake Gu                RowPresenter.ViewHolder rowViewHolder, Row row) {
1737f3028385b0349cfc6c0d6784840be148943b296Dake Gu
174f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu            Intent intent;
175f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu            Bundle bundle;
176da2c70f656f02c377b796694ca27d93e2b698733Dake Gu            if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_6) {
177da2c70f656f02c377b796694ca27d93e2b698733Dake Gu                GuidedStepFragment.add(getFragmentManager(),
17820767a171ab46addb5d50248d4267db14c0c8883susnata                        new GuidedStepHalfScreenActivity.FirstStepFragment(),
179ee3c13ee552002263be40f6a5986f61c605b0bacDake Gu                        R.id.lb_guidedstep_host);
180da2c70f656f02c377b796694ca27d93e2b698733Dake Gu                return;
18120767a171ab46addb5d50248d4267db14c0c8883susnata            } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_5) {
18220767a171ab46addb5d50248d4267db14c0c8883susnata                GuidedStepFragment.add(getFragmentManager(),
183c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                        new GuidedStepActivity.FirstStepFragment(), R.id.lb_guidedstep_host);
184c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                return;
185c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_8) {
186f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu                intent = new Intent(getActivity(), BrowseActivity.class);
187f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu                bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity())
188f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu                        .toBundle();
189c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_7) {
190f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu                intent = new Intent(getActivity(), RowsActivity.class);
191f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu                bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity())
192f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu                        .toBundle();
19367a49ad87bfde1a06a5c4b423184a89b15328604Dake Gu            } else {
194f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu                intent = new Intent(getActivity(), DetailsActivity.class);
195f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu                intent.putExtra(DetailsActivity.EXTRA_ITEM, (PhotoItem) item);
196f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu                bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(
197f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu                        getActivity(),
198c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                        ((ImageCardView) itemViewHolder.view).getMainImageView(),
199f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu                        DetailsActivity.SHARED_ELEMENT_NAME).toBundle();
20067a49ad87bfde1a06a5c4b423184a89b15328604Dake Gu            }
201f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu            getActivity().startActivity(intent, bundle);
2021684edec87235b40126662107630cf0f603c45eaTim Kilbourn        }
2031684edec87235b40126662107630cf0f603c45eaTim Kilbourn    }
204c578ad430b51de0151ca9b3299d84f73bb71286bsusnata
205c578ad430b51de0151ca9b3299d84f73bb71286bsusnata    private static class MainFragmentFactorAdapterImpl extends MainFragmentAdapterFactory {
206c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        private AbstractMainFragmentAdapter pageFragmentAdapter1 = new PageFragmentAdapterImpl();
207c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        private RowsFragmentAdapter gridPageFragmentAdapter;
208c578ad430b51de0151ca9b3299d84f73bb71286bsusnata
209c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        @Override
210c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        public AbstractMainFragmentAdapter getPageFragmentAdapter(
211c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                ObjectAdapter adapter, int position) {
212c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            if (position == 4) {
213c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                return pageFragmentAdapter1;
214c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            } else {
215c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                if (gridPageFragmentAdapter == null) {
216c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    gridPageFragmentAdapter = new GridPageFragmentAdapterImpl();
217c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                }
218c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                return gridPageFragmentAdapter;
219c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            }
220c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        }
221c578ad430b51de0151ca9b3299d84f73bb71286bsusnata    }
222c578ad430b51de0151ca9b3299d84f73bb71286bsusnata
223c578ad430b51de0151ca9b3299d84f73bb71286bsusnata    private static class PageFragmentAdapterImpl extends AbstractMainFragmentAdapter {
224c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        private Fragment mFragment;
225c578ad430b51de0151ca9b3299d84f73bb71286bsusnata
226c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        PageFragmentAdapterImpl() {
227c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            setScalingEnabled(true);
228c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        }
229c578ad430b51de0151ca9b3299d84f73bb71286bsusnata
230c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        @Override
231c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        public Fragment getFragment() {
232c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            if (mFragment == null) {
233c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                mFragment = new SampleFragment();
234c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            }
235c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            return mFragment;
236c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        }
237c578ad430b51de0151ca9b3299d84f73bb71286bsusnata    }
238c578ad430b51de0151ca9b3299d84f73bb71286bsusnata
239c578ad430b51de0151ca9b3299d84f73bb71286bsusnata    private static class GridPageFragmentAdapterImpl extends RowsFragmentAdapter {
240c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        final CardPresenter mCardPresenter = new CardPresenter();
241c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        final CardPresenter mCardPresenter2 = new CardPresenter(R.style.MyImageCardViewTheme);
242c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        private RowsFragment mFragment;
243c578ad430b51de0151ca9b3299d84f73bb71286bsusnata
244c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        GridPageFragmentAdapterImpl() {
245c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            setScalingEnabled(true);
246c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        }
247c578ad430b51de0151ca9b3299d84f73bb71286bsusnata
248c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        protected Fragment createFragment() {
249c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            if (mFragment == null) {
250c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                mFragment = new RowsFragment();
251c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                ArrayObjectAdapter adapter = new ArrayObjectAdapter(new ListRowPresenter());
252c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                for (int i = 0; i < 4; i++) {
253c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    ListRow row = new ListRow(new HeaderItem("Row " + i), createListRowAdapter(i));
254c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    adapter.add(row);
255c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                }
256c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                mFragment.setAdapter(adapter);
257c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            }
258c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            return mFragment;
259c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        }
260c578ad430b51de0151ca9b3299d84f73bb71286bsusnata
261c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        private ArrayObjectAdapter createListRowAdapter(int i) {
262c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter((i & 1) == 0 ?
263c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    mCardPresenter : mCardPresenter2);
264c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            listRowAdapter.add(new PhotoItem(
265c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    "Hello world",
266c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    R.drawable.gallery_photo_1));
267c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            listRowAdapter.add(new PhotoItem(
268c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    "This is a test",
269c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    "Only a test",
270c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    R.drawable.gallery_photo_2));
271c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            listRowAdapter.add(new PhotoItem(
272c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    "Android TV",
273c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    "by Google",
274c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    R.drawable.gallery_photo_3));
275c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            listRowAdapter.add(new PhotoItem(
276c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    "Leanback",
277c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    R.drawable.gallery_photo_4));
278c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            listRowAdapter.add(new PhotoItem(
279c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    "GuidedStep (Slide left/right)",
280c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    R.drawable.gallery_photo_5));
281c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            listRowAdapter.add(new PhotoItem(
282c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    "GuidedStep (Slide bottom up)",
283c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    "Open GuidedStepFragment",
284c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    R.drawable.gallery_photo_6));
285c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            listRowAdapter.add(new PhotoItem(
286c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    "Android TV",
287c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    "open RowsActivity",
288c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    R.drawable.gallery_photo_7));
289c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            listRowAdapter.add(new PhotoItem(
290c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    "Leanback",
291c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    "open BrowseActivity",
292c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                    R.drawable.gallery_photo_8));
293c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            return listRowAdapter;
294c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        }
295c578ad430b51de0151ca9b3299d84f73bb71286bsusnata    }
296c578ad430b51de0151ca9b3299d84f73bb71286bsusnata
297c578ad430b51de0151ca9b3299d84f73bb71286bsusnata    private static class SampleFragment extends Fragment {
298c578ad430b51de0151ca9b3299d84f73bb71286bsusnata
299c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        @Override
300c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        public View onCreateView(
301c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
302c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            return inflater.inflate(R.layout.page_fragment, container, false);
303c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        }
304c578ad430b51de0151ca9b3299d84f73bb71286bsusnata    }
305c578ad430b51de0151ca9b3299d84f73bb71286bsusnata
306c578ad430b51de0151ca9b3299d84f73bb71286bsusnata    private static class MyPresenterSelector extends PresenterSelector {
307c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        private Presenter[] presenters = {
308c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                new ListRowPresenter(),
309c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                new PageRowPresenter()
310c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        };
311c578ad430b51de0151ca9b3299d84f73bb71286bsusnata
312c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        @Override
313c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        public Presenter getPresenter(Object item) {
314c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            if (item instanceof PageRow) {
315c578ad430b51de0151ca9b3299d84f73bb71286bsusnata                return presenters[1];
316c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            }
317c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            return presenters[0];
318c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        }
319c578ad430b51de0151ca9b3299d84f73bb71286bsusnata
320c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        @Override
321c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        public Presenter[] getPresenters() {
322c578ad430b51de0151ca9b3299d84f73bb71286bsusnata            return presenters;
323c578ad430b51de0151ca9b3299d84f73bb71286bsusnata        }
324c578ad430b51de0151ca9b3299d84f73bb71286bsusnata    }
3252223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn}
326