Loading core/api/current.txt +1 −0 Original line number Diff line number Diff line Loading @@ -25346,6 +25346,7 @@ package android.media { method @FlaggedApi("com.android.media.flags.enable_mirroring_in_media_router_2") public void onCreateSystemRoutingSession(long, @NonNull String, @NonNull android.media.MediaRoute2ProviderService.SystemRoutingSessionParams); method public abstract void onDeselectRoute(long, @NonNull String, @NonNull String); method public void onDiscoveryPreferenceChanged(@NonNull android.media.RouteDiscoveryPreference); method @FlaggedApi("com.android.media.flags.enable_route_visibility_control_api") @RequiresPermission(value=android.Manifest.permission.MEDIA_CONTENT_CONTROL, conditional=true) public void onDiscoveryPreferenceChanged(@NonNull android.media.RouteDiscoveryPreference, @NonNull java.util.Map<java.lang.String,android.media.RouteDiscoveryPreference>); method public abstract void onReleaseSession(long, @NonNull String); method public abstract void onSelectRoute(long, @NonNull String, @NonNull String); method public abstract void onSetRouteVolume(long, @NonNull String, int); media/java/android/media/IMediaRoute2ProviderService.aidl +3 −1 Original line number Diff line number Diff line Loading @@ -28,7 +28,9 @@ oneway interface IMediaRoute2ProviderService { // Note: When changing this file, match the order of methods below with // MediaRoute2ProviderService#MediaRoute2ProviderServiceStub for readability. void setCallback(IMediaRoute2ProviderServiceCallback callback); void updateDiscoveryPreference(in RouteDiscoveryPreference discoveryPreference); void updateDiscoveryPreference( in RouteDiscoveryPreference discoveryPreference, in Map<String, RouteDiscoveryPreference> perAppPreferences); void setRouteVolume(long requestId, String routeId, int volume); void requestCreateSession(long requestId, String packageName, String routeId, Loading media/java/android/media/MediaRoute2ProviderService.java +29 −2 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package android.media; import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage; import static com.android.media.flags.Flags.FLAG_ENABLE_ROUTE_VISIBILITY_CONTROL_API; import static java.util.Objects.requireNonNull; Loading Loading @@ -55,6 +56,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Deque; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.concurrent.atomic.AtomicBoolean; Loading Loading @@ -757,6 +759,29 @@ public abstract class MediaRoute2ProviderService extends Service { */ public void onDiscoveryPreferenceChanged(@NonNull RouteDiscoveryPreference preference) {} /** * Called when any individual app's {@link RouteDiscoveryPreference discovery preference} has * changed, which typically means the composite preference has also changed. * * <p>This is similar to {@link #onDiscoveryPreferenceChanged(RouteDiscoveryPreference)} but * provides more granular per-app preference information if the provider has permission to see * it. * * @param compositePreference A composite object aggregating the route preferences for all apps * with registered {@link MediaRouter2.RouteCallback callbacks}. * @param perAppPreferences A mapping of app package name to the * {@link RouteDiscoveryPreference discovery preference} just for * that app. This map will only be populated if the caller holds the * {@link Manifest.permission#MEDIA_CONTENT_CONTROL * MEDIA_CONTENT_CONTROL} permission. */ @FlaggedApi(FLAG_ENABLE_ROUTE_VISIBILITY_CONTROL_API) @RequiresPermission(value = Manifest.permission.MEDIA_CONTENT_CONTROL, conditional = true) public void onDiscoveryPreferenceChanged(@NonNull RouteDiscoveryPreference compositePreference, @NonNull Map<String, RouteDiscoveryPreference> perAppPreferences) { onDiscoveryPreferenceChanged(compositePreference); } /** * Updates routes of the provider and notifies the system media router service. * Loading Loading @@ -943,13 +968,15 @@ public abstract class MediaRoute2ProviderService extends Service { } @Override public void updateDiscoveryPreference(RouteDiscoveryPreference discoveryPreference) { public void updateDiscoveryPreference(RouteDiscoveryPreference discoveryPreference, @NonNull Map<String, RouteDiscoveryPreference> perAppPreferences) { if (!checkCallerIsSystem()) { return; } mHandler.sendMessage(obtainMessage( MediaRoute2ProviderService::onDiscoveryPreferenceChanged, MediaRoute2ProviderService.this, discoveryPreference)); MediaRoute2ProviderService.this, discoveryPreference, perAppPreferences)); } @Override Loading services/core/java/com/android/server/media/MediaRoute2Provider.java +3 −1 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ import com.android.internal.annotations.GuardedBy; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; Loading Loading @@ -71,7 +72,8 @@ abstract class MediaRoute2Provider { public abstract void releaseSession(long requestId, String sessionId); public abstract void updateDiscoveryPreference( Set<String> activelyScanningPackages, RouteDiscoveryPreference discoveryPreference); Set<String> activelyScanningPackages, RouteDiscoveryPreference discoveryPreference, Map<String, RouteDiscoveryPreference> perAppPreferences); public abstract void selectRoute(long requestId, String sessionId, String routeId); public abstract void deselectRoute(long requestId, String sessionId, String routeId); Loading services/core/java/com/android/server/media/MediaRoute2ProviderServiceProxy.java +20 −5 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.server.media; import static android.Manifest.permission.MEDIA_CONTENT_CONTROL; import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.media.MediaRoute2ProviderService.REASON_REJECTED; import static android.media.MediaRoute2ProviderService.REQUEST_ID_NONE; Loading @@ -27,6 +29,7 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.content.pm.PackageManager; import android.media.IMediaRoute2ProviderService; import android.media.IMediaRoute2ProviderServiceCallback; import android.media.MediaRoute2Info; Loading Loading @@ -66,6 +69,7 @@ final class MediaRoute2ProviderServiceProxy extends MediaRoute2Provider { private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); private final Context mContext; private PackageManager mPackageManager; private final int mUserId; private final Handler mHandler; private final boolean mIsSelfScanOnlyProvider; Loading @@ -79,6 +83,7 @@ final class MediaRoute2ProviderServiceProxy extends MediaRoute2Provider { private boolean mConnectionReady; private RouteDiscoveryPreference mLastDiscoveryPreference = null; private Map<String, RouteDiscoveryPreference> mLastPerAppPreferences = null; private boolean mLastDiscoveryPreferenceIncludesThisPackage = false; @GuardedBy("mLock") Loading Loading @@ -108,6 +113,7 @@ final class MediaRoute2ProviderServiceProxy extends MediaRoute2Provider { int userId) { super(componentName, /* isSystemRouteProvider= */ false); mContext = Objects.requireNonNull(context, "Context must not be null."); mPackageManager = mContext.getPackageManager(); mRequestIdToSessionCreationRequest = new LongSparseArray<>(); mSessionOriginalIdToTransferRequest = new HashMap<>(); mRequestIdToSystemSessionRequest = new LongSparseArray<>(); Loading Loading @@ -161,12 +167,14 @@ final class MediaRoute2ProviderServiceProxy extends MediaRoute2Provider { @Override public void updateDiscoveryPreference( Set<String> activelyScanningPackages, RouteDiscoveryPreference discoveryPreference) { Set<String> activelyScanningPackages, RouteDiscoveryPreference discoveryPreference, Map<String, RouteDiscoveryPreference> perAppPreferences) { mLastDiscoveryPreference = discoveryPreference; mLastPerAppPreferences = perAppPreferences; mLastDiscoveryPreferenceIncludesThisPackage = activelyScanningPackages.contains(mComponentName.getPackageName()); if (mConnectionReady) { mActiveConnection.updateDiscoveryPreference(discoveryPreference); mActiveConnection.updateDiscoveryPreference(discoveryPreference, perAppPreferences); } updateBinding(); } Loading Loading @@ -457,7 +465,8 @@ final class MediaRoute2ProviderServiceProxy extends MediaRoute2Provider { mLastDiscoveryPreferenceIncludesThisPackage ? Set.of(mComponentName.getPackageName()) : Set.of(), mLastDiscoveryPreference); mLastDiscoveryPreference, mLastPerAppPreferences); } } } Loading Loading @@ -888,9 +897,15 @@ final class MediaRoute2ProviderServiceProxy extends MediaRoute2Provider { } } public void updateDiscoveryPreference(RouteDiscoveryPreference discoveryPreference) { public void updateDiscoveryPreference(RouteDiscoveryPreference discoveryPreference, Map<String, RouteDiscoveryPreference> perAppPreferences) { if (!Flags.enableRouteVisibilityControlApi() || perAppPreferences == null || mPackageManager.checkPermission(MEDIA_CONTENT_CONTROL, mComponentName.getPackageName()) != PERMISSION_GRANTED) { perAppPreferences = Map.of(); } try { mService.updateDiscoveryPreference(discoveryPreference); mService.updateDiscoveryPreference(discoveryPreference, perAppPreferences); } catch (RemoteException ex) { Slog.e(TAG, "updateDiscoveryPreference: Failed to deliver request."); } Loading Loading
core/api/current.txt +1 −0 Original line number Diff line number Diff line Loading @@ -25346,6 +25346,7 @@ package android.media { method @FlaggedApi("com.android.media.flags.enable_mirroring_in_media_router_2") public void onCreateSystemRoutingSession(long, @NonNull String, @NonNull android.media.MediaRoute2ProviderService.SystemRoutingSessionParams); method public abstract void onDeselectRoute(long, @NonNull String, @NonNull String); method public void onDiscoveryPreferenceChanged(@NonNull android.media.RouteDiscoveryPreference); method @FlaggedApi("com.android.media.flags.enable_route_visibility_control_api") @RequiresPermission(value=android.Manifest.permission.MEDIA_CONTENT_CONTROL, conditional=true) public void onDiscoveryPreferenceChanged(@NonNull android.media.RouteDiscoveryPreference, @NonNull java.util.Map<java.lang.String,android.media.RouteDiscoveryPreference>); method public abstract void onReleaseSession(long, @NonNull String); method public abstract void onSelectRoute(long, @NonNull String, @NonNull String); method public abstract void onSetRouteVolume(long, @NonNull String, int);
media/java/android/media/IMediaRoute2ProviderService.aidl +3 −1 Original line number Diff line number Diff line Loading @@ -28,7 +28,9 @@ oneway interface IMediaRoute2ProviderService { // Note: When changing this file, match the order of methods below with // MediaRoute2ProviderService#MediaRoute2ProviderServiceStub for readability. void setCallback(IMediaRoute2ProviderServiceCallback callback); void updateDiscoveryPreference(in RouteDiscoveryPreference discoveryPreference); void updateDiscoveryPreference( in RouteDiscoveryPreference discoveryPreference, in Map<String, RouteDiscoveryPreference> perAppPreferences); void setRouteVolume(long requestId, String routeId, int volume); void requestCreateSession(long requestId, String packageName, String routeId, Loading
media/java/android/media/MediaRoute2ProviderService.java +29 −2 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package android.media; import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage; import static com.android.media.flags.Flags.FLAG_ENABLE_ROUTE_VISIBILITY_CONTROL_API; import static java.util.Objects.requireNonNull; Loading Loading @@ -55,6 +56,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Deque; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.concurrent.atomic.AtomicBoolean; Loading Loading @@ -757,6 +759,29 @@ public abstract class MediaRoute2ProviderService extends Service { */ public void onDiscoveryPreferenceChanged(@NonNull RouteDiscoveryPreference preference) {} /** * Called when any individual app's {@link RouteDiscoveryPreference discovery preference} has * changed, which typically means the composite preference has also changed. * * <p>This is similar to {@link #onDiscoveryPreferenceChanged(RouteDiscoveryPreference)} but * provides more granular per-app preference information if the provider has permission to see * it. * * @param compositePreference A composite object aggregating the route preferences for all apps * with registered {@link MediaRouter2.RouteCallback callbacks}. * @param perAppPreferences A mapping of app package name to the * {@link RouteDiscoveryPreference discovery preference} just for * that app. This map will only be populated if the caller holds the * {@link Manifest.permission#MEDIA_CONTENT_CONTROL * MEDIA_CONTENT_CONTROL} permission. */ @FlaggedApi(FLAG_ENABLE_ROUTE_VISIBILITY_CONTROL_API) @RequiresPermission(value = Manifest.permission.MEDIA_CONTENT_CONTROL, conditional = true) public void onDiscoveryPreferenceChanged(@NonNull RouteDiscoveryPreference compositePreference, @NonNull Map<String, RouteDiscoveryPreference> perAppPreferences) { onDiscoveryPreferenceChanged(compositePreference); } /** * Updates routes of the provider and notifies the system media router service. * Loading Loading @@ -943,13 +968,15 @@ public abstract class MediaRoute2ProviderService extends Service { } @Override public void updateDiscoveryPreference(RouteDiscoveryPreference discoveryPreference) { public void updateDiscoveryPreference(RouteDiscoveryPreference discoveryPreference, @NonNull Map<String, RouteDiscoveryPreference> perAppPreferences) { if (!checkCallerIsSystem()) { return; } mHandler.sendMessage(obtainMessage( MediaRoute2ProviderService::onDiscoveryPreferenceChanged, MediaRoute2ProviderService.this, discoveryPreference)); MediaRoute2ProviderService.this, discoveryPreference, perAppPreferences)); } @Override Loading
services/core/java/com/android/server/media/MediaRoute2Provider.java +3 −1 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ import com.android.internal.annotations.GuardedBy; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; Loading Loading @@ -71,7 +72,8 @@ abstract class MediaRoute2Provider { public abstract void releaseSession(long requestId, String sessionId); public abstract void updateDiscoveryPreference( Set<String> activelyScanningPackages, RouteDiscoveryPreference discoveryPreference); Set<String> activelyScanningPackages, RouteDiscoveryPreference discoveryPreference, Map<String, RouteDiscoveryPreference> perAppPreferences); public abstract void selectRoute(long requestId, String sessionId, String routeId); public abstract void deselectRoute(long requestId, String sessionId, String routeId); Loading
services/core/java/com/android/server/media/MediaRoute2ProviderServiceProxy.java +20 −5 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.server.media; import static android.Manifest.permission.MEDIA_CONTENT_CONTROL; import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.media.MediaRoute2ProviderService.REASON_REJECTED; import static android.media.MediaRoute2ProviderService.REQUEST_ID_NONE; Loading @@ -27,6 +29,7 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.content.pm.PackageManager; import android.media.IMediaRoute2ProviderService; import android.media.IMediaRoute2ProviderServiceCallback; import android.media.MediaRoute2Info; Loading Loading @@ -66,6 +69,7 @@ final class MediaRoute2ProviderServiceProxy extends MediaRoute2Provider { private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); private final Context mContext; private PackageManager mPackageManager; private final int mUserId; private final Handler mHandler; private final boolean mIsSelfScanOnlyProvider; Loading @@ -79,6 +83,7 @@ final class MediaRoute2ProviderServiceProxy extends MediaRoute2Provider { private boolean mConnectionReady; private RouteDiscoveryPreference mLastDiscoveryPreference = null; private Map<String, RouteDiscoveryPreference> mLastPerAppPreferences = null; private boolean mLastDiscoveryPreferenceIncludesThisPackage = false; @GuardedBy("mLock") Loading Loading @@ -108,6 +113,7 @@ final class MediaRoute2ProviderServiceProxy extends MediaRoute2Provider { int userId) { super(componentName, /* isSystemRouteProvider= */ false); mContext = Objects.requireNonNull(context, "Context must not be null."); mPackageManager = mContext.getPackageManager(); mRequestIdToSessionCreationRequest = new LongSparseArray<>(); mSessionOriginalIdToTransferRequest = new HashMap<>(); mRequestIdToSystemSessionRequest = new LongSparseArray<>(); Loading Loading @@ -161,12 +167,14 @@ final class MediaRoute2ProviderServiceProxy extends MediaRoute2Provider { @Override public void updateDiscoveryPreference( Set<String> activelyScanningPackages, RouteDiscoveryPreference discoveryPreference) { Set<String> activelyScanningPackages, RouteDiscoveryPreference discoveryPreference, Map<String, RouteDiscoveryPreference> perAppPreferences) { mLastDiscoveryPreference = discoveryPreference; mLastPerAppPreferences = perAppPreferences; mLastDiscoveryPreferenceIncludesThisPackage = activelyScanningPackages.contains(mComponentName.getPackageName()); if (mConnectionReady) { mActiveConnection.updateDiscoveryPreference(discoveryPreference); mActiveConnection.updateDiscoveryPreference(discoveryPreference, perAppPreferences); } updateBinding(); } Loading Loading @@ -457,7 +465,8 @@ final class MediaRoute2ProviderServiceProxy extends MediaRoute2Provider { mLastDiscoveryPreferenceIncludesThisPackage ? Set.of(mComponentName.getPackageName()) : Set.of(), mLastDiscoveryPreference); mLastDiscoveryPreference, mLastPerAppPreferences); } } } Loading Loading @@ -888,9 +897,15 @@ final class MediaRoute2ProviderServiceProxy extends MediaRoute2Provider { } } public void updateDiscoveryPreference(RouteDiscoveryPreference discoveryPreference) { public void updateDiscoveryPreference(RouteDiscoveryPreference discoveryPreference, Map<String, RouteDiscoveryPreference> perAppPreferences) { if (!Flags.enableRouteVisibilityControlApi() || perAppPreferences == null || mPackageManager.checkPermission(MEDIA_CONTENT_CONTROL, mComponentName.getPackageName()) != PERMISSION_GRANTED) { perAppPreferences = Map.of(); } try { mService.updateDiscoveryPreference(discoveryPreference); mService.updateDiscoveryPreference(discoveryPreference, perAppPreferences); } catch (RemoteException ex) { Slog.e(TAG, "updateDiscoveryPreference: Failed to deliver request."); } Loading