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