summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Kyunglyul Hyun <klhyun@google.com> 2020-02-05 09:27:17 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2020-02-05 09:27:17 +0000
commit0a4502a0fb274ee46c8cde05f08c2f22c4714d52 (patch)
treefbae90d694dacd5d7b7a222344fe38ae6a0c4f4f
parentb1e380c47654e281464e4e571cf363df2dca61d6 (diff)
parent1866d8ae80d3869a8de466fd2a4588b81ec5e0b5 (diff)
Merge "MediaRouter: Call onDiscoveryPreferenceChanged()"
-rw-r--r--media/java/android/media/IMediaRoute2Provider.aidl2
-rw-r--r--media/java/android/media/MediaRoute2ProviderService.java11
-rw-r--r--media/java/android/media/MediaRouter2.java42
-rw-r--r--media/java/android/media/RouteDiscoveryPreference.java3
-rw-r--r--media/tests/MediaRouter/src/com/android/mediaroutertest/SampleMediaRoute2ProviderService.java1
-rw-r--r--services/core/java/com/android/server/media/MediaRoute2Provider.java2
-rw-r--r--services/core/java/com/android/server/media/MediaRoute2ProviderProxy.java17
-rw-r--r--services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java26
-rw-r--r--services/core/java/com/android/server/media/SystemMediaRoute2Provider.java5
9 files changed, 93 insertions, 16 deletions
diff --git a/media/java/android/media/IMediaRoute2Provider.aidl b/media/java/android/media/IMediaRoute2Provider.aidl
index a25aff6611ca..194669c19018 100644
--- a/media/java/android/media/IMediaRoute2Provider.aidl
+++ b/media/java/android/media/IMediaRoute2Provider.aidl
@@ -18,6 +18,7 @@ package android.media;
import android.content.Intent;
import android.media.IMediaRoute2ProviderClient;
+import android.media.RouteDiscoveryPreference;
import android.os.Bundle;
/**
@@ -28,6 +29,7 @@ oneway interface IMediaRoute2Provider {
void requestCreateSession(String packageName, String routeId, long requestId,
in @nullable Bundle sessionHints);
void releaseSession(String sessionId);
+ void updateDiscoveryPreference(in RouteDiscoveryPreference discoveryPreference);
void selectRoute(String sessionId, String routeId);
void deselectRoute(String sessionId, String routeId);
diff --git a/media/java/android/media/MediaRoute2ProviderService.java b/media/java/android/media/MediaRoute2ProviderService.java
index e39b7bc59148..d0b5d486d19c 100644
--- a/media/java/android/media/MediaRoute2ProviderService.java
+++ b/media/java/android/media/MediaRoute2ProviderService.java
@@ -370,7 +370,6 @@ public abstract class MediaRoute2ProviderService extends Service {
*
* @param preference the new discovery preference
*/
- // TODO: This method needs tests.
public void onDiscoveryPreferenceChanged(@NonNull RouteDiscoveryPreference preference) {}
/**
@@ -456,6 +455,16 @@ public abstract class MediaRoute2ProviderService extends Service {
}
@Override
+ public void updateDiscoveryPreference(RouteDiscoveryPreference discoveryPreference) {
+ if (!checkCallerisSystem()) {
+ return;
+ }
+ mHandler.sendMessage(obtainMessage(
+ MediaRoute2ProviderService::onDiscoveryPreferenceChanged,
+ MediaRoute2ProviderService.this, discoveryPreference));
+ }
+
+ @Override
public void selectRoute(@NonNull String sessionId, String routeId) {
if (!checkCallerisSystem()) {
return;
diff --git a/media/java/android/media/MediaRouter2.java b/media/java/android/media/MediaRouter2.java
index f751a22c4900..515cabe5a5c9 100644
--- a/media/java/android/media/MediaRouter2.java
+++ b/media/java/android/media/MediaRouter2.java
@@ -182,11 +182,16 @@ public class MediaRouter2 {
Client2 client = new Client2();
try {
mMediaRouterService.registerClient2(client, mPackageName);
- updateDiscoveryRequestLocked();
- mMediaRouterService.setDiscoveryRequest2(client, mDiscoveryPreference);
mClient = client;
} catch (RemoteException ex) {
- Log.e(TAG, "Unable to register media router.", ex);
+ Log.e(TAG, "registerRouteCallback: Unable to register client.", ex);
+ }
+ }
+ if (mClient != null && updateDiscoveryPreferenceIfNeededLocked()) {
+ try {
+ mMediaRouterService.setDiscoveryRequest2(mClient, mDiscoveryPreference);
+ } catch (RemoteException ex) {
+ Log.e(TAG, "registerRouteCallback: Unable to set discovery request.");
}
}
}
@@ -209,22 +214,37 @@ public class MediaRouter2 {
}
synchronized (sRouterLock) {
- if (mRouteCallbackRecords.size() == 0 && mClient != null) {
- try {
- mMediaRouterService.unregisterClient2(mClient);
- } catch (RemoteException ex) {
- Log.e(TAG, "Unable to unregister media router.", ex);
+ if (mClient != null) {
+ if (updateDiscoveryPreferenceIfNeededLocked()) {
+ try {
+ mMediaRouterService.setDiscoveryRequest2(mClient, mDiscoveryPreference);
+ } catch (RemoteException ex) {
+ Log.e(TAG, "unregisterRouteCallback: Unable to set discovery request.");
+ }
+ }
+ if (mRouteCallbackRecords.size() == 0) {
+ try {
+ mMediaRouterService.unregisterClient2(mClient);
+ } catch (RemoteException ex) {
+ Log.e(TAG, "Unable to unregister media router.", ex);
+ }
}
- //TODO: Clean up mRoutes. (onHandler?)
+ mShouldUpdateRoutes = true;
mClient = null;
}
}
}
- private void updateDiscoveryRequestLocked() {
- mDiscoveryPreference = new RouteDiscoveryPreference.Builder(
+ private boolean updateDiscoveryPreferenceIfNeededLocked() {
+ RouteDiscoveryPreference newDiscoveryPreference = new RouteDiscoveryPreference.Builder(
mRouteCallbackRecords.stream().map(record -> record.mPreference).collect(
Collectors.toList())).build();
+ if (Objects.equals(mDiscoveryPreference, newDiscoveryPreference)) {
+ return false;
+ }
+ mDiscoveryPreference = newDiscoveryPreference;
+ mShouldUpdateRoutes = true;
+ return true;
}
/**
diff --git a/media/java/android/media/RouteDiscoveryPreference.java b/media/java/android/media/RouteDiscoveryPreference.java
index 7ec1123ee19c..ebcb9ed342e5 100644
--- a/media/java/android/media/RouteDiscoveryPreference.java
+++ b/media/java/android/media/RouteDiscoveryPreference.java
@@ -31,7 +31,7 @@ import java.util.Objects;
import java.util.Set;
/**
- * A media route discovery preference describing the kinds of routes that media router
+ * A media route discovery preference describing the kinds of routes that media router
* would like to discover and whether to perform active scanning.
*
* @see MediaRouter2#registerRouteCallback
@@ -58,6 +58,7 @@ public final class RouteDiscoveryPreference implements Parcelable {
private final Bundle mExtras;
/**
+ * An empty discovery preference.
* @hide
*/
public static final RouteDiscoveryPreference EMPTY =
diff --git a/media/tests/MediaRouter/src/com/android/mediaroutertest/SampleMediaRoute2ProviderService.java b/media/tests/MediaRouter/src/com/android/mediaroutertest/SampleMediaRoute2ProviderService.java
index e29b3239fcaa..f1a08f29e0cc 100644
--- a/media/tests/MediaRouter/src/com/android/mediaroutertest/SampleMediaRoute2ProviderService.java
+++ b/media/tests/MediaRouter/src/com/android/mediaroutertest/SampleMediaRoute2ProviderService.java
@@ -155,7 +155,6 @@ public class SampleMediaRoute2ProviderService extends MediaRoute2ProviderService
@Override
public void onUpdateVolume(String routeId, int delta) {
- android.util.Log.d(TAG, "onUpdateVolume routeId= " + routeId + "delta=" + delta);
MediaRoute2Info route = mRoutes.get(routeId);
if (route == null) {
return;
diff --git a/services/core/java/com/android/server/media/MediaRoute2Provider.java b/services/core/java/com/android/server/media/MediaRoute2Provider.java
index 5123362d84ba..7b17b4ed6219 100644
--- a/services/core/java/com/android/server/media/MediaRoute2Provider.java
+++ b/services/core/java/com/android/server/media/MediaRoute2Provider.java
@@ -21,6 +21,7 @@ import android.annotation.Nullable;
import android.content.ComponentName;
import android.content.Intent;
import android.media.MediaRoute2ProviderInfo;
+import android.media.RouteDiscoveryPreference;
import android.media.RoutingSessionInfo;
import android.os.Bundle;
@@ -54,6 +55,7 @@ abstract class MediaRoute2Provider {
public abstract void requestCreateSession(String packageName, String routeId, long requestId,
@Nullable Bundle sessionHints);
public abstract void releaseSession(String sessionId);
+ public abstract void updateDiscoveryPreference(RouteDiscoveryPreference discoveryPreference);
public abstract void selectRoute(String sessionId, String routeId);
public abstract void deselectRoute(String sessionId, String routeId);
diff --git a/services/core/java/com/android/server/media/MediaRoute2ProviderProxy.java b/services/core/java/com/android/server/media/MediaRoute2ProviderProxy.java
index e23542edb214..e22ea4681428 100644
--- a/services/core/java/com/android/server/media/MediaRoute2ProviderProxy.java
+++ b/services/core/java/com/android/server/media/MediaRoute2ProviderProxy.java
@@ -25,6 +25,7 @@ import android.media.IMediaRoute2Provider;
import android.media.IMediaRoute2ProviderClient;
import android.media.MediaRoute2ProviderInfo;
import android.media.MediaRoute2ProviderService;
+import android.media.RouteDiscoveryPreference;
import android.media.RoutingSessionInfo;
import android.os.Bundle;
import android.os.Handler;
@@ -93,6 +94,14 @@ final class MediaRoute2ProviderProxy extends MediaRoute2Provider implements Serv
}
@Override
+ public void updateDiscoveryPreference(RouteDiscoveryPreference discoveryPreference) {
+ if (mConnectionReady) {
+ mActiveConnection.updateDiscoveryPreference(discoveryPreference);
+ updateBinding();
+ }
+ }
+
+ @Override
public void selectRoute(String sessionId, String routeId) {
if (mConnectionReady) {
mActiveConnection.selectRoute(sessionId, routeId);
@@ -461,6 +470,14 @@ final class MediaRoute2ProviderProxy extends MediaRoute2Provider implements Serv
}
}
+ public void updateDiscoveryPreference(RouteDiscoveryPreference discoveryPreference) {
+ try {
+ mProvider.updateDiscoveryPreference(discoveryPreference);
+ } catch (RemoteException ex) {
+ Slog.e(TAG, "updateDiscoveryPreference(): Failed to deliver request.");
+ }
+ }
+
public void selectRoute(String sessionId, String routeId) {
try {
mProvider.selectRoute(sessionId, routeId);
diff --git a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java
index 9594659f23d0..358cc29e3d64 100644
--- a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java
+++ b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java
@@ -598,6 +598,9 @@ class MediaRouter2ServiceImpl {
clientRecord.mUserRecord.mHandler.sendMessage(
obtainMessage(UserHandler::updateClientUsage,
clientRecord.mUserRecord.mHandler, clientRecord));
+ clientRecord.mUserRecord.mHandler.sendMessage(
+ obtainMessage(UserHandler::updateDiscoveryPreference,
+ clientRecord.mUserRecord.mHandler));
}
}
@@ -856,6 +859,7 @@ class MediaRouter2ServiceImpl {
//TODO: make records private for thread-safety
final ArrayList<Client2Record> mClientRecords = new ArrayList<>();
final ArrayList<ManagerRecord> mManagerRecords = new ArrayList<>();
+ RouteDiscoveryPreference mCompositeDiscoveryPreference = RouteDiscoveryPreference.EMPTY;
final UserHandler mHandler;
UserRecord(int userId) {
@@ -885,8 +889,6 @@ class MediaRouter2ServiceImpl {
public final int mClientId;
public RouteDiscoveryPreference mDiscoveryPreference;
- public boolean mIsManagerSelecting;
- public MediaRoute2Info mSelectingRoute;
public MediaRoute2Info mSelectedRoute;
Client2Record(UserRecord userRecord, IMediaRouter2Client client,
@@ -1003,6 +1005,7 @@ class MediaRouter2ServiceImpl {
public void onAddProvider(MediaRoute2ProviderProxy provider) {
provider.setCallback(this);
mMediaProviders.add(provider);
+ provider.updateDiscoveryPreference(mUserRecord.mCompositeDiscoveryPreference);
}
@Override
@@ -1642,6 +1645,25 @@ class MediaRouter2ServiceImpl {
}
}
+ private void updateDiscoveryPreference() {
+ MediaRouter2ServiceImpl service = mServiceRef.get();
+ if (service == null) {
+ return;
+ }
+ List<RouteDiscoveryPreference> discoveryPreferences = new ArrayList<>();
+ synchronized (service.mLock) {
+ for (Client2Record clientRecord : mUserRecord.mClientRecords) {
+ discoveryPreferences.add(clientRecord.mDiscoveryPreference);
+ }
+ mUserRecord.mCompositeDiscoveryPreference =
+ new RouteDiscoveryPreference.Builder(discoveryPreferences)
+ .build();
+ }
+ for (MediaRoute2Provider provider : mMediaProviders) {
+ provider.updateDiscoveryPreference(mUserRecord.mCompositeDiscoveryPreference);
+ }
+ }
+
private MediaRoute2Provider findProvider(String providerId) {
for (MediaRoute2Provider provider : mMediaProviders) {
if (TextUtils.equals(provider.getUniqueId(), providerId)) {
diff --git a/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java b/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java
index 924a9b71c8ec..798a781a9d6c 100644
--- a/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java
+++ b/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java
@@ -29,6 +29,7 @@ import android.media.IAudioRoutesObserver;
import android.media.IAudioService;
import android.media.MediaRoute2Info;
import android.media.MediaRoute2ProviderInfo;
+import android.media.RouteDiscoveryPreference;
import android.media.RoutingSessionInfo;
import android.os.Bundle;
import android.os.Handler;
@@ -118,6 +119,10 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
public void releaseSession(String sessionId) {
// Do nothing
}
+ @Override
+ public void updateDiscoveryPreference(RouteDiscoveryPreference discoveryPreference) {
+ // Do nothing
+ }
@Override
public void selectRoute(String sessionId, String routeId) {