Change FM off button to release media and audio resources.
When FM application is launched, no other Media consuming
application can receive key events (play, pause etc.) because
FM service is the owner of MediaSession and AudioFocus. This
does not bode well for user experience. Change the behaviour
of FM off button so that we release MediaSession and AudioFocus
so that other applications can work.
The same behaviour is enabled when antenna is pulled out.
We differentiate FM off from remote bluetooth headset
start/stop i.e. when remote headset does start/stop, it starts/stops
FM. This means that if user presses FM off button, user has to
explicitly turn it on again.
Also remove old FM Media Button Intent receiver as it is deprecated.
CRs-Fixed: 936190
Change-Id: I32fef8e43b226a260d5483b40f5825926c023e62
diff --git a/fmapp2/AndroidManifest.xml b/fmapp2/AndroidManifest.xml
index 92af7e3..bc383fe 100644
--- a/fmapp2/AndroidManifest.xml
+++ b/fmapp2/AndroidManifest.xml
@@ -73,7 +73,6 @@
<receiver android:name="com.caf.fmradio.FMMediaButtonIntentReceiver">
<intent-filter>
- <action android:name="android.intent.action.MEDIA_BUTTON" />
<action android:name="android.media.AUDIO_BECOMING_NOISY" />
</intent-filter>
</receiver>
diff --git a/fmapp2/src/com/caf/fmradio/FMRadio.java b/fmapp2/src/com/caf/fmradio/FMRadio.java
index 3537137..5cfd5a6 100644
--- a/fmapp2/src/com/caf/fmradio/FMRadio.java
+++ b/fmapp2/src/com/caf/fmradio/FMRadio.java
@@ -2622,7 +2622,7 @@
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
- Log.d(LOGTAG, "KEY event received" + keyCode);
+ Log.d(LOGTAG, "KEY event received " + keyCode);
switch (keyCode) {
case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
case 126: //KeyEvent.KEYCODE_MEDIA_PLAY:
diff --git a/fmapp2/src/com/caf/fmradio/FMRadioService.java b/fmapp2/src/com/caf/fmradio/FMRadioService.java
index 98fac7a..149c248 100644
--- a/fmapp2/src/com/caf/fmradio/FMRadioService.java
+++ b/fmapp2/src/com/caf/fmradio/FMRadioService.java
@@ -213,6 +213,9 @@
private Object mRecordSinkLock = new Object();
private boolean mIsFMDeviceLoopbackActive = false;
+ private static final int FM_OFF_FROM_APPLICATION = 1;
+ private static final int FM_OFF_FROM_ANTENNA = 2;
+
public FMRadioService() {
}
@@ -238,9 +241,7 @@
registerDelayedServiceStop();
registerExternalStorageListener();
registerAirplaneModeStatusChanged();
- // registering media button receiver seperately as we need to set
- // different priority for receiving media events
- registerFmMediaButtonReceiver();
+
mSession = new MediaSession(getApplicationContext(), this.getClass().getName());
mSession.setCallback(mSessionCallback);
mSession.setFlags(MediaSession.FLAG_EXCLUSIVE_GLOBAL_PRIORITY |
@@ -665,71 +666,6 @@
}
}
- public void registerFmMediaButtonReceiver() {
- if (mFmMediaButtonListener == null) {
- mFmMediaButtonListener = new BroadcastReceiver() {
- public void onReceive(Context context, Intent intent) {
- Log.d(LOGTAG, "FMMediaButtonIntentReceiver.FM_MEDIA_BUTTON");
- Log.d(LOGTAG, "KeyEvent = " +intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT));
- String action = intent.getAction();
- if (action.equals(FMMediaButtonIntentReceiver.FM_MEDIA_BUTTON)) {
- KeyEvent event = (KeyEvent)
- intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
- int keycode = event.getKeyCode();
- switch (keycode) {
- case KeyEvent.KEYCODE_HEADSETHOOK :
- toggleFM();
- if (isOrderedBroadcast()) {
- abortBroadcast();
- }
- break;
- case KeyEvent.KEYCODE_MEDIA_PAUSE :
- if (isFmOn()){
- //FM should be off when Headset hook pressed.
- fmOff();
- if (isOrderedBroadcast()) {
- abortBroadcast();
- }
- try {
- /* Notify the UI/Activity, only if the service is "bound"
- by an activity and if Callbacks are registered
- */
- if ((mServiceInUse) && (mCallbacks != null) ) {
- mCallbacks.onDisabled();
- }
- } catch (RemoteException e) {
- e.printStackTrace();
- }
- }
- break;
- case KeyEvent.KEYCODE_MEDIA_PLAY:
- if (isAntennaAvailable() && mServiceInUse) {
- fmOn();
- if (isOrderedBroadcast()) {
- abortBroadcast();
- }
- try {
- /* Notify the UI/Activity, only if the service is "bound"
- by an activity and if Callbacks are registered
- */
- if (mCallbacks != null ) {
- mCallbacks.onEnabled();
- }
- } catch (RemoteException e) {
- e.printStackTrace();
- }
- }
- break;
- } // end of switch
- } // end of FMMediaButtonIntentReceiver.FM_MEDIA_BUTTON
- } // end of onReceive
- };
- IntentFilter iFilter = new IntentFilter();
- iFilter.addAction(FMMediaButtonIntentReceiver.FM_MEDIA_BUTTON);
- registerReceiver(mFmMediaButtonListener, iFilter);
- }
- }
-
public void registerAudioBecomeNoisy() {
if (mAudioBecomeNoisyListener == null) {
mAudioBecomeNoisyListener = new BroadcastReceiver() {
@@ -742,7 +678,7 @@
if (isFmOn())
{
/* Disable FM and let the UI know */
- fmOff();
+ fmOff(FM_OFF_FROM_ANTENNA);
try
{
/* Notify the UI/Activity, only if the service is "bound"
@@ -1092,12 +1028,14 @@
Log.d(LOGTAG, "audio focuss couldnot be granted");
return;
}
+ mSession.setActive(true);
Log.d(LOGTAG,"FM registering for registerMediaButtonEventReceiver");
mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
ComponentName fmRadio = new ComponentName(this.getPackageName(),
FMMediaButtonIntentReceiver.class.getName());
mAudioManager.registerMediaButtonEventReceiver(fmRadio);
+
mStoppedOnFocusLoss = false;
if (!mA2dpDeviceState.isDeviceAvailable()) {
@@ -1670,6 +1608,7 @@
private void stop() {
Log.d(LOGTAG,"in stop");
+
if (!mServiceInUse) {
Log.d(LOGTAG,"calling unregisterMediaButtonEventReceiver in stop");
mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
@@ -1726,7 +1665,7 @@
public boolean fmOff() throws RemoteException
{
- return(mService.get().fmOff());
+ return(mService.get().fmOff(FM_OFF_FROM_APPLICATION));
}
public boolean fmRadioReset() throws RemoteException
@@ -2030,6 +1969,7 @@
{
return(mService.get().isA2DPConnected());
}
+
}
private final IBinder mBinder = new ServiceStub(this);
@@ -2243,6 +2183,19 @@
return(bStatus);
}
+
+ private boolean fmOff(int off_from) {
+ if (off_from == FM_OFF_FROM_APPLICATION || off_from == FM_OFF_FROM_ANTENNA) {
+ Log.d(LOGTAG, "FM application close button pressed or antenna removed");
+ mSession.setActive(false);
+ AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
+ if (audioManager != null)
+ audioManager.abandonAudioFocus(mAudioFocusListener);
+ else
+ Log.d(LOGTAG, "Failed to get Audio Service");
+ }
+ return fmOff();
+ }
/*
* Turn OFF FM: Disable the FM Host when hardware resets asynchronously .
* .