blob: 6869e460273ef61e623319a691ef959582ce07bd [file] [log] [blame]
Bryan Cassell58b7bbb2016-12-16 10:27:09 -08001/*
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
17package com.google.android.leanbackjank.ui;
18
19import android.content.Intent;
Bryan Cassellf30fe402017-05-09 14:04:07 -070020import android.content.res.Resources;
Bryan Cassell58b7bbb2016-12-16 10:27:09 -080021import android.net.Uri;
22import android.os.Bundle;
23import android.support.v17.leanback.app.BackgroundManager;
24import android.support.v17.leanback.app.BrowseFragment;
25import android.support.v17.leanback.widget.ArrayObjectAdapter;
26import android.support.v17.leanback.widget.HeaderItem;
27import android.support.v17.leanback.widget.ListRow;
28import android.support.v17.leanback.widget.ListRowPresenter;
29import android.support.v17.leanback.widget.Presenter;
30import android.support.v17.leanback.widget.PresenterSelector;
Bryan Cassellf30fe402017-05-09 14:04:07 -070031import android.support.v17.leanback.widget.ShadowOverlayHelper;
Aurimas Liutikasa3eaac12017-03-03 21:15:01 -080032import android.support.v4.content.res.ResourcesCompat;
Bryan Cassell58b7bbb2016-12-16 10:27:09 -080033
34import com.google.android.leanbackjank.IntentDefaults;
35import com.google.android.leanbackjank.IntentKeys;
36import com.google.android.leanbackjank.R;
37import com.google.android.leanbackjank.data.VideoProvider;
38import com.google.android.leanbackjank.model.VideoInfo;
39import com.google.android.leanbackjank.presenter.CardPresenter;
40import com.google.android.leanbackjank.presenter.GridItemPresenter;
41import com.google.android.leanbackjank.presenter.HeaderItemPresenter;
42
43import java.util.HashMap;
44import java.util.List;
45import java.util.Map;
46
47/**
48 * Main class to show BrowseFragment with header and rows of videos
49 */
50public class MainFragment extends BrowseFragment {
51
52 private BackgroundManager mBackgroundManager;
53 private ArrayObjectAdapter mRowsAdapter;
54
55 @Override
56 public void onActivityCreated(Bundle savedInstanceState) {
57 super.onActivityCreated(savedInstanceState);
58
59 // Define defaults.
60 int categoryCount = IntentDefaults.CATEGORY_COUNT;
61 int entriesPerCat = IntentDefaults.ENTRIES_PER_CATEGORY;
62 boolean disableShadows = IntentDefaults.DISABLE_SHADOWS;
63 int cardWidth = IntentDefaults.CARD_WIDTH;
64 int cardHeight = IntentDefaults.CARD_HEIGHT;
Daniel Cardenas734bc412017-01-11 13:51:13 -080065 int whichVideo = IntentDefaults.WHICH_VIDEO;
Bryan Cassell58b7bbb2016-12-16 10:27:09 -080066 boolean useSingleBitmap = IntentDefaults.USE_SINGLE_BITMAP;
67
68 Intent intent = getActivity().getIntent();
69 if (intent.getExtras() != null) {
70 categoryCount = intent.getIntExtra(IntentKeys.CATEGORY_COUNT, categoryCount);
71 entriesPerCat = intent.getIntExtra(IntentKeys.ENTRIES_PER_CATEGORY, entriesPerCat);
72 disableShadows = intent.getBooleanExtra(IntentKeys.DISABLE_SHADOWS, disableShadows);
73 cardWidth = intent.getIntExtra(IntentKeys.CARD_WIDTH, cardWidth);
74 cardHeight = intent.getIntExtra(IntentKeys.CARD_HEIGHT, cardHeight);
Daniel Cardenas734bc412017-01-11 13:51:13 -080075 whichVideo = intent.getIntExtra(IntentKeys.WHICH_VIDEO, whichVideo);
Bryan Cassell58b7bbb2016-12-16 10:27:09 -080076 useSingleBitmap = intent.getBooleanExtra(IntentKeys.USE_SINGLE_BITMAP, useSingleBitmap);
77 }
78
79 loadVideoData(categoryCount, entriesPerCat, disableShadows, useSingleBitmap, cardWidth,
80 cardHeight);
81 setBackground();
82 setupUIElements();
83
Daniel Cardenas734bc412017-01-11 13:51:13 -080084 if (whichVideo != IntentKeys.NO_VIDEO) {
85 int resource = 0;
86 /* For info on how to generate videos see:
87 * https://docs.google.com/document/d/1HV8O-Nm4rc2DwVwiZmT4Wa9pf8XttWndg9saGncTRGw
88 */
89 if (whichVideo == IntentKeys.VIDEO_2160P_60FPS) {
90 resource = R.raw.bbb_sunflower_2160p_60fps;
91 } else if (whichVideo == IntentKeys.VIDEO_1080P_60FPS) {
92 resource = R.raw.testvideo_1080p_60fps;
93 } else if (whichVideo == IntentKeys.VIDEO_480P_60FPS) {
94 resource = R.raw.bbb_480p;
Enrico Biancof6964052017-04-19 14:41:44 -070095 } else if (whichVideo == IntentKeys.VIDEO_360P_60FPS) {
96 resource = R.raw.bbb_360p;
Daniel Cardenas734bc412017-01-11 13:51:13 -080097 }
Aurimas Liutikasa3eaac12017-03-03 21:15:01 -080098 Uri uri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/"
Daniel Cardenas734bc412017-01-11 13:51:13 -080099 + resource);
Aurimas Liutikasa3eaac12017-03-03 21:15:01 -0800100 Intent videoIntent = new Intent(Intent.ACTION_VIEW, uri, getActivity(),
Bryan Cassell58b7bbb2016-12-16 10:27:09 -0800101 VideoActivity.class);
102 startActivity(videoIntent);
103 }
104 }
105
106 private void setBackground() {
107 mBackgroundManager = BackgroundManager.getInstance(getActivity());
108 mBackgroundManager.attach(getActivity().getWindow());
109 mBackgroundManager.setDrawable(
Aurimas Liutikasa3eaac12017-03-03 21:15:01 -0800110 ResourcesCompat.getDrawable(getResources(), R.drawable.default_background, null));
Bryan Cassell58b7bbb2016-12-16 10:27:09 -0800111 }
112
113 private void setupUIElements() {
Aurimas Liutikasa3eaac12017-03-03 21:15:01 -0800114 setBadgeDrawable(ResourcesCompat.getDrawable(
115 getActivity().getResources(), R.drawable.app_banner, null));
Bryan Cassell58b7bbb2016-12-16 10:27:09 -0800116 // Badge, when set, takes precedent over title
117 setTitle(getString(R.string.browse_title));
118 setHeadersState(HEADERS_ENABLED);
119 setHeadersTransitionOnBackEnabled(true);
120 // set headers background color
Aurimas Liutikasa3eaac12017-03-03 21:15:01 -0800121 setBrandColor(ResourcesCompat.getColor(getResources(), R.color.jank_yellow, null));
Bryan Cassell58b7bbb2016-12-16 10:27:09 -0800122 // set search icon color
Aurimas Liutikasa3eaac12017-03-03 21:15:01 -0800123 setSearchAffordanceColor(
124 ResourcesCompat.getColor(getResources(), R.color.search_opaque, null));
Bryan Cassell58b7bbb2016-12-16 10:27:09 -0800125
126 setHeaderPresenterSelector(new PresenterSelector() {
127 @Override
128 public Presenter getPresenter(Object o) {
129 return new HeaderItemPresenter();
130 }
131 });
132 }
133
134 private void loadVideoData(int categoryCount, int entriesPerCat, boolean disableShadows,
135 boolean useSingleBitmap, int cardWidth, int cardHeight) {
Bryan Cassellf30fe402017-05-09 14:04:07 -0700136 ListRowPresenter listRowPresenter = new ListRowPresenter() {
137 @Override
138 protected ShadowOverlayHelper.Options createShadowOverlayOptions() {
139 Resources res = getResources();
140 ShadowOverlayHelper.Options options = new ShadowOverlayHelper.Options();
141 options.dynamicShadowZ(res.getDimension(R.dimen.shadow_unfocused_z),
142 res.getDimension(R.dimen.shadow_focused_z));
143 return options;
144 }
145 };
Bryan Cassell58b7bbb2016-12-16 10:27:09 -0800146 listRowPresenter.setShadowEnabled(!disableShadows);
147 mRowsAdapter = new ArrayObjectAdapter(listRowPresenter);
148 HashMap<String, List<VideoInfo>> data = VideoProvider.buildMedia(categoryCount,
Aurimas Liutikasa3eaac12017-03-03 21:15:01 -0800149 entriesPerCat, cardWidth, cardHeight, getActivity(), useSingleBitmap);
Bryan Cassell58b7bbb2016-12-16 10:27:09 -0800150 CardPresenter cardPresenter = new CardPresenter(cardWidth, cardHeight);
151
152 int i = 0;
153 for (Map.Entry<String, List<VideoInfo>> entry : data.entrySet()) {
154 ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(cardPresenter);
155 for (VideoInfo videoInfo : entry.getValue()) {
156 listRowAdapter.add(videoInfo);
157 }
158 HeaderItem header = new HeaderItem(i++, entry.getKey());
159 mRowsAdapter.add(new ListRow(header, listRowAdapter));
160 }
161
162 ArrayObjectAdapter settingsListAdapter = new ArrayObjectAdapter(new GridItemPresenter());
163 for (int j = 0; j < entriesPerCat; j++) {
164 settingsListAdapter.add("Settings " + j);
165 }
166 HeaderItem settingsHeader = new HeaderItem(i++, "Settings");
167 mRowsAdapter.add(new ListRow(settingsHeader, settingsListAdapter));
168
169 setAdapter(mRowsAdapter);
170 }
171}