Merge "Differentiate the default route with the device route" into rvc-dev

This commit is contained in:
TreeHugger Robot
2020-03-27 15:50:55 +00:00
committed by Android (Google) Code Review
3 changed files with 65 additions and 25 deletions

View File

@@ -663,8 +663,8 @@ public final class MediaRoute2Info implements Parcelable {
} }
/** /**
* Constructor for builder to create {@link MediaRoute2Info} with * Constructor for builder to create {@link MediaRoute2Info} with existing
* existing {@link MediaRoute2Info} instance. * {@link MediaRoute2Info} instance.
* *
* @param routeInfo the existing instance to copy data from. * @param routeInfo the existing instance to copy data from.
*/ */
@@ -689,6 +689,38 @@ public final class MediaRoute2Info implements Parcelable {
mProviderId = routeInfo.mProviderId; mProviderId = routeInfo.mProviderId;
} }
/**
* Constructor for builder to create {@link MediaRoute2Info} with existing
* {@link MediaRoute2Info} instance and replace ID with the given {@code id}.
*
* @param id The ID of the new route. Must not be empty.
* @param routeInfo the existing instance to copy data from.
* @hide
*/
public Builder(@NonNull String id, @NonNull MediaRoute2Info routeInfo) {
if (TextUtils.isEmpty(id)) {
throw new IllegalArgumentException("id must not be empty");
}
Objects.requireNonNull(routeInfo, "routeInfo must not be null");
mId = id;
mName = routeInfo.mName;
mFeatures = new ArrayList<>(routeInfo.mFeatures);
mType = routeInfo.mType;
mIsSystem = routeInfo.mIsSystem;
mIconUri = routeInfo.mIconUri;
mDescription = routeInfo.mDescription;
mConnectionState = routeInfo.mConnectionState;
mClientPackageName = routeInfo.mClientPackageName;
mVolumeHandling = routeInfo.mVolumeHandling;
mVolumeMax = routeInfo.mVolumeMax;
mVolume = routeInfo.mVolume;
if (routeInfo.mExtras != null) {
mExtras = new Bundle(routeInfo.mExtras);
}
mProviderId = routeInfo.mProviderId;
}
/** /**
* Adds a feature for the route. * Adds a feature for the route.
* @param feature a feature that the route has. May be one of predefined features * @param feature a feature that the route has. May be one of predefined features

View File

@@ -708,7 +708,7 @@ class MediaRouter2ServiceImpl {
} }
List<RoutingSessionInfo> sessionInfos = new ArrayList<>(); List<RoutingSessionInfo> sessionInfos = new ArrayList<>();
for (MediaRoute2Provider provider : managerRecord.mUserRecord.mHandler.mMediaProviders) { for (MediaRoute2Provider provider : managerRecord.mUserRecord.mHandler.mRouteProviders) {
sessionInfos.addAll(provider.getSessionInfos()); sessionInfos.addAll(provider.getSessionInfos());
} }
return sessionInfos; return sessionInfos;
@@ -1059,7 +1059,7 @@ class MediaRouter2ServiceImpl {
//TODO: Make this thread-safe. //TODO: Make this thread-safe.
private final SystemMediaRoute2Provider mSystemProvider; private final SystemMediaRoute2Provider mSystemProvider;
private final ArrayList<MediaRoute2Provider> mMediaProviders = private final ArrayList<MediaRoute2Provider> mRouteProviders =
new ArrayList<>(); new ArrayList<>();
private final List<MediaRoute2ProviderInfo> mLastProviderInfos = new ArrayList<>(); private final List<MediaRoute2ProviderInfo> mLastProviderInfos = new ArrayList<>();
@@ -1074,7 +1074,7 @@ class MediaRouter2ServiceImpl {
mServiceRef = new WeakReference<>(service); mServiceRef = new WeakReference<>(service);
mUserRecord = userRecord; mUserRecord = userRecord;
mSystemProvider = new SystemMediaRoute2Provider(service.mContext, this); mSystemProvider = new SystemMediaRoute2Provider(service.mContext, this);
mMediaProviders.add(mSystemProvider); mRouteProviders.add(mSystemProvider);
mWatcher = new MediaRoute2ProviderWatcher(service.mContext, this, mWatcher = new MediaRoute2ProviderWatcher(service.mContext, this,
this, mUserRecord.mUserId); this, mUserRecord.mUserId);
} }
@@ -1097,13 +1097,13 @@ class MediaRouter2ServiceImpl {
@Override @Override
public void onAddProviderService(@NonNull MediaRoute2ProviderServiceProxy proxy) { public void onAddProviderService(@NonNull MediaRoute2ProviderServiceProxy proxy) {
proxy.setCallback(this); proxy.setCallback(this);
mMediaProviders.add(proxy); mRouteProviders.add(proxy);
proxy.updateDiscoveryPreference(mUserRecord.mCompositeDiscoveryPreference); proxy.updateDiscoveryPreference(mUserRecord.mCompositeDiscoveryPreference);
} }
@Override @Override
public void onRemoveProviderService(@NonNull MediaRoute2ProviderServiceProxy proxy) { public void onRemoveProviderService(@NonNull MediaRoute2ProviderServiceProxy proxy) {
mMediaProviders.remove(proxy); mRouteProviders.remove(proxy);
} }
@Override @Override
@@ -1148,10 +1148,10 @@ class MediaRouter2ServiceImpl {
//TODO: notify session info updates //TODO: notify session info updates
private void onProviderStateChangedOnHandler(@NonNull MediaRoute2Provider provider) { private void onProviderStateChangedOnHandler(@NonNull MediaRoute2Provider provider) {
int providerIndex = getProviderInfoIndex(provider.getUniqueId()); int providerInfoIndex = getLastProviderInfoIndex(provider.getUniqueId());
MediaRoute2ProviderInfo providerInfo = provider.getProviderInfo(); MediaRoute2ProviderInfo providerInfo = provider.getProviderInfo();
MediaRoute2ProviderInfo prevInfo = MediaRoute2ProviderInfo prevInfo =
(providerIndex < 0) ? null : mLastProviderInfos.get(providerIndex); (providerInfoIndex < 0) ? null : mLastProviderInfos.get(providerInfoIndex);
if (Objects.equals(prevInfo, providerInfo)) return; if (Objects.equals(prevInfo, providerInfo)) return;
@@ -1171,7 +1171,7 @@ class MediaRouter2ServiceImpl {
this, getRouters(), new ArrayList<>(removedRoutes))); this, getRouters(), new ArrayList<>(removedRoutes)));
} }
} else { } else {
mLastProviderInfos.set(providerIndex, providerInfo); mLastProviderInfos.set(providerInfoIndex, providerInfo);
List<MediaRoute2Info> addedRoutes = new ArrayList<>(); List<MediaRoute2Info> addedRoutes = new ArrayList<>();
List<MediaRoute2Info> removedRoutes = new ArrayList<>(); List<MediaRoute2Info> removedRoutes = new ArrayList<>();
List<MediaRoute2Info> changedRoutes = new ArrayList<>(); List<MediaRoute2Info> changedRoutes = new ArrayList<>();
@@ -1219,7 +1219,7 @@ class MediaRouter2ServiceImpl {
} }
} }
private int getProviderInfoIndex(@NonNull String providerId) { private int getLastProviderInfoIndex(@NonNull String providerId) {
for (int i = 0; i < mLastProviderInfos.size(); i++) { for (int i = 0; i < mLastProviderInfos.size(); i++) {
MediaRoute2ProviderInfo providerInfo = mLastProviderInfos.get(i); MediaRoute2ProviderInfo providerInfo = mLastProviderInfos.get(i);
if (TextUtils.equals(providerInfo.getUniqueId(), providerId)) { if (TextUtils.equals(providerInfo.getUniqueId(), providerId)) {
@@ -1795,13 +1795,13 @@ class MediaRouter2ServiceImpl {
new RouteDiscoveryPreference.Builder(discoveryPreferences) new RouteDiscoveryPreference.Builder(discoveryPreferences)
.build(); .build();
} }
for (MediaRoute2Provider provider : mMediaProviders) { for (MediaRoute2Provider provider : mRouteProviders) {
provider.updateDiscoveryPreference(mUserRecord.mCompositeDiscoveryPreference); provider.updateDiscoveryPreference(mUserRecord.mCompositeDiscoveryPreference);
} }
} }
private MediaRoute2Provider findProvider(@Nullable String providerId) { private MediaRoute2Provider findProvider(@Nullable String providerId) {
for (MediaRoute2Provider provider : mMediaProviders) { for (MediaRoute2Provider provider : mRouteProviders) {
if (TextUtils.equals(provider.getUniqueId(), providerId)) { if (TextUtils.equals(provider.getUniqueId(), providerId)) {
return provider; return provider;
} }

View File

@@ -54,6 +54,7 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
static final String DEFAULT_ROUTE_ID = "DEFAULT_ROUTE"; static final String DEFAULT_ROUTE_ID = "DEFAULT_ROUTE";
static final String DEVICE_ROUTE_ID = "DEVICE_ROUTE";
static final String SYSTEM_SESSION_ID = "SYSTEM_SESSION"; static final String SYSTEM_SESSION_ID = "SYSTEM_SESSION";
private final AudioManager mAudioManager; private final AudioManager mAudioManager;
@@ -67,14 +68,17 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
SystemMediaRoute2Provider.class.getName()); SystemMediaRoute2Provider.class.getName());
private String mSelectedRouteId; private String mSelectedRouteId;
// For apps without MODIFYING_AUDIO_ROUTING permission.
// This should be the currently selected route.
MediaRoute2Info mDefaultRoute; MediaRoute2Info mDefaultRoute;
MediaRoute2Info mDeviceRoute;
final AudioRoutesInfo mCurAudioRoutesInfo = new AudioRoutesInfo(); final AudioRoutesInfo mCurAudioRoutesInfo = new AudioRoutesInfo();
final IAudioRoutesObserver.Stub mAudioRoutesObserver = new IAudioRoutesObserver.Stub() { final IAudioRoutesObserver.Stub mAudioRoutesObserver = new IAudioRoutesObserver.Stub() {
@Override @Override
public void dispatchAudioRoutesChanged(final AudioRoutesInfo newRoutes) { public void dispatchAudioRoutesChanged(final AudioRoutesInfo newRoutes) {
mHandler.post(() -> { mHandler.post(() -> {
updateDefaultRoute(newRoutes); updateDeviceRoute(newRoutes);
notifyProviderState(); notifyProviderState();
}); });
} }
@@ -97,7 +101,7 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
newAudioRoutes = mAudioService.startWatchingRoutes(mAudioRoutesObserver); newAudioRoutes = mAudioService.startWatchingRoutes(mAudioRoutesObserver);
} catch (RemoteException e) { } catch (RemoteException e) {
} }
updateDefaultRoute(newAudioRoutes); updateDeviceRoute(newAudioRoutes);
mBtRouteProvider = BluetoothRouteProvider.getInstance(context, (routes) -> { mBtRouteProvider = BluetoothRouteProvider.getInstance(context, (routes) -> {
publishProviderState(); publishProviderState();
@@ -109,7 +113,6 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
} }
}); });
updateSessionInfosIfNeeded(); updateSessionInfosIfNeeded();
mContext.registerReceiver(new VolumeChangeReceiver(), mContext.registerReceiver(new VolumeChangeReceiver(),
new IntentFilter(AudioManager.VOLUME_CHANGED_ACTION)); new IntentFilter(AudioManager.VOLUME_CHANGED_ACTION));
@@ -150,7 +153,7 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
@Override @Override
public void transferToRoute(long requestId, String sessionId, String routeId) { public void transferToRoute(long requestId, String sessionId, String routeId) {
if (TextUtils.equals(routeId, mDefaultRoute.getId())) { if (TextUtils.equals(routeId, mDeviceRoute.getId())) {
mBtRouteProvider.transferTo(null); mBtRouteProvider.transferTo(null);
} else { } else {
mBtRouteProvider.transferTo(routeId); mBtRouteProvider.transferTo(routeId);
@@ -170,7 +173,11 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
// Do nothing since we don't support grouping volume yet. // Do nothing since we don't support grouping volume yet.
} }
private void updateDefaultRoute(AudioRoutesInfo newRoutes) { public MediaRoute2Info getDefaultRoute() {
return mDefaultRoute;
}
private void updateDeviceRoute(AudioRoutesInfo newRoutes) {
int name = R.string.default_audio_route_name; int name = R.string.default_audio_route_name;
if (newRoutes != null) { if (newRoutes != null) {
mCurAudioRoutesInfo.mainType = newRoutes.mainType; mCurAudioRoutesInfo.mainType = newRoutes.mainType;
@@ -185,8 +192,8 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
name = com.android.internal.R.string.default_audio_route_name_usb; name = com.android.internal.R.string.default_audio_route_name_usb;
} }
} }
mDefaultRoute = new MediaRoute2Info.Builder( mDeviceRoute = new MediaRoute2Info.Builder(
DEFAULT_ROUTE_ID, mContext.getResources().getText(name).toString()) DEVICE_ROUTE_ID, mContext.getResources().getText(name).toString())
.setVolumeHandling(mAudioManager.isVolumeFixed() .setVolumeHandling(mAudioManager.isVolumeFixed()
? MediaRoute2Info.PLAYBACK_VOLUME_FIXED ? MediaRoute2Info.PLAYBACK_VOLUME_FIXED
: MediaRoute2Info.PLAYBACK_VOLUME_VARIABLE) : MediaRoute2Info.PLAYBACK_VOLUME_VARIABLE)
@@ -203,7 +210,7 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
private void updateProviderState() { private void updateProviderState() {
MediaRoute2ProviderInfo.Builder builder = new MediaRoute2ProviderInfo.Builder(); MediaRoute2ProviderInfo.Builder builder = new MediaRoute2ProviderInfo.Builder();
builder.addRoute(mDefaultRoute); builder.addRoute(mDeviceRoute);
if (mBtRouteProvider != null) { if (mBtRouteProvider != null) {
for (MediaRoute2Info route : mBtRouteProvider.getAllBluetoothRoutes()) { for (MediaRoute2Info route : mBtRouteProvider.getAllBluetoothRoutes()) {
builder.addRoute(route); builder.addRoute(route);
@@ -228,11 +235,12 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
MediaRoute2Info selectedRoute = mBtRouteProvider.getSelectedRoute(); MediaRoute2Info selectedRoute = mBtRouteProvider.getSelectedRoute();
if (selectedRoute == null) { if (selectedRoute == null) {
selectedRoute = mDefaultRoute; selectedRoute = mDeviceRoute;
} else { } else {
builder.addTransferableRoute(mDefaultRoute.getId()); builder.addTransferableRoute(mDeviceRoute.getId());
} }
mSelectedRouteId = selectedRoute.getId(); mSelectedRouteId = selectedRoute.getId();
mDefaultRoute = new MediaRoute2Info.Builder(DEFAULT_ROUTE_ID, selectedRoute).build();
builder.addSelectedRoute(mSelectedRouteId); builder.addSelectedRoute(mSelectedRouteId);
for (MediaRoute2Info route : mBtRouteProvider.getTransferableRoutes()) { for (MediaRoute2Info route : mBtRouteProvider.getTransferableRoutes()) {
@@ -282,8 +290,8 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
AudioManager.EXTRA_PREV_VOLUME_STREAM_VALUE, 0); AudioManager.EXTRA_PREV_VOLUME_STREAM_VALUE, 0);
if (newVolume != oldVolume) { if (newVolume != oldVolume) {
if (TextUtils.equals(mDefaultRoute.getId(), mSelectedRouteId)) { if (TextUtils.equals(mDeviceRoute.getId(), mSelectedRouteId)) {
mDefaultRoute = new MediaRoute2Info.Builder(mDefaultRoute) mDeviceRoute = new MediaRoute2Info.Builder(mDeviceRoute)
.setVolume(newVolume) .setVolume(newVolume)
.build(); .build();
} else { } else {