MediaSessionService: Keep track of newly created MediaSession2

Bug: 122234817
Test: Build and flash manually.
Change-Id: I583dbeedda56738b7180713d1e6bc993cbb751d3
This commit is contained in:
Jaewan Kim
2019-01-07 19:57:12 +09:00
parent caa6519f68
commit 7a58fbd1be

View File

@@ -40,6 +40,8 @@ import android.media.AudioPlaybackConfiguration;
import android.media.AudioSystem;
import android.media.IAudioService;
import android.media.IRemoteVolumeController;
import android.media.MediaController2;
import android.media.Session2CommandGroup;
import android.media.Session2Token;
import android.media.session.IActiveSessionsListener;
import android.media.session.ICallback;
@@ -54,6 +56,7 @@ import android.net.Uri;
import android.os.Binder;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerExecutor;
import android.os.IBinder;
import android.os.Message;
import android.os.PowerManager;
@@ -73,6 +76,7 @@ import android.util.SparseIntArray;
import android.view.KeyEvent;
import android.view.ViewConfiguration;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.DumpUtils;
import com.android.server.LocalServices;
import com.android.server.SystemService;
@@ -97,17 +101,23 @@ public class MediaSessionService extends SystemService implements Monitor {
private static final int MEDIA_KEY_LISTENER_TIMEOUT = 1000;
private final SessionManagerImpl mSessionManagerImpl;
// Keeps the full user id for each user.
private final SparseIntArray mFullUserIds = new SparseIntArray();
private final SparseArray<FullUserRecord> mUserRecords = new SparseArray<FullUserRecord>();
private final ArrayList<SessionsListenerRecord> mSessionsListeners
= new ArrayList<SessionsListenerRecord>();
private final Object mLock = new Object();
private final MessageHandler mHandler = new MessageHandler();
private final PowerManager.WakeLock mMediaEventWakeLock;
private final int mLongPressTimeout;
private final INotificationManager mNotificationManager;
private final Object mLock = new Object();
// Keeps the full user id for each user.
@GuardedBy("mLock")
private final SparseIntArray mFullUserIds = new SparseIntArray();
@GuardedBy("mLock")
private final SparseArray<FullUserRecord> mUserRecords = new SparseArray<FullUserRecord>();
@GuardedBy("mLock")
private final ArrayList<SessionsListenerRecord> mSessionsListeners
= new ArrayList<SessionsListenerRecord>();
// TODO: Keep session2 info in MediaSessionStack for prioritizing both session1 and session2 in
// one place.
@GuardedBy("mLock")
private final List<Session2Token> mSession2Tokens = new ArrayList<>();
private KeyguardManager mKeyguardManager;
private IAudioService mAudioService;
@@ -722,6 +732,10 @@ public class MediaSessionService extends SystemService implements Monitor {
pw.println(indent + "Restored MediaButtonReceiverComponentType: "
+ mRestoredMediaButtonReceiverComponentType);
mPriorityStack.dump(pw, indent);
pw.println(indent + "Session2Tokens - " + mSession2Tokens.size());
for (Session2Token session2Token : mSession2Tokens) {
pw.println(indent + " " + session2Token);
}
}
@Override
@@ -904,7 +918,17 @@ public class MediaSessionService extends SystemService implements Monitor {
if (DEBUG) {
Log.d(TAG, "Session2 is created " + sessionToken);
}
// TODO: Keep the session.
if (uid != sessionToken.getUid()) {
throw new SecurityException("Unexpected Session2Token's UID, expected=" + uid
+ " but actually=" + sessionToken.getUid());
}
Controller2Callback callback = new Controller2Callback(sessionToken);
// Note: It's safe not to keep controller here because it wouldn't be GC'ed until
// it's closed.
// TODO: Keep controller as well for better readability
// because the GC behavior isn't straightforward.
MediaController2 controller = new MediaController2(getContext(), sessionToken,
new HandlerExecutor(mHandler), callback);
} finally {
Binder.restoreCallingIdentity(token);
}
@@ -1930,4 +1954,26 @@ public class MediaSessionService extends SystemService implements Monitor {
obtainMessage(MSG_SESSIONS_CHANGED, userIdInteger).sendToTarget();
}
}
private class Controller2Callback extends MediaController2.ControllerCallback {
private final Session2Token mToken;
Controller2Callback(Session2Token token) {
mToken = token;
}
@Override
public void onConnected(MediaController2 controller, Session2CommandGroup allowedCommands) {
synchronized (mLock) {
mSession2Tokens.add(mToken);
}
}
@Override
public void onDisconnected(MediaController2 controller) {
synchronized (mLock) {
mSession2Tokens.remove(mToken);
}
}
}
}