1 /* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License 15 */ 16 17 package com.google.android.leanbackjank.ui; 18 19 import android.content.Intent; 20 import android.net.Uri; 21 import android.os.Bundle; 22 import android.support.v17.leanback.app.BackgroundManager; 23 import android.support.v17.leanback.app.BrowseFragment; 24 import android.support.v17.leanback.widget.ArrayObjectAdapter; 25 import android.support.v17.leanback.widget.HeaderItem; 26 import android.support.v17.leanback.widget.ListRow; 27 import android.support.v17.leanback.widget.ListRowPresenter; 28 import android.support.v17.leanback.widget.Presenter; 29 import android.support.v17.leanback.widget.PresenterSelector; 30 import android.support.v4.content.res.ResourcesCompat; 31 32 import com.google.android.leanbackjank.IntentDefaults; 33 import com.google.android.leanbackjank.IntentKeys; 34 import com.google.android.leanbackjank.R; 35 import com.google.android.leanbackjank.data.VideoProvider; 36 import com.google.android.leanbackjank.model.VideoInfo; 37 import com.google.android.leanbackjank.presenter.CardPresenter; 38 import com.google.android.leanbackjank.presenter.GridItemPresenter; 39 import com.google.android.leanbackjank.presenter.HeaderItemPresenter; 40 41 import java.util.HashMap; 42 import java.util.List; 43 import java.util.Map; 44 45 /** 46 * Main class to show BrowseFragment with header and rows of videos 47 */ 48 public class MainFragment extends BrowseFragment { 49 50 private BackgroundManager mBackgroundManager; 51 private ArrayObjectAdapter mRowsAdapter; 52 53 @Override onActivityCreated(Bundle savedInstanceState)54 public void onActivityCreated(Bundle savedInstanceState) { 55 super.onActivityCreated(savedInstanceState); 56 57 // Define defaults. 58 int categoryCount = IntentDefaults.CATEGORY_COUNT; 59 int entriesPerCat = IntentDefaults.ENTRIES_PER_CATEGORY; 60 boolean disableShadows = IntentDefaults.DISABLE_SHADOWS; 61 int cardWidth = IntentDefaults.CARD_WIDTH; 62 int cardHeight = IntentDefaults.CARD_HEIGHT; 63 int whichVideo = IntentDefaults.WHICH_VIDEO; 64 boolean useSingleBitmap = IntentDefaults.USE_SINGLE_BITMAP; 65 66 Intent intent = getActivity().getIntent(); 67 if (intent.getExtras() != null) { 68 categoryCount = intent.getIntExtra(IntentKeys.CATEGORY_COUNT, categoryCount); 69 entriesPerCat = intent.getIntExtra(IntentKeys.ENTRIES_PER_CATEGORY, entriesPerCat); 70 disableShadows = intent.getBooleanExtra(IntentKeys.DISABLE_SHADOWS, disableShadows); 71 cardWidth = intent.getIntExtra(IntentKeys.CARD_WIDTH, cardWidth); 72 cardHeight = intent.getIntExtra(IntentKeys.CARD_HEIGHT, cardHeight); 73 whichVideo = intent.getIntExtra(IntentKeys.WHICH_VIDEO, whichVideo); 74 useSingleBitmap = intent.getBooleanExtra(IntentKeys.USE_SINGLE_BITMAP, useSingleBitmap); 75 } 76 77 loadVideoData(categoryCount, entriesPerCat, disableShadows, useSingleBitmap, cardWidth, 78 cardHeight); 79 setBackground(); 80 setupUIElements(); 81 82 if (whichVideo != IntentKeys.NO_VIDEO) { 83 int resource = 0; 84 /* For info on how to generate videos see: 85 * https://docs.google.com/document/d/1HV8O-Nm4rc2DwVwiZmT4Wa9pf8XttWndg9saGncTRGw 86 */ 87 if (whichVideo == IntentKeys.VIDEO_2160P_60FPS) { 88 resource = R.raw.bbb_sunflower_2160p_60fps; 89 } else if (whichVideo == IntentKeys.VIDEO_1080P_60FPS) { 90 resource = R.raw.testvideo_1080p_60fps; 91 } else if (whichVideo == IntentKeys.VIDEO_480P_60FPS) { 92 resource = R.raw.bbb_480p; 93 } 94 Uri uri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" 95 + resource); 96 Intent videoIntent = new Intent(Intent.ACTION_VIEW, uri, getActivity(), 97 VideoActivity.class); 98 startActivity(videoIntent); 99 } 100 } 101 setBackground()102 private void setBackground() { 103 mBackgroundManager = BackgroundManager.getInstance(getActivity()); 104 mBackgroundManager.attach(getActivity().getWindow()); 105 mBackgroundManager.setDrawable( 106 ResourcesCompat.getDrawable(getResources(), R.drawable.default_background, null)); 107 } 108 setupUIElements()109 private void setupUIElements() { 110 setBadgeDrawable(ResourcesCompat.getDrawable( 111 getActivity().getResources(), R.drawable.app_banner, null)); 112 // Badge, when set, takes precedent over title 113 setTitle(getString(R.string.browse_title)); 114 setHeadersState(HEADERS_ENABLED); 115 setHeadersTransitionOnBackEnabled(true); 116 // set headers background color 117 setBrandColor(ResourcesCompat.getColor(getResources(), R.color.jank_yellow, null)); 118 // set search icon color 119 setSearchAffordanceColor( 120 ResourcesCompat.getColor(getResources(), R.color.search_opaque, null)); 121 122 setHeaderPresenterSelector(new PresenterSelector() { 123 @Override 124 public Presenter getPresenter(Object o) { 125 return new HeaderItemPresenter(); 126 } 127 }); 128 } 129 loadVideoData(int categoryCount, int entriesPerCat, boolean disableShadows, boolean useSingleBitmap, int cardWidth, int cardHeight)130 private void loadVideoData(int categoryCount, int entriesPerCat, boolean disableShadows, 131 boolean useSingleBitmap, int cardWidth, int cardHeight) { 132 ListRowPresenter listRowPresenter = new ListRowPresenter(); 133 listRowPresenter.setShadowEnabled(!disableShadows); 134 mRowsAdapter = new ArrayObjectAdapter(listRowPresenter); 135 HashMap<String, List<VideoInfo>> data = VideoProvider.buildMedia(categoryCount, 136 entriesPerCat, cardWidth, cardHeight, getActivity(), useSingleBitmap); 137 CardPresenter cardPresenter = new CardPresenter(cardWidth, cardHeight); 138 139 int i = 0; 140 for (Map.Entry<String, List<VideoInfo>> entry : data.entrySet()) { 141 ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(cardPresenter); 142 for (VideoInfo videoInfo : entry.getValue()) { 143 listRowAdapter.add(videoInfo); 144 } 145 HeaderItem header = new HeaderItem(i++, entry.getKey()); 146 mRowsAdapter.add(new ListRow(header, listRowAdapter)); 147 } 148 149 ArrayObjectAdapter settingsListAdapter = new ArrayObjectAdapter(new GridItemPresenter()); 150 for (int j = 0; j < entriesPerCat; j++) { 151 settingsListAdapter.add("Settings " + j); 152 } 153 HeaderItem settingsHeader = new HeaderItem(i++, "Settings"); 154 mRowsAdapter.add(new ListRow(settingsHeader, settingsListAdapter)); 155 156 setAdapter(mRowsAdapter); 157 } 158 } 159