Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b510b281 authored by Ajay Panicker's avatar Ajay Panicker
Browse files

Remove media players if their backing session dissappears

If the backing session dies or dissappears for any reason, then remove
it from the tracked sessions. If it was the active session, send an
update that the media information has changed so that the remote device
doesn't continue attempting to retrieve information from the now defunct
session.

Bug: 125672467
Test: Kill the active music app while playing a song
Change-Id: Ia40c2a1ef962057ac0a3f824f084afbb031ec480
parent 8d6d51cb
Loading
Loading
Loading
Loading
+17 −9
Original line number Diff line number Diff line
@@ -459,6 +459,7 @@ public class MediaPlayerList {
        if (playerId == mActivePlayerId && playerId != NO_ACTIVE_PLAYER) {
            getActivePlayer().unregisterCallback();
            mActivePlayerId = NO_ACTIVE_PLAYER;
            sendMediaUpdate(new MediaData(Util.empty_data(), null, null));
        }

        final MediaPlayerWrapper wrapper = mMediaPlayers.get(playerId);
@@ -536,28 +537,35 @@ public class MediaPlayerList {
            new MediaSessionManager.OnActiveSessionsChangedListener() {
        @Override
        public void onActiveSessionsChanged(
                List<android.media.session.MediaController> newControllers) {
                List<android.media.session.MediaController> controllers) {
            synchronized (MediaPlayerList.this) {
                Log.v(TAG, "onActiveSessionsChanged: number of controllers: "
                        + newControllers.size());
                if (newControllers.size() == 0) return;
                        + controllers.size());
                if (controllers.size() == 0) return;

                // Apps are allowed to have multiple MediaControllers. If an app does have
                // multiple controllers then newControllers contains them in highest
                // multiple controllers then controllers contains them in highest
                // priority order. Since we only want to keep the highest priority one,
                // we keep track of which controllers we updated and skip over ones
                // we've already looked at.
                HashSet<String> addedPackages = new HashSet<String>();

                for (int i = 0; i < newControllers.size(); i++) {
                for (int i = 0; i < controllers.size(); i++) {
                    Log.d(TAG, "onActiveSessionsChanged: controller: "
                            + newControllers.get(i).getPackageName());
                    if (addedPackages.contains(newControllers.get(i).getPackageName())) {
                            + controllers.get(i).getPackageName());
                    if (addedPackages.contains(controllers.get(i).getPackageName())) {
                        continue;
                    }

                    addedPackages.add(newControllers.get(i).getPackageName());
                    addMediaPlayer(newControllers.get(i));
                    addedPackages.add(controllers.get(i).getPackageName());
                    addMediaPlayer(controllers.get(i));
                }

                // Remove all players that weren't added.
                for (String packageName : mMediaPlayerIds.keySet()) {
                    if (!addedPackages.contains(packageName)) {
                        removeMediaPlayer(mMediaPlayerIds.get(packageName));
                    }
                }
            }
        }