1d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn/* 2d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn * Copyright (C) 2013 The Android Open Source Project 3d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn * 4d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 5d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn * you may not use this file except in compliance with the License. 6d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn * You may obtain a copy of the License at 7d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn * 8d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 9d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn * 10d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn * Unless required by applicable law or agreed to in writing, software 11d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 12d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn * See the License for the specific language governing permissions and 14d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn * limitations under the License. 15d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn */ 16d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn 17d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackbornpackage android.support.v4.media; 18d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn 19d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackbornimport android.app.PendingIntent; 20d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackbornimport android.content.BroadcastReceiver; 21d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackbornimport android.content.Context; 22d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackbornimport android.content.Intent; 23d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackbornimport android.content.IntentFilter; 24d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackbornimport android.media.AudioManager; 25d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackbornimport android.media.RemoteControlClient; 26d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackbornimport android.util.Log; 27d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackbornimport android.view.KeyEvent; 28d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackbornimport android.view.View; 29d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackbornimport android.view.ViewTreeObserver; 30d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn 3184bbe6fe39c63a7e67a3ca937981a463c11ac9edScott Mainclass TransportMediatorJellybeanMR2 3254fe42a994b1aa1608d23a57a2f55228712e98e7Dianne Hackborn implements RemoteControlClient.OnGetPlaybackPositionListener, 3354fe42a994b1aa1608d23a57a2f55228712e98e7Dianne Hackborn RemoteControlClient.OnPlaybackPositionUpdateListener { 34d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn final Context mContext; 35d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn final AudioManager mAudioManager; 36d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn final View mTargetView; 3754fe42a994b1aa1608d23a57a2f55228712e98e7Dianne Hackborn final TransportMediatorCallback mTransportCallback; 38d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn final String mReceiverAction; 39d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn final IntentFilter mReceiverFilter; 40d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn final Intent mIntent; 41d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn final ViewTreeObserver.OnWindowAttachListener mWindowAttachListener = 42d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn new ViewTreeObserver.OnWindowAttachListener() { 43d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn @Override 44d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn public void onWindowAttached() { 45d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn windowAttached(); 46d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn } 47d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn @Override 48d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn public void onWindowDetached() { 49d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn windowDetached(); 50d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn } 51d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn }; 52d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn final ViewTreeObserver.OnWindowFocusChangeListener mWindowFocusListener = 53d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn new ViewTreeObserver.OnWindowFocusChangeListener() { 54d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn @Override 55d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn public void onWindowFocusChanged(boolean hasFocus) { 56d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn if (hasFocus) gainFocus(); 57d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn else loseFocus(); 58d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn } 59d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn }; 60d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn final BroadcastReceiver mMediaButtonReceiver = new BroadcastReceiver() { 61d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn @Override 62d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn public void onReceive(Context context, Intent intent) { 63d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn try { 64d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); 65c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn mTransportCallback.handleKey(event); 66d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn } catch (ClassCastException e) { 67d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn Log.w("TransportController", e); 68d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn } 69d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn } 70d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn }; 71c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn AudioManager.OnAudioFocusChangeListener mAudioFocusChangeListener 72c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn = new AudioManager.OnAudioFocusChangeListener() { 73c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn @Override 74c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn public void onAudioFocusChange(int focusChange) { 75c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn mTransportCallback.handleAudioFocusChange(focusChange); 76c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn } 77c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn }; 78d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn 79d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn PendingIntent mPendingIntent; 80d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn RemoteControlClient mRemoteControl; 81d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn boolean mFocused; 82c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn int mPlayState = 0; 83c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn boolean mAudioFocused; 84d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn 8554fe42a994b1aa1608d23a57a2f55228712e98e7Dianne Hackborn public TransportMediatorJellybeanMR2(Context context, AudioManager audioManager, 8654fe42a994b1aa1608d23a57a2f55228712e98e7Dianne Hackborn View view, TransportMediatorCallback transportCallback) { 87d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mContext = context; 88d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mAudioManager = audioManager; 89d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mTargetView = view; 90c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn mTransportCallback = transportCallback; 91d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mReceiverAction = context.getPackageName() + ":transport:" + System.identityHashCode(this); 92d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mIntent = new Intent(mReceiverAction); 93d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mIntent.setPackage(context.getPackageName()); 94d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mReceiverFilter = new IntentFilter(); 95d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mReceiverFilter.addAction(mReceiverAction); 96d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mTargetView.getViewTreeObserver().addOnWindowAttachListener(mWindowAttachListener); 97d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mTargetView.getViewTreeObserver().addOnWindowFocusChangeListener(mWindowFocusListener); 98d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn } 99d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn 100d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn public Object getRemoteControlClient() { 101d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn return mRemoteControl; 102d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn } 103d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn 104d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn public void destroy() { 105d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn windowDetached(); 106d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mTargetView.getViewTreeObserver().removeOnWindowAttachListener(mWindowAttachListener); 107d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mTargetView.getViewTreeObserver().removeOnWindowFocusChangeListener(mWindowFocusListener); 108d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn } 109d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn 110d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn void windowAttached() { 111d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mContext.registerReceiver(mMediaButtonReceiver, mReceiverFilter); 112d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mPendingIntent = PendingIntent.getBroadcast(mContext, 0, mIntent, 113d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn PendingIntent.FLAG_CANCEL_CURRENT); 114d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mRemoteControl = new RemoteControlClient(mPendingIntent); 11554fe42a994b1aa1608d23a57a2f55228712e98e7Dianne Hackborn mRemoteControl.setOnGetPlaybackPositionListener(this); 11654fe42a994b1aa1608d23a57a2f55228712e98e7Dianne Hackborn mRemoteControl.setPlaybackPositionUpdateListener(this); 117d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn } 118d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn 119d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn void gainFocus() { 120d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn if (!mFocused) { 121d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mFocused = true; 122d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mAudioManager.registerMediaButtonEventReceiver(mPendingIntent); 123d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mAudioManager.registerRemoteControlClient(mRemoteControl); 124c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn if (mPlayState == RemoteControlClient.PLAYSTATE_PLAYING) { 125c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn takeAudioFocus(); 126c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn } 127c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn } 128c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn } 129c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn 130c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn void takeAudioFocus() { 131c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn if (!mAudioFocused) { 132c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn mAudioFocused = true; 133c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn mAudioManager.requestAudioFocus(mAudioFocusChangeListener, 134c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); 135c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn } 136c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn } 137c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn 138c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn public void startPlaying() { 139c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn if (mPlayState != RemoteControlClient.PLAYSTATE_PLAYING) { 140c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn mPlayState = RemoteControlClient.PLAYSTATE_PLAYING; 141c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn mRemoteControl.setPlaybackState(RemoteControlClient.PLAYSTATE_PLAYING); 142c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn } 143c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn if (mFocused) { 144c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn takeAudioFocus(); 145c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn } 146c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn } 147c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn 14854fe42a994b1aa1608d23a57a2f55228712e98e7Dianne Hackborn @Override 14954fe42a994b1aa1608d23a57a2f55228712e98e7Dianne Hackborn public long onGetPlaybackPosition() { 15054fe42a994b1aa1608d23a57a2f55228712e98e7Dianne Hackborn return mTransportCallback.getPlaybackPosition(); 15154fe42a994b1aa1608d23a57a2f55228712e98e7Dianne Hackborn } 15254fe42a994b1aa1608d23a57a2f55228712e98e7Dianne Hackborn 15354fe42a994b1aa1608d23a57a2f55228712e98e7Dianne Hackborn @Override 15454fe42a994b1aa1608d23a57a2f55228712e98e7Dianne Hackborn public void onPlaybackPositionUpdate(long newPositionMs) { 15554fe42a994b1aa1608d23a57a2f55228712e98e7Dianne Hackborn mTransportCallback.playbackPositionUpdate(newPositionMs); 15654fe42a994b1aa1608d23a57a2f55228712e98e7Dianne Hackborn } 15754fe42a994b1aa1608d23a57a2f55228712e98e7Dianne Hackborn 15854fe42a994b1aa1608d23a57a2f55228712e98e7Dianne Hackborn public void refreshState(boolean playing, long position, int transportControls) { 1598c7c4c0409bd93f66fe39c5a5298a94f832be31eDianne Hackborn if (mRemoteControl != null) { 1608c7c4c0409bd93f66fe39c5a5298a94f832be31eDianne Hackborn mRemoteControl.setPlaybackState(playing ? RemoteControlClient.PLAYSTATE_PLAYING 16154fe42a994b1aa1608d23a57a2f55228712e98e7Dianne Hackborn : RemoteControlClient.PLAYSTATE_STOPPED, position, playing ? 1 : 0); 1628c7c4c0409bd93f66fe39c5a5298a94f832be31eDianne Hackborn mRemoteControl.setTransportControlFlags(transportControls); 1638c7c4c0409bd93f66fe39c5a5298a94f832be31eDianne Hackborn } 1648c7c4c0409bd93f66fe39c5a5298a94f832be31eDianne Hackborn } 1658c7c4c0409bd93f66fe39c5a5298a94f832be31eDianne Hackborn 166c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn public void pausePlaying() { 167c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn if (mPlayState == RemoteControlClient.PLAYSTATE_PLAYING) { 168c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn mPlayState = RemoteControlClient.PLAYSTATE_PAUSED; 169c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn mRemoteControl.setPlaybackState(RemoteControlClient.PLAYSTATE_PAUSED); 170c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn } 1718c7c4c0409bd93f66fe39c5a5298a94f832be31eDianne Hackborn dropAudioFocus(); 172c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn } 173c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn 174c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn public void stopPlaying() { 175c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn if (mPlayState != RemoteControlClient.PLAYSTATE_STOPPED) { 176c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn mPlayState = RemoteControlClient.PLAYSTATE_STOPPED; 177c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn mRemoteControl.setPlaybackState(RemoteControlClient.PLAYSTATE_STOPPED); 178c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn } 179c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn dropAudioFocus(); 180c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn } 181c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn 182c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn void dropAudioFocus() { 183c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn if (mAudioFocused) { 184c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn mAudioFocused = false; 185c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn mAudioManager.abandonAudioFocus(mAudioFocusChangeListener); 186d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn } 187d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn } 188d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn 189d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn void loseFocus() { 190c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn dropAudioFocus(); 191d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn if (mFocused) { 192d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mFocused = false; 193d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mAudioManager.unregisterRemoteControlClient(mRemoteControl); 194d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mAudioManager.unregisterMediaButtonEventReceiver(mPendingIntent); 195d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn } 196d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn } 197d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn 198d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn void windowDetached() { 199d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn loseFocus(); 200d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn if (mPendingIntent != null) { 201d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mContext.unregisterReceiver(mMediaButtonReceiver); 202d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mPendingIntent.cancel(); 203d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mPendingIntent = null; 204d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mRemoteControl = null; 205d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn } 206d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn } 207d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn} 208