From cf2795ada0897f97fd4db963a103d05a8b64cb3a Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Tue, 10 Jun 2014 17:26:22 -0700 Subject: #360, #331 Change to use AUDIO_NOISY event. Fixes issues with both pausing during any bluetooth disconnect, and delay when music is playing after unplugging headphones --- .../dsub/receiver/AudioNoisyReceiver.java | 51 +++++++++++++ .../dsub/receiver/BluetoothIntentReceiver.java | 85 ---------------------- .../service/DownloadServiceLifecycleSupport.java | 25 ------- 3 files changed, 51 insertions(+), 110 deletions(-) create mode 100644 src/github/daneren2005/dsub/receiver/AudioNoisyReceiver.java delete mode 100644 src/github/daneren2005/dsub/receiver/BluetoothIntentReceiver.java (limited to 'src') diff --git a/src/github/daneren2005/dsub/receiver/AudioNoisyReceiver.java b/src/github/daneren2005/dsub/receiver/AudioNoisyReceiver.java new file mode 100644 index 00000000..058d04b4 --- /dev/null +++ b/src/github/daneren2005/dsub/receiver/AudioNoisyReceiver.java @@ -0,0 +1,51 @@ +/* + This file is part of Subsonic. + Subsonic is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + Subsonic is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + You should have received a copy of the GNU General Public License + along with Subsonic. If not, see . + Copyright 2014 (C) Scott Jackson +*/ + +package github.daneren2005.dsub.receiver; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.media.AudioManager; +import android.util.Log; + +import github.daneren2005.dsub.domain.PlayerState; +import github.daneren2005.dsub.service.DownloadService; +import github.daneren2005.dsub.util.Constants; +import github.daneren2005.dsub.util.Util; + +public class AudioNoisyReceiver extends BroadcastReceiver { + private static final String TAG = AudioNoisyReceiver.class.getSimpleName(); + + @Override + public void onReceive(Context context, Intent intent) { + DownloadService downloadService = DownloadService.getInstance(); + // Don't do anything if downloadService is not started + if(downloadService == null) { + return; + } + + if (AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals (intent.getAction ())) { + if(!downloadService.isRemoteEnabled() && downloadService.getPlayerState() == PlayerState.STARTED) { + SharedPreferences prefs = Util.getPreferences(downloadService); + int pausePref = Integer.parseInt(prefs.getString(Constants.PREFERENCES_KEY_PAUSE_DISCONNECT, "0")); + if(pausePref == 0) { + downloadService.pause(); + } + } + } + } +} diff --git a/src/github/daneren2005/dsub/receiver/BluetoothIntentReceiver.java b/src/github/daneren2005/dsub/receiver/BluetoothIntentReceiver.java deleted file mode 100644 index 13de4d86..00000000 --- a/src/github/daneren2005/dsub/receiver/BluetoothIntentReceiver.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - This file is part of Subsonic. - - Subsonic is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Subsonic is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Subsonic. If not, see . - - Copyright 2010 (C) Sindre Mehus - */ -package github.daneren2005.dsub.receiver; - -import android.bluetooth.BluetoothDevice; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.SharedPreferences; -import android.util.Log; - -import github.daneren2005.dsub.service.DownloadService; -import github.daneren2005.dsub.util.Constants; -import github.daneren2005.dsub.util.Util; - -/** - * Request media button focus when connected to Bluetooth A2DP. - * - * @author Sindre Mehus - */ -public class BluetoothIntentReceiver extends BroadcastReceiver { - private static final String TAG = BluetoothIntentReceiver.class.getSimpleName(); - // Same as constants in android.bluetooth.BluetoothProfile, which is API level 11. - private static final int STATE_DISCONNECTED = 0; - private static final int STATE_CONNECTED = 2; - @Override - public void onReceive(Context context, Intent intent) { - Log.i(TAG, "GOT INTENT " + intent); - if (isConnected(intent)) { - Log.i(TAG, "Connected to Bluetooth A2DP, requesting media button focus."); - Util.registerMediaButtonEventReceiver(context); - } else if (isDisconnected(intent)) { - Log.i(TAG, "Disconnected from Bluetooth A2DP, requesting pause."); - SharedPreferences prefs = Util.getPreferences(context); - int pausePref = Integer.parseInt(prefs.getString(Constants.PREFERENCES_KEY_PAUSE_DISCONNECT, "0")); - if(pausePref == 0 || pausePref == 2) { - context.sendBroadcast(new Intent(DownloadService.CMD_PAUSE)); - } - } - } - private boolean isConnected(Intent intent) { - if ("android.bluetooth.a2dp.action.SINK_STATE_CHANGED".equals(intent.getAction()) && - intent.getIntExtra("android.bluetooth.a2dp.extra.SINK_STATE", -1) == STATE_CONNECTED) { - return true; - } - else if ("android.bluetooth.headset.profile.action.CONNECTION_STATE_CHANGED".equals(intent.getAction()) && - intent.getIntExtra("android.bluetooth.profile.extra.STATE", -1) == STATE_CONNECTED) { - return true; - } - else if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(intent.getAction())) { - return true; - } - return false; - } - private boolean isDisconnected(Intent intent) { - if ("android.bluetooth.a2dp.action.SINK_STATE_CHANGED".equals(intent.getAction()) && - intent.getIntExtra("android.bluetooth.a2dp.extra.SINK_STATE", -1) == STATE_DISCONNECTED) { - return true; - } - else if ("android.bluetooth.headset.profile.action.CONNECTION_STATE_CHANGED".equals(intent.getAction()) && - intent.getIntExtra("android.bluetooth.profile.extra.STATE", -1) == STATE_DISCONNECTED) { - return true; - } - else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(intent.getAction())) { - return true; - } - return false; - } -} diff --git a/src/github/daneren2005/dsub/service/DownloadServiceLifecycleSupport.java b/src/github/daneren2005/dsub/service/DownloadServiceLifecycleSupport.java index db69517c..ed092328 100644 --- a/src/github/daneren2005/dsub/service/DownloadServiceLifecycleSupport.java +++ b/src/github/daneren2005/dsub/service/DownloadServiceLifecycleSupport.java @@ -54,7 +54,6 @@ public class DownloadServiceLifecycleSupport { private final DownloadService downloadService; private Looper eventLooper; private Handler eventHandler; - private BroadcastReceiver headsetEventReceiver; private BroadcastReceiver ejectEventReceiver; private PhoneStateListener phoneStateListener; private boolean externalStorageAvailable= true; @@ -118,29 +117,6 @@ public class DownloadServiceLifecycleSupport { } }, "DownloadServiceLifecycleSupport").start(); - // Pause when headset is unplugged. - headsetEventReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - Log.i(TAG, "Headset event for: " + intent.getExtras().get("name")); - if (intent.getExtras().getInt("state") == 0) { - eventHandler.post(new Runnable() { - @Override - public void run() { - if(!downloadService.isRemoteEnabled()) { - SharedPreferences prefs = Util.getPreferences(downloadService); - int pausePref = Integer.parseInt(prefs.getString(Constants.PREFERENCES_KEY_PAUSE_DISCONNECT, "0")); - if(pausePref == 0 || pausePref == 1) { - downloadService.pause(); - } - } - } - }); - } - } - }; - downloadService.registerReceiver(headsetEventReceiver, new IntentFilter(Intent.ACTION_HEADSET_PLUG)); - // Stop when SD card is ejected. ejectEventReceiver = new BroadcastReceiver() { @Override @@ -210,7 +186,6 @@ public class DownloadServiceLifecycleSupport { eventLooper.quit(); serializeDownloadQueueNow(); downloadService.unregisterReceiver(ejectEventReceiver); - downloadService.unregisterReceiver(headsetEventReceiver); downloadService.unregisterReceiver(intentReceiver); TelephonyManager telephonyManager = (TelephonyManager) downloadService.getSystemService(Context.TELEPHONY_SERVICE); -- cgit v1.2.3