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