Merge "MediaRouter: Call onDiscoveryPreferenceChanged()"

This commit is contained in:
Kyunglyul Hyun
2020-02-05 09:27:17 +00:00
committed by Android (Google) Code Review
9 changed files with 93 additions and 16 deletions

View File

@@ -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);

View File

@@ -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) {}
/**
@@ -455,6 +454,16 @@ public abstract class MediaRoute2ProviderService extends Service {
MediaRoute2ProviderService.this, sessionId));
}
@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()) {

View File

@@ -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.");
}
}
//TODO: Clean up mRoutes. (onHandler?)
if (mRouteCallbackRecords.size() == 0) {
try {
mMediaRouterService.unregisterClient2(mClient);
} catch (RemoteException ex) {
Log.e(TAG, "Unable to unregister media router.", ex);
}
}
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;
}
/**

View File

@@ -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 =

View File

@@ -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;

View File

@@ -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);

View File

@@ -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;
@@ -92,6 +93,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) {
@@ -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);

View File

@@ -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)) {

View File

@@ -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) {