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