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