MainFragment.java revision 58b7bbb83053e664ada2e1ace49f8960dfecdbfd
158b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell/* 258b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell * Copyright (C) 2016 The Android Open Source Project 358b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell * 458b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell * Licensed under the Apache License, Version 2.0 (the "License"); 558b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell * you may not use this file except in compliance with the License. 658b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell * You may obtain a copy of the License at 758b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell * 858b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell * http://www.apache.org/licenses/LICENSE-2.0 958b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell * 1058b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell * Unless required by applicable law or agreed to in writing, software 1158b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell * distributed under the License is distributed on an "AS IS" BASIS, 1258b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1358b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell * See the License for the specific language governing permissions and 1458b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell * limitations under the License 1558b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell */ 1658b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell 1758b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassellpackage com.google.android.leanbackjank.ui; 1858b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell 1958b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassellimport android.content.Intent; 2058b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassellimport android.net.Uri; 2158b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassellimport android.os.Bundle; 2258b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassellimport android.support.v17.leanback.app.BackgroundManager; 2358b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassellimport android.support.v17.leanback.app.BrowseFragment; 2458b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassellimport android.support.v17.leanback.widget.ArrayObjectAdapter; 2558b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassellimport android.support.v17.leanback.widget.HeaderItem; 2658b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassellimport android.support.v17.leanback.widget.ListRow; 2758b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassellimport android.support.v17.leanback.widget.ListRowPresenter; 2858b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassellimport android.support.v17.leanback.widget.Presenter; 2958b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassellimport android.support.v17.leanback.widget.PresenterSelector; 3058b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell 3158b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassellimport com.google.android.leanbackjank.IntentDefaults; 3258b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassellimport com.google.android.leanbackjank.IntentKeys; 3358b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassellimport com.google.android.leanbackjank.R; 3458b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassellimport com.google.android.leanbackjank.data.VideoProvider; 3558b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassellimport com.google.android.leanbackjank.model.VideoInfo; 3658b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassellimport com.google.android.leanbackjank.presenter.CardPresenter; 3758b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassellimport com.google.android.leanbackjank.presenter.GridItemPresenter; 3858b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassellimport com.google.android.leanbackjank.presenter.HeaderItemPresenter; 3958b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell 4058b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassellimport java.util.HashMap; 4158b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassellimport java.util.List; 4258b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassellimport java.util.Map; 4358b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell 4458b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell/** 4558b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell * Main class to show BrowseFragment with header and rows of videos 4658b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell */ 4758b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassellpublic class MainFragment extends BrowseFragment { 4858b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell 4958b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell private BackgroundManager mBackgroundManager; 5058b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell private ArrayObjectAdapter mRowsAdapter; 5158b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell 5258b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell @Override 5358b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell public void onActivityCreated(Bundle savedInstanceState) { 5458b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell super.onActivityCreated(savedInstanceState); 5558b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell 5658b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell // Define defaults. 5758b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell int categoryCount = IntentDefaults.CATEGORY_COUNT; 5858b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell int entriesPerCat = IntentDefaults.ENTRIES_PER_CATEGORY; 5958b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell boolean disableShadows = IntentDefaults.DISABLE_SHADOWS; 6058b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell int cardWidth = IntentDefaults.CARD_WIDTH; 6158b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell int cardHeight = IntentDefaults.CARD_HEIGHT; 6258b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell boolean playVideo = IntentDefaults.PLAY_VIDEO; 6358b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell boolean useSingleBitmap = IntentDefaults.USE_SINGLE_BITMAP; 6458b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell 6558b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell Intent intent = getActivity().getIntent(); 6658b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell if (intent.getExtras() != null) { 6758b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell categoryCount = intent.getIntExtra(IntentKeys.CATEGORY_COUNT, categoryCount); 6858b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell entriesPerCat = intent.getIntExtra(IntentKeys.ENTRIES_PER_CATEGORY, entriesPerCat); 6958b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell disableShadows = intent.getBooleanExtra(IntentKeys.DISABLE_SHADOWS, disableShadows); 7058b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell cardWidth = intent.getIntExtra(IntentKeys.CARD_WIDTH, cardWidth); 7158b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell cardHeight = intent.getIntExtra(IntentKeys.CARD_HEIGHT, cardHeight); 7258b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell playVideo = intent.getBooleanExtra(IntentKeys.PLAY_VIDEO, playVideo); 7358b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell useSingleBitmap = intent.getBooleanExtra(IntentKeys.USE_SINGLE_BITMAP, useSingleBitmap); 7458b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell } 7558b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell 7658b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell loadVideoData(categoryCount, entriesPerCat, disableShadows, useSingleBitmap, cardWidth, 7758b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell cardHeight); 7858b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell setBackground(); 7958b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell setupUIElements(); 8058b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell 8158b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell if (playVideo) { 8258b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell Uri uri = Uri.parse("android.resource://" + getContext().getPackageName() + "/" 8358b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell + R.raw.testvideo_1080p_60fps); 8458b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell Intent videoIntent = new Intent(Intent.ACTION_VIEW, uri, getContext(), 8558b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell VideoActivity.class); 8658b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell startActivity(videoIntent); 8758b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell } 8858b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell } 8958b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell 9058b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell private void setBackground() { 9158b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell mBackgroundManager = BackgroundManager.getInstance(getActivity()); 9258b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell mBackgroundManager.attach(getActivity().getWindow()); 9358b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell mBackgroundManager.setDrawable( 9458b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell getResources().getDrawable(R.drawable.default_background, null)); 9558b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell } 9658b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell 9758b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell private void setupUIElements() { 9858b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell setBadgeDrawable(getActivity().getResources().getDrawable(R.drawable.app_banner, null)); 9958b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell // Badge, when set, takes precedent over title 10058b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell setTitle(getString(R.string.browse_title)); 10158b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell setHeadersState(HEADERS_ENABLED); 10258b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell setHeadersTransitionOnBackEnabled(true); 10358b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell // set headers background color 10458b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell setBrandColor(getResources().getColor(R.color.jank_yellow)); 10558b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell // set search icon color 10658b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell setSearchAffordanceColor(getResources().getColor(R.color.search_opaque)); 10758b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell 10858b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell setHeaderPresenterSelector(new PresenterSelector() { 10958b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell @Override 11058b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell public Presenter getPresenter(Object o) { 11158b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell return new HeaderItemPresenter(); 11258b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell } 11358b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell }); 11458b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell } 11558b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell 11658b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell private void loadVideoData(int categoryCount, int entriesPerCat, boolean disableShadows, 11758b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell boolean useSingleBitmap, int cardWidth, int cardHeight) { 11858b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell ListRowPresenter listRowPresenter = new ListRowPresenter(); 11958b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell listRowPresenter.setShadowEnabled(!disableShadows); 12058b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell mRowsAdapter = new ArrayObjectAdapter(listRowPresenter); 12158b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell HashMap<String, List<VideoInfo>> data = VideoProvider.buildMedia(categoryCount, 12258b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell entriesPerCat, cardWidth, cardHeight, getContext(), useSingleBitmap); 12358b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell CardPresenter cardPresenter = new CardPresenter(cardWidth, cardHeight); 12458b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell 12558b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell int i = 0; 12658b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell for (Map.Entry<String, List<VideoInfo>> entry : data.entrySet()) { 12758b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(cardPresenter); 12858b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell for (VideoInfo videoInfo : entry.getValue()) { 12958b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell listRowAdapter.add(videoInfo); 13058b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell } 13158b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell HeaderItem header = new HeaderItem(i++, entry.getKey()); 13258b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell mRowsAdapter.add(new ListRow(header, listRowAdapter)); 13358b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell } 13458b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell 13558b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell ArrayObjectAdapter settingsListAdapter = new ArrayObjectAdapter(new GridItemPresenter()); 13658b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell for (int j = 0; j < entriesPerCat; j++) { 13758b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell settingsListAdapter.add("Settings " + j); 13858b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell } 13958b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell HeaderItem settingsHeader = new HeaderItem(i++, "Settings"); 14058b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell mRowsAdapter.add(new ListRow(settingsHeader, settingsListAdapter)); 14158b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell 14258b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell setAdapter(mRowsAdapter); 14358b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell } 14458b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell} 145