Fixed lost lockscreen controls when exiting the app

This commit is contained in:
Nite 2020-07-02 19:01:33 +02:00
parent 091374f922
commit f5748d7dc0
No known key found for this signature in database
GPG Key ID: 1D1AD59B1C6386C1
7 changed files with 30 additions and 15 deletions

View File

@ -482,7 +482,7 @@ public class MainActivity extends SubsonicTabActivity
private void exit() private void exit()
{ {
lifecycleSupport.getValue().onDestroy(); lifecycleSupport.getValue().onDestroy();
Util.unregisterMediaButtonEventReceiver(this); Util.unregisterMediaButtonEventReceiver(this, false);
finish(); finish();
} }

View File

@ -158,7 +158,7 @@ public class SubsonicTabActivity extends ResultActivity implements OnClickListen
applyTheme(); applyTheme();
instance = this; instance = this;
Util.registerMediaButtonEventReceiver(this); Util.registerMediaButtonEventReceiver(this, false);
// Lifecycle support's constructor registers some event receivers so it should be created early // Lifecycle support's constructor registers some event receivers so it should be created early
lifecycleSupport.getValue().onCreate(); lifecycleSupport.getValue().onCreate();
@ -195,7 +195,7 @@ public class SubsonicTabActivity extends ResultActivity implements OnClickListen
@Override @Override
protected void onDestroy() protected void onDestroy()
{ {
Util.unregisterMediaButtonEventReceiver(this); Util.unregisterMediaButtonEventReceiver(this, false);
super.onDestroy(); super.onDestroy();
destroyed = true; destroyed = true;
nowPlayingView = null; nowPlayingView = null;

View File

@ -375,10 +375,10 @@ public class SettingsFragment extends PreferenceFragment
private void setMediaButtonsEnabled(boolean enabled) { private void setMediaButtonsEnabled(boolean enabled) {
if (enabled) { if (enabled) {
lockScreenEnabled.setEnabled(true); lockScreenEnabled.setEnabled(true);
Util.registerMediaButtonEventReceiver(getActivity()); Util.registerMediaButtonEventReceiver(getActivity(), false);
} else { } else {
lockScreenEnabled.setEnabled(false); lockScreenEnabled.setEnabled(false);
Util.unregisterMediaButtonEventReceiver(getActivity()); Util.unregisterMediaButtonEventReceiver(getActivity(), false);
} }
} }

View File

@ -65,7 +65,7 @@ public class BluetoothIntentReceiver extends BroadcastReceiver
if (connected) if (connected)
{ {
Log.i(TAG, "Connected to Bluetooth device, requesting media button focus."); Log.i(TAG, "Connected to Bluetooth device, requesting media button focus.");
Util.registerMediaButtonEventReceiver(context); Util.registerMediaButtonEventReceiver(context, false);
} }
if (disconnected) if (disconnected)

View File

@ -168,7 +168,7 @@ public class LocalMediaPlayer
wakeLock.setReferenceCounted(false); wakeLock.setReferenceCounted(false);
audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
Util.registerMediaButtonEventReceiver(context, true);
setUpRemoteControlClient(); setUpRemoteControlClient();
if (equalizerAvailable) if (equalizerAvailable)
@ -202,6 +202,11 @@ public class LocalMediaPlayer
try 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(); mediaPlayer.release();
if (nextMediaPlayer != null) if (nextMediaPlayer != null)
{ {
@ -230,17 +235,14 @@ public class LocalMediaPlayer
nextPlayingTask.cancel(); 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); audioManager.unregisterRemoteControlClient(remoteControlClient);
clearRemoteControl(); clearRemoteControl();
Util.unregisterMediaButtonEventReceiver(context, true);
wakeLock.release(); wakeLock.release();
} }
catch (Throwable ignored) catch (Throwable ignored)
{ {
Log.w(TAG, "LocalMediaPlayer onDestroy exception: ", ignored);
} }
Log.i(TAG, "LocalMediaPlayer destroyed"); Log.i(TAG, "LocalMediaPlayer destroyed");

View File

@ -74,7 +74,7 @@ public class MediaPlayerLifecycleSupport
registerHeadsetReceiver(); registerHeadsetReceiver();
// React to media buttons. // React to media buttons.
Util.registerMediaButtonEventReceiver(context); Util.registerMediaButtonEventReceiver(context, true);
// Register the handler for outside intents. // Register the handler for outside intents.
IntentFilter commandFilter = new IntentFilter(); IntentFilter commandFilter = new IntentFilter();

View File

@ -96,6 +96,9 @@ public class Util extends DownloadActivity
private static boolean pauseFocus; private static boolean pauseFocus;
private static boolean lowerFocus; private static boolean lowerFocus;
private static boolean mediaButtonsRegisteredForUI;
private static boolean mediaButtonsRegisteredForService;
private static final Map<Integer, Version> SERVER_REST_VERSIONS = new ConcurrentHashMap<Integer, Version>(); private static final Map<Integer, Version> SERVER_REST_VERSIONS = new ConcurrentHashMap<Integer, Version>();
// Used by hexEncode() // Used by hexEncode()
@ -890,19 +893,29 @@ public class Util extends DownloadActivity
return Bitmap.createScaledBitmap(bitmap, size, getScaledHeight(bitmap, size), true); 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 (getMediaButtonsPreference(context))
{ {
if (isService) mediaButtonsRegisteredForService = true;
else mediaButtonsRegisteredForUI = true;
AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
audioManager.registerMediaButtonEventReceiver(new ComponentName(context.getPackageName(), MediaButtonIntentReceiver.class.getName())); 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 audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
audioManager.unregisterMediaButtonEventReceiver(new ComponentName(context.getPackageName(), MediaButtonIntentReceiver.class.getName())); audioManager.unregisterMediaButtonEventReceiver(new ComponentName(context.getPackageName(), MediaButtonIntentReceiver.class.getName()));
Log.i(TAG, "MediaButtonEventReceiver unregistered.");
} }
public static MusicDirectory getSongsFromSearchResult(SearchResult searchResult) public static MusicDirectory getSongsFromSearchResult(SearchResult searchResult)