Require permission for changing system routes
Bug: 149796428 Test: pass MR2 tests Change-Id: Iaee8937a869815da8adc10bee2e1b1accfbd704e
This commit is contained in:
@@ -98,18 +98,26 @@ class MediaRouter2ServiceImpl {
|
||||
public List<MediaRoute2Info> getSystemRoutes() {
|
||||
final int uid = Binder.getCallingUid();
|
||||
final int userId = UserHandle.getUserHandleForUid(uid).getIdentifier();
|
||||
final boolean hasModifyAudioRoutingPermission = mContext.checkCallingOrSelfPermission(
|
||||
android.Manifest.permission.MODIFY_AUDIO_ROUTING)
|
||||
== PackageManager.PERMISSION_GRANTED;
|
||||
|
||||
final long token = Binder.clearCallingIdentity();
|
||||
try {
|
||||
Collection<MediaRoute2Info> systemRoutes;
|
||||
synchronized (mLock) {
|
||||
UserRecord userRecord = getOrCreateUserRecordLocked(userId);
|
||||
MediaRoute2ProviderInfo providerInfo =
|
||||
userRecord.mHandler.mSystemProvider.getProviderInfo();
|
||||
if (providerInfo != null) {
|
||||
systemRoutes = providerInfo.getRoutes();
|
||||
if (hasModifyAudioRoutingPermission) {
|
||||
MediaRoute2ProviderInfo providerInfo =
|
||||
userRecord.mHandler.mSystemProvider.getProviderInfo();
|
||||
if (providerInfo != null) {
|
||||
systemRoutes = providerInfo.getRoutes();
|
||||
} else {
|
||||
systemRoutes = Collections.emptyList();
|
||||
}
|
||||
} else {
|
||||
systemRoutes = Collections.emptyList();
|
||||
systemRoutes = new ArrayList<>();
|
||||
systemRoutes.add(userRecord.mHandler.mSystemProvider.getDefaultRoute());
|
||||
}
|
||||
}
|
||||
return new ArrayList<>(systemRoutes);
|
||||
@@ -122,18 +130,25 @@ class MediaRouter2ServiceImpl {
|
||||
public RoutingSessionInfo getSystemSessionInfo() {
|
||||
final int uid = Binder.getCallingUid();
|
||||
final int userId = UserHandle.getUserHandleForUid(uid).getIdentifier();
|
||||
final boolean hasModifyAudioRoutingPermission = mContext.checkCallingOrSelfPermission(
|
||||
android.Manifest.permission.MODIFY_AUDIO_ROUTING)
|
||||
== PackageManager.PERMISSION_GRANTED;
|
||||
|
||||
final long token = Binder.clearCallingIdentity();
|
||||
try {
|
||||
RoutingSessionInfo systemSessionInfo = null;
|
||||
synchronized (mLock) {
|
||||
UserRecord userRecord = getOrCreateUserRecordLocked(userId);
|
||||
List<RoutingSessionInfo> sessionInfos =
|
||||
userRecord.mHandler.mSystemProvider.getSessionInfos();
|
||||
if (sessionInfos != null && !sessionInfos.isEmpty()) {
|
||||
systemSessionInfo = sessionInfos.get(0);
|
||||
List<RoutingSessionInfo> sessionInfos;
|
||||
if (hasModifyAudioRoutingPermission) {
|
||||
sessionInfos = userRecord.mHandler.mSystemProvider.getSessionInfos();
|
||||
if (sessionInfos != null && !sessionInfos.isEmpty()) {
|
||||
systemSessionInfo = sessionInfos.get(0);
|
||||
} else {
|
||||
Slog.w(TAG, "System provider does not have any session info.");
|
||||
}
|
||||
} else {
|
||||
Slog.w(TAG, "System provider does not have any session info.");
|
||||
systemSessionInfo = userRecord.mHandler.mSystemProvider.getDefaultSessionInfo();
|
||||
}
|
||||
}
|
||||
return systemSessionInfo;
|
||||
@@ -654,10 +669,20 @@ class MediaRouter2ServiceImpl {
|
||||
return;
|
||||
}
|
||||
|
||||
routerRecord.mUserRecord.mHandler.sendMessage(
|
||||
obtainMessage(UserHandler::transferToRouteOnHandler,
|
||||
routerRecord.mUserRecord.mHandler,
|
||||
DUMMY_REQUEST_ID, routerRecord, uniqueSessionId, route));
|
||||
String defaultRouteId =
|
||||
routerRecord.mUserRecord.mHandler.mSystemProvider.getDefaultRoute().getId();
|
||||
if (route.isSystemRoute() && !routerRecord.mHasModifyAudioRoutingPermission
|
||||
&& !TextUtils.equals(route.getId(), defaultRouteId)) {
|
||||
routerRecord.mUserRecord.mHandler.sendMessage(
|
||||
obtainMessage(UserHandler::notifySessionCreationFailedToRouter,
|
||||
routerRecord.mUserRecord.mHandler,
|
||||
routerRecord, toOriginalRequestId(DUMMY_REQUEST_ID)));
|
||||
} else {
|
||||
routerRecord.mUserRecord.mHandler.sendMessage(
|
||||
obtainMessage(UserHandler::transferToRouteOnHandler,
|
||||
routerRecord.mUserRecord.mHandler,
|
||||
DUMMY_REQUEST_ID, routerRecord, uniqueSessionId, route));
|
||||
}
|
||||
}
|
||||
|
||||
private void setSessionVolumeWithRouter2Locked(@NonNull IMediaRouter2 router,
|
||||
@@ -1185,18 +1210,42 @@ class MediaRouter2ServiceImpl {
|
||||
}
|
||||
}
|
||||
|
||||
List<IMediaRouter2> routers = getRouters();
|
||||
List<IMediaRouter2> routersWithModifyAudioRoutingPermission = getRouters(true);
|
||||
List<IMediaRouter2> routersWithoutModifyAudioRoutingPermission = getRouters(false);
|
||||
List<IMediaRouter2Manager> managers = getManagers();
|
||||
List<MediaRoute2Info> defaultRoute = new ArrayList<>();
|
||||
defaultRoute.add(mSystemProvider.getDefaultRoute());
|
||||
|
||||
if (addedRoutes.size() > 0) {
|
||||
notifyRoutesAddedToRouters(routers, addedRoutes);
|
||||
notifyRoutesAddedToRouters(routersWithModifyAudioRoutingPermission, addedRoutes);
|
||||
if (!provider.mIsSystemRouteProvider) {
|
||||
notifyRoutesAddedToRouters(routersWithoutModifyAudioRoutingPermission,
|
||||
addedRoutes);
|
||||
} else if (prevInfo == null) {
|
||||
notifyRoutesAddedToRouters(routersWithoutModifyAudioRoutingPermission,
|
||||
defaultRoute);
|
||||
} // 'else' is handled as changed routes
|
||||
notifyRoutesAddedToManagers(managers, addedRoutes);
|
||||
}
|
||||
if (removedRoutes.size() > 0) {
|
||||
notifyRoutesRemovedToRouters(routers, removedRoutes);
|
||||
notifyRoutesRemovedToRouters(routersWithModifyAudioRoutingPermission,
|
||||
removedRoutes);
|
||||
if (!provider.mIsSystemRouteProvider) {
|
||||
notifyRoutesRemovedToRouters(routersWithoutModifyAudioRoutingPermission,
|
||||
removedRoutes);
|
||||
}
|
||||
notifyRoutesRemovedToManagers(managers, removedRoutes);
|
||||
}
|
||||
if (changedRoutes.size() > 0) {
|
||||
notifyRoutesChangedToRouters(routers, changedRoutes);
|
||||
notifyRoutesChangedToRouters(routersWithModifyAudioRoutingPermission,
|
||||
changedRoutes);
|
||||
if (!provider.mIsSystemRouteProvider) {
|
||||
notifyRoutesChangedToRouters(routersWithoutModifyAudioRoutingPermission,
|
||||
changedRoutes);
|
||||
} else if (prevInfo != null) {
|
||||
notifyRoutesChangedToRouters(routersWithoutModifyAudioRoutingPermission,
|
||||
defaultRoute);
|
||||
} // 'else' is handled as added routes
|
||||
notifyRoutesChangedToManagers(managers, changedRoutes);
|
||||
}
|
||||
}
|
||||
@@ -1223,6 +1272,15 @@ class MediaRouter2ServiceImpl {
|
||||
toOriginalRequestId(uniqueRequestId));
|
||||
return;
|
||||
}
|
||||
if (route.isSystemRoute() && !routerRecord.mHasModifyAudioRoutingPermission
|
||||
&& !TextUtils.equals(route.getId(),
|
||||
mSystemProvider.getDefaultRoute().getId())) {
|
||||
Slog.w(TAG, "MODIFY_AUDIO_ROUTING permission is required to transfer to"
|
||||
+ route);
|
||||
notifySessionCreationFailedToRouter(routerRecord,
|
||||
toOriginalRequestId(uniqueRequestId));
|
||||
return;
|
||||
}
|
||||
|
||||
SessionCreationRequest request =
|
||||
new SessionCreationRequest(routerRecord, uniqueRequestId, route, managerRecord);
|
||||
@@ -1448,7 +1506,9 @@ class MediaRouter2ServiceImpl {
|
||||
if (service == null) {
|
||||
return;
|
||||
}
|
||||
notifySessionInfoChangedToRouters(getRouters(), sessionInfo);
|
||||
notifySessionInfoChangedToRouters(getRouters(true), sessionInfo);
|
||||
notifySessionInfoChangedToRouters(getRouters(false),
|
||||
mSystemProvider.getDefaultSessionInfo());
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1569,7 +1629,7 @@ class MediaRouter2ServiceImpl {
|
||||
}
|
||||
}
|
||||
|
||||
private List<IMediaRouter2> getRouters() {
|
||||
private List<IMediaRouter2> getAllRouters() {
|
||||
final List<IMediaRouter2> routers = new ArrayList<>();
|
||||
MediaRouter2ServiceImpl service = mServiceRef.get();
|
||||
if (service == null) {
|
||||
@@ -1583,6 +1643,23 @@ class MediaRouter2ServiceImpl {
|
||||
return routers;
|
||||
}
|
||||
|
||||
private List<IMediaRouter2> getRouters(boolean hasModifyAudioRoutingPermission) {
|
||||
final List<IMediaRouter2> routers = new ArrayList<>();
|
||||
MediaRouter2ServiceImpl service = mServiceRef.get();
|
||||
if (service == null) {
|
||||
return routers;
|
||||
}
|
||||
synchronized (service.mLock) {
|
||||
for (RouterRecord routerRecord : mUserRecord.mRouterRecords) {
|
||||
if (hasModifyAudioRoutingPermission
|
||||
== routerRecord.mHasModifyAudioRoutingPermission) {
|
||||
routers.add(routerRecord.mRouter);
|
||||
}
|
||||
}
|
||||
}
|
||||
return routers;
|
||||
}
|
||||
|
||||
private List<IMediaRouter2Manager> getManagers() {
|
||||
final List<IMediaRouter2Manager> managers = new ArrayList<>();
|
||||
MediaRouter2ServiceImpl service = mServiceRef.get();
|
||||
|
||||
@@ -72,6 +72,7 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
|
||||
// This should be the currently selected route.
|
||||
MediaRoute2Info mDefaultRoute;
|
||||
MediaRoute2Info mDeviceRoute;
|
||||
RoutingSessionInfo mDefaultSessionInfo;
|
||||
final AudioRoutesInfo mCurAudioRoutesInfo = new AudioRoutesInfo();
|
||||
|
||||
final IAudioRoutesObserver.Stub mAudioRoutesObserver = new IAudioRoutesObserver.Stub() {
|
||||
@@ -114,6 +115,7 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
|
||||
}
|
||||
});
|
||||
updateSessionInfosIfNeeded();
|
||||
|
||||
mContext.registerReceiver(new VolumeChangeReceiver(),
|
||||
new IntentFilter(AudioManager.VOLUME_CHANGED_ACTION));
|
||||
|
||||
@@ -156,6 +158,10 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
|
||||
|
||||
@Override
|
||||
public void transferToRoute(long requestId, String sessionId, String routeId) {
|
||||
if (TextUtils.equals(routeId, DEFAULT_ROUTE_ID)) {
|
||||
// The currently selected route is the default route.
|
||||
return;
|
||||
}
|
||||
if (mBtRouteProvider != null) {
|
||||
if (TextUtils.equals(routeId, mDeviceRoute.getId())) {
|
||||
mBtRouteProvider.transferTo(null);
|
||||
@@ -182,6 +188,10 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
|
||||
return mDefaultRoute;
|
||||
}
|
||||
|
||||
public RoutingSessionInfo getDefaultSessionInfo() {
|
||||
return mDefaultSessionInfo;
|
||||
}
|
||||
|
||||
private void updateDeviceRoute(AudioRoutesInfo newRoutes) {
|
||||
int name = R.string.default_audio_route_name;
|
||||
if (newRoutes != null) {
|
||||
@@ -229,8 +239,6 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
|
||||
*/
|
||||
boolean updateSessionInfosIfNeeded() {
|
||||
synchronized (mLock) {
|
||||
// Prevent to execute this method before mBtRouteProvider is created.
|
||||
if (mBtRouteProvider == null) return false;
|
||||
RoutingSessionInfo oldSessionInfo = mSessionInfos.isEmpty() ? null : mSessionInfos.get(
|
||||
0);
|
||||
|
||||
@@ -238,14 +246,19 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
|
||||
SYSTEM_SESSION_ID, "" /* clientPackageName */)
|
||||
.setSystemSession(true);
|
||||
|
||||
MediaRoute2Info selectedRoute = mBtRouteProvider.getSelectedRoute();
|
||||
if (selectedRoute == null) {
|
||||
selectedRoute = mDeviceRoute;
|
||||
} else {
|
||||
builder.addTransferableRoute(mDeviceRoute.getId());
|
||||
MediaRoute2Info selectedRoute = mDeviceRoute;
|
||||
if (mBtRouteProvider != null) {
|
||||
MediaRoute2Info selectedBtRoute = mBtRouteProvider.getSelectedRoute();
|
||||
if (selectedBtRoute != null) {
|
||||
selectedRoute = selectedBtRoute;
|
||||
builder.addTransferableRoute(mDeviceRoute.getId());
|
||||
}
|
||||
}
|
||||
mSelectedRouteId = selectedRoute.getId();
|
||||
mDefaultRoute = new MediaRoute2Info.Builder(DEFAULT_ROUTE_ID, selectedRoute).build();
|
||||
mDefaultRoute = new MediaRoute2Info.Builder(DEFAULT_ROUTE_ID, selectedRoute)
|
||||
.setSystemRoute(true)
|
||||
.setProviderId(mUniqueId)
|
||||
.build();
|
||||
builder.addSelectedRoute(mSelectedRouteId);
|
||||
|
||||
for (MediaRoute2Info route : mBtRouteProvider.getTransferableRoutes()) {
|
||||
@@ -258,6 +271,12 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
|
||||
} else {
|
||||
mSessionInfos.clear();
|
||||
mSessionInfos.add(newSessionInfo);
|
||||
mDefaultSessionInfo = new RoutingSessionInfo.Builder(
|
||||
SYSTEM_SESSION_ID, "" /* clientPackageName */)
|
||||
.setProviderId(mUniqueId)
|
||||
.setSystemSession(true)
|
||||
.addSelectedRoute(DEFAULT_ROUTE_ID)
|
||||
.build();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -302,6 +321,9 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
|
||||
} else if (mBtRouteProvider != null) {
|
||||
mBtRouteProvider.setSelectedRouteVolume(newVolume);
|
||||
}
|
||||
mDefaultRoute = new MediaRoute2Info.Builder(mDefaultRoute)
|
||||
.setVolume(newVolume)
|
||||
.build();
|
||||
publishProviderState();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user