1*90c8c64dSAndroid Build Coastguard Worker /* 2*90c8c64dSAndroid Build Coastguard Worker * Copyright (C) 2014 The Android Open Source Project 3*90c8c64dSAndroid Build Coastguard Worker * 4*90c8c64dSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*90c8c64dSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*90c8c64dSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*90c8c64dSAndroid Build Coastguard Worker * 8*90c8c64dSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*90c8c64dSAndroid Build Coastguard Worker * 10*90c8c64dSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*90c8c64dSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*90c8c64dSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*90c8c64dSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*90c8c64dSAndroid Build Coastguard Worker * limitations under the License. 15*90c8c64dSAndroid Build Coastguard Worker */ 16*90c8c64dSAndroid Build Coastguard Worker package com.example.android.mediabrowserservice; 17*90c8c64dSAndroid Build Coastguard Worker 18*90c8c64dSAndroid Build Coastguard Worker import android.app.Fragment; 19*90c8c64dSAndroid Build Coastguard Worker import android.content.ComponentName; 20*90c8c64dSAndroid Build Coastguard Worker import android.media.browse.MediaBrowser; 21*90c8c64dSAndroid Build Coastguard Worker import android.media.session.MediaController; 22*90c8c64dSAndroid Build Coastguard Worker import android.media.session.MediaSession; 23*90c8c64dSAndroid Build Coastguard Worker import android.media.session.PlaybackState; 24*90c8c64dSAndroid Build Coastguard Worker import android.os.Bundle; 25*90c8c64dSAndroid Build Coastguard Worker import android.view.LayoutInflater; 26*90c8c64dSAndroid Build Coastguard Worker import android.view.View; 27*90c8c64dSAndroid Build Coastguard Worker import android.view.ViewGroup; 28*90c8c64dSAndroid Build Coastguard Worker import android.widget.AdapterView; 29*90c8c64dSAndroid Build Coastguard Worker import android.widget.ImageButton; 30*90c8c64dSAndroid Build Coastguard Worker import android.widget.ListView; 31*90c8c64dSAndroid Build Coastguard Worker 32*90c8c64dSAndroid Build Coastguard Worker import com.example.android.mediabrowserservice.utils.LogHelper; 33*90c8c64dSAndroid Build Coastguard Worker 34*90c8c64dSAndroid Build Coastguard Worker import java.util.List; 35*90c8c64dSAndroid Build Coastguard Worker 36*90c8c64dSAndroid Build Coastguard Worker /** 37*90c8c64dSAndroid Build Coastguard Worker * A class that shows the Media Queue to the user. 38*90c8c64dSAndroid Build Coastguard Worker */ 39*90c8c64dSAndroid Build Coastguard Worker public class QueueFragment extends Fragment { 40*90c8c64dSAndroid Build Coastguard Worker 41*90c8c64dSAndroid Build Coastguard Worker private static final String TAG = LogHelper.makeLogTag(QueueFragment.class.getSimpleName()); 42*90c8c64dSAndroid Build Coastguard Worker 43*90c8c64dSAndroid Build Coastguard Worker private ImageButton mSkipNext; 44*90c8c64dSAndroid Build Coastguard Worker private ImageButton mSkipPrevious; 45*90c8c64dSAndroid Build Coastguard Worker private ImageButton mPlayPause; 46*90c8c64dSAndroid Build Coastguard Worker 47*90c8c64dSAndroid Build Coastguard Worker private MediaBrowser mMediaBrowser; 48*90c8c64dSAndroid Build Coastguard Worker private MediaController.TransportControls mTransportControls; 49*90c8c64dSAndroid Build Coastguard Worker private MediaController mMediaController; 50*90c8c64dSAndroid Build Coastguard Worker private PlaybackState mPlaybackState; 51*90c8c64dSAndroid Build Coastguard Worker 52*90c8c64dSAndroid Build Coastguard Worker private QueueAdapter mQueueAdapter; 53*90c8c64dSAndroid Build Coastguard Worker 54*90c8c64dSAndroid Build Coastguard Worker private MediaBrowser.ConnectionCallback mConnectionCallback = 55*90c8c64dSAndroid Build Coastguard Worker new MediaBrowser.ConnectionCallback() { 56*90c8c64dSAndroid Build Coastguard Worker @Override 57*90c8c64dSAndroid Build Coastguard Worker public void onConnected() { 58*90c8c64dSAndroid Build Coastguard Worker LogHelper.d(TAG, "onConnected: session token ", mMediaBrowser.getSessionToken()); 59*90c8c64dSAndroid Build Coastguard Worker 60*90c8c64dSAndroid Build Coastguard Worker if (mMediaBrowser.getSessionToken() == null) { 61*90c8c64dSAndroid Build Coastguard Worker throw new IllegalArgumentException("No Session token"); 62*90c8c64dSAndroid Build Coastguard Worker } 63*90c8c64dSAndroid Build Coastguard Worker 64*90c8c64dSAndroid Build Coastguard Worker mMediaController = new MediaController(getActivity(), 65*90c8c64dSAndroid Build Coastguard Worker mMediaBrowser.getSessionToken()); 66*90c8c64dSAndroid Build Coastguard Worker mTransportControls = mMediaController.getTransportControls(); 67*90c8c64dSAndroid Build Coastguard Worker mMediaController.registerCallback(mSessionCallback); 68*90c8c64dSAndroid Build Coastguard Worker 69*90c8c64dSAndroid Build Coastguard Worker getActivity().setMediaController(mMediaController); 70*90c8c64dSAndroid Build Coastguard Worker mPlaybackState = mMediaController.getPlaybackState(); 71*90c8c64dSAndroid Build Coastguard Worker 72*90c8c64dSAndroid Build Coastguard Worker List<MediaSession.QueueItem> queue = mMediaController.getQueue(); 73*90c8c64dSAndroid Build Coastguard Worker if (queue != null) { 74*90c8c64dSAndroid Build Coastguard Worker mQueueAdapter.clear(); 75*90c8c64dSAndroid Build Coastguard Worker mQueueAdapter.notifyDataSetInvalidated(); 76*90c8c64dSAndroid Build Coastguard Worker mQueueAdapter.addAll(queue); 77*90c8c64dSAndroid Build Coastguard Worker mQueueAdapter.notifyDataSetChanged(); 78*90c8c64dSAndroid Build Coastguard Worker } 79*90c8c64dSAndroid Build Coastguard Worker onPlaybackStateChanged(mPlaybackState); 80*90c8c64dSAndroid Build Coastguard Worker } 81*90c8c64dSAndroid Build Coastguard Worker 82*90c8c64dSAndroid Build Coastguard Worker @Override 83*90c8c64dSAndroid Build Coastguard Worker public void onConnectionFailed() { 84*90c8c64dSAndroid Build Coastguard Worker LogHelper.d(TAG, "onConnectionFailed"); 85*90c8c64dSAndroid Build Coastguard Worker } 86*90c8c64dSAndroid Build Coastguard Worker 87*90c8c64dSAndroid Build Coastguard Worker @Override 88*90c8c64dSAndroid Build Coastguard Worker public void onConnectionSuspended() { 89*90c8c64dSAndroid Build Coastguard Worker LogHelper.d(TAG, "onConnectionSuspended"); 90*90c8c64dSAndroid Build Coastguard Worker mMediaController.unregisterCallback(mSessionCallback); 91*90c8c64dSAndroid Build Coastguard Worker mTransportControls = null; 92*90c8c64dSAndroid Build Coastguard Worker mMediaController = null; 93*90c8c64dSAndroid Build Coastguard Worker getActivity().setMediaController(null); 94*90c8c64dSAndroid Build Coastguard Worker } 95*90c8c64dSAndroid Build Coastguard Worker }; 96*90c8c64dSAndroid Build Coastguard Worker 97*90c8c64dSAndroid Build Coastguard Worker // Receive callbacks from the MediaController. Here we update our state such as which queue 98*90c8c64dSAndroid Build Coastguard Worker // is being shown, the current title and description and the PlaybackState. 99*90c8c64dSAndroid Build Coastguard Worker private MediaController.Callback mSessionCallback = new MediaController.Callback() { 100*90c8c64dSAndroid Build Coastguard Worker 101*90c8c64dSAndroid Build Coastguard Worker @Override 102*90c8c64dSAndroid Build Coastguard Worker public void onSessionDestroyed() { 103*90c8c64dSAndroid Build Coastguard Worker LogHelper.d(TAG, "Session destroyed. Need to fetch a new Media Session"); 104*90c8c64dSAndroid Build Coastguard Worker } 105*90c8c64dSAndroid Build Coastguard Worker 106*90c8c64dSAndroid Build Coastguard Worker @Override 107*90c8c64dSAndroid Build Coastguard Worker public void onPlaybackStateChanged(PlaybackState state) { 108*90c8c64dSAndroid Build Coastguard Worker if (state == null) { 109*90c8c64dSAndroid Build Coastguard Worker return; 110*90c8c64dSAndroid Build Coastguard Worker } 111*90c8c64dSAndroid Build Coastguard Worker LogHelper.d(TAG, "Received playback state change to state ", state.getState()); 112*90c8c64dSAndroid Build Coastguard Worker mPlaybackState = state; 113*90c8c64dSAndroid Build Coastguard Worker QueueFragment.this.onPlaybackStateChanged(state); 114*90c8c64dSAndroid Build Coastguard Worker } 115*90c8c64dSAndroid Build Coastguard Worker 116*90c8c64dSAndroid Build Coastguard Worker @Override 117*90c8c64dSAndroid Build Coastguard Worker public void onQueueChanged(List<MediaSession.QueueItem> queue) { 118*90c8c64dSAndroid Build Coastguard Worker LogHelper.d(TAG, "onQueueChanged ", queue); 119*90c8c64dSAndroid Build Coastguard Worker if (queue != null) { 120*90c8c64dSAndroid Build Coastguard Worker mQueueAdapter.clear(); 121*90c8c64dSAndroid Build Coastguard Worker mQueueAdapter.notifyDataSetInvalidated(); 122*90c8c64dSAndroid Build Coastguard Worker mQueueAdapter.addAll(queue); 123*90c8c64dSAndroid Build Coastguard Worker mQueueAdapter.notifyDataSetChanged(); 124*90c8c64dSAndroid Build Coastguard Worker } 125*90c8c64dSAndroid Build Coastguard Worker } 126*90c8c64dSAndroid Build Coastguard Worker }; 127*90c8c64dSAndroid Build Coastguard Worker newInstance()128*90c8c64dSAndroid Build Coastguard Worker public static QueueFragment newInstance() { 129*90c8c64dSAndroid Build Coastguard Worker return new QueueFragment(); 130*90c8c64dSAndroid Build Coastguard Worker } 131*90c8c64dSAndroid Build Coastguard Worker 132*90c8c64dSAndroid Build Coastguard Worker @Override onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)133*90c8c64dSAndroid Build Coastguard Worker public View onCreateView(LayoutInflater inflater, ViewGroup container, 134*90c8c64dSAndroid Build Coastguard Worker Bundle savedInstanceState) { 135*90c8c64dSAndroid Build Coastguard Worker View rootView = inflater.inflate(R.layout.fragment_list, container, false); 136*90c8c64dSAndroid Build Coastguard Worker 137*90c8c64dSAndroid Build Coastguard Worker mSkipPrevious = (ImageButton) rootView.findViewById(R.id.skip_previous); 138*90c8c64dSAndroid Build Coastguard Worker mSkipPrevious.setEnabled(false); 139*90c8c64dSAndroid Build Coastguard Worker mSkipPrevious.setOnClickListener(mButtonListener); 140*90c8c64dSAndroid Build Coastguard Worker 141*90c8c64dSAndroid Build Coastguard Worker mSkipNext = (ImageButton) rootView.findViewById(R.id.skip_next); 142*90c8c64dSAndroid Build Coastguard Worker mSkipNext.setEnabled(false); 143*90c8c64dSAndroid Build Coastguard Worker mSkipNext.setOnClickListener(mButtonListener); 144*90c8c64dSAndroid Build Coastguard Worker 145*90c8c64dSAndroid Build Coastguard Worker mPlayPause = (ImageButton) rootView.findViewById(R.id.play_pause); 146*90c8c64dSAndroid Build Coastguard Worker mPlayPause.setEnabled(true); 147*90c8c64dSAndroid Build Coastguard Worker mPlayPause.setOnClickListener(mButtonListener); 148*90c8c64dSAndroid Build Coastguard Worker 149*90c8c64dSAndroid Build Coastguard Worker mQueueAdapter = new QueueAdapter(getActivity()); 150*90c8c64dSAndroid Build Coastguard Worker 151*90c8c64dSAndroid Build Coastguard Worker ListView mListView = (ListView) rootView.findViewById(R.id.list_view); 152*90c8c64dSAndroid Build Coastguard Worker mListView.setAdapter(mQueueAdapter); 153*90c8c64dSAndroid Build Coastguard Worker mListView.setFocusable(true); 154*90c8c64dSAndroid Build Coastguard Worker mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 155*90c8c64dSAndroid Build Coastguard Worker @Override 156*90c8c64dSAndroid Build Coastguard Worker public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 157*90c8c64dSAndroid Build Coastguard Worker MediaSession.QueueItem item = mQueueAdapter.getItem(position); 158*90c8c64dSAndroid Build Coastguard Worker mTransportControls.skipToQueueItem(item.getQueueId()); 159*90c8c64dSAndroid Build Coastguard Worker } 160*90c8c64dSAndroid Build Coastguard Worker }); 161*90c8c64dSAndroid Build Coastguard Worker 162*90c8c64dSAndroid Build Coastguard Worker mMediaBrowser = new MediaBrowser(getActivity(), 163*90c8c64dSAndroid Build Coastguard Worker new ComponentName(getActivity(), MusicService.class), 164*90c8c64dSAndroid Build Coastguard Worker mConnectionCallback, null); 165*90c8c64dSAndroid Build Coastguard Worker 166*90c8c64dSAndroid Build Coastguard Worker return rootView; 167*90c8c64dSAndroid Build Coastguard Worker } 168*90c8c64dSAndroid Build Coastguard Worker 169*90c8c64dSAndroid Build Coastguard Worker @Override onResume()170*90c8c64dSAndroid Build Coastguard Worker public void onResume() { 171*90c8c64dSAndroid Build Coastguard Worker super.onResume(); 172*90c8c64dSAndroid Build Coastguard Worker if (mMediaBrowser != null) { 173*90c8c64dSAndroid Build Coastguard Worker mMediaBrowser.connect(); 174*90c8c64dSAndroid Build Coastguard Worker } 175*90c8c64dSAndroid Build Coastguard Worker } 176*90c8c64dSAndroid Build Coastguard Worker 177*90c8c64dSAndroid Build Coastguard Worker @Override onPause()178*90c8c64dSAndroid Build Coastguard Worker public void onPause() { 179*90c8c64dSAndroid Build Coastguard Worker super.onPause(); 180*90c8c64dSAndroid Build Coastguard Worker if (mMediaController != null) { 181*90c8c64dSAndroid Build Coastguard Worker mMediaController.unregisterCallback(mSessionCallback); 182*90c8c64dSAndroid Build Coastguard Worker } 183*90c8c64dSAndroid Build Coastguard Worker if (mMediaBrowser != null) { 184*90c8c64dSAndroid Build Coastguard Worker mMediaBrowser.disconnect(); 185*90c8c64dSAndroid Build Coastguard Worker } 186*90c8c64dSAndroid Build Coastguard Worker } 187*90c8c64dSAndroid Build Coastguard Worker 188*90c8c64dSAndroid Build Coastguard Worker onPlaybackStateChanged(PlaybackState state)189*90c8c64dSAndroid Build Coastguard Worker private void onPlaybackStateChanged(PlaybackState state) { 190*90c8c64dSAndroid Build Coastguard Worker LogHelper.d(TAG, "onPlaybackStateChanged ", state); 191*90c8c64dSAndroid Build Coastguard Worker if (state == null) { 192*90c8c64dSAndroid Build Coastguard Worker return; 193*90c8c64dSAndroid Build Coastguard Worker } 194*90c8c64dSAndroid Build Coastguard Worker mQueueAdapter.setActiveQueueItemId(state.getActiveQueueItemId()); 195*90c8c64dSAndroid Build Coastguard Worker mQueueAdapter.notifyDataSetChanged(); 196*90c8c64dSAndroid Build Coastguard Worker boolean enablePlay = false; 197*90c8c64dSAndroid Build Coastguard Worker StringBuilder statusBuilder = new StringBuilder(); 198*90c8c64dSAndroid Build Coastguard Worker switch (state.getState()) { 199*90c8c64dSAndroid Build Coastguard Worker case PlaybackState.STATE_PLAYING: 200*90c8c64dSAndroid Build Coastguard Worker statusBuilder.append("playing"); 201*90c8c64dSAndroid Build Coastguard Worker enablePlay = false; 202*90c8c64dSAndroid Build Coastguard Worker break; 203*90c8c64dSAndroid Build Coastguard Worker case PlaybackState.STATE_PAUSED: 204*90c8c64dSAndroid Build Coastguard Worker statusBuilder.append("paused"); 205*90c8c64dSAndroid Build Coastguard Worker enablePlay = true; 206*90c8c64dSAndroid Build Coastguard Worker break; 207*90c8c64dSAndroid Build Coastguard Worker case PlaybackState.STATE_STOPPED: 208*90c8c64dSAndroid Build Coastguard Worker statusBuilder.append("ended"); 209*90c8c64dSAndroid Build Coastguard Worker enablePlay = true; 210*90c8c64dSAndroid Build Coastguard Worker break; 211*90c8c64dSAndroid Build Coastguard Worker case PlaybackState.STATE_ERROR: 212*90c8c64dSAndroid Build Coastguard Worker statusBuilder.append("error: ").append(state.getErrorMessage()); 213*90c8c64dSAndroid Build Coastguard Worker break; 214*90c8c64dSAndroid Build Coastguard Worker case PlaybackState.STATE_BUFFERING: 215*90c8c64dSAndroid Build Coastguard Worker statusBuilder.append("buffering"); 216*90c8c64dSAndroid Build Coastguard Worker break; 217*90c8c64dSAndroid Build Coastguard Worker case PlaybackState.STATE_NONE: 218*90c8c64dSAndroid Build Coastguard Worker statusBuilder.append("none"); 219*90c8c64dSAndroid Build Coastguard Worker enablePlay = false; 220*90c8c64dSAndroid Build Coastguard Worker break; 221*90c8c64dSAndroid Build Coastguard Worker case PlaybackState.STATE_CONNECTING: 222*90c8c64dSAndroid Build Coastguard Worker statusBuilder.append("connecting"); 223*90c8c64dSAndroid Build Coastguard Worker break; 224*90c8c64dSAndroid Build Coastguard Worker default: 225*90c8c64dSAndroid Build Coastguard Worker statusBuilder.append(mPlaybackState); 226*90c8c64dSAndroid Build Coastguard Worker } 227*90c8c64dSAndroid Build Coastguard Worker statusBuilder.append(" -- At position: ").append(state.getPosition()); 228*90c8c64dSAndroid Build Coastguard Worker LogHelper.d(TAG, statusBuilder.toString()); 229*90c8c64dSAndroid Build Coastguard Worker 230*90c8c64dSAndroid Build Coastguard Worker if (enablePlay) { 231*90c8c64dSAndroid Build Coastguard Worker mPlayPause.setImageDrawable( 232*90c8c64dSAndroid Build Coastguard Worker getActivity().getDrawable(R.drawable.ic_play_arrow_white_24dp)); 233*90c8c64dSAndroid Build Coastguard Worker } else { 234*90c8c64dSAndroid Build Coastguard Worker mPlayPause.setImageDrawable(getActivity().getDrawable(R.drawable.ic_pause_white_24dp)); 235*90c8c64dSAndroid Build Coastguard Worker } 236*90c8c64dSAndroid Build Coastguard Worker 237*90c8c64dSAndroid Build Coastguard Worker mSkipPrevious.setEnabled((state.getActions() & PlaybackState.ACTION_SKIP_TO_PREVIOUS) != 0); 238*90c8c64dSAndroid Build Coastguard Worker mSkipNext.setEnabled((state.getActions() & PlaybackState.ACTION_SKIP_TO_NEXT) != 0); 239*90c8c64dSAndroid Build Coastguard Worker 240*90c8c64dSAndroid Build Coastguard Worker LogHelper.d(TAG, "Queue From MediaController *** Title " + 241*90c8c64dSAndroid Build Coastguard Worker mMediaController.getQueueTitle() + "\n: Queue: " + mMediaController.getQueue() + 242*90c8c64dSAndroid Build Coastguard Worker "\n Metadata " + mMediaController.getMetadata()); 243*90c8c64dSAndroid Build Coastguard Worker } 244*90c8c64dSAndroid Build Coastguard Worker 245*90c8c64dSAndroid Build Coastguard Worker private View.OnClickListener mButtonListener = new View.OnClickListener() { 246*90c8c64dSAndroid Build Coastguard Worker @Override 247*90c8c64dSAndroid Build Coastguard Worker public void onClick(View v) { 248*90c8c64dSAndroid Build Coastguard Worker final int state = mPlaybackState == null ? 249*90c8c64dSAndroid Build Coastguard Worker PlaybackState.STATE_NONE : mPlaybackState.getState(); 250*90c8c64dSAndroid Build Coastguard Worker switch (v.getId()) { 251*90c8c64dSAndroid Build Coastguard Worker case R.id.play_pause: 252*90c8c64dSAndroid Build Coastguard Worker LogHelper.d(TAG, "Play button pressed, in state " + state); 253*90c8c64dSAndroid Build Coastguard Worker if (state == PlaybackState.STATE_PAUSED || 254*90c8c64dSAndroid Build Coastguard Worker state == PlaybackState.STATE_STOPPED || 255*90c8c64dSAndroid Build Coastguard Worker state == PlaybackState.STATE_NONE) { 256*90c8c64dSAndroid Build Coastguard Worker playMedia(); 257*90c8c64dSAndroid Build Coastguard Worker } else if (state == PlaybackState.STATE_PLAYING) { 258*90c8c64dSAndroid Build Coastguard Worker pauseMedia(); 259*90c8c64dSAndroid Build Coastguard Worker } 260*90c8c64dSAndroid Build Coastguard Worker break; 261*90c8c64dSAndroid Build Coastguard Worker case R.id.skip_previous: 262*90c8c64dSAndroid Build Coastguard Worker LogHelper.d(TAG, "Start button pressed, in state " + state); 263*90c8c64dSAndroid Build Coastguard Worker skipToPrevious(); 264*90c8c64dSAndroid Build Coastguard Worker break; 265*90c8c64dSAndroid Build Coastguard Worker case R.id.skip_next: 266*90c8c64dSAndroid Build Coastguard Worker skipToNext(); 267*90c8c64dSAndroid Build Coastguard Worker break; 268*90c8c64dSAndroid Build Coastguard Worker } 269*90c8c64dSAndroid Build Coastguard Worker } 270*90c8c64dSAndroid Build Coastguard Worker }; 271*90c8c64dSAndroid Build Coastguard Worker playMedia()272*90c8c64dSAndroid Build Coastguard Worker private void playMedia() { 273*90c8c64dSAndroid Build Coastguard Worker if (mTransportControls != null) { 274*90c8c64dSAndroid Build Coastguard Worker mTransportControls.play(); 275*90c8c64dSAndroid Build Coastguard Worker } 276*90c8c64dSAndroid Build Coastguard Worker } 277*90c8c64dSAndroid Build Coastguard Worker pauseMedia()278*90c8c64dSAndroid Build Coastguard Worker private void pauseMedia() { 279*90c8c64dSAndroid Build Coastguard Worker if (mTransportControls != null) { 280*90c8c64dSAndroid Build Coastguard Worker mTransportControls.pause(); 281*90c8c64dSAndroid Build Coastguard Worker } 282*90c8c64dSAndroid Build Coastguard Worker } 283*90c8c64dSAndroid Build Coastguard Worker skipToPrevious()284*90c8c64dSAndroid Build Coastguard Worker private void skipToPrevious() { 285*90c8c64dSAndroid Build Coastguard Worker if (mTransportControls != null) { 286*90c8c64dSAndroid Build Coastguard Worker mTransportControls.skipToPrevious(); 287*90c8c64dSAndroid Build Coastguard Worker } 288*90c8c64dSAndroid Build Coastguard Worker } 289*90c8c64dSAndroid Build Coastguard Worker skipToNext()290*90c8c64dSAndroid Build Coastguard Worker private void skipToNext() { 291*90c8c64dSAndroid Build Coastguard Worker if (mTransportControls != null) { 292*90c8c64dSAndroid Build Coastguard Worker mTransportControls.skipToNext(); 293*90c8c64dSAndroid Build Coastguard Worker } 294*90c8c64dSAndroid Build Coastguard Worker } 295*90c8c64dSAndroid Build Coastguard Worker } 296