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