Merge "Require permission for changing system routes" into rvc-dev am: 1be609a3a8

Change-Id: Ia44b7e14c42ec817954c9f202b7d4901010bcde7
This commit is contained in:
Sungsoo Lim
2020-04-08 23:22:10 +00:00
committed by Automerger Merge Worker
2 changed files with 127 additions and 28 deletions

View File

@@ -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);
@@ -1444,7 +1502,9 @@ class MediaRouter2ServiceImpl {
if (service == null) {
return;
}
notifySessionInfoChangedToRouters(getRouters(), sessionInfo);
notifySessionInfoChangedToRouters(getRouters(true), sessionInfo);
notifySessionInfoChangedToRouters(getRouters(false),
mSystemProvider.getDefaultSessionInfo());
return;
}
@@ -1565,7 +1625,7 @@ class MediaRouter2ServiceImpl {
}
}
private List<IMediaRouter2> getRouters() {
private List<IMediaRouter2> getAllRouters() {
final List<IMediaRouter2> routers = new ArrayList<>();
MediaRouter2ServiceImpl service = mServiceRef.get();
if (service == null) {
@@ -1579,6 +1639,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();

View File

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