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