diff options
| -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() |