Merge "Require permission for changing system routes" into rvc-dev
This commit is contained in:
@@ -98,12 +98,16 @@ class MediaRouter2ServiceImpl {
|
|||||||
public List<MediaRoute2Info> getSystemRoutes() {
|
public List<MediaRoute2Info> getSystemRoutes() {
|
||||||
final int uid = Binder.getCallingUid();
|
final int uid = Binder.getCallingUid();
|
||||||
final int userId = UserHandle.getUserHandleForUid(uid).getIdentifier();
|
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();
|
final long token = Binder.clearCallingIdentity();
|
||||||
try {
|
try {
|
||||||
Collection<MediaRoute2Info> systemRoutes;
|
Collection<MediaRoute2Info> systemRoutes;
|
||||||
synchronized (mLock) {
|
synchronized (mLock) {
|
||||||
UserRecord userRecord = getOrCreateUserRecordLocked(userId);
|
UserRecord userRecord = getOrCreateUserRecordLocked(userId);
|
||||||
|
if (hasModifyAudioRoutingPermission) {
|
||||||
MediaRoute2ProviderInfo providerInfo =
|
MediaRoute2ProviderInfo providerInfo =
|
||||||
userRecord.mHandler.mSystemProvider.getProviderInfo();
|
userRecord.mHandler.mSystemProvider.getProviderInfo();
|
||||||
if (providerInfo != null) {
|
if (providerInfo != null) {
|
||||||
@@ -111,6 +115,10 @@ class MediaRouter2ServiceImpl {
|
|||||||
} else {
|
} else {
|
||||||
systemRoutes = Collections.emptyList();
|
systemRoutes = Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
systemRoutes = new ArrayList<>();
|
||||||
|
systemRoutes.add(userRecord.mHandler.mSystemProvider.getDefaultRoute());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return new ArrayList<>(systemRoutes);
|
return new ArrayList<>(systemRoutes);
|
||||||
} finally {
|
} finally {
|
||||||
@@ -122,19 +130,26 @@ class MediaRouter2ServiceImpl {
|
|||||||
public RoutingSessionInfo getSystemSessionInfo() {
|
public RoutingSessionInfo getSystemSessionInfo() {
|
||||||
final int uid = Binder.getCallingUid();
|
final int uid = Binder.getCallingUid();
|
||||||
final int userId = UserHandle.getUserHandleForUid(uid).getIdentifier();
|
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();
|
final long token = Binder.clearCallingIdentity();
|
||||||
try {
|
try {
|
||||||
RoutingSessionInfo systemSessionInfo = null;
|
RoutingSessionInfo systemSessionInfo = null;
|
||||||
synchronized (mLock) {
|
synchronized (mLock) {
|
||||||
UserRecord userRecord = getOrCreateUserRecordLocked(userId);
|
UserRecord userRecord = getOrCreateUserRecordLocked(userId);
|
||||||
List<RoutingSessionInfo> sessionInfos =
|
List<RoutingSessionInfo> sessionInfos;
|
||||||
userRecord.mHandler.mSystemProvider.getSessionInfos();
|
if (hasModifyAudioRoutingPermission) {
|
||||||
|
sessionInfos = userRecord.mHandler.mSystemProvider.getSessionInfos();
|
||||||
if (sessionInfos != null && !sessionInfos.isEmpty()) {
|
if (sessionInfos != null && !sessionInfos.isEmpty()) {
|
||||||
systemSessionInfo = sessionInfos.get(0);
|
systemSessionInfo = sessionInfos.get(0);
|
||||||
} else {
|
} else {
|
||||||
Slog.w(TAG, "System provider does not have any session info.");
|
Slog.w(TAG, "System provider does not have any session info.");
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
systemSessionInfo = userRecord.mHandler.mSystemProvider.getDefaultSessionInfo();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return systemSessionInfo;
|
return systemSessionInfo;
|
||||||
} finally {
|
} finally {
|
||||||
@@ -654,11 +669,21 @@ class MediaRouter2ServiceImpl {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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(
|
routerRecord.mUserRecord.mHandler.sendMessage(
|
||||||
obtainMessage(UserHandler::transferToRouteOnHandler,
|
obtainMessage(UserHandler::transferToRouteOnHandler,
|
||||||
routerRecord.mUserRecord.mHandler,
|
routerRecord.mUserRecord.mHandler,
|
||||||
DUMMY_REQUEST_ID, routerRecord, uniqueSessionId, route));
|
DUMMY_REQUEST_ID, routerRecord, uniqueSessionId, route));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void setSessionVolumeWithRouter2Locked(@NonNull IMediaRouter2 router,
|
private void setSessionVolumeWithRouter2Locked(@NonNull IMediaRouter2 router,
|
||||||
@NonNull String uniqueSessionId, int volume) {
|
@NonNull String uniqueSessionId, int volume) {
|
||||||
@@ -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<IMediaRouter2Manager> managers = getManagers();
|
||||||
|
List<MediaRoute2Info> defaultRoute = new ArrayList<>();
|
||||||
|
defaultRoute.add(mSystemProvider.getDefaultRoute());
|
||||||
|
|
||||||
if (addedRoutes.size() > 0) {
|
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);
|
notifyRoutesAddedToManagers(managers, addedRoutes);
|
||||||
}
|
}
|
||||||
if (removedRoutes.size() > 0) {
|
if (removedRoutes.size() > 0) {
|
||||||
notifyRoutesRemovedToRouters(routers, removedRoutes);
|
notifyRoutesRemovedToRouters(routersWithModifyAudioRoutingPermission,
|
||||||
|
removedRoutes);
|
||||||
|
if (!provider.mIsSystemRouteProvider) {
|
||||||
|
notifyRoutesRemovedToRouters(routersWithoutModifyAudioRoutingPermission,
|
||||||
|
removedRoutes);
|
||||||
|
}
|
||||||
notifyRoutesRemovedToManagers(managers, removedRoutes);
|
notifyRoutesRemovedToManagers(managers, removedRoutes);
|
||||||
}
|
}
|
||||||
if (changedRoutes.size() > 0) {
|
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);
|
notifyRoutesChangedToManagers(managers, changedRoutes);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1223,6 +1272,15 @@ class MediaRouter2ServiceImpl {
|
|||||||
toOriginalRequestId(uniqueRequestId));
|
toOriginalRequestId(uniqueRequestId));
|
||||||
return;
|
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 =
|
SessionCreationRequest request =
|
||||||
new SessionCreationRequest(routerRecord, uniqueRequestId, route, managerRecord);
|
new SessionCreationRequest(routerRecord, uniqueRequestId, route, managerRecord);
|
||||||
@@ -1444,7 +1502,9 @@ class MediaRouter2ServiceImpl {
|
|||||||
if (service == null) {
|
if (service == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
notifySessionInfoChangedToRouters(getRouters(), sessionInfo);
|
notifySessionInfoChangedToRouters(getRouters(true), sessionInfo);
|
||||||
|
notifySessionInfoChangedToRouters(getRouters(false),
|
||||||
|
mSystemProvider.getDefaultSessionInfo());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1565,7 +1625,7 @@ class MediaRouter2ServiceImpl {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<IMediaRouter2> getRouters() {
|
private List<IMediaRouter2> getAllRouters() {
|
||||||
final List<IMediaRouter2> routers = new ArrayList<>();
|
final List<IMediaRouter2> routers = new ArrayList<>();
|
||||||
MediaRouter2ServiceImpl service = mServiceRef.get();
|
MediaRouter2ServiceImpl service = mServiceRef.get();
|
||||||
if (service == null) {
|
if (service == null) {
|
||||||
@@ -1579,6 +1639,23 @@ class MediaRouter2ServiceImpl {
|
|||||||
return routers;
|
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() {
|
private List<IMediaRouter2Manager> getManagers() {
|
||||||
final List<IMediaRouter2Manager> managers = new ArrayList<>();
|
final List<IMediaRouter2Manager> managers = new ArrayList<>();
|
||||||
MediaRouter2ServiceImpl service = mServiceRef.get();
|
MediaRouter2ServiceImpl service = mServiceRef.get();
|
||||||
|
|||||||
@@ -72,6 +72,7 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
|
|||||||
// This should be the currently selected route.
|
// This should be the currently selected route.
|
||||||
MediaRoute2Info mDefaultRoute;
|
MediaRoute2Info mDefaultRoute;
|
||||||
MediaRoute2Info mDeviceRoute;
|
MediaRoute2Info mDeviceRoute;
|
||||||
|
RoutingSessionInfo mDefaultSessionInfo;
|
||||||
final AudioRoutesInfo mCurAudioRoutesInfo = new AudioRoutesInfo();
|
final AudioRoutesInfo mCurAudioRoutesInfo = new AudioRoutesInfo();
|
||||||
|
|
||||||
final IAudioRoutesObserver.Stub mAudioRoutesObserver = new IAudioRoutesObserver.Stub() {
|
final IAudioRoutesObserver.Stub mAudioRoutesObserver = new IAudioRoutesObserver.Stub() {
|
||||||
@@ -114,6 +115,7 @@ 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));
|
||||||
|
|
||||||
@@ -156,6 +158,10 @@ 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, DEFAULT_ROUTE_ID)) {
|
||||||
|
// The currently selected route is the default route.
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (mBtRouteProvider != null) {
|
if (mBtRouteProvider != null) {
|
||||||
if (TextUtils.equals(routeId, mDeviceRoute.getId())) {
|
if (TextUtils.equals(routeId, mDeviceRoute.getId())) {
|
||||||
mBtRouteProvider.transferTo(null);
|
mBtRouteProvider.transferTo(null);
|
||||||
@@ -182,6 +188,10 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
|
|||||||
return mDefaultRoute;
|
return mDefaultRoute;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public RoutingSessionInfo getDefaultSessionInfo() {
|
||||||
|
return mDefaultSessionInfo;
|
||||||
|
}
|
||||||
|
|
||||||
private void updateDeviceRoute(AudioRoutesInfo newRoutes) {
|
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) {
|
||||||
@@ -229,8 +239,6 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
|
|||||||
*/
|
*/
|
||||||
boolean updateSessionInfosIfNeeded() {
|
boolean updateSessionInfosIfNeeded() {
|
||||||
synchronized (mLock) {
|
synchronized (mLock) {
|
||||||
// Prevent to execute this method before mBtRouteProvider is created.
|
|
||||||
if (mBtRouteProvider == null) return false;
|
|
||||||
RoutingSessionInfo oldSessionInfo = mSessionInfos.isEmpty() ? null : mSessionInfos.get(
|
RoutingSessionInfo oldSessionInfo = mSessionInfos.isEmpty() ? null : mSessionInfos.get(
|
||||||
0);
|
0);
|
||||||
|
|
||||||
@@ -238,14 +246,19 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
|
|||||||
SYSTEM_SESSION_ID, "" /* clientPackageName */)
|
SYSTEM_SESSION_ID, "" /* clientPackageName */)
|
||||||
.setSystemSession(true);
|
.setSystemSession(true);
|
||||||
|
|
||||||
MediaRoute2Info selectedRoute = mBtRouteProvider.getSelectedRoute();
|
MediaRoute2Info selectedRoute = mDeviceRoute;
|
||||||
if (selectedRoute == null) {
|
if (mBtRouteProvider != null) {
|
||||||
selectedRoute = mDeviceRoute;
|
MediaRoute2Info selectedBtRoute = mBtRouteProvider.getSelectedRoute();
|
||||||
} else {
|
if (selectedBtRoute != null) {
|
||||||
|
selectedRoute = selectedBtRoute;
|
||||||
builder.addTransferableRoute(mDeviceRoute.getId());
|
builder.addTransferableRoute(mDeviceRoute.getId());
|
||||||
}
|
}
|
||||||
|
}
|
||||||
mSelectedRouteId = selectedRoute.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);
|
builder.addSelectedRoute(mSelectedRouteId);
|
||||||
|
|
||||||
for (MediaRoute2Info route : mBtRouteProvider.getTransferableRoutes()) {
|
for (MediaRoute2Info route : mBtRouteProvider.getTransferableRoutes()) {
|
||||||
@@ -258,6 +271,12 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
|
|||||||
} else {
|
} else {
|
||||||
mSessionInfos.clear();
|
mSessionInfos.clear();
|
||||||
mSessionInfos.add(newSessionInfo);
|
mSessionInfos.add(newSessionInfo);
|
||||||
|
mDefaultSessionInfo = new RoutingSessionInfo.Builder(
|
||||||
|
SYSTEM_SESSION_ID, "" /* clientPackageName */)
|
||||||
|
.setProviderId(mUniqueId)
|
||||||
|
.setSystemSession(true)
|
||||||
|
.addSelectedRoute(DEFAULT_ROUTE_ID)
|
||||||
|
.build();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -302,6 +321,9 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
|
|||||||
} else if (mBtRouteProvider != null) {
|
} else if (mBtRouteProvider != null) {
|
||||||
mBtRouteProvider.setSelectedRouteVolume(newVolume);
|
mBtRouteProvider.setSelectedRouteVolume(newVolume);
|
||||||
}
|
}
|
||||||
|
mDefaultRoute = new MediaRoute2Info.Builder(mDefaultRoute)
|
||||||
|
.setVolume(newVolume)
|
||||||
|
.build();
|
||||||
publishProviderState();
|
publishProviderState();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user