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