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; 20def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport android.util.Log; 21def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport android.view.LayoutInflater; 22def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport android.view.View; 23def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport android.view.ViewGroup; 24def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikas 25def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport androidx.core.app.ActivityOptionsCompat; 26def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport androidx.core.content.res.ResourcesCompat; 27ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.app.GuidedStepFragment; 28ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.app.RowsFragment; 29ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.ArrayObjectAdapter; 30ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.DividerRow; 31ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.HeaderItem; 32ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.ImageCardView; 33ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.ListRow; 34ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.ListRowPresenter; 35ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.OnItemViewClickedListener; 36ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.OnItemViewSelectedListener; 37ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.PageRow; 38ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.Presenter; 39ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.Row; 40ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.RowPresenter; 41ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.SectionRow; 422223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn 43ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikaspublic class BrowseFragment extends androidx.leanback.app.BrowseFragment { 442223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn private static final String TAG = "leanback.BrowseFragment"; 452223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn 4667a49ad87bfde1a06a5c4b423184a89b15328604Dake Gu private static final boolean TEST_ENTRANCE_TRANSITION = true; 47380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata private static final int NUM_ROWS = 8; 48380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata private static final long HEADER_ID1 = 1001; 49380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata private static final long HEADER_ID2 = 1002; 508f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata private static final long HEADER_ID3 = 1003; 51005084f6f0860a69c80492d3549a687ffb283c40Craig Stout 522223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn private ArrayObjectAdapter mRowsAdapter; 53181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu private BackgroundHelper mBackgroundHelper; 542223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn 55da2c70f656f02c377b796694ca27d93e2b698733Dake Gu // For good performance, it's important to use a single instance of 56da2c70f656f02c377b796694ca27d93e2b698733Dake Gu // a card presenter for all rows using that presenter. 5787b904ffa106f12f2fecfe8b9a46084863678f29Dake Gu final CardPresenter mCardPresenter = new CardPresenter(); 5887b904ffa106f12f2fecfe8b9a46084863678f29Dake Gu final CardPresenter mCardPresenter2 = new CardPresenter(R.style.MyImageCardViewTheme); 59da2c70f656f02c377b796694ca27d93e2b698733Dake Gu 60c578ad430b51de0151ca9b3299d84f73bb71286bsusnata public BrowseFragment() { 61380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata getMainFragmentRegistry().registerFragment(PageRow.class, new PageRowFragmentFactory()); 62c578ad430b51de0151ca9b3299d84f73bb71286bsusnata } 63c578ad430b51de0151ca9b3299d84f73bb71286bsusnata 642223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn @Override 652223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn public void onCreate(Bundle savedInstanceState) { 662223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn Log.i(TAG, "onCreate"); 672223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn super.onCreate(savedInstanceState); 682223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn 69181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu mBackgroundHelper = new BackgroundHelper(getActivity()); 70181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu mBackgroundHelper.attachToWindow(); 71181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu 72b7087e036a48f5a3db28d02ff7f9b97fbbc46c4fDake Gu setBadgeDrawable(ResourcesCompat.getDrawable(getActivity().getResources(), 73b7087e036a48f5a3db28d02ff7f9b97fbbc46c4fDake Gu R.drawable.ic_title, getActivity().getTheme())); 742085f1d8c47e93c8bf94d137533fd126d32a48b4Craig Stout setTitle("Leanback Sample App"); 752085f1d8c47e93c8bf94d137533fd126d32a48b4Craig Stout setHeadersState(HEADERS_ENABLED); 76816bfc28b79d802b4366684775df74cf40109e6eJerome Poichet setOnSearchClickedListener(new View.OnClickListener() { 77816bfc28b79d802b4366684775df74cf40109e6eJerome Poichet @Override 78816bfc28b79d802b4366684775df74cf40109e6eJerome Poichet public void onClick(View view) { 79816bfc28b79d802b4366684775df74cf40109e6eJerome Poichet Intent intent = new Intent(getActivity(), SearchActivity.class); 80816bfc28b79d802b4366684775df74cf40109e6eJerome Poichet startActivity(intent); 81816bfc28b79d802b4366684775df74cf40109e6eJerome Poichet } 82816bfc28b79d802b4366684775df74cf40109e6eJerome Poichet }); 83816bfc28b79d802b4366684775df74cf40109e6eJerome Poichet 847f3028385b0349cfc6c0d6784840be148943b296Dake Gu setOnItemViewClickedListener(new ItemViewClickedListener()); 85ffd20ebba154edf2374a53d4bb1c682b6737ab77Craig Stout setOnItemViewSelectedListener(new OnItemViewSelectedListener() { 86ffd20ebba154edf2374a53d4bb1c682b6737ab77Craig Stout @Override 87ffd20ebba154edf2374a53d4bb1c682b6737ab77Craig Stout public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item, 88ffd20ebba154edf2374a53d4bb1c682b6737ab77Craig Stout RowPresenter.ViewHolder rowViewHolder, Row row) { 89ffd20ebba154edf2374a53d4bb1c682b6737ab77Craig Stout Log.i(TAG, "onItemSelected: " + item + " row " + row); 90af136b73e6c8e377914e494f9870da1618be20d0Craig Stout 91181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu updateBackgroundToSelection(); 92181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu } 93181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu }); 94181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu setBrowseTransitionListener(new BrowseTransitionListener() { 95181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu @Override 96181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu public void onHeadersTransitionStop(boolean withHeaders) { 97181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu updateBackgroundToSelection(); 98ffd20ebba154edf2374a53d4bb1c682b6737ab77Craig Stout } 99ffd20ebba154edf2374a53d4bb1c682b6737ab77Craig Stout }); 10067a49ad87bfde1a06a5c4b423184a89b15328604Dake Gu if (TEST_ENTRANCE_TRANSITION) { 101da2c70f656f02c377b796694ca27d93e2b698733Dake Gu // don't run entrance transition if fragment is restored. 10267a49ad87bfde1a06a5c4b423184a89b15328604Dake Gu if (savedInstanceState == null) { 1039744dea0e0ea62d654a1bb352cb60201d869e390Dake Gu prepareEntranceTransition(); 10467a49ad87bfde1a06a5c4b423184a89b15328604Dake Gu } 10567a49ad87bfde1a06a5c4b423184a89b15328604Dake Gu } 106380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata 107da2c70f656f02c377b796694ca27d93e2b698733Dake Gu // simulates in a real world use case data being loaded two seconds later 108da2c70f656f02c377b796694ca27d93e2b698733Dake Gu new Handler().postDelayed(new Runnable() { 109e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas @Override 110da2c70f656f02c377b796694ca27d93e2b698733Dake Gu public void run() { 11135d7a6c31606ed4ca38deda3cacae080a95c95c9susnata setupRows(); 112da2c70f656f02c377b796694ca27d93e2b698733Dake Gu loadData(); 113da2c70f656f02c377b796694ca27d93e2b698733Dake Gu startEntranceTransition(); 114da2c70f656f02c377b796694ca27d93e2b698733Dake Gu } 115da2c70f656f02c377b796694ca27d93e2b698733Dake Gu }, 2000); 1162223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn } 1172223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn 118c578ad430b51de0151ca9b3299d84f73bb71286bsusnata @Override 119181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu public void onStart() { 120181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu super.onStart(); 121181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu updateBackgroundToSelection(); 122181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu } 123181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu 124181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu void updateBackgroundToSelection() { 125181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu if (!isShowingHeaders()) { 126181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu RowPresenter.ViewHolder rowViewHolder = getSelectedRowViewHolder(); 127181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu Object item = rowViewHolder == null ? null : rowViewHolder.getSelectedItem(); 128181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu if (item != null) { 129181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu mBackgroundHelper.setBackground(((PhotoItem) item).getImageResourceId()); 130181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu } else { 131181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu mBackgroundHelper.clearDrawable(); 132181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu } 133181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu } else { 134181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu mBackgroundHelper.clearDrawable(); 135181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu } 136181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu } 137181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu 138181c8847d5a1169e26755ed690131333b7fff7e9Dake Gu @Override 139c578ad430b51de0151ca9b3299d84f73bb71286bsusnata public View onCreateView( 140c578ad430b51de0151ca9b3299d84f73bb71286bsusnata LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 141c578ad430b51de0151ca9b3299d84f73bb71286bsusnata return super.onCreateView(inflater, container, savedInstanceState); 142c578ad430b51de0151ca9b3299d84f73bb71286bsusnata } 1432223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn 144c578ad430b51de0151ca9b3299d84f73bb71286bsusnata private void setupRows() { 1454ff7f6d210b75531b3dce98f8028804f55c72051susnata ListRowPresenter listRowPresenter = new ListRowPresenter(); 14648cbca8d2f412611a09e4f231055f10573a1f45asusnata listRowPresenter.setNumRows(1); 1474ff7f6d210b75531b3dce98f8028804f55c72051susnata mRowsAdapter = new ArrayObjectAdapter(listRowPresenter); 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"))); 16799e222d5b14544bbb89d402eb704829c642f8abfDake Gu setAdapter(mRowsAdapter); 168c578ad430b51de0151ca9b3299d84f73bb71286bsusnata } 169c578ad430b51de0151ca9b3299d84f73bb71286bsusnata 170c578ad430b51de0151ca9b3299d84f73bb71286bsusnata private ArrayObjectAdapter createListRowAdapter(int i) { 171c578ad430b51de0151ca9b3299d84f73bb71286bsusnata ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter((i & 1) == 0 ? 172c578ad430b51de0151ca9b3299d84f73bb71286bsusnata mCardPresenter : mCardPresenter2); 173c578ad430b51de0151ca9b3299d84f73bb71286bsusnata listRowAdapter.add(new PhotoItem( 174c578ad430b51de0151ca9b3299d84f73bb71286bsusnata "Hello world", 175c578ad430b51de0151ca9b3299d84f73bb71286bsusnata R.drawable.gallery_photo_1)); 176c578ad430b51de0151ca9b3299d84f73bb71286bsusnata listRowAdapter.add(new PhotoItem( 177c578ad430b51de0151ca9b3299d84f73bb71286bsusnata "This is a test", 178c578ad430b51de0151ca9b3299d84f73bb71286bsusnata "Only a test", 179c578ad430b51de0151ca9b3299d84f73bb71286bsusnata R.drawable.gallery_photo_2)); 180c578ad430b51de0151ca9b3299d84f73bb71286bsusnata listRowAdapter.add(new PhotoItem( 181c578ad430b51de0151ca9b3299d84f73bb71286bsusnata "Android TV", 182c578ad430b51de0151ca9b3299d84f73bb71286bsusnata "by Google", 183c578ad430b51de0151ca9b3299d84f73bb71286bsusnata R.drawable.gallery_photo_3)); 184c578ad430b51de0151ca9b3299d84f73bb71286bsusnata listRowAdapter.add(new PhotoItem( 185c578ad430b51de0151ca9b3299d84f73bb71286bsusnata "Leanback", 186c578ad430b51de0151ca9b3299d84f73bb71286bsusnata R.drawable.gallery_photo_4)); 187c578ad430b51de0151ca9b3299d84f73bb71286bsusnata listRowAdapter.add(new PhotoItem( 188c578ad430b51de0151ca9b3299d84f73bb71286bsusnata "GuidedStep (Slide left/right)", 189c578ad430b51de0151ca9b3299d84f73bb71286bsusnata R.drawable.gallery_photo_5)); 190c578ad430b51de0151ca9b3299d84f73bb71286bsusnata listRowAdapter.add(new PhotoItem( 191c578ad430b51de0151ca9b3299d84f73bb71286bsusnata "GuidedStep (Slide bottom up)", 192c578ad430b51de0151ca9b3299d84f73bb71286bsusnata "Open GuidedStepFragment", 193c578ad430b51de0151ca9b3299d84f73bb71286bsusnata R.drawable.gallery_photo_6)); 194c578ad430b51de0151ca9b3299d84f73bb71286bsusnata listRowAdapter.add(new PhotoItem( 195c578ad430b51de0151ca9b3299d84f73bb71286bsusnata "Android TV", 196c578ad430b51de0151ca9b3299d84f73bb71286bsusnata "open RowsActivity", 197c578ad430b51de0151ca9b3299d84f73bb71286bsusnata R.drawable.gallery_photo_7)); 198c578ad430b51de0151ca9b3299d84f73bb71286bsusnata listRowAdapter.add(new PhotoItem( 199c578ad430b51de0151ca9b3299d84f73bb71286bsusnata "Leanback", 200c578ad430b51de0151ca9b3299d84f73bb71286bsusnata "open BrowseActivity", 201c578ad430b51de0151ca9b3299d84f73bb71286bsusnata R.drawable.gallery_photo_8)); 2028f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata listRowAdapter.add(new PhotoItem( 2034ff7f6d210b75531b3dce98f8028804f55c72051susnata "Hello world", 2044ff7f6d210b75531b3dce98f8028804f55c72051susnata R.drawable.gallery_photo_1)); 2054ff7f6d210b75531b3dce98f8028804f55c72051susnata listRowAdapter.add(new PhotoItem( 2064ff7f6d210b75531b3dce98f8028804f55c72051susnata "This is a test", 2074ff7f6d210b75531b3dce98f8028804f55c72051susnata "Only a test", 2084ff7f6d210b75531b3dce98f8028804f55c72051susnata R.drawable.gallery_photo_2)); 2094ff7f6d210b75531b3dce98f8028804f55c72051susnata listRowAdapter.add(new PhotoItem( 2104ff7f6d210b75531b3dce98f8028804f55c72051susnata "Android TV", 2114ff7f6d210b75531b3dce98f8028804f55c72051susnata "by Google", 2124ff7f6d210b75531b3dce98f8028804f55c72051susnata R.drawable.gallery_photo_3)); 2138f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata listRowAdapter.add(new PhotoItem( 2148f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata "Leanback", 2154ff7f6d210b75531b3dce98f8028804f55c72051susnata R.drawable.gallery_photo_4)); 216c578ad430b51de0151ca9b3299d84f73bb71286bsusnata return listRowAdapter; 2172223b08a0435d06a61fa0046098fc80ad4293c1cTim Kilbourn } 2181684edec87235b40126662107630cf0f603c45eaTim Kilbourn 2197f3028385b0349cfc6c0d6784840be148943b296Dake Gu private final class ItemViewClickedListener implements OnItemViewClickedListener { 2207f3028385b0349cfc6c0d6784840be148943b296Dake Gu @Override 2217f3028385b0349cfc6c0d6784840be148943b296Dake Gu public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item, 2227f3028385b0349cfc6c0d6784840be148943b296Dake Gu RowPresenter.ViewHolder rowViewHolder, Row row) { 2237f3028385b0349cfc6c0d6784840be148943b296Dake Gu 224f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu Intent intent; 225f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu Bundle bundle; 226da2c70f656f02c377b796694ca27d93e2b698733Dake Gu if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_6) { 227da2c70f656f02c377b796694ca27d93e2b698733Dake Gu GuidedStepFragment.add(getFragmentManager(), 22820767a171ab46addb5d50248d4267db14c0c8883susnata new GuidedStepHalfScreenActivity.FirstStepFragment(), 229ee3c13ee552002263be40f6a5986f61c605b0bacDake Gu R.id.lb_guidedstep_host); 230da2c70f656f02c377b796694ca27d93e2b698733Dake Gu return; 23120767a171ab46addb5d50248d4267db14c0c8883susnata } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_5) { 23220767a171ab46addb5d50248d4267db14c0c8883susnata GuidedStepFragment.add(getFragmentManager(), 233c578ad430b51de0151ca9b3299d84f73bb71286bsusnata new GuidedStepActivity.FirstStepFragment(), R.id.lb_guidedstep_host); 234c578ad430b51de0151ca9b3299d84f73bb71286bsusnata return; 235c578ad430b51de0151ca9b3299d84f73bb71286bsusnata } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_8) { 236f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu intent = new Intent(getActivity(), BrowseActivity.class); 237f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity()) 238f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu .toBundle(); 239c578ad430b51de0151ca9b3299d84f73bb71286bsusnata } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_7) { 240f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu intent = new Intent(getActivity(), RowsActivity.class); 241f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity()) 242f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu .toBundle(); 24367a49ad87bfde1a06a5c4b423184a89b15328604Dake Gu } else { 244f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu intent = new Intent(getActivity(), DetailsActivity.class); 245f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu intent.putExtra(DetailsActivity.EXTRA_ITEM, (PhotoItem) item); 246f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu bundle = ActivityOptionsCompat.makeSceneTransitionAnimation( 247f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu getActivity(), 248c578ad430b51de0151ca9b3299d84f73bb71286bsusnata ((ImageCardView) itemViewHolder.view).getMainImageView(), 249f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu DetailsActivity.SHARED_ELEMENT_NAME).toBundle(); 25067a49ad87bfde1a06a5c4b423184a89b15328604Dake Gu } 251f3206b05abc0c73e4d4ea34b514ac35cd207b2e1Dake Gu getActivity().startActivity(intent, bundle); 2521684edec87235b40126662107630cf0f603c45eaTim Kilbourn } 2531684edec87235b40126662107630cf0f603c45eaTim Kilbourn } 254c578ad430b51de0151ca9b3299d84f73bb71286bsusnata 255380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata public static class PageRowFragmentFactory extends FragmentFactory { 256c578ad430b51de0151ca9b3299d84f73bb71286bsusnata 257c578ad430b51de0151ca9b3299d84f73bb71286bsusnata @Override 258380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata public Fragment createFragment(Object rowObj) { 259380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata Row row = (Row) rowObj; 260380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata if (row.getHeaderItem().getId() == HEADER_ID1) { 2615f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu return new SampleRowsFragment(); 262380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata } else if (row.getHeaderItem().getId() == HEADER_ID2) { 263380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata return new SampleRowsFragment(); 2648f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata } else if (row.getHeaderItem().getId() == HEADER_ID3) { 2658f94d180902da7469b67f7c47c93a3a0b9acdb3asusnata return new SampleFragment(); 266c578ad430b51de0151ca9b3299d84f73bb71286bsusnata } 267380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata 268380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata return null; 269c578ad430b51de0151ca9b3299d84f73bb71286bsusnata } 270c578ad430b51de0151ca9b3299d84f73bb71286bsusnata } 271c578ad430b51de0151ca9b3299d84f73bb71286bsusnata 272380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata public static class SampleRowsFragment extends RowsFragment { 273c578ad430b51de0151ca9b3299d84f73bb71286bsusnata final CardPresenter mCardPresenter = new CardPresenter(); 274c578ad430b51de0151ca9b3299d84f73bb71286bsusnata final CardPresenter mCardPresenter2 = new CardPresenter(R.style.MyImageCardViewTheme); 275c578ad430b51de0151ca9b3299d84f73bb71286bsusnata 2765f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu void loadFragmentData() { 27799e222d5b14544bbb89d402eb704829c642f8abfDake Gu ArrayObjectAdapter adapter = new ArrayObjectAdapter(new ListRowPresenter()); 278380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata for (int i = 0; i < 4; i++) { 279380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata ListRow row = new ListRow(new HeaderItem("Row " + i), createListRowAdapter(i)); 280380a6d5bcb74ec69524f248d0b2edee49805b31bsusnata adapter.add(row); 281c578ad430b51de0151ca9b3299d84f73bb71286bsusnata } 2825f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu if (getMainFragmentAdapter() != null) { 2835f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu getMainFragmentAdapter().getFragmentHost() 2845f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu .notifyDataReady(getMainFragmentAdapter()); 2855f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu } 28699e222d5b14544bbb89d402eb704829c642f8abfDake Gu setAdapter(adapter); 2875f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu } 2885f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu 2895f15bc26bec463ef6ece44e8c90d5c63988ae16bDake Gu public SampleRowsFragment() { 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