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 31e317b752141603289f5c31754fc6987d00f58635Neil Fullerclass TransportMediatorJellybeanMR2 { 32d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn final Context mContext; 33d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn final AudioManager mAudioManager; 34d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn final View mTargetView; 3554fe42a994b1aa1608d23a57a2f55228712e98e7Dianne Hackborn final TransportMediatorCallback mTransportCallback; 36d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn final String mReceiverAction; 37d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn final IntentFilter mReceiverFilter; 38d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn final Intent mIntent; 39d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn final ViewTreeObserver.OnWindowAttachListener mWindowAttachListener = 40d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn new ViewTreeObserver.OnWindowAttachListener() { 41d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn @Override 42d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn public void onWindowAttached() { 43d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn windowAttached(); 44d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn } 45d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn @Override 46d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn public void onWindowDetached() { 47d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn windowDetached(); 48d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn } 49d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn }; 50d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn final ViewTreeObserver.OnWindowFocusChangeListener mWindowFocusListener = 51d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn new ViewTreeObserver.OnWindowFocusChangeListener() { 52d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn @Override 53d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn public void onWindowFocusChanged(boolean hasFocus) { 54d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn if (hasFocus) gainFocus(); 55d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn else loseFocus(); 56d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn } 57d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn }; 58d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn final BroadcastReceiver mMediaButtonReceiver = new BroadcastReceiver() { 59d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn @Override 60d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn public void onReceive(Context context, Intent intent) { 61d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn try { 62d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); 63c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn mTransportCallback.handleKey(event); 64d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn } catch (ClassCastException e) { 65d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn Log.w("TransportController", e); 66d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn } 67d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn } 68d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn }; 69c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn AudioManager.OnAudioFocusChangeListener mAudioFocusChangeListener 70c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn = new AudioManager.OnAudioFocusChangeListener() { 71c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn @Override 72c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn public void onAudioFocusChange(int focusChange) { 73c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn mTransportCallback.handleAudioFocusChange(focusChange); 74c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn } 75c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn }; 76e317b752141603289f5c31754fc6987d00f58635Neil Fuller final RemoteControlClient.OnGetPlaybackPositionListener mGetPlaybackPositionListener 77e317b752141603289f5c31754fc6987d00f58635Neil Fuller = new RemoteControlClient.OnGetPlaybackPositionListener() { 78e317b752141603289f5c31754fc6987d00f58635Neil Fuller @Override 79e317b752141603289f5c31754fc6987d00f58635Neil Fuller public long onGetPlaybackPosition() { 80e317b752141603289f5c31754fc6987d00f58635Neil Fuller return mTransportCallback.getPlaybackPosition(); 81e317b752141603289f5c31754fc6987d00f58635Neil Fuller } 82e317b752141603289f5c31754fc6987d00f58635Neil Fuller }; 83e317b752141603289f5c31754fc6987d00f58635Neil Fuller final RemoteControlClient.OnPlaybackPositionUpdateListener mPlaybackPositionUpdateListener 84e317b752141603289f5c31754fc6987d00f58635Neil Fuller = new RemoteControlClient.OnPlaybackPositionUpdateListener() { 85e317b752141603289f5c31754fc6987d00f58635Neil Fuller public void onPlaybackPositionUpdate(long newPositionMs) { 86e317b752141603289f5c31754fc6987d00f58635Neil Fuller mTransportCallback.playbackPositionUpdate(newPositionMs); 87e317b752141603289f5c31754fc6987d00f58635Neil Fuller } 88e317b752141603289f5c31754fc6987d00f58635Neil Fuller }; 89e317b752141603289f5c31754fc6987d00f58635Neil Fuller 90d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn PendingIntent mPendingIntent; 91d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn RemoteControlClient mRemoteControl; 92d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn boolean mFocused; 93c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn int mPlayState = 0; 94c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn boolean mAudioFocused; 95d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn 9654fe42a994b1aa1608d23a57a2f55228712e98e7Dianne Hackborn public TransportMediatorJellybeanMR2(Context context, AudioManager audioManager, 9754fe42a994b1aa1608d23a57a2f55228712e98e7Dianne Hackborn View view, TransportMediatorCallback transportCallback) { 98d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mContext = context; 99d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mAudioManager = audioManager; 100d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mTargetView = view; 101c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn mTransportCallback = transportCallback; 102d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mReceiverAction = context.getPackageName() + ":transport:" + System.identityHashCode(this); 103d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mIntent = new Intent(mReceiverAction); 104d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mIntent.setPackage(context.getPackageName()); 105d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mReceiverFilter = new IntentFilter(); 106d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mReceiverFilter.addAction(mReceiverAction); 107d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mTargetView.getViewTreeObserver().addOnWindowAttachListener(mWindowAttachListener); 108d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mTargetView.getViewTreeObserver().addOnWindowFocusChangeListener(mWindowFocusListener); 109d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn } 110d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn 111d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn public Object getRemoteControlClient() { 112d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn return mRemoteControl; 113d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn } 114d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn 115d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn public void destroy() { 116d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn windowDetached(); 117d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mTargetView.getViewTreeObserver().removeOnWindowAttachListener(mWindowAttachListener); 118d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mTargetView.getViewTreeObserver().removeOnWindowFocusChangeListener(mWindowFocusListener); 119d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn } 120d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn 121d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn void windowAttached() { 122d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mContext.registerReceiver(mMediaButtonReceiver, mReceiverFilter); 123d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mPendingIntent = PendingIntent.getBroadcast(mContext, 0, mIntent, 124d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn PendingIntent.FLAG_CANCEL_CURRENT); 125d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mRemoteControl = new RemoteControlClient(mPendingIntent); 126e317b752141603289f5c31754fc6987d00f58635Neil Fuller mRemoteControl.setOnGetPlaybackPositionListener(mGetPlaybackPositionListener); 127e317b752141603289f5c31754fc6987d00f58635Neil Fuller mRemoteControl.setPlaybackPositionUpdateListener(mPlaybackPositionUpdateListener); 128d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn } 129d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn 130d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn void gainFocus() { 131d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn if (!mFocused) { 132d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mFocused = true; 133d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mAudioManager.registerMediaButtonEventReceiver(mPendingIntent); 134d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mAudioManager.registerRemoteControlClient(mRemoteControl); 135c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn if (mPlayState == RemoteControlClient.PLAYSTATE_PLAYING) { 136c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn takeAudioFocus(); 137c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn } 138c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn } 139c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn } 140c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn 141c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn void takeAudioFocus() { 142c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn if (!mAudioFocused) { 143c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn mAudioFocused = true; 144c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn mAudioManager.requestAudioFocus(mAudioFocusChangeListener, 145c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); 146c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn } 147c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn } 148c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn 149c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn public void startPlaying() { 150c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn if (mPlayState != RemoteControlClient.PLAYSTATE_PLAYING) { 151c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn mPlayState = RemoteControlClient.PLAYSTATE_PLAYING; 152c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn mRemoteControl.setPlaybackState(RemoteControlClient.PLAYSTATE_PLAYING); 153c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn } 154c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn if (mFocused) { 155c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn takeAudioFocus(); 156c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn } 157c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn } 158c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn 15954fe42a994b1aa1608d23a57a2f55228712e98e7Dianne Hackborn public void refreshState(boolean playing, long position, int transportControls) { 1608c7c4c0409bd93f66fe39c5a5298a94f832be31eDianne Hackborn if (mRemoteControl != null) { 1618c7c4c0409bd93f66fe39c5a5298a94f832be31eDianne Hackborn mRemoteControl.setPlaybackState(playing ? RemoteControlClient.PLAYSTATE_PLAYING 16254fe42a994b1aa1608d23a57a2f55228712e98e7Dianne Hackborn : RemoteControlClient.PLAYSTATE_STOPPED, position, playing ? 1 : 0); 1638c7c4c0409bd93f66fe39c5a5298a94f832be31eDianne Hackborn mRemoteControl.setTransportControlFlags(transportControls); 1648c7c4c0409bd93f66fe39c5a5298a94f832be31eDianne Hackborn } 1658c7c4c0409bd93f66fe39c5a5298a94f832be31eDianne Hackborn } 1668c7c4c0409bd93f66fe39c5a5298a94f832be31eDianne Hackborn 167c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn public void pausePlaying() { 168c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn if (mPlayState == RemoteControlClient.PLAYSTATE_PLAYING) { 169c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn mPlayState = RemoteControlClient.PLAYSTATE_PAUSED; 170c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn mRemoteControl.setPlaybackState(RemoteControlClient.PLAYSTATE_PAUSED); 171c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn } 1728c7c4c0409bd93f66fe39c5a5298a94f832be31eDianne Hackborn dropAudioFocus(); 173c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn } 174c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn 175c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn public void stopPlaying() { 176c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn if (mPlayState != RemoteControlClient.PLAYSTATE_STOPPED) { 177c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn mPlayState = RemoteControlClient.PLAYSTATE_STOPPED; 178c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn mRemoteControl.setPlaybackState(RemoteControlClient.PLAYSTATE_STOPPED); 179c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn } 180c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn dropAudioFocus(); 181c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn } 182c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn 183c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn void dropAudioFocus() { 184c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn if (mAudioFocused) { 185c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn mAudioFocused = false; 186c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn mAudioManager.abandonAudioFocus(mAudioFocusChangeListener); 187d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn } 188d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn } 189d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn 190d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn void loseFocus() { 191c76d76a0d92a9dca5c91c68b86666d403ac0fd3cDianne Hackborn dropAudioFocus(); 192d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn if (mFocused) { 193d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mFocused = false; 194d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mAudioManager.unregisterRemoteControlClient(mRemoteControl); 195d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mAudioManager.unregisterMediaButtonEventReceiver(mPendingIntent); 196d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn } 197d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn } 198d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn 199d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn void windowDetached() { 200d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn loseFocus(); 201d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn if (mPendingIntent != null) { 202d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mContext.unregisterReceiver(mMediaButtonReceiver); 203d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mPendingIntent.cancel(); 204d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mPendingIntent = null; 205d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn mRemoteControl = null; 206d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn } 207d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn } 208d3a70800e5f2cc2855d53ebea82fb7568affe02aDianne Hackborn} 209