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; 36b7087e036a48f5a3db28d02ff7f9b97fbbc46c4fDake Guimport android.support.v4.content.res.ResourcesCompat; 372223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbournimport android.util.Log; 38c578ad430b51de0151ca9b3299d84f73bb71286bsusnataimport android.view.LayoutInflater; 39816bfc28b79d802b4366684775df74cf40109e6eJerome Poichetimport android.view.View; 407f3028385b0349cfc6c0d6784840be148943b296Dake Guimport android.view.ViewGroup; 412223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn 422223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbournpublic class BrowseFragment extends android.support.v17.leanback.app.BrowseFragment { 432223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn private static final String TAG = "leanback.BrowseFragment"; 442223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn 4567a49ad87bfde1a06a5c4b423184a89b15328604Dake Gu private static final boolean TEST_ENTRANCE_TRANSITION = true; 46380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata private static final int NUM_ROWS = 8; 47380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata private static final long HEADER_ID1 = 1001; 48380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata private static final long HEADER_ID2 = 1002; 498f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata private static final long HEADER_ID3 = 1003; 50005084f6f0860a69c80492d3549a687ffb283c40Craig Stout 512223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn private ArrayObjectAdapter mRowsAdapter; 52181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu private BackgroundHelper mBackgroundHelper; 532223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn 54da2c70f656f02c377b796694ca27d93e2b698733Dake Gu // For good performance, it's important to use a single instance of 55da2c70f656f02c377b796694ca27d93e2b698733Dake Gu // a card presenter for all rows using that presenter. 5687b904ffa106f12f2fecfe8b9a46084863678f29Dake Gu final CardPresenter mCardPresenter = new CardPresenter(); 5787b904ffa106f12f2fecfe8b9a46084863678f29Dake Gu final CardPresenter mCardPresenter2 = new CardPresenter(R.style.MyImageCardViewTheme); 58da2c70f656f02c377b796694ca27d93e2b698733Dake Gu 59c578ad430b51de0151ca9b3299d84f73bb71286bsusnata public BrowseFragment() { 60380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata getMainFragmentRegistry().registerFragment(PageRow.class, new PageRowFragmentFactory()); 61c578ad430b51de0151ca9b3299d84f73bb71286bsusnata } 62c578ad430b51de0151ca9b3299d84f73bb71286bsusnata 632223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn @Override 642223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn public void onCreate(Bundle savedInstanceState) { 652223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn Log.i(TAG, "onCreate"); 662223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn super.onCreate(savedInstanceState); 672223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn 68181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu mBackgroundHelper = new BackgroundHelper(getActivity()); 69181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu mBackgroundHelper.attachToWindow(); 70181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu 71b7087e036a48f5a3db28d02ff7f9b97fbbc46c4fDake Gu setBadgeDrawable(ResourcesCompat.getDrawable(getActivity().getResources(), 72b7087e036a48f5a3db28d02ff7f9b97fbbc46c4fDake Gu R.drawable.ic_title, getActivity().getTheme())); 732085f1d8c47e93c8bf94d137533fd126d32a48b4Craig Stout setTitle("Leanback Sample App"); 742085f1d8c47e93c8bf94d137533fd126d32a48b4Craig Stout setHeadersState(HEADERS_ENABLED); 75816bfc28b79d802b4366684775df74cf40109e6eJerome Poichet setOnSearchClickedListener(new View.OnClickListener() { 76816bfc28b79d802b4366684775df74cf40109e6eJerome Poichet @Override 77816bfc28b79d802b4366684775df74cf40109e6eJerome Poichet public void onClick(View view) { 78816bfc28b79d802b4366684775df74cf40109e6eJerome Poichet Intent intent = new Intent(getActivity(), SearchActivity.class); 79816bfc28b79d802b4366684775df74cf40109e6eJerome Poichet startActivity(intent); 80816bfc28b79d802b4366684775df74cf40109e6eJerome Poichet } 81816bfc28b79d802b4366684775df74cf40109e6eJerome Poichet }); 82816bfc28b79d802b4366684775df74cf40109e6eJerome Poichet 837f3028385b0349cfc6c0d6784840be148943b296Dake Gu setOnItemViewClickedListener(new ItemViewClickedListener()); 84ffd20ebba154edf2374a53d4bb1c682b6737ab77Craig Stout setOnItemViewSelectedListener(new OnItemViewSelectedListener() { 85ffd20ebba154edf2374a53d4bb1c682b6737ab77Craig Stout @Override 86ffd20ebba154edf2374a53d4bb1c682b6737ab77Craig Stout public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item, 87ffd20ebba154edf2374a53d4bb1c682b6737ab77Craig Stout RowPresenter.ViewHolder rowViewHolder, Row row) { 88ffd20ebba154edf2374a53d4bb1c682b6737ab77Craig Stout Log.i(TAG, "onItemSelected: " + item + " row " + row); 89af136b73e6c8e377914e494f9870da1618be20d0Craig Stout 90181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu updateBackgroundToSelection(); 91181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu } 92181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu }); 93181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu setBrowseTransitionListener(new BrowseTransitionListener() { 94181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu @Override 95181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu public void onHeadersTransitionStop(boolean withHeaders) { 96181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu updateBackgroundToSelection(); 97ffd20ebba154edf2374a53d4bb1c682b6737ab77Craig Stout } 98ffd20ebba154edf2374a53d4bb1c682b6737ab77Craig Stout }); 9967a49ad87bfde1a06a5c4b423184a89b15328604Dake Gu if (TEST_ENTRANCE_TRANSITION) { 100da2c70f656f02c377b796694ca27d93e2b698733Dake Gu // don't run entrance transition if fragment is restored. 10167a49ad87bfde1a06a5c4b423184a89b15328604Dake Gu if (savedInstanceState == null) { 1029744dea0e0ea62d654a1bb352cb60201d869e390Dake Gu prepareEntranceTransition(); 10367a49ad87bfde1a06a5c4b423184a89b15328604Dake Gu } 10467a49ad87bfde1a06a5c4b423184a89b15328604Dake Gu } 105380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata 106da2c70f656f02c377b796694ca27d93e2b698733Dake Gu // simulates in a real world use case data being loaded two seconds later 107da2c70f656f02c377b796694ca27d93e2b698733Dake Gu new Handler().postDelayed(new Runnable() { 108e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas @Override 109da2c70f656f02c377b796694ca27d93e2b698733Dake Gu public void run() { 11035d7a6c31606ed4ca38deda3cacae080a95c95c9susnata setupRows(); 111da2c70f656f02c377b796694ca27d93e2b698733Dake Gu loadData(); 112da2c70f656f02c377b796694ca27d93e2b698733Dake Gu startEntranceTransition(); 113da2c70f656f02c377b796694ca27d93e2b698733Dake Gu } 114da2c70f656f02c377b796694ca27d93e2b698733Dake Gu }, 2000); 1152223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn } 1162223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn 117c578ad430b51de0151ca9b3299d84f73bb71286bsusnata @Override 118181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu public void onStart() { 119181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu super.onStart(); 120181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu updateBackgroundToSelection(); 121181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu } 122181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu 123181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu void updateBackgroundToSelection() { 124181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu if (!isShowingHeaders()) { 125181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu RowPresenter.ViewHolder rowViewHolder = getSelectedRowViewHolder(); 126181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu Object item = rowViewHolder == null ? null : rowViewHolder.getSelectedItem(); 127181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu if (item != null) { 128181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu mBackgroundHelper.setBackground(((PhotoItem) item).getImageResourceId()); 129181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu } else { 130181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu mBackgroundHelper.clearDrawable(); 131181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu } 132181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu } else { 133181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu mBackgroundHelper.clearDrawable(); 134181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu } 135181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu } 136181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu 137181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu @Override 138c578ad430b51de0151ca9b3299d84f73bb71286bsusnata public View onCreateView( 139c578ad430b51de0151ca9b3299d84f73bb71286bsusnata LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 140c578ad430b51de0151ca9b3299d84f73bb71286bsusnata return super.onCreateView(inflater, container, savedInstanceState); 141c578ad430b51de0151ca9b3299d84f73bb71286bsusnata } 1422223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn 143c578ad430b51de0151ca9b3299d84f73bb71286bsusnata private void setupRows() { 1444ff7f6d210b75531b3dce98f8028804f55c72051susnata ListRowPresenter listRowPresenter = new ListRowPresenter(); 14548cbca8d2f412611a09e4f231055f10573a1f45asusnata listRowPresenter.setNumRows(1); 1464ff7f6d210b75531b3dce98f8028804f55c72051susnata mRowsAdapter = new ArrayObjectAdapter(listRowPresenter); 147da2c70f656f02c377b796694ca27d93e2b698733Dake Gu setAdapter(mRowsAdapter); 148da2c70f656f02c377b796694ca27d93e2b698733Dake Gu } 1490cd6f9d62c8b026d4e94f424c91f4083f26f61aaCraig Stout 150da2c70f656f02c377b796694ca27d93e2b698733Dake Gu private void loadData() { 151c578ad430b51de0151ca9b3299d84f73bb71286bsusnata int i = 0; 152380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata 1535635fbd2da9e73c8f68287626728f909565c7a8aDake Gu mRowsAdapter.add(new PageRow(new HeaderItem(HEADER_ID1, "Page Row 0"))); 1545635fbd2da9e73c8f68287626728f909565c7a8aDake Gu mRowsAdapter.add(new DividerRow()); 155380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata 1565635fbd2da9e73c8f68287626728f909565c7a8aDake Gu mRowsAdapter.add(new SectionRow(new HeaderItem("section 0"))); 157c578ad430b51de0151ca9b3299d84f73bb71286bsusnata for (; i < NUM_ROWS; ++i) { 15848cbca8d2f412611a09e4f231055f10573a1f45asusnata HeaderItem headerItem = new HeaderItem(i, "Row " + i); 15948cbca8d2f412611a09e4f231055f10573a1f45asusnata headerItem.setDescription("Description for Row "+i); 16048cbca8d2f412611a09e4f231055f10573a1f45asusnata mRowsAdapter.add(new ListRow(headerItem, createListRowAdapter(i))); 1612223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn } 1622223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn 1635635fbd2da9e73c8f68287626728f909565c7a8aDake Gu mRowsAdapter.add(new DividerRow()); 1645635fbd2da9e73c8f68287626728f909565c7a8aDake Gu mRowsAdapter.add(new PageRow(new HeaderItem(HEADER_ID2, "Page Row 1"))); 1658f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata 1668f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata mRowsAdapter.add(new PageRow(new HeaderItem(HEADER_ID3, "Page Row 2"))); 167c578ad430b51de0151ca9b3299d84f73bb71286bsusnata } 168c578ad430b51de0151ca9b3299d84f73bb71286bsusnata 169c578ad430b51de0151ca9b3299d84f73bb71286bsusnata private ArrayObjectAdapter createListRowAdapter(int i) { 170c578ad430b51de0151ca9b3299d84f73bb71286bsusnata ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter((i & 1) == 0 ? 171c578ad430b51de0151ca9b3299d84f73bb71286bsusnata mCardPresenter : mCardPresenter2); 172c578ad430b51de0151ca9b3299d84f73bb71286bsusnata listRowAdapter.add(new PhotoItem( 173c578ad430b51de0151ca9b3299d84f73bb71286bsusnata "Hello world", 174c578ad430b51de0151ca9b3299d84f73bb71286bsusnata R.drawable.gallery_photo_1)); 175c578ad430b51de0151ca9b3299d84f73bb71286bsusnata listRowAdapter.add(new PhotoItem( 176c578ad430b51de0151ca9b3299d84f73bb71286bsusnata "This is a test", 177c578ad430b51de0151ca9b3299d84f73bb71286bsusnata "Only a test", 178c578ad430b51de0151ca9b3299d84f73bb71286bsusnata R.drawable.gallery_photo_2)); 179c578ad430b51de0151ca9b3299d84f73bb71286bsusnata listRowAdapter.add(new PhotoItem( 180c578ad430b51de0151ca9b3299d84f73bb71286bsusnata "Android TV", 181c578ad430b51de0151ca9b3299d84f73bb71286bsusnata "by Google", 182c578ad430b51de0151ca9b3299d84f73bb71286bsusnata R.drawable.gallery_photo_3)); 183c578ad430b51de0151ca9b3299d84f73bb71286bsusnata listRowAdapter.add(new PhotoItem( 184c578ad430b51de0151ca9b3299d84f73bb71286bsusnata "Leanback", 185c578ad430b51de0151ca9b3299d84f73bb71286bsusnata R.drawable.gallery_photo_4)); 186c578ad430b51de0151ca9b3299d84f73bb71286bsusnata listRowAdapter.add(new PhotoItem( 187c578ad430b51de0151ca9b3299d84f73bb71286bsusnata "GuidedStep (Slide left/right)", 188c578ad430b51de0151ca9b3299d84f73bb71286bsusnata R.drawable.gallery_photo_5)); 189c578ad430b51de0151ca9b3299d84f73bb71286bsusnata listRowAdapter.add(new PhotoItem( 190c578ad430b51de0151ca9b3299d84f73bb71286bsusnata "GuidedStep (Slide bottom up)", 191c578ad430b51de0151ca9b3299d84f73bb71286bsusnata "Open GuidedStepFragment", 192c578ad430b51de0151ca9b3299d84f73bb71286bsusnata R.drawable.gallery_photo_6)); 193c578ad430b51de0151ca9b3299d84f73bb71286bsusnata listRowAdapter.add(new PhotoItem( 194c578ad430b51de0151ca9b3299d84f73bb71286bsusnata "Android TV", 195c578ad430b51de0151ca9b3299d84f73bb71286bsusnata "open RowsActivity", 196c578ad430b51de0151ca9b3299d84f73bb71286bsusnata R.drawable.gallery_photo_7)); 197c578ad430b51de0151ca9b3299d84f73bb71286bsusnata listRowAdapter.add(new PhotoItem( 198c578ad430b51de0151ca9b3299d84f73bb71286bsusnata "Leanback", 199c578ad430b51de0151ca9b3299d84f73bb71286bsusnata "open BrowseActivity", 200c578ad430b51de0151ca9b3299d84f73bb71286bsusnata R.drawable.gallery_photo_8)); 2018f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata listRowAdapter.add(new PhotoItem( 2024ff7f6d210b75531b3dce98f8028804f55c72051susnata "Hello world", 2034ff7f6d210b75531b3dce98f8028804f55c72051susnata R.drawable.gallery_photo_1)); 2044ff7f6d210b75531b3dce98f8028804f55c72051susnata listRowAdapter.add(new PhotoItem( 2054ff7f6d210b75531b3dce98f8028804f55c72051susnata "This is a test", 2064ff7f6d210b75531b3dce98f8028804f55c72051susnata "Only a test", 2074ff7f6d210b75531b3dce98f8028804f55c72051susnata R.drawable.gallery_photo_2)); 2084ff7f6d210b75531b3dce98f8028804f55c72051susnata listRowAdapter.add(new PhotoItem( 2094ff7f6d210b75531b3dce98f8028804f55c72051susnata "Android TV", 2104ff7f6d210b75531b3dce98f8028804f55c72051susnata "by Google", 2114ff7f6d210b75531b3dce98f8028804f55c72051susnata R.drawable.gallery_photo_3)); 2128f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata listRowAdapter.add(new PhotoItem( 2138f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata "Leanback", 2144ff7f6d210b75531b3dce98f8028804f55c72051susnata R.drawable.gallery_photo_4)); 215c578ad430b51de0151ca9b3299d84f73bb71286bsusnata return listRowAdapter; 2162223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn } 2171684edec87235b40126662107630cf0f603c45eaTim Kilbourn 2187f3028385b0349cfc6c0d6784840be148943b296Dake Gu private final class ItemViewClickedListener implements OnItemViewClickedListener { 2197f3028385b0349cfc6c0d6784840be148943b296Dake Gu @Override 2207f3028385b0349cfc6c0d6784840be148943b296Dake Gu public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item, 2217f3028385b0349cfc6c0d6784840be148943b296Dake Gu RowPresenter.ViewHolder rowViewHolder, Row row) { 2227f3028385b0349cfc6c0d6784840be148943b296Dake Gu 223f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu Intent intent; 224f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu Bundle bundle; 225da2c70f656f02c377b796694ca27d93e2b698733Dake Gu if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_6) { 226da2c70f656f02c377b796694ca27d93e2b698733Dake Gu GuidedStepFragment.add(getFragmentManager(), 22720767a171ab46addb5d50248d4267db14c0c8883susnata new GuidedStepHalfScreenActivity.FirstStepFragment(), 228ee3c13ee552002263be40f6a5986f61c605b0bacDake Gu R.id.lb_guidedstep_host); 229da2c70f656f02c377b796694ca27d93e2b698733Dake Gu return; 23020767a171ab46addb5d50248d4267db14c0c8883susnata } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_5) { 23120767a171ab46addb5d50248d4267db14c0c8883susnata GuidedStepFragment.add(getFragmentManager(), 232c578ad430b51de0151ca9b3299d84f73bb71286bsusnata new GuidedStepActivity.FirstStepFragment(), R.id.lb_guidedstep_host); 233c578ad430b51de0151ca9b3299d84f73bb71286bsusnata return; 234c578ad430b51de0151ca9b3299d84f73bb71286bsusnata } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_8) { 235f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu intent = new Intent(getActivity(), BrowseActivity.class); 236f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity()) 237f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu .toBundle(); 238c578ad430b51de0151ca9b3299d84f73bb71286bsusnata } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_7) { 239f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu intent = new Intent(getActivity(), RowsActivity.class); 240f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity()) 241f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu .toBundle(); 24267a49ad87bfde1a06a5c4b423184a89b15328604Dake Gu } else { 243f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu intent = new Intent(getActivity(), DetailsActivity.class); 244f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu intent.putExtra(DetailsActivity.EXTRA_ITEM, (PhotoItem) item); 245f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu bundle = ActivityOptionsCompat.makeSceneTransitionAnimation( 246f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu getActivity(), 247c578ad430b51de0151ca9b3299d84f73bb71286bsusnata ((ImageCardView) itemViewHolder.view).getMainImageView(), 248f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu DetailsActivity.SHARED_ELEMENT_NAME).toBundle(); 24967a49ad87bfde1a06a5c4b423184a89b15328604Dake Gu } 250f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu getActivity().startActivity(intent, bundle); 2511684edec87235b40126662107630cf0f603c45eaTim Kilbourn } 2521684edec87235b40126662107630cf0f603c45eaTim Kilbourn } 253c578ad430b51de0151ca9b3299d84f73bb71286bsusnata 254380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata public static class PageRowFragmentFactory extends FragmentFactory { 255c578ad430b51de0151ca9b3299d84f73bb71286bsusnata 256c578ad430b51de0151ca9b3299d84f73bb71286bsusnata @Override 257380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata public Fragment createFragment(Object rowObj) { 258380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata Row row = (Row) rowObj; 259380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata if (row.getHeaderItem().getId() == HEADER_ID1) { 2605f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu return new SampleRowsFragment(); 261380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata } else if (row.getHeaderItem().getId() == HEADER_ID2) { 262380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata return new SampleRowsFragment(); 2638f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata } else if (row.getHeaderItem().getId() == HEADER_ID3) { 2648f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata return new SampleFragment(); 265c578ad430b51de0151ca9b3299d84f73bb71286bsusnata } 266380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata 267380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata return null; 268c578ad430b51de0151ca9b3299d84f73bb71286bsusnata } 269c578ad430b51de0151ca9b3299d84f73bb71286bsusnata } 270c578ad430b51de0151ca9b3299d84f73bb71286bsusnata 271380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata public static class SampleRowsFragment extends RowsFragment { 272c578ad430b51de0151ca9b3299d84f73bb71286bsusnata final CardPresenter mCardPresenter = new CardPresenter(); 273c578ad430b51de0151ca9b3299d84f73bb71286bsusnata final CardPresenter mCardPresenter2 = new CardPresenter(R.style.MyImageCardViewTheme); 274c578ad430b51de0151ca9b3299d84f73bb71286bsusnata 2755f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu void loadFragmentData() { 2765f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu ArrayObjectAdapter adapter = (ArrayObjectAdapter) getAdapter(); 277380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata for (int i = 0; i < 4; i++) { 278380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata ListRow row = new ListRow(new HeaderItem("Row " + i), createListRowAdapter(i)); 279380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata adapter.add(row); 280c578ad430b51de0151ca9b3299d84f73bb71286bsusnata } 2815f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu if (getMainFragmentAdapter() != null) { 2825f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu getMainFragmentAdapter().getFragmentHost() 2835f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu .notifyDataReady(getMainFragmentAdapter()); 2845f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu } 2855f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu } 2865f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu 2875f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu public SampleRowsFragment() { 2885f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu ArrayObjectAdapter adapter = new ArrayObjectAdapter(new ListRowPresenter()); 289380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata setAdapter(adapter); 2905f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu // simulates late data loading: 2915f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu new Handler().postDelayed(new Runnable() { 292e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas @Override 2935f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu public void run() { 2945f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu loadFragmentData(); 2955f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu } 2965f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu }, 500); 297380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata 298380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata setOnItemViewClickedListener(new OnItemViewClickedListener() { 299380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata @Override 3004ff7f6d210b75531b3dce98f8028804f55c72051susnata public void onItemClicked( 3014ff7f6d210b75531b3dce98f8028804f55c72051susnata Presenter.ViewHolder itemViewHolder, 3024ff7f6d210b75531b3dce98f8028804f55c72051susnata Object item, 3034ff7f6d210b75531b3dce98f8028804f55c72051susnata RowPresenter.ViewHolder rowViewHolder, 3044ff7f6d210b75531b3dce98f8028804f55c72051susnata Row row) { 3058f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata Intent intent; 3068f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata Bundle bundle; 3078f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_6) { 3085f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu GuidedStepFragment.add(getActivity().getFragmentManager(), 3098f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata new GuidedStepHalfScreenActivity.FirstStepFragment(), 3108f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata R.id.lb_guidedstep_host); 3118f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata return; 3128f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_5) { 3135f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu GuidedStepFragment.add(getActivity().getFragmentManager(), 3148f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata new GuidedStepActivity.FirstStepFragment(), R.id.lb_guidedstep_host); 3158f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata return; 3168f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_8) { 3178f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata intent = new Intent(getActivity(), BrowseActivity.class); 3188f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity()) 3198f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata .toBundle(); 3208f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_7) { 3218f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata intent = new Intent(getActivity(), RowsActivity.class); 3228f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity()) 3238f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata .toBundle(); 3248f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata } else { 3258f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata intent = new Intent(getActivity(), DetailsActivity.class); 3268f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata intent.putExtra(DetailsActivity.EXTRA_ITEM, (PhotoItem) item); 3278f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata bundle = ActivityOptionsCompat.makeSceneTransitionAnimation( 3288f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata getActivity(), 3298f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata ((ImageCardView) itemViewHolder.view).getMainImageView(), 3308f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata DetailsActivity.SHARED_ELEMENT_NAME).toBundle(); 3318f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata } 3328f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata getActivity().startActivity(intent, bundle); 333380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata } 334380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata }); 335c578ad430b51de0151ca9b3299d84f73bb71286bsusnata } 336c578ad430b51de0151ca9b3299d84f73bb71286bsusnata 337c578ad430b51de0151ca9b3299d84f73bb71286bsusnata private ArrayObjectAdapter createListRowAdapter(int i) { 338c578ad430b51de0151ca9b3299d84f73bb71286bsusnata ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter((i & 1) == 0 ? 339c578ad430b51de0151ca9b3299d84f73bb71286bsusnata mCardPresenter : mCardPresenter2); 340c578ad430b51de0151ca9b3299d84f73bb71286bsusnata listRowAdapter.add(new PhotoItem( 341c578ad430b51de0151ca9b3299d84f73bb71286bsusnata "Hello world", 342c578ad430b51de0151ca9b3299d84f73bb71286bsusnata R.drawable.gallery_photo_1)); 343c578ad430b51de0151ca9b3299d84f73bb71286bsusnata listRowAdapter.add(new PhotoItem( 344c578ad430b51de0151ca9b3299d84f73bb71286bsusnata "This is a test", 345c578ad430b51de0151ca9b3299d84f73bb71286bsusnata "Only a test", 346c578ad430b51de0151ca9b3299d84f73bb71286bsusnata R.drawable.gallery_photo_2)); 347c578ad430b51de0151ca9b3299d84f73bb71286bsusnata listRowAdapter.add(new PhotoItem( 348c578ad430b51de0151ca9b3299d84f73bb71286bsusnata "Android TV", 349c578ad430b51de0151ca9b3299d84f73bb71286bsusnata "by Google", 350c578ad430b51de0151ca9b3299d84f73bb71286bsusnata R.drawable.gallery_photo_3)); 351c578ad430b51de0151ca9b3299d84f73bb71286bsusnata listRowAdapter.add(new PhotoItem( 352c578ad430b51de0151ca9b3299d84f73bb71286bsusnata "Leanback", 353c578ad430b51de0151ca9b3299d84f73bb71286bsusnata R.drawable.gallery_photo_4)); 354c578ad430b51de0151ca9b3299d84f73bb71286bsusnata listRowAdapter.add(new PhotoItem( 355c578ad430b51de0151ca9b3299d84f73bb71286bsusnata "GuidedStep (Slide left/right)", 356c578ad430b51de0151ca9b3299d84f73bb71286bsusnata R.drawable.gallery_photo_5)); 357c578ad430b51de0151ca9b3299d84f73bb71286bsusnata listRowAdapter.add(new PhotoItem( 358c578ad430b51de0151ca9b3299d84f73bb71286bsusnata "GuidedStep (Slide bottom up)", 359c578ad430b51de0151ca9b3299d84f73bb71286bsusnata "Open GuidedStepFragment", 360c578ad430b51de0151ca9b3299d84f73bb71286bsusnata R.drawable.gallery_photo_6)); 361c578ad430b51de0151ca9b3299d84f73bb71286bsusnata listRowAdapter.add(new PhotoItem( 362c578ad430b51de0151ca9b3299d84f73bb71286bsusnata "Android TV", 363c578ad430b51de0151ca9b3299d84f73bb71286bsusnata "open RowsActivity", 364c578ad430b51de0151ca9b3299d84f73bb71286bsusnata R.drawable.gallery_photo_7)); 365c578ad430b51de0151ca9b3299d84f73bb71286bsusnata listRowAdapter.add(new PhotoItem( 366c578ad430b51de0151ca9b3299d84f73bb71286bsusnata "Leanback", 367c578ad430b51de0151ca9b3299d84f73bb71286bsusnata "open BrowseActivity", 368c578ad430b51de0151ca9b3299d84f73bb71286bsusnata R.drawable.gallery_photo_8)); 369c578ad430b51de0151ca9b3299d84f73bb71286bsusnata return listRowAdapter; 370c578ad430b51de0151ca9b3299d84f73bb71286bsusnata } 371c578ad430b51de0151ca9b3299d84f73bb71286bsusnata } 372c578ad430b51de0151ca9b3299d84f73bb71286bsusnata 3735f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu public static class PageFragmentAdapterImpl extends MainFragmentAdapter<SampleFragment> { 3745f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu 3755f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu public PageFragmentAdapterImpl(SampleFragment fragment) { 3765f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu super(fragment); 3775f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu setScalingEnabled(true); 3785f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu } 3795f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu 3805f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu @Override 3815f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu public void setEntranceTransitionState(boolean state) { 3825f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu getFragment().setEntranceTransitionState(state); 3835f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu } 3845f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu } 3855f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu 3868f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata public static class SampleFragment extends Fragment implements MainFragmentAdapterProvider { 387380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata 388380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata final PageFragmentAdapterImpl mMainFragmentAdapter = new PageFragmentAdapterImpl(this); 389c578ad430b51de0151ca9b3299d84f73bb71286bsusnata 390acccd0ab69d4c55e763b452c007aed7d14cf6654Dake Gu public void setEntranceTransitionState(boolean state) { 391acccd0ab69d4c55e763b452c007aed7d14cf6654Dake Gu final View view = getView(); 392acccd0ab69d4c55e763b452c007aed7d14cf6654Dake Gu int visibility = state ? View.VISIBLE : View.INVISIBLE; 393acccd0ab69d4c55e763b452c007aed7d14cf6654Dake Gu view.findViewById(R.id.tv1).setVisibility(visibility); 394acccd0ab69d4c55e763b452c007aed7d14cf6654Dake Gu view.findViewById(R.id.tv2).setVisibility(visibility); 395acccd0ab69d4c55e763b452c007aed7d14cf6654Dake Gu view.findViewById(R.id.tv3).setVisibility(visibility); 396acccd0ab69d4c55e763b452c007aed7d14cf6654Dake Gu } 397acccd0ab69d4c55e763b452c007aed7d14cf6654Dake Gu 398c578ad430b51de0151ca9b3299d84f73bb71286bsusnata @Override 399c578ad430b51de0151ca9b3299d84f73bb71286bsusnata public View onCreateView( 400380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 401380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata View view = inflater.inflate(R.layout.page_fragment, container, false); 402380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata view.findViewById(R.id.tv1).setOnClickListener(new View.OnClickListener() { 403380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata @Override 404380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata public void onClick(View view) { 405380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata Intent intent = new Intent(inflater.getContext(), GuidedStepActivity.class); 406380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata startActivity(intent); 407380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata } 408380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata }); 409380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata 410380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata return view; 411380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata } 412380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata 413380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata @Override 414aadab57a5c879a377588d7e5d21b7e8b09b94170Dake Gu public void onViewCreated(View view, Bundle savedInstanceState) { 4155f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu // static layout has view and data ready immediately 4165f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu mMainFragmentAdapter.getFragmentHost().notifyViewCreated(mMainFragmentAdapter); 4175f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu mMainFragmentAdapter.getFragmentHost().notifyDataReady(mMainFragmentAdapter); 418acccd0ab69d4c55e763b452c007aed7d14cf6654Dake Gu } 419acccd0ab69d4c55e763b452c007aed7d14cf6654Dake Gu 420acccd0ab69d4c55e763b452c007aed7d14cf6654Dake Gu @Override 4218f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata public MainFragmentAdapter getMainFragmentAdapter() { 4228f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata return mMainFragmentAdapter; 423c578ad430b51de0151ca9b3299d84f73bb71286bsusnata } 424c578ad430b51de0151ca9b3299d84f73bb71286bsusnata } 4252223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn} 426