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