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