diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/activity/MainActivity.java b/ultrasonic/src/main/java/org/moire/ultrasonic/activity/MainActivity.java index f9052ffd..66297dba 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/activity/MainActivity.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/activity/MainActivity.java @@ -482,7 +482,7 @@ public class MainActivity extends SubsonicTabActivity private void exit() { lifecycleSupport.getValue().onDestroy(); - Util.unregisterMediaButtonEventReceiver(this); + Util.unregisterMediaButtonEventReceiver(this, false); finish(); } diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/activity/SubsonicTabActivity.java b/ultrasonic/src/main/java/org/moire/ultrasonic/activity/SubsonicTabActivity.java index 3e534fce..6d790618 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/activity/SubsonicTabActivity.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/activity/SubsonicTabActivity.java @@ -158,7 +158,7 @@ public class SubsonicTabActivity extends ResultActivity implements OnClickListen applyTheme(); instance = this; - Util.registerMediaButtonEventReceiver(this); + Util.registerMediaButtonEventReceiver(this, false); // Lifecycle support's constructor registers some event receivers so it should be created early lifecycleSupport.getValue().onCreate(); @@ -195,7 +195,7 @@ public class SubsonicTabActivity extends ResultActivity implements OnClickListen @Override protected void onDestroy() { - Util.unregisterMediaButtonEventReceiver(this); + Util.unregisterMediaButtonEventReceiver(this, false); super.onDestroy(); destroyed = true; nowPlayingView = null; diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/fragment/SettingsFragment.java b/ultrasonic/src/main/java/org/moire/ultrasonic/fragment/SettingsFragment.java index abe44f7d..d15d6a0e 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/fragment/SettingsFragment.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/fragment/SettingsFragment.java @@ -375,10 +375,10 @@ public class SettingsFragment extends PreferenceFragment private void setMediaButtonsEnabled(boolean enabled) { if (enabled) { lockScreenEnabled.setEnabled(true); - Util.registerMediaButtonEventReceiver(getActivity()); + Util.registerMediaButtonEventReceiver(getActivity(), false); } else { lockScreenEnabled.setEnabled(false); - Util.unregisterMediaButtonEventReceiver(getActivity()); + Util.unregisterMediaButtonEventReceiver(getActivity(), false); } } diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/receiver/BluetoothIntentReceiver.java b/ultrasonic/src/main/java/org/moire/ultrasonic/receiver/BluetoothIntentReceiver.java index 4cf7bfe2..fa1c61c4 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/receiver/BluetoothIntentReceiver.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/receiver/BluetoothIntentReceiver.java @@ -65,7 +65,7 @@ public class BluetoothIntentReceiver extends BroadcastReceiver if (connected) { Log.i(TAG, "Connected to Bluetooth device, requesting media button focus."); - Util.registerMediaButtonEventReceiver(context); + Util.registerMediaButtonEventReceiver(context, false); } if (disconnected) diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/service/LocalMediaPlayer.java b/ultrasonic/src/main/java/org/moire/ultrasonic/service/LocalMediaPlayer.java index 10ce6ad0..3b3f8828 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/service/LocalMediaPlayer.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/service/LocalMediaPlayer.java @@ -168,7 +168,7 @@ public class LocalMediaPlayer wakeLock.setReferenceCounted(false); audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); - + Util.registerMediaButtonEventReceiver(context, true); setUpRemoteControlClient(); if (equalizerAvailable) @@ -202,6 +202,11 @@ public class LocalMediaPlayer try { + Intent i = new Intent(AudioEffect.ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION); + i.putExtra(AudioEffect.EXTRA_AUDIO_SESSION, mediaPlayer.getAudioSessionId()); + i.putExtra(AudioEffect.EXTRA_PACKAGE_NAME, context.getPackageName()); + context.sendBroadcast(i); + mediaPlayer.release(); if (nextMediaPlayer != null) { @@ -230,17 +235,14 @@ public class LocalMediaPlayer nextPlayingTask.cancel(); } - Intent i = new Intent(AudioEffect.ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION); - i.putExtra(AudioEffect.EXTRA_AUDIO_SESSION, mediaPlayer.getAudioSessionId()); - i.putExtra(AudioEffect.EXTRA_PACKAGE_NAME, context.getPackageName()); - context.sendBroadcast(i); - audioManager.unregisterRemoteControlClient(remoteControlClient); clearRemoteControl(); + Util.unregisterMediaButtonEventReceiver(context, true); wakeLock.release(); } catch (Throwable ignored) { + Log.w(TAG, "LocalMediaPlayer onDestroy exception: ", ignored); } Log.i(TAG, "LocalMediaPlayer destroyed"); diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/service/MediaPlayerLifecycleSupport.java b/ultrasonic/src/main/java/org/moire/ultrasonic/service/MediaPlayerLifecycleSupport.java index 59057b7d..95bf2a59 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/service/MediaPlayerLifecycleSupport.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/service/MediaPlayerLifecycleSupport.java @@ -74,7 +74,7 @@ public class MediaPlayerLifecycleSupport registerHeadsetReceiver(); // React to media buttons. - Util.registerMediaButtonEventReceiver(context); + Util.registerMediaButtonEventReceiver(context, true); // Register the handler for outside intents. IntentFilter commandFilter = new IntentFilter(); diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/util/Util.java b/ultrasonic/src/main/java/org/moire/ultrasonic/util/Util.java index a64e2a6b..4de5fa45 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/util/Util.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/util/Util.java @@ -96,6 +96,9 @@ public class Util extends DownloadActivity private static boolean pauseFocus; private static boolean lowerFocus; + private static boolean mediaButtonsRegisteredForUI; + private static boolean mediaButtonsRegisteredForService; + private static final Map SERVER_REST_VERSIONS = new ConcurrentHashMap(); // Used by hexEncode() @@ -890,19 +893,29 @@ public class Util extends DownloadActivity return Bitmap.createScaledBitmap(bitmap, size, getScaledHeight(bitmap, size), true); } - public static void registerMediaButtonEventReceiver(Context context) + public static void registerMediaButtonEventReceiver(Context context, boolean isService) { if (getMediaButtonsPreference(context)) { + if (isService) mediaButtonsRegisteredForService = true; + else mediaButtonsRegisteredForUI = true; + AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); audioManager.registerMediaButtonEventReceiver(new ComponentName(context.getPackageName(), MediaButtonIntentReceiver.class.getName())); } } - public static void unregisterMediaButtonEventReceiver(Context context) + public static void unregisterMediaButtonEventReceiver(Context context, boolean isService) { + if (isService) mediaButtonsRegisteredForService = false; + else mediaButtonsRegisteredForUI = false; + + // Do not unregister while there is an active part of the app which needs the control + if (mediaButtonsRegisteredForService || mediaButtonsRegisteredForUI) return; + AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); audioManager.unregisterMediaButtonEventReceiver(new ComponentName(context.getPackageName(), MediaButtonIntentReceiver.class.getName())); + Log.i(TAG, "MediaButtonEventReceiver unregistered."); } public static MusicDirectory getSongsFromSearchResult(SearchResult searchResult)