PlaybackFragment.java revision 3bcad88cbf4488e747d84893c35f2351b8f84afe
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
17package com.example.android.leanback;
18
19import android.content.Context;
20import android.os.Build;
21import android.os.Bundle;
22import android.support.v17.leanback.app.PlaybackFragmentGlueHost;
23import android.support.v17.leanback.widget.Action;
24import android.support.v17.leanback.widget.ArrayObjectAdapter;
25import android.support.v17.leanback.widget.ClassPresenterSelector;
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.SparseArrayObjectAdapter;
30import android.util.Log;
31
32/**
33 * Example of PlaybackFragment working with a PlaybackControlGlue.
34 */
35public class PlaybackFragment
36        extends android.support.v17.leanback.app.PlaybackFragment
37        implements PlaybackActivity.PictureInPictureListener {
38    private static final String TAG = "leanback.PlaybackControlsFragment";
39
40    /**
41     * Change this to choose a different overlay background.
42     */
43    private static final int BACKGROUND_TYPE = PlaybackFragment.BG_LIGHT;
44
45    /**
46     * Change the number of related content rows.
47     */
48    private static final int RELATED_CONTENT_ROWS = 3;
49
50    /**
51     * Change this to select hidden
52     */
53    private static final boolean SECONDARY_HIDDEN = false;
54
55    private static final int ROW_CONTROLS = 0;
56
57    private PlaybackControlGlue mGlue;
58
59    @Override
60    public SparseArrayObjectAdapter getAdapter() {
61        return (SparseArrayObjectAdapter) super.getAdapter();
62    }
63
64    @Override
65    public void onCreate(Bundle savedInstanceState) {
66        Log.i(TAG, "onCreate");
67        super.onCreate(savedInstanceState);
68
69        setBackgroundType(BACKGROUND_TYPE);
70
71        createComponents(getActivity());
72    }
73
74    private void createComponents(Context context) {
75        mGlue = new PlaybackControlGlue(context) {
76            @Override
77            public int getUpdatePeriod() {
78                long totalTime = getControlsRow().getDuration();
79                if (getView() == null || getView().getWidth() == 0 || totalTime <= 0) {
80                    return 1000;
81                }
82                return 16;
83            }
84
85            @Override
86            public void onActionClicked(Action action) {
87                if (action.getId() == R.id.lb_control_picture_in_picture) {
88                    if (Build.VERSION.SDK_INT >= 24) {
89                        getActivity().enterPictureInPictureMode();
90                    }
91                    return;
92                }
93                super.onActionClicked(action);
94            }
95
96            @Override
97            protected void onCreateControlsRowAndPresenter() {
98                super.onCreateControlsRowAndPresenter();
99                getControlsRowPresenter().setSecondaryActionsHidden(SECONDARY_HIDDEN);
100            }
101        };
102
103        mGlue.setHost(new PlaybackFragmentGlueHost(this));
104        ClassPresenterSelector classPresenterSelector = new ClassPresenterSelector();
105        classPresenterSelector.addClassPresenter(ListRow.class, new ListRowPresenter());
106
107        setAdapter(new SparseArrayObjectAdapter(classPresenterSelector));
108
109        // Add related content rows
110        for (int i = 0; i < RELATED_CONTENT_ROWS; ++i) {
111            ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(new StringPresenter());
112            listRowAdapter.add("Some related content");
113            listRowAdapter.add("Other related content");
114            HeaderItem header = new HeaderItem(i, "Row " + i);
115            getAdapter().set(ROW_CONTROLS + 1 + i, new ListRow(header, listRowAdapter));
116        }
117    }
118
119    @Override
120    public void onStart() {
121        super.onStart();
122        ((PlaybackActivity) getActivity()).registerPictureInPictureListener(this);
123    }
124
125    @Override
126    public void onStop() {
127        ((PlaybackActivity) getActivity()).unregisterPictureInPictureListener(this);
128        super.onStop();
129    }
130
131    @Override
132    public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) {
133        if (isInPictureInPictureMode) {
134            // Hide the controls in picture-in-picture mode.
135            setFadingEnabled(true);
136            fadeOut();
137        } else {
138            setFadingEnabled(mGlue.isPlaying());
139        }
140    }
141}
142