MediaSession: Use mHandler for sending a pending intent

When PendingIntent.send() is called with a null handler,
onSendFinished() will be called inside of the send() method.
Therefore in this case, if a thread holds a lock before
calling send(), and onSendFinished() also requires the lock,
a deadlock could happen.

Change-Id: I71d9f708fc3d52b7b5713426ad6140cbf6e336ef
This commit is contained in:
riddle_hsu
2015-10-20 16:00:15 +08:00
committed by Riddle Hsu
parent 59d548e1e5
commit 8ebba5cb83

View File

@@ -764,7 +764,7 @@ public class MediaSessionService extends SystemService implements Monitor {
synchronized (mLock) {
// If we don't have a media button receiver to fall back on
// include non-playing sessions for dispatching
UserRecord ur = mUserRecords.get(ActivityManager.getCurrentUser());
UserRecord ur = mUserRecords.get(mCurrentUserId);
boolean useNotPlayingSessions = (ur == null) ||
(ur.mLastMediaButtonReceiver == null
&& ur.mRestoredMediaButtonReceiver == null);
@@ -946,8 +946,7 @@ public class MediaSessionService extends SystemService implements Monitor {
mKeyEventReceiver);
} else {
// Launch the last PendingIntent we had with priority
int userId = ActivityManager.getCurrentUser();
UserRecord user = mUserRecords.get(userId);
UserRecord user = mUserRecords.get(mCurrentUserId);
if (user.mLastMediaButtonReceiver != null
|| user.mRestoredMediaButtonReceiver != null) {
if (DEBUG) {
@@ -964,11 +963,11 @@ public class MediaSessionService extends SystemService implements Monitor {
if (user.mLastMediaButtonReceiver != null) {
user.mLastMediaButtonReceiver.send(getContext(),
needWakeLock ? mKeyEventReceiver.mLastTimeoutId : -1,
mediaButtonIntent, mKeyEventReceiver, null);
mediaButtonIntent, mKeyEventReceiver, mHandler);
} else {
mediaButtonIntent.setComponent(user.mRestoredMediaButtonReceiver);
getContext().sendBroadcastAsUser(mediaButtonIntent,
new UserHandle(userId));
new UserHandle(mCurrentUserId));
}
} catch (CanceledException e) {
Log.i(TAG, "Error sending key event to media button receiver "