diff options
| author | 2025-01-24 11:40:07 +0000 | |
|---|---|---|
| committer | 2025-01-30 15:01:10 +0000 | |
| commit | 77c65e71ef5717c135814f8d0486751d2fe8c55f (patch) | |
| tree | 337fb31790d1a7298f96045b3434d43a8a394b63 | |
| parent | d4d2aa08541f2e1ad1ca932edbf37d31ad748215 (diff) | |
Add support for system media session volume adjustment
Also change the separate to be an underscore. The dot is already used
for the package name, which is part of the generated original id.
Bug: b/362507305
Test: atest CtsMediaBetterTogetherTestCases:android.media.router.cts.SystemMediaRoutingTest
Flag: com.android.media.flags.enable_mirroring_in_media_router_2
Change-Id: I6b078b80bfc970e8b9e4c0822cc460fccd45659d
| -rw-r--r-- | media/java/android/media/RoutingSessionInfo.java | 12 | ||||
| -rw-r--r-- | services/core/java/com/android/server/media/SystemMediaRoute2Provider2.java | 91 |
2 files changed, 77 insertions, 26 deletions
diff --git a/media/java/android/media/RoutingSessionInfo.java b/media/java/android/media/RoutingSessionInfo.java index 87bb6eab6c4d..d27d7fc72a38 100644 --- a/media/java/android/media/RoutingSessionInfo.java +++ b/media/java/android/media/RoutingSessionInfo.java @@ -649,9 +649,19 @@ public final class RoutingSessionInfo implements Parcelable { * @param sessionInfo the existing instance to copy data from. */ public Builder(@NonNull RoutingSessionInfo sessionInfo) { + this(sessionInfo, sessionInfo.getOriginalId()); + } + + /** + * Builds upon the given {@code sessionInfo}, using the given {@link #getOriginalId()} for + * the id. + * + * @hide + */ + public Builder(@NonNull RoutingSessionInfo sessionInfo, String originalId) { Objects.requireNonNull(sessionInfo, "sessionInfo must not be null"); - mOriginalId = sessionInfo.mOriginalId; + mOriginalId = originalId; mName = sessionInfo.mName; mClientPackageName = sessionInfo.mClientPackageName; mProviderId = sessionInfo.mProviderId; diff --git a/services/core/java/com/android/server/media/SystemMediaRoute2Provider2.java b/services/core/java/com/android/server/media/SystemMediaRoute2Provider2.java index 3eb38a7029e6..b13dee530ee2 100644 --- a/services/core/java/com/android/server/media/SystemMediaRoute2Provider2.java +++ b/services/core/java/com/android/server/media/SystemMediaRoute2Provider2.java @@ -56,8 +56,8 @@ import java.util.stream.Stream; */ /* package */ class SystemMediaRoute2Provider2 extends SystemMediaRoute2Provider { - private static final String ROUTE_ID_PREFIX_SYSTEM = "SYSTEM"; - private static final String ROUTE_ID_SYSTEM_SEPARATOR = "."; + private static final String UNIQUE_SYSTEM_ID_PREFIX = "SYSTEM"; + private static final String UNIQUE_SYSTEM_ID_SEPARATOR = "-"; private final PackageManager mPackageManager; @@ -67,6 +67,10 @@ import java.util.stream.Stream; @GuardedBy("mLock") private final Map<String, ProviderProxyRecord> mProxyRecords = new ArrayMap<>(); + @GuardedBy("mLock") + private final Map<String, SystemMediaSessionRecord> mSessionOriginalIdToSessionRecord = + new ArrayMap<>(); + /** * Maps package names to corresponding sessions maintained by {@link MediaRoute2ProviderService * provider services}. @@ -150,7 +154,7 @@ import java.util.stream.Stream; if (currentProxyRecord != null) { currentProxyRecord.releaseSession( requestId, existingSession.getOriginalId()); - existingSessionRecord.removeSelfFromSessionMap(); + existingSessionRecord.removeSelfFromSessionMaps(); } } } @@ -240,6 +244,24 @@ import java.util.stream.Stream; super.setRouteVolume(requestId, routeOriginalId, volume); } + @Override + public void setSessionVolume(long requestId, String sessionOriginalId, int volume) { + if (SYSTEM_SESSION_ID.equals(sessionOriginalId)) { + super.setSessionVolume(requestId, sessionOriginalId, volume); + return; + } + synchronized (mLock) { + var sessionRecord = mSessionOriginalIdToSessionRecord.get(sessionOriginalId); + var proxyRecord = sessionRecord != null ? sessionRecord.getProxyRecord() : null; + if (proxyRecord != null) { + proxyRecord.mProxy.setSessionVolume( + requestId, sessionRecord.getServiceSessionId(), volume); + return; + } + } + notifyRequestFailed(requestId, MediaRoute2ProviderService.REASON_ROUTE_NOT_AVAILABLE); + } + /** * Returns the uid that corresponds to the given name and user handle, or {@link * Process#INVALID_UID} if a uid couldn't be found. @@ -376,16 +398,17 @@ import java.util.stream.Stream; } /** - * Equivalent to {@link #asSystemRouteId}, except it takes a unique route id instead of a - * original id. + * Equivalent to {@link #asUniqueSystemId}, except it takes a unique id instead of an original + * id. */ private static String uniqueIdAsSystemRouteId(String providerId, String uniqueRouteId) { - return asSystemRouteId(providerId, MediaRouter2Utils.getOriginalId(uniqueRouteId)); + return asUniqueSystemId(providerId, MediaRouter2Utils.getOriginalId(uniqueRouteId)); } /** * Returns a unique {@link MediaRoute2Info#getOriginalId() original id} for this provider to - * publish system media routes from {@link MediaRoute2ProviderService provider services}. + * publish system media routes and sessions from {@link MediaRoute2ProviderService provider + * services}. * * <p>This provider will publish system media routes as part of the system routing session. * However, said routes may also support {@link MediaRoute2Info#FLAG_ROUTING_TYPE_REMOTE remote @@ -393,12 +416,12 @@ import java.util.stream.Stream; * we derive a {@link MediaRoute2Info#getOriginalId original id} that is unique among all * original route ids used by this provider. */ - private static String asSystemRouteId(String providerId, String originalRouteId) { - return ROUTE_ID_PREFIX_SYSTEM - + ROUTE_ID_SYSTEM_SEPARATOR + private static String asUniqueSystemId(String providerId, String originalId) { + return UNIQUE_SYSTEM_ID_PREFIX + + UNIQUE_SYSTEM_ID_SEPARATOR + providerId - + ROUTE_ID_SYSTEM_SEPARATOR - + originalRouteId; + + UNIQUE_SYSTEM_ID_SEPARATOR + + originalId; } /** @@ -485,7 +508,7 @@ import java.util.stream.Stream; continue; } String id = - asSystemRouteId(providerInfo.getUniqueId(), sourceRoute.getOriginalId()); + asUniqueSystemId(providerInfo.getUniqueId(), sourceRoute.getOriginalId()); var newRouteBuilder = new MediaRoute2Info.Builder(id, sourceRoute); if ((sourceRoute.getSupportedRoutingTypes() & MediaRoute2Info.FLAG_ROUTING_TYPE_SYSTEM_AUDIO) @@ -534,6 +557,9 @@ import java.util.stream.Stream; RoutingSessionInfo translatedSession; synchronized (mLock) { mSessionRecord = systemMediaSessionRecord; + mSessionOriginalIdToSessionRecord.put( + systemMediaSessionRecord.mOriginalId, + systemMediaSessionRecord); mPackageNameToSessionRecord.put( mClientPackageName, systemMediaSessionRecord); mPendingSessionCreations.remove(mRequestId); @@ -576,24 +602,38 @@ import java.util.stream.Stream; private final String mProviderId; - @GuardedBy("SystemMediaRoute2Provider2.this.mLock") - @NonNull - private RoutingSessionInfo mSourceSessionInfo; + /** + * The {@link RoutingSessionInfo#getOriginalId() original id} with which this session is + * published. + * + * <p>Derived from the service routing session, using {@link #asUniqueSystemId}. + */ + private final String mOriginalId; + + // @GuardedBy("SystemMediaRoute2Provider2.this.mLock") + @NonNull private RoutingSessionInfo mSourceSessionInfo; /** - * The same as {@link #mSourceSessionInfo}, except ids are {@link #asSystemRouteId system + * The same as {@link #mSourceSessionInfo}, except ids are {@link #asUniqueSystemId system * provider ids}. */ - @NonNull - private RoutingSessionInfo mTranslatedSessionInfo; + // @GuardedBy("SystemMediaRoute2Provider2.this.mLock") + @NonNull private RoutingSessionInfo mTranslatedSessionInfo; SystemMediaSessionRecord( @NonNull String providerId, @NonNull RoutingSessionInfo sessionInfo) { mProviderId = providerId; mSourceSessionInfo = sessionInfo; + mOriginalId = + asUniqueSystemId(sessionInfo.getProviderId(), sessionInfo.getOriginalId()); mTranslatedSessionInfo = asSystemProviderSession(sessionInfo); } + // @GuardedBy("SystemMediaRoute2Provider2.this.mLock") + public String getServiceSessionId() { + return mSourceSessionInfo.getOriginalId(); + } + @Override public void onSessionUpdate(@NonNull RoutingSessionInfo sessionInfo) { RoutingSessionInfo translatedSessionInfo = asSystemProviderSession(sessionInfo); @@ -612,31 +652,32 @@ import java.util.stream.Stream; @Override public void onSessionReleased() { synchronized (mLock) { - removeSelfFromSessionMap(); + removeSelfFromSessionMaps(); } notifyGlobalSessionInfoUpdated(); } - @GuardedBy("SystemMediaRoute2Provider2.this.mLock") + // @GuardedBy("SystemMediaRoute2Provider2.this.mLock") @Nullable public ProviderProxyRecord getProxyRecord() { ProviderProxyRecord provider = mProxyRecords.get(mProviderId); if (provider == null) { // Unexpected condition where the proxy is no longer available while there's an // ongoing session. Could happen due to a crash in the provider process. - removeSelfFromSessionMap(); + removeSelfFromSessionMaps(); } return provider; } - @GuardedBy("SystemMediaRoute2Provider2.this.mLock") - private void removeSelfFromSessionMap() { + // @GuardedBy("SystemMediaRoute2Provider2.this.mLock") + private void removeSelfFromSessionMaps() { + mSessionOriginalIdToSessionRecord.remove(mOriginalId); mPackageNameToSessionRecord.remove(mSourceSessionInfo.getClientPackageName()); } private RoutingSessionInfo asSystemProviderSession(RoutingSessionInfo session) { var builder = - new RoutingSessionInfo.Builder(session) + new RoutingSessionInfo.Builder(session, mOriginalId) .setProviderId(mUniqueId) .setSystemSession(true) .clearSelectedRoutes() |