BrowseFragment.java revision c578ad430b51de0151ca9b3299d84f73bb71286b
1/* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 * in compliance with the License. You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software distributed under the License 10 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 * or implied. See the License for the specific language governing permissions and limitations under 12 * the License. 13 */ 14package com.example.android.leanback; 15 16import android.app.Fragment; 17import android.content.Intent; 18import android.os.Bundle; 19import android.os.Handler; 20import android.support.v17.leanback.app.GuidedStepFragment; 21import android.support.v17.leanback.app.RowsFragment; 22import android.support.v17.leanback.app.RowsFragmentAdapter; 23import android.support.v17.leanback.widget.ArrayObjectAdapter; 24import android.support.v17.leanback.widget.HeaderItem; 25import android.support.v17.leanback.widget.ImageCardView; 26import android.support.v17.leanback.widget.ListRow; 27import android.support.v17.leanback.widget.ListRowPresenter; 28import android.support.v17.leanback.widget.ObjectAdapter; 29import android.support.v17.leanback.widget.OnItemViewClickedListener; 30import android.support.v17.leanback.widget.OnItemViewSelectedListener; 31import android.support.v17.leanback.widget.PageRow; 32import android.support.v17.leanback.widget.PageRowPresenter; 33import android.support.v17.leanback.widget.Presenter; 34import android.support.v17.leanback.widget.PresenterSelector; 35import android.support.v17.leanback.widget.Row; 36import android.support.v17.leanback.widget.RowPresenter; 37import android.support.v4.app.ActivityOptionsCompat; 38import android.util.Log; 39import android.view.LayoutInflater; 40import android.view.View; 41import android.view.ViewGroup; 42 43public class BrowseFragment extends android.support.v17.leanback.app.BrowseFragment { 44 private static final String TAG = "leanback.BrowseFragment"; 45 46 private static final boolean TEST_ENTRANCE_TRANSITION = true; 47 private static final int NUM_ROWS = 4; 48 49 private ArrayObjectAdapter mRowsAdapter; 50 private BackgroundHelper mBackgroundHelper = new BackgroundHelper(); 51 52 // For good performance, it's important to use a single instance of 53 // a card presenter for all rows using that presenter. 54 final CardPresenter mCardPresenter = new CardPresenter(); 55 final CardPresenter mCardPresenter2 = new CardPresenter(R.style.MyImageCardViewTheme); 56 57 public BrowseFragment() { 58 setMainFragmentAdapterFactory(new MainFragmentFactorAdapterImpl()); 59 } 60 61 @Override 62 public void onCreate(Bundle savedInstanceState) { 63 Log.i(TAG, "onCreate"); 64 super.onCreate(savedInstanceState); 65 66 setBadgeDrawable(getActivity().getResources().getDrawable(R.drawable.ic_title)); 67 setTitle("Leanback Sample App"); 68 setHeadersState(HEADERS_ENABLED); 69 70 setOnSearchClickedListener(new View.OnClickListener() { 71 @Override 72 public void onClick(View view) { 73 Intent intent = new Intent(getActivity(), SearchActivity.class); 74 startActivity(intent); 75 } 76 }); 77 78 setupRows(); 79 setOnItemViewClickedListener(new ItemViewClickedListener()); 80 setOnItemViewSelectedListener(new OnItemViewSelectedListener() { 81 @Override 82 public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item, 83 RowPresenter.ViewHolder rowViewHolder, Row row) { 84 Log.i(TAG, "onItemSelected: " + item + " row " + row); 85 86 if (isShowingHeaders()) { 87 mBackgroundHelper.setBackground(getActivity(), null); 88 } else if (item instanceof PhotoItem) { 89 mBackgroundHelper.setBackground( 90 getActivity(), ((PhotoItem) item).getImageResourceId()); 91 } 92 } 93 }); 94 if (TEST_ENTRANCE_TRANSITION) { 95 // don't run entrance transition if fragment is restored. 96 if (savedInstanceState == null) { 97 prepareEntranceTransition(); 98 } 99 } 100 // simulates in a real world use case data being loaded two seconds later 101 new Handler().postDelayed(new Runnable() { 102 public void run() { 103 loadData(); 104 startEntranceTransition(); 105 } 106 }, 2000); 107 } 108 109 @Override 110 public View onCreateView( 111 LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 112 return super.onCreateView(inflater, container, savedInstanceState); 113 } 114 115 private void setupRows() { 116 mRowsAdapter = new ArrayObjectAdapter(new MyPresenterSelector()); 117 setAdapter(mRowsAdapter); 118 } 119 120 private void loadData() { 121 int i = 0; 122 for (; i < NUM_ROWS; ++i) { 123 HeaderItem header = new HeaderItem(i, "Row " + i); 124 mRowsAdapter.add(new ListRow(header, createListRowAdapter(i))); 125 } 126 127 HeaderItem header = new HeaderItem(NUM_ROWS, "Page Row " + 0); 128 mRowsAdapter.add(new PageRow(header)); 129 130 header = new HeaderItem(NUM_ROWS, "Page Row " + 1); 131 mRowsAdapter.add(new PageRow(header)); 132 } 133 134 private ArrayObjectAdapter createListRowAdapter(int i) { 135 ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter((i & 1) == 0 ? 136 mCardPresenter : mCardPresenter2); 137 listRowAdapter.add(new PhotoItem( 138 "Hello world", 139 R.drawable.gallery_photo_1)); 140 listRowAdapter.add(new PhotoItem( 141 "This is a test", 142 "Only a test", 143 R.drawable.gallery_photo_2)); 144 listRowAdapter.add(new PhotoItem( 145 "Android TV", 146 "by Google", 147 R.drawable.gallery_photo_3)); 148 listRowAdapter.add(new PhotoItem( 149 "Leanback", 150 R.drawable.gallery_photo_4)); 151 listRowAdapter.add(new PhotoItem( 152 "GuidedStep (Slide left/right)", 153 R.drawable.gallery_photo_5)); 154 listRowAdapter.add(new PhotoItem( 155 "GuidedStep (Slide bottom up)", 156 "Open GuidedStepFragment", 157 R.drawable.gallery_photo_6)); 158 listRowAdapter.add(new PhotoItem( 159 "Android TV", 160 "open RowsActivity", 161 R.drawable.gallery_photo_7)); 162 listRowAdapter.add(new PhotoItem( 163 "Leanback", 164 "open BrowseActivity", 165 R.drawable.gallery_photo_8)); 166 return listRowAdapter; 167 } 168 169 private final class ItemViewClickedListener implements OnItemViewClickedListener { 170 @Override 171 public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item, 172 RowPresenter.ViewHolder rowViewHolder, Row row) { 173 174 Intent intent; 175 Bundle bundle; 176 if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_6) { 177 GuidedStepFragment.add(getFragmentManager(), 178 new GuidedStepHalfScreenActivity.FirstStepFragment(), 179 R.id.lb_guidedstep_host); 180 return; 181 } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_5) { 182 GuidedStepFragment.add(getFragmentManager(), 183 new GuidedStepActivity.FirstStepFragment(), R.id.lb_guidedstep_host); 184 return; 185 } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_8) { 186 intent = new Intent(getActivity(), BrowseActivity.class); 187 bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity()) 188 .toBundle(); 189 } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_7) { 190 intent = new Intent(getActivity(), RowsActivity.class); 191 bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity()) 192 .toBundle(); 193 } else { 194 intent = new Intent(getActivity(), DetailsActivity.class); 195 intent.putExtra(DetailsActivity.EXTRA_ITEM, (PhotoItem) item); 196 bundle = ActivityOptionsCompat.makeSceneTransitionAnimation( 197 getActivity(), 198 ((ImageCardView) itemViewHolder.view).getMainImageView(), 199 DetailsActivity.SHARED_ELEMENT_NAME).toBundle(); 200 } 201 getActivity().startActivity(intent, bundle); 202 } 203 } 204 205 private static class MainFragmentFactorAdapterImpl extends MainFragmentAdapterFactory { 206 private AbstractMainFragmentAdapter pageFragmentAdapter1 = new PageFragmentAdapterImpl(); 207 private RowsFragmentAdapter gridPageFragmentAdapter; 208 209 @Override 210 public AbstractMainFragmentAdapter getPageFragmentAdapter( 211 ObjectAdapter adapter, int position) { 212 if (position == 4) { 213 return pageFragmentAdapter1; 214 } else { 215 if (gridPageFragmentAdapter == null) { 216 gridPageFragmentAdapter = new GridPageFragmentAdapterImpl(); 217 } 218 return gridPageFragmentAdapter; 219 } 220 } 221 } 222 223 private static class PageFragmentAdapterImpl extends AbstractMainFragmentAdapter { 224 private Fragment mFragment; 225 226 PageFragmentAdapterImpl() { 227 setScalingEnabled(true); 228 } 229 230 @Override 231 public Fragment getFragment() { 232 if (mFragment == null) { 233 mFragment = new SampleFragment(); 234 } 235 return mFragment; 236 } 237 } 238 239 private static class GridPageFragmentAdapterImpl extends RowsFragmentAdapter { 240 final CardPresenter mCardPresenter = new CardPresenter(); 241 final CardPresenter mCardPresenter2 = new CardPresenter(R.style.MyImageCardViewTheme); 242 private RowsFragment mFragment; 243 244 GridPageFragmentAdapterImpl() { 245 setScalingEnabled(true); 246 } 247 248 protected Fragment createFragment() { 249 if (mFragment == null) { 250 mFragment = new RowsFragment(); 251 ArrayObjectAdapter adapter = new ArrayObjectAdapter(new ListRowPresenter()); 252 for (int i = 0; i < 4; i++) { 253 ListRow row = new ListRow(new HeaderItem("Row " + i), createListRowAdapter(i)); 254 adapter.add(row); 255 } 256 mFragment.setAdapter(adapter); 257 } 258 return mFragment; 259 } 260 261 private ArrayObjectAdapter createListRowAdapter(int i) { 262 ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter((i & 1) == 0 ? 263 mCardPresenter : mCardPresenter2); 264 listRowAdapter.add(new PhotoItem( 265 "Hello world", 266 R.drawable.gallery_photo_1)); 267 listRowAdapter.add(new PhotoItem( 268 "This is a test", 269 "Only a test", 270 R.drawable.gallery_photo_2)); 271 listRowAdapter.add(new PhotoItem( 272 "Android TV", 273 "by Google", 274 R.drawable.gallery_photo_3)); 275 listRowAdapter.add(new PhotoItem( 276 "Leanback", 277 R.drawable.gallery_photo_4)); 278 listRowAdapter.add(new PhotoItem( 279 "GuidedStep (Slide left/right)", 280 R.drawable.gallery_photo_5)); 281 listRowAdapter.add(new PhotoItem( 282 "GuidedStep (Slide bottom up)", 283 "Open GuidedStepFragment", 284 R.drawable.gallery_photo_6)); 285 listRowAdapter.add(new PhotoItem( 286 "Android TV", 287 "open RowsActivity", 288 R.drawable.gallery_photo_7)); 289 listRowAdapter.add(new PhotoItem( 290 "Leanback", 291 "open BrowseActivity", 292 R.drawable.gallery_photo_8)); 293 return listRowAdapter; 294 } 295 } 296 297 private static class SampleFragment extends Fragment { 298 299 @Override 300 public View onCreateView( 301 LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 302 return inflater.inflate(R.layout.page_fragment, container, false); 303 } 304 } 305 306 private static class MyPresenterSelector extends PresenterSelector { 307 private Presenter[] presenters = { 308 new ListRowPresenter(), 309 new PageRowPresenter() 310 }; 311 312 @Override 313 public Presenter getPresenter(Object item) { 314 if (item instanceof PageRow) { 315 return presenters[1]; 316 } 317 return presenters[0]; 318 } 319 320 @Override 321 public Presenter[] getPresenters() { 322 return presenters; 323 } 324 } 325} 326