Merge "MediaRouter: Call onDiscoveryPreferenceChanged()"
This commit is contained in:
committed by
Android (Google) Code Review
commit
0a4502a0fb
@@ -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);
|
||||
|
||||
@@ -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()) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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 =
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user