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

Commit 6dea2095 authored by wentjin's avatar wentjin
Browse files

Store active player avoid it was deleted by other threads

Root cause: The player was cleaned by other threads when
set player active which caused BT crash.

Bug: 377409171
Test: m com.android.btservices
Change-Id: I79cc6d05140d3b54c954ad5208288a71a4ea27a2
parent 1572a42f
Loading
Loading
Loading
Loading
+19 −8
Original line number Diff line number Diff line
@@ -971,24 +971,35 @@ public class MediaPlayerList {
            return;
        }

        if (playerId == mActivePlayerId) {
            Log.w(TAG, getActivePlayer().getPackageName() + " is already the active player");
        int previousActivePlayerId = mActivePlayerId;
        MediaPlayerWrapper previousPlayer = getActivePlayer();

        if (playerId == previousActivePlayerId) {
            if (previousPlayer != null) {
                Log.w(TAG, previousPlayer.getPackageName() + " is already the active player");
            }
            return;
        }

        if (mActivePlayerId != NO_ACTIVE_PLAYER) getActivePlayer().unregisterCallback();
        if (previousActivePlayerId != NO_ACTIVE_PLAYER && previousPlayer != null) {
            previousPlayer.unregisterCallback();
        }

        mActivePlayerId = playerId;
        getActivePlayer().registerCallback(mMediaPlayerCallback);

        MediaPlayerWrapper player = getActivePlayer();
        if (player == null) return;

        player.registerCallback(mMediaPlayerCallback);
        mActivePlayerLogger.logd(
                TAG, "setActivePlayer(): setting player to " + getActivePlayer().getPackageName());
                TAG, "setActivePlayer(): setting player to " + player.getPackageName());

        if (mPlayerSettingsListener != null) {
            mPlayerSettingsListener.onActivePlayerChanged(getActivePlayer());
            mPlayerSettingsListener.onActivePlayerChanged(player);
        }

        // Ensure that metadata is synced on the new player
        if (!getActivePlayer().isMetadataSynced()) {
        if (!player.isMetadataSynced()) {
            Log.w(TAG, "setActivePlayer(): Metadata not synced on new player");
            return;
        }
@@ -1006,7 +1017,7 @@ public class MediaPlayerList {
            }
        }

        MediaData data = getActivePlayer().getCurrentMediaData();
        MediaData data = player.getCurrentMediaData();
        if (mAudioPlaybackIsActive) {
            data.state = mCurrMediaData.state;
            Log.d(TAG, "setActivePlayer mAudioPlaybackIsActive=true, state=" + data.state);