1 // CHECKSTYLE:OFF Generated code 2 /* This file is auto-generated from PlaybackOverlayFragment.java. DO NOT MODIFY. */ 3 4 /* 5 * Copyright (C) 2014 The Android Open Source Project 6 * 7 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 8 * in compliance with the License. You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, software distributed under the License 13 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 14 * or implied. See the License for the specific language governing permissions and limitations under 15 * the License. 16 */ 17 package com.example.android.leanback; 18 19 import android.content.Context; 20 import android.os.Build; 21 import android.os.Bundle; 22 import android.os.Handler; 23 import android.support.v17.leanback.widget.Action; 24 import android.support.v17.leanback.widget.ArrayObjectAdapter; 25 import android.support.v17.leanback.widget.ClassPresenterSelector; 26 import android.support.v17.leanback.widget.HeaderItem; 27 import android.support.v17.leanback.widget.ListRow; 28 import android.support.v17.leanback.widget.ListRowPresenter; 29 import android.support.v17.leanback.widget.OnItemViewClickedListener; 30 import android.support.v17.leanback.widget.OnItemViewSelectedListener; 31 import android.support.v17.leanback.widget.PlaybackControlsRow; 32 import android.support.v17.leanback.widget.PlaybackControlsRowPresenter; 33 import android.support.v17.leanback.widget.Presenter; 34 import android.support.v17.leanback.widget.Row; 35 import android.support.v17.leanback.widget.RowPresenter; 36 import android.support.v17.leanback.widget.SparseArrayObjectAdapter; 37 import android.util.Log; 38 39 public class PlaybackOverlaySupportFragment 40 extends android.support.v17.leanback.app.PlaybackOverlaySupportFragment 41 implements PlaybackOverlaySupportActivity.PictureInPictureListener { 42 private static final String TAG = "leanback.PlaybackControlsFragment"; 43 44 /** 45 * Change this to choose a different overlay background. 46 */ 47 private static final int BACKGROUND_TYPE = PlaybackOverlaySupportFragment.BG_LIGHT; 48 49 /** 50 * Change the number of related content rows. 51 */ 52 private static final int RELATED_CONTENT_ROWS = 3; 53 54 /** 55 * Change this to select hidden 56 */ 57 private static final boolean SECONDARY_HIDDEN = false; 58 59 private static final int ROW_CONTROLS = 0; 60 61 private PlaybackControlSupportHelper mGlue; 62 final Handler mHandler = new Handler(); 63 64 // Artificial delay to simulate a media being prepared. The onRowChanged callback should be 65 // called and the playback row UI should be updated after this delay. 66 private static final int MEDIA_PREPARATION_DELAY = 500; 67 68 private OnItemViewClickedListener mOnItemViewClickedListener = new OnItemViewClickedListener() { 69 @Override 70 public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item, 71 RowPresenter.ViewHolder rowViewHolder, Row row) { 72 Log.i(TAG, "onItemClicked: " + item + " row " + row); 73 if (item instanceof Action) { 74 mGlue.onActionClicked((Action) item); 75 } 76 } 77 }; 78 79 private OnItemViewSelectedListener mOnItemViewSelectedListener = 80 new OnItemViewSelectedListener() { 81 @Override 82 public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item, 83 RowPresenter.ViewHolder rowViewHolder, Row row) { 84 Log.i(TAG, "onItemSelected: " + item + " row " + row); 85 } 86 }; 87 88 @Override getAdapter()89 public SparseArrayObjectAdapter getAdapter() { 90 return (SparseArrayObjectAdapter) super.getAdapter(); 91 } 92 93 @Override onCreate(Bundle savedInstanceState)94 public void onCreate(Bundle savedInstanceState) { 95 Log.i(TAG, "onCreate"); 96 super.onCreate(savedInstanceState); 97 98 setBackgroundType(BACKGROUND_TYPE); 99 setOnItemViewSelectedListener(mOnItemViewSelectedListener); 100 101 createComponents(getActivity()); 102 } 103 createComponents(Context context)104 private void createComponents(Context context) { 105 mGlue = new PlaybackControlSupportHelper(context, this) { 106 @Override 107 public int getUpdatePeriod() { 108 long totalTime = getControlsRow().getDuration(); 109 if (getView() == null || getView().getWidth() == 0 || totalTime <= 0) { 110 return 1000; 111 } 112 return 16; 113 } 114 115 @Override 116 protected void onRowChanged(PlaybackControlsRow row) { 117 if (getAdapter() == null) { 118 return; 119 } 120 int index = getAdapter().indexOf(row); 121 if (index >= 0) { 122 getAdapter().notifyArrayItemRangeChanged(index, 1); 123 } 124 } 125 126 @Override 127 public void onActionClicked(Action action) { 128 if (action.getId() == R.id.lb_control_picture_in_picture) { 129 if (Build.VERSION.SDK_INT >= 24) { 130 getActivity().enterPictureInPictureMode(); 131 } 132 return; 133 } 134 super.onActionClicked(action); 135 } 136 }; 137 138 mGlue.setInitialized(false); 139 mHandler.postDelayed(new Runnable() { 140 @Override 141 public void run() { 142 mGlue.setInitialized(true); 143 } 144 }, MEDIA_PREPARATION_DELAY); 145 mGlue.setOnItemViewClickedListener(mOnItemViewClickedListener); 146 147 PlaybackControlsRowPresenter playbackControlsRowPresenter = 148 mGlue.createControlsRowAndPresenter(); 149 playbackControlsRowPresenter.setSecondaryActionsHidden(SECONDARY_HIDDEN); 150 ClassPresenterSelector selector = new ClassPresenterSelector(); 151 selector.addClassPresenter(ListRow.class, new ListRowPresenter()); 152 selector.addClassPresenter(PlaybackControlsRow.class, playbackControlsRowPresenter); 153 154 setAdapter(new SparseArrayObjectAdapter(selector)); 155 156 // Add the controls row 157 getAdapter().set(ROW_CONTROLS, mGlue.getControlsRow()); 158 159 // Add related content rows 160 for (int i = 0; i < RELATED_CONTENT_ROWS; ++i) { 161 ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(new StringPresenter()); 162 listRowAdapter.add("Some related content"); 163 listRowAdapter.add("Other related content"); 164 HeaderItem header = new HeaderItem(i, "Row " + i); 165 getAdapter().set(ROW_CONTROLS + 1 + i, new ListRow(header, listRowAdapter)); 166 } 167 168 } 169 170 @Override onStart()171 public void onStart() { 172 super.onStart(); 173 mGlue.setFadingEnabled(true); 174 mGlue.enableProgressUpdating(true); 175 ((PlaybackOverlaySupportActivity) getActivity()).registerPictureInPictureListener(this); 176 } 177 178 @Override onStop()179 public void onStop() { 180 mGlue.enableProgressUpdating(false); 181 ((PlaybackOverlaySupportActivity) getActivity()).unregisterPictureInPictureListener(this); 182 super.onStop(); 183 } 184 185 @Override onPictureInPictureModeChanged(boolean isInPictureInPictureMode)186 public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) { 187 if (isInPictureInPictureMode) { 188 // Hide the controls in picture-in-picture mode. 189 setFadingEnabled(true); 190 fadeOut(); 191 } else { 192 setFadingEnabled(mGlue.isPlaying()); 193 } 194 } 195 } 196