diff options
| author | 2020-02-05 09:27:17 +0000 | |
|---|---|---|
| committer | 2020-02-05 09:27:17 +0000 | |
| commit | 0a4502a0fb274ee46c8cde05f08c2f22c4714d52 (patch) | |
| tree | fbae90d694dacd5d7b7a222344fe38ae6a0c4f4f | |
| parent | b1e380c47654e281464e4e571cf363df2dca61d6 (diff) | |
| parent | 1866d8ae80d3869a8de466fd2a4588b81ec5e0b5 (diff) | |
Merge "MediaRouter: Call onDiscoveryPreferenceChanged()"
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) { |