Make MediaRouter2Manager connect to the system ASAP
With this CL, some methods such as getAllRoutes, getActiveSessions
can be used without registering a callback.
Bug: 155042836
Test: atest mediaroutertest
Change-Id: Iba38d73a95c1d184bc89ff91d128b00109029d0a
diff --git a/media/java/android/media/MediaRouter2Manager.java b/media/java/android/media/MediaRouter2Manager.java
index 0dc019c..4ebfce8 100644
--- a/media/java/android/media/MediaRouter2Manager.java
+++ b/media/java/android/media/MediaRouter2Manager.java
@@ -100,6 +100,7 @@
.getSystemService(Context.MEDIA_SESSION_SERVICE);
mPackageName = mContext.getPackageName();
mHandler = new Handler(context.getMainLooper());
+ mHandler.post(this::getOrCreateClient);
}
/**
@@ -118,18 +119,6 @@
Log.w(TAG, "Ignoring to add the same callback twice.");
return;
}
-
- synchronized (sLock) {
- if (mClient == null) {
- Client client = new Client();
- try {
- mMediaRouterService.registerManager(client, mPackageName);
- mClient = client;
- } catch (RemoteException ex) {
- Log.e(TAG, "Unable to register media router manager.", ex);
- }
- }
- }
}
/**
@@ -144,21 +133,6 @@
Log.w(TAG, "unregisterCallback: Ignore unknown callback. " + callback);
return;
}
-
- synchronized (sLock) {
- if (mCallbackRecords.size() == 0) {
- if (mClient != null) {
- try {
- mMediaRouterService.unregisterManager(mClient);
- } catch (RemoteException ex) {
- Log.e(TAG, "Unable to unregister media router manager", ex);
- }
- mClient = null;
- }
- mRoutes.clear();
- mPreferredFeaturesMap.clear();
- }
- }
}
/**
@@ -314,10 +288,7 @@
*/
@NonNull
public List<RoutingSessionInfo> getActiveSessions() {
- Client client;
- synchronized (sLock) {
- client = mClient;
- }
+ Client client = getOrCreateClient();
if (client != null) {
try {
return mMediaRouterService.getActiveSessions(client);
@@ -380,10 +351,7 @@
return;
}
- Client client;
- synchronized (sLock) {
- client = mClient;
- }
+ Client client = getOrCreateClient();
if (client != null) {
try {
int requestId = mNextRequestId.getAndIncrement();
@@ -419,10 +387,7 @@
return;
}
- Client client;
- synchronized (sLock) {
- client = mClient;
- }
+ Client client = getOrCreateClient();
if (client != null) {
try {
int requestId = mNextRequestId.getAndIncrement();
@@ -451,10 +416,7 @@
return;
}
- Client client;
- synchronized (sLock) {
- client = mClient;
- }
+ Client client = getOrCreateClient();
if (client != null) {
try {
int requestId = mNextRequestId.getAndIncrement();
@@ -710,15 +672,12 @@
return;
}
- Client client;
- synchronized (sLock) {
- client = mClient;
- }
+ Client client = getOrCreateClient();
if (client != null) {
try {
int requestId = mNextRequestId.getAndIncrement();
mMediaRouterService.selectRouteWithManager(
- mClient, requestId, sessionInfo.getId(), route);
+ client, requestId, sessionInfo.getId(), route);
} catch (RemoteException ex) {
Log.e(TAG, "selectRoute: Failed to send a request.", ex);
}
@@ -755,15 +714,12 @@
return;
}
- Client client;
- synchronized (sLock) {
- client = mClient;
- }
+ Client client = getOrCreateClient();
if (client != null) {
try {
int requestId = mNextRequestId.getAndIncrement();
mMediaRouterService.deselectRouteWithManager(
- mClient, requestId, sessionInfo.getId(), route);
+ client, requestId, sessionInfo.getId(), route);
} catch (RemoteException ex) {
Log.e(TAG, "deselectRoute: Failed to send a request.", ex);
}
@@ -794,14 +750,11 @@
int requestId = mNextRequestId.getAndIncrement();
mTransferRequests.add(new TransferRequest(requestId, sessionInfo, route));
- Client client;
- synchronized (sLock) {
- client = mClient;
- }
+ Client client = getOrCreateClient();
if (client != null) {
try {
mMediaRouterService.transferToRouteWithManager(
- mClient, requestId, sessionInfo.getId(), route);
+ client, requestId, sessionInfo.getId(), route);
} catch (RemoteException ex) {
Log.e(TAG, "transferToRoute: Failed to send a request.", ex);
}
@@ -821,15 +774,12 @@
public void releaseSession(@NonNull RoutingSessionInfo sessionInfo) {
Objects.requireNonNull(sessionInfo, "sessionInfo must not be null");
- Client client;
- synchronized (sLock) {
- client = mClient;
- }
+ Client client = getOrCreateClient();
if (client != null) {
try {
int requestId = mNextRequestId.getAndIncrement();
mMediaRouterService.releaseSessionWithManager(
- mClient, requestId, sessionInfo.getId());
+ client, requestId, sessionInfo.getId());
} catch (RemoteException ex) {
Log.e(TAG, "releaseSession: Failed to send a request", ex);
}
@@ -857,6 +807,23 @@
sessionInfo.getOwnerPackageName());
}
+ private Client getOrCreateClient() {
+ synchronized (sLock) {
+ if (mClient != null) {
+ return mClient;
+ }
+ Client client = new Client();
+ try {
+ mMediaRouterService.registerManager(client, mPackageName);
+ mClient = client;
+ return client;
+ } catch (RemoteException ex) {
+ Log.e(TAG, "Unable to register media router manager.", ex);
+ }
+ }
+ return null;
+ }
+
/**
* Interface for receiving events about media routing changes.
*/
diff --git a/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2ManagerTest.java b/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2ManagerTest.java
index eee797a..c05c21c 100644
--- a/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2ManagerTest.java
+++ b/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2ManagerTest.java
@@ -603,6 +603,11 @@
assertTrue(onSessionCreatedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
}
+ @Test
+ public void testGetActiveSessions_returnsNonEmptyList() {
+ assertFalse(mManager.getActiveSessions().isEmpty());
+ }
+
Map<String, MediaRoute2Info> waitAndGetRoutesWithManager(List<String> routeFeatures)
throws Exception {
CountDownLatch addedLatch = new CountDownLatch(1);