From 46be72edc3b32c2e295a79d85d6a6081a63a702d Mon Sep 17 00:00:00 2001 From: Eric Laurent Date: Wed, 1 Nov 2017 11:43:02 -0700 Subject: [PATCH] AudioPlayerStateMonitor: fix NPE Use PLAYER_STATE_UNKNOWN for state passed to sendAudioPlayerStateChangedMessageLocked() when prevState is null in dispatchPlaybackConfigChange() Bug: 68748062 Test: receive a call and check ringtone Test: passed media cts Change-Id: I9d4c84dc1d79a72afd06d044d00f682b70c86255 --- .../server/media/AudioPlayerStateMonitor.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/media/AudioPlayerStateMonitor.java b/services/core/java/com/android/server/media/AudioPlayerStateMonitor.java index 110f26d5eddc7..be223f1e56df2 100644 --- a/services/core/java/com/android/server/media/AudioPlayerStateMonitor.java +++ b/services/core/java/com/android/server/media/AudioPlayerStateMonitor.java @@ -165,10 +165,13 @@ class AudioPlayerStateMonitor extends IPlaybackConfigDispatcher.Stub { } // Notify the change of audio player states. for (AudioPlaybackConfiguration config : configs) { - Integer prevState = prevAudioPlayerStates.get(config.getPlayerInterfaceId()); - if (prevState == null || prevState != config.getPlayerState()) { + final Integer prevState = prevAudioPlayerStates.get(config.getPlayerInterfaceId()); + final int prevStateInt = + (prevState == null) ? AudioPlaybackConfiguration.PLAYER_STATE_UNKNOWN : + prevState.intValue(); + if (prevStateInt != config.getPlayerState()) { sendAudioPlayerStateChangedMessageLocked( - config.getClientUid(), prevState, config); + config.getClientUid(), prevStateInt, config); } } for (Integer prevUid : prevAudioPlayersForUid.keySet()) { @@ -176,9 +179,9 @@ class AudioPlayerStateMonitor extends IPlaybackConfigDispatcher.Stub { // PLAYER_STATE_STARTED only when there were a player whose state was // PLAYER_STATE_STARTED, otherwise any inactive state is okay to notify. if (!mAudioPlayersForUid.containsKey(prevUid)) { - Set players = mAudioPlayersForUid.get(prevUid); + Set prevPlayers = prevAudioPlayersForUid.get(prevUid); int prevState = AudioPlaybackConfiguration.PLAYER_STATE_UNKNOWN; - for (int pii : players) { + for (int pii : prevPlayers) { Integer state = prevAudioPlayerStates.get(pii); if (state == null) { continue;