MainFragment.java revision f69640504837ec25d9eef68338782673a9874742
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;
30a3eaac19490539262eff7832eff880566c57cafcAurimas Liutikasimport android.support.v4.content.res.ResourcesCompat;
3158b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell
3258b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassellimport com.google.android.leanbackjank.IntentDefaults;
3358b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassellimport com.google.android.leanbackjank.IntentKeys;
3458b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassellimport com.google.android.leanbackjank.R;
3558b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassellimport com.google.android.leanbackjank.data.VideoProvider;
3658b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassellimport com.google.android.leanbackjank.model.VideoInfo;
3758b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassellimport com.google.android.leanbackjank.presenter.CardPresenter;
3858b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassellimport com.google.android.leanbackjank.presenter.GridItemPresenter;
3958b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassellimport com.google.android.leanbackjank.presenter.HeaderItemPresenter;
4058b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell
4158b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassellimport java.util.HashMap;
4258b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassellimport java.util.List;
4358b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassellimport java.util.Map;
4458b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell
4558b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell/**
4658b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell * Main class to show BrowseFragment with header and rows of videos
4758b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell */
4858b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassellpublic class MainFragment extends BrowseFragment {
4958b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell
5058b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell    private BackgroundManager mBackgroundManager;
5158b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell    private ArrayObjectAdapter mRowsAdapter;
5258b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell
5358b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell    @Override
5458b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell    public void onActivityCreated(Bundle savedInstanceState) {
5558b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        super.onActivityCreated(savedInstanceState);
5658b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell
5758b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        // Define defaults.
5858b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        int categoryCount = IntentDefaults.CATEGORY_COUNT;
5958b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        int entriesPerCat = IntentDefaults.ENTRIES_PER_CATEGORY;
6058b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        boolean disableShadows = IntentDefaults.DISABLE_SHADOWS;
6158b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        int cardWidth = IntentDefaults.CARD_WIDTH;
6258b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        int cardHeight = IntentDefaults.CARD_HEIGHT;
63734bc41ce2a1f549a972bfda05ede02d969ebefbDaniel Cardenas        int whichVideo = IntentDefaults.WHICH_VIDEO;
6458b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        boolean useSingleBitmap = IntentDefaults.USE_SINGLE_BITMAP;
6558b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell
6658b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        Intent intent = getActivity().getIntent();
6758b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        if (intent.getExtras() != null) {
6858b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell            categoryCount = intent.getIntExtra(IntentKeys.CATEGORY_COUNT, categoryCount);
6958b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell            entriesPerCat = intent.getIntExtra(IntentKeys.ENTRIES_PER_CATEGORY, entriesPerCat);
7058b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell            disableShadows = intent.getBooleanExtra(IntentKeys.DISABLE_SHADOWS, disableShadows);
7158b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell            cardWidth = intent.getIntExtra(IntentKeys.CARD_WIDTH, cardWidth);
7258b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell            cardHeight = intent.getIntExtra(IntentKeys.CARD_HEIGHT, cardHeight);
73734bc41ce2a1f549a972bfda05ede02d969ebefbDaniel Cardenas            whichVideo = intent.getIntExtra(IntentKeys.WHICH_VIDEO, whichVideo);
7458b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell            useSingleBitmap = intent.getBooleanExtra(IntentKeys.USE_SINGLE_BITMAP, useSingleBitmap);
7558b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        }
7658b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell
7758b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        loadVideoData(categoryCount, entriesPerCat, disableShadows, useSingleBitmap, cardWidth,
7858b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell                cardHeight);
7958b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        setBackground();
8058b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        setupUIElements();
8158b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell
82734bc41ce2a1f549a972bfda05ede02d969ebefbDaniel Cardenas        if (whichVideo != IntentKeys.NO_VIDEO) {
83734bc41ce2a1f549a972bfda05ede02d969ebefbDaniel Cardenas            int resource = 0;
84734bc41ce2a1f549a972bfda05ede02d969ebefbDaniel Cardenas            /* For info on how to generate videos see:
85734bc41ce2a1f549a972bfda05ede02d969ebefbDaniel Cardenas             * https://docs.google.com/document/d/1HV8O-Nm4rc2DwVwiZmT4Wa9pf8XttWndg9saGncTRGw
86734bc41ce2a1f549a972bfda05ede02d969ebefbDaniel Cardenas             */
87734bc41ce2a1f549a972bfda05ede02d969ebefbDaniel Cardenas            if (whichVideo == IntentKeys.VIDEO_2160P_60FPS) {
88734bc41ce2a1f549a972bfda05ede02d969ebefbDaniel Cardenas                resource = R.raw.bbb_sunflower_2160p_60fps;
89734bc41ce2a1f549a972bfda05ede02d969ebefbDaniel Cardenas            } else if (whichVideo == IntentKeys.VIDEO_1080P_60FPS) {
90734bc41ce2a1f549a972bfda05ede02d969ebefbDaniel Cardenas                resource = R.raw.testvideo_1080p_60fps;
91734bc41ce2a1f549a972bfda05ede02d969ebefbDaniel Cardenas            } else if (whichVideo == IntentKeys.VIDEO_480P_60FPS) {
92734bc41ce2a1f549a972bfda05ede02d969ebefbDaniel Cardenas                resource = R.raw.bbb_480p;
93f69640504837ec25d9eef68338782673a9874742Enrico Bianco            } else if (whichVideo == IntentKeys.VIDEO_360P_60FPS) {
94f69640504837ec25d9eef68338782673a9874742Enrico Bianco                resource = R.raw.bbb_360p;
95734bc41ce2a1f549a972bfda05ede02d969ebefbDaniel Cardenas            }
96a3eaac19490539262eff7832eff880566c57cafcAurimas Liutikas            Uri uri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/"
97734bc41ce2a1f549a972bfda05ede02d969ebefbDaniel Cardenas                    + resource);
98a3eaac19490539262eff7832eff880566c57cafcAurimas Liutikas            Intent videoIntent = new Intent(Intent.ACTION_VIEW, uri, getActivity(),
9958b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell                    VideoActivity.class);
10058b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell            startActivity(videoIntent);
10158b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        }
10258b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell    }
10358b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell
10458b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell    private void setBackground() {
10558b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        mBackgroundManager = BackgroundManager.getInstance(getActivity());
10658b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        mBackgroundManager.attach(getActivity().getWindow());
10758b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        mBackgroundManager.setDrawable(
108a3eaac19490539262eff7832eff880566c57cafcAurimas Liutikas                ResourcesCompat.getDrawable(getResources(), R.drawable.default_background, null));
10958b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell    }
11058b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell
11158b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell    private void setupUIElements() {
112a3eaac19490539262eff7832eff880566c57cafcAurimas Liutikas        setBadgeDrawable(ResourcesCompat.getDrawable(
113a3eaac19490539262eff7832eff880566c57cafcAurimas Liutikas                getActivity().getResources(), R.drawable.app_banner, null));
11458b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        // Badge, when set, takes precedent over title
11558b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        setTitle(getString(R.string.browse_title));
11658b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        setHeadersState(HEADERS_ENABLED);
11758b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        setHeadersTransitionOnBackEnabled(true);
11858b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        // set headers background color
119a3eaac19490539262eff7832eff880566c57cafcAurimas Liutikas        setBrandColor(ResourcesCompat.getColor(getResources(), R.color.jank_yellow, null));
12058b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        // set search icon color
121a3eaac19490539262eff7832eff880566c57cafcAurimas Liutikas        setSearchAffordanceColor(
122a3eaac19490539262eff7832eff880566c57cafcAurimas Liutikas                ResourcesCompat.getColor(getResources(), R.color.search_opaque, null));
12358b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell
12458b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        setHeaderPresenterSelector(new PresenterSelector() {
12558b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell            @Override
12658b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell            public Presenter getPresenter(Object o) {
12758b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell                return new HeaderItemPresenter();
12858b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell            }
12958b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        });
13058b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell    }
13158b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell
13258b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell    private void loadVideoData(int categoryCount, int entriesPerCat, boolean disableShadows,
13358b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell            boolean useSingleBitmap, int cardWidth, int cardHeight) {
13458b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        ListRowPresenter listRowPresenter = new ListRowPresenter();
13558b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        listRowPresenter.setShadowEnabled(!disableShadows);
13658b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        mRowsAdapter = new ArrayObjectAdapter(listRowPresenter);
13758b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        HashMap<String, List<VideoInfo>> data = VideoProvider.buildMedia(categoryCount,
138a3eaac19490539262eff7832eff880566c57cafcAurimas Liutikas                entriesPerCat, cardWidth, cardHeight, getActivity(), useSingleBitmap);
13958b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        CardPresenter cardPresenter = new CardPresenter(cardWidth, cardHeight);
14058b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell
14158b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        int i = 0;
14258b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        for (Map.Entry<String, List<VideoInfo>> entry : data.entrySet()) {
14358b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell            ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(cardPresenter);
14458b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell            for (VideoInfo videoInfo : entry.getValue()) {
14558b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell                listRowAdapter.add(videoInfo);
14658b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell            }
14758b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell            HeaderItem header = new HeaderItem(i++, entry.getKey());
14858b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell            mRowsAdapter.add(new ListRow(header, listRowAdapter));
14958b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        }
15058b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell
15158b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        ArrayObjectAdapter settingsListAdapter = new ArrayObjectAdapter(new GridItemPresenter());
15258b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        for (int j = 0; j < entriesPerCat; j++) {
15358b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell            settingsListAdapter.add("Settings " + j);
15458b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        }
15558b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        HeaderItem settingsHeader = new HeaderItem(i++, "Settings");
15658b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        mRowsAdapter.add(new ListRow(settingsHeader, settingsListAdapter));
15758b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell
15858b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        setAdapter(mRowsAdapter);
15958b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell    }
16058b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell}
161