Loading services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java +97 −20 Original line number Diff line number Diff line Loading @@ -98,12 +98,16 @@ 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); if (hasModifyAudioRoutingPermission) { MediaRoute2ProviderInfo providerInfo = userRecord.mHandler.mSystemProvider.getProviderInfo(); if (providerInfo != null) { Loading @@ -111,6 +115,10 @@ class MediaRouter2ServiceImpl { } else { systemRoutes = Collections.emptyList(); } } else { systemRoutes = new ArrayList<>(); systemRoutes.add(userRecord.mHandler.mSystemProvider.getDefaultRoute()); } } return new ArrayList<>(systemRoutes); } finally { Loading @@ -122,19 +130,26 @@ 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(); 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 { systemSessionInfo = userRecord.mHandler.mSystemProvider.getDefaultSessionInfo(); } } return systemSessionInfo; } finally { Loading Loading @@ -654,11 +669,21 @@ class MediaRouter2ServiceImpl { 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( obtainMessage(UserHandler::transferToRouteOnHandler, routerRecord.mUserRecord.mHandler, DUMMY_REQUEST_ID, routerRecord, uniqueSessionId, route)); } } private void setSessionVolumeWithRouter2Locked(@NonNull IMediaRouter2 router, @NonNull String uniqueSessionId, int volume) { Loading Loading @@ -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); } } Loading @@ -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); Loading Loading @@ -1444,7 +1502,9 @@ class MediaRouter2ServiceImpl { if (service == null) { return; } notifySessionInfoChangedToRouters(getRouters(), sessionInfo); notifySessionInfoChangedToRouters(getRouters(true), sessionInfo); notifySessionInfoChangedToRouters(getRouters(false), mSystemProvider.getDefaultSessionInfo()); return; } Loading Loading @@ -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) { Loading @@ -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(); Loading services/core/java/com/android/server/media/SystemMediaRoute2Provider.java +30 −8 Original line number Diff line number Diff line Loading @@ -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() { Loading Loading @@ -114,6 +115,7 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider { } }); updateSessionInfosIfNeeded(); mContext.registerReceiver(new VolumeChangeReceiver(), new IntentFilter(AudioManager.VOLUME_CHANGED_ACTION)); Loading Loading @@ -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); Loading @@ -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) { Loading Loading @@ -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); Loading @@ -238,14 +246,19 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider { SYSTEM_SESSION_ID, "" /* clientPackageName */) .setSystemSession(true); MediaRoute2Info selectedRoute = mBtRouteProvider.getSelectedRoute(); if (selectedRoute == null) { selectedRoute = mDeviceRoute; } else { 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()) { Loading @@ -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; } } Loading Loading @@ -302,6 +321,9 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider { } else if (mBtRouteProvider != null) { mBtRouteProvider.setSelectedRouteVolume(newVolume); } mDefaultRoute = new MediaRoute2Info.Builder(mDefaultRoute) .setVolume(newVolume) .build(); publishProviderState(); } } Loading Loading
services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java +97 −20 Original line number Diff line number Diff line Loading @@ -98,12 +98,16 @@ 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); if (hasModifyAudioRoutingPermission) { MediaRoute2ProviderInfo providerInfo = userRecord.mHandler.mSystemProvider.getProviderInfo(); if (providerInfo != null) { Loading @@ -111,6 +115,10 @@ class MediaRouter2ServiceImpl { } else { systemRoutes = Collections.emptyList(); } } else { systemRoutes = new ArrayList<>(); systemRoutes.add(userRecord.mHandler.mSystemProvider.getDefaultRoute()); } } return new ArrayList<>(systemRoutes); } finally { Loading @@ -122,19 +130,26 @@ 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(); 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 { systemSessionInfo = userRecord.mHandler.mSystemProvider.getDefaultSessionInfo(); } } return systemSessionInfo; } finally { Loading Loading @@ -654,11 +669,21 @@ class MediaRouter2ServiceImpl { 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( obtainMessage(UserHandler::transferToRouteOnHandler, routerRecord.mUserRecord.mHandler, DUMMY_REQUEST_ID, routerRecord, uniqueSessionId, route)); } } private void setSessionVolumeWithRouter2Locked(@NonNull IMediaRouter2 router, @NonNull String uniqueSessionId, int volume) { Loading Loading @@ -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); } } Loading @@ -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); Loading Loading @@ -1444,7 +1502,9 @@ class MediaRouter2ServiceImpl { if (service == null) { return; } notifySessionInfoChangedToRouters(getRouters(), sessionInfo); notifySessionInfoChangedToRouters(getRouters(true), sessionInfo); notifySessionInfoChangedToRouters(getRouters(false), mSystemProvider.getDefaultSessionInfo()); return; } Loading Loading @@ -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) { Loading @@ -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(); Loading
services/core/java/com/android/server/media/SystemMediaRoute2Provider.java +30 −8 Original line number Diff line number Diff line Loading @@ -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() { Loading Loading @@ -114,6 +115,7 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider { } }); updateSessionInfosIfNeeded(); mContext.registerReceiver(new VolumeChangeReceiver(), new IntentFilter(AudioManager.VOLUME_CHANGED_ACTION)); Loading Loading @@ -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); Loading @@ -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) { Loading Loading @@ -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); Loading @@ -238,14 +246,19 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider { SYSTEM_SESSION_ID, "" /* clientPackageName */) .setSystemSession(true); MediaRoute2Info selectedRoute = mBtRouteProvider.getSelectedRoute(); if (selectedRoute == null) { selectedRoute = mDeviceRoute; } else { 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()) { Loading @@ -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; } } Loading Loading @@ -302,6 +321,9 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider { } else if (mBtRouteProvider != null) { mBtRouteProvider.setSelectedRouteVolume(newVolume); } mDefaultRoute = new MediaRoute2Info.Builder(mDefaultRoute) .setVolume(newVolume) .build(); publishProviderState(); } } Loading