Loading services/core/Android.bp +8 −0 Original line number Diff line number Diff line Loading @@ -121,6 +121,13 @@ genrule { out: ["com/android/server/location/contexthub/ContextHubStatsLog.java"], } genrule { name: "statslog-mediarouter-java-gen", tools: ["stats-log-api-gen"], cmd: "$(location stats-log-api-gen) --java $(out) --module mediarouter --javaPackage com.android.server.media --javaClass MediaRouterStatsLog", out: ["com/android/server/media/MediaRouterStatsLog.java"], } java_library_static { name: "services.core.unboosted", defaults: [ Loading @@ -136,6 +143,7 @@ java_library_static { ":android.hardware.tv.mediaquality-V1-java-source", ":statslog-art-java-gen", ":statslog-contexthub-java-gen", ":statslog-mediarouter-java-gen", ":services.core-aidl-sources", ":services.core-sources", ":services.core.protologsrc", Loading services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java +128 −36 Original line number Diff line number Diff line Loading @@ -25,8 +25,20 @@ import static android.media.MediaRouter2.SCANNING_STATE_SCANNING_FULL; import static android.media.MediaRouter2.SCANNING_STATE_WHILE_INTERACTIVE; import static android.media.MediaRouter2Utils.getOriginalId; import static android.media.MediaRouter2Utils.getProviderId; import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage; import static com.android.server.media.MediaRouterStatsLog.MEDIA_ROUTER_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_CREATE_SESSION; import static com.android.server.media.MediaRouterStatsLog.MEDIA_ROUTER_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_DESELECT_ROUTE; import static com.android.server.media.MediaRouterStatsLog.MEDIA_ROUTER_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_RELEASE_SESSION; import static com.android.server.media.MediaRouterStatsLog.MEDIA_ROUTER_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_SELECT_ROUTE; import static com.android.server.media.MediaRouterStatsLog.MEDIA_ROUTER_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_TRANSFER_TO_ROUTE; import static com.android.server.media.MediaRouterStatsLog.MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_INVALID_COMMAND; import static com.android.server.media.MediaRouterStatsLog.MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_INVALID_ROUTE_ID; import static com.android.server.media.MediaRouterStatsLog.MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_INVALID_SESSION_ID; import static com.android.server.media.MediaRouterStatsLog.MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_MANAGER_RECORD_NOT_FOUND; import static com.android.server.media.MediaRouterStatsLog.MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_PERMISSION_DENIED; import static com.android.server.media.MediaRouterStatsLog.MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_ROUTER_RECORD_NOT_FOUND; import static com.android.server.media.MediaRouterStatsLog.MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_SUCCESS; import static com.android.server.media.MediaRouterStatsLog.MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_UNSPECIFIED; import android.Manifest; import android.annotation.NonNull; Loading Loading @@ -64,14 +76,12 @@ import android.util.ArrayMap; import android.util.Log; import android.util.Slog; import android.util.SparseArray; import com.android.internal.annotations.GuardedBy; import com.android.internal.util.function.pooled.PooledLambda; import com.android.media.flags.Flags; import com.android.server.LocalServices; import com.android.server.pm.UserManagerInternal; import com.android.server.statusbar.StatusBarManagerInternal; import java.io.PrintWriter; import java.lang.ref.WeakReference; import java.util.ArrayList; Loading Loading @@ -130,9 +140,14 @@ class MediaRouter2ServiceImpl { private final ArrayMap<IBinder, RouterRecord> mAllRouterRecords = new ArrayMap<>(); @GuardedBy("mLock") private final ArrayMap<IBinder, ManagerRecord> mAllManagerRecords = new ArrayMap<>(); @GuardedBy("mLock") private int mCurrentActiveUserId = -1; @GuardedBy("mLock") private static final MediaRouterMetricLogger mMediaRouterMetricLogger = new MediaRouterMetricLogger(); private final ActivityManager.OnUidImportanceListener mOnUidImportanceListener = (uid, importance) -> { synchronized (mLock) { Loading Loading @@ -350,8 +365,8 @@ class MediaRouter2ServiceImpl { } } public void setDiscoveryRequestWithRouter2(@NonNull IMediaRouter2 router, @NonNull RouteDiscoveryPreference preference) { public void setDiscoveryRequestWithRouter2( @NonNull IMediaRouter2 router, @NonNull RouteDiscoveryPreference preference) { Objects.requireNonNull(router, "router must not be null"); Objects.requireNonNull(preference, "preference must not be null"); Loading Loading @@ -409,8 +424,8 @@ class MediaRouter2ServiceImpl { } } public void setRouteVolumeWithRouter2(@NonNull IMediaRouter2 router, @NonNull MediaRoute2Info route, int volume) { public void setRouteVolumeWithRouter2( @NonNull IMediaRouter2 router, @NonNull MediaRoute2Info route, int volume) { Objects.requireNonNull(router, "router must not be null"); Objects.requireNonNull(route, "route must not be null"); Loading Loading @@ -439,12 +454,7 @@ class MediaRouter2ServiceImpl { try { synchronized (mLock) { requestCreateSessionWithRouter2Locked( requestId, managerRequestId, router, oldSession, route, sessionHints); requestId, managerRequestId, router, oldSession, route, sessionHints); } } finally { Binder.restoreCallingIdentity(token); Loading Loading @@ -1326,6 +1336,9 @@ class MediaRouter2ServiceImpl { final RouterRecord routerRecord = mAllRouterRecords.get(binder); if (routerRecord == null) { mMediaRouterMetricLogger.logOperationFailure( MEDIA_ROUTER_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_CREATE_SESSION, MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_ROUTER_RECORD_NOT_FOUND); return; } Loading @@ -1344,15 +1357,22 @@ class MediaRouter2ServiceImpl { if (managerRequestId != MediaRoute2ProviderService.REQUEST_ID_NONE) { ManagerRecord manager = userHandler.findManagerWithId(toRequesterId(managerRequestId)); if (manager == null || manager.mLastSessionCreationRequest == null) { Slog.w(TAG, "requestCreateSessionWithRouter2Locked: " + "Ignoring unknown request."); Slog.w(TAG, "requestCreateSessionWithRouter2Locked: Ignoring unknown request."); mMediaRouterMetricLogger.logOperationFailure( MEDIA_ROUTER_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_CREATE_SESSION, MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_MANAGER_RECORD_NOT_FOUND); routerRecord.notifySessionCreationFailed(requestId); return; } if (!TextUtils.equals(manager.mLastSessionCreationRequest.mOldSession.getId(), oldSession.getId())) { Slog.w(TAG, "requestCreateSessionWithRouter2Locked: " if (!TextUtils.equals( manager.mLastSessionCreationRequest.mOldSession.getId(), oldSession.getId())) { Slog.w( TAG, "requestCreateSessionWithRouter2Locked: " + "Ignoring unmatched routing session."); mMediaRouterMetricLogger.logOperationFailure( MEDIA_ROUTER_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_CREATE_SESSION, MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_INVALID_SESSION_ID); routerRecord.notifySessionCreationFailed(requestId); return; } Loading @@ -1364,8 +1384,13 @@ class MediaRouter2ServiceImpl { && route.isSystemRoute()) { route = manager.mLastSessionCreationRequest.mRoute; } else { Slog.w(TAG, "requestCreateSessionWithRouter2Locked: " Slog.w( TAG, "requestCreateSessionWithRouter2Locked: " + "Ignoring unmatched route."); mMediaRouterMetricLogger.logOperationFailure( MEDIA_ROUTER_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_CREATE_SESSION, MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_INVALID_ROUTE_ID); routerRecord.notifySessionCreationFailed(requestId); return; } Loading @@ -1376,14 +1401,19 @@ class MediaRouter2ServiceImpl { if (route.isSystemRoute() && !routerRecord.hasSystemRoutingPermission() && !TextUtils.equals(route.getId(), defaultRouteId)) { Slog.w(TAG, "MODIFY_AUDIO_ROUTING permission is required to transfer to" + route); Slog.w(TAG, "MODIFY_AUDIO_ROUTING permission is required to transfer to" + route); mMediaRouterMetricLogger.logOperationFailure( MEDIA_ROUTER_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_CREATE_SESSION, MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_PERMISSION_DENIED); routerRecord.notifySessionCreationFailed(requestId); return; } } long uniqueRequestId = toUniqueRequestId(routerRecord.mRouterId, requestId); mMediaRouterMetricLogger.addRequestInfo( uniqueRequestId, MEDIA_ROUTER_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_CREATE_SESSION); userHandler.sendMessage( obtainMessage( UserHandler::requestCreateSessionWithRouter2OnHandler, Loading @@ -1403,6 +1433,9 @@ class MediaRouter2ServiceImpl { final RouterRecord routerRecord = mAllRouterRecords.get(binder); if (routerRecord == null) { mMediaRouterMetricLogger.logOperationFailure( MEDIA_ROUTER_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_SELECT_ROUTE, MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_ROUTER_RECORD_NOT_FOUND); return; } Loading @@ -1411,6 +1444,9 @@ class MediaRouter2ServiceImpl { TextUtils.formatSimple( "selectRouteWithRouter2 | router: %s(id: %d), route: %s", routerRecord.mPackageName, routerRecord.mRouterId, route.getId())); mMediaRouterMetricLogger.logOperationTriggered( MEDIA_ROUTER_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_SELECT_ROUTE, MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_UNSPECIFIED); routerRecord.mUserRecord.mHandler.sendMessage( obtainMessage(UserHandler::selectRouteOnHandler, Loading @@ -1425,6 +1461,9 @@ class MediaRouter2ServiceImpl { final RouterRecord routerRecord = mAllRouterRecords.get(binder); if (routerRecord == null) { mMediaRouterMetricLogger.logOperationFailure( MEDIA_ROUTER_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_DESELECT_ROUTE, MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_ROUTER_RECORD_NOT_FOUND); return; } Loading @@ -1433,6 +1472,9 @@ class MediaRouter2ServiceImpl { TextUtils.formatSimple( "deselectRouteWithRouter2 | router: %s(id: %d), route: %s", routerRecord.mPackageName, routerRecord.mRouterId, route.getId())); mMediaRouterMetricLogger.logOperationTriggered( MEDIA_ROUTER_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_DESELECT_ROUTE, MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_UNSPECIFIED); routerRecord.mUserRecord.mHandler.sendMessage( obtainMessage(UserHandler::deselectRouteOnHandler, Loading @@ -1450,6 +1492,9 @@ class MediaRouter2ServiceImpl { final RouterRecord routerRecord = mAllRouterRecords.get(binder); if (routerRecord == null) { mMediaRouterMetricLogger.logOperationFailure( MEDIA_ROUTER_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_TRANSFER_TO_ROUTE, MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_ROUTER_RECORD_NOT_FOUND); return; } Loading @@ -1458,6 +1503,9 @@ class MediaRouter2ServiceImpl { TextUtils.formatSimple( "transferToRouteWithRouter2 | router: %s(id: %d), route: %s", routerRecord.mPackageName, routerRecord.mRouterId, route.getId())); mMediaRouterMetricLogger.logOperationTriggered( MEDIA_ROUTER_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_TRANSFER_TO_ROUTE, MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_UNSPECIFIED); UserHandler userHandler = routerRecord.mUserRecord.mHandler; String defaultRouteId = userHandler.getSystemProvider().getDefaultRoute().getId(); Loading Loading @@ -1516,6 +1564,9 @@ class MediaRouter2ServiceImpl { final RouterRecord routerRecord = mAllRouterRecords.get(binder); if (routerRecord == null) { mMediaRouterMetricLogger.logOperationFailure( MEDIA_ROUTER_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_RELEASE_SESSION, MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_ROUTER_RECORD_NOT_FOUND); return; } Loading Loading @@ -1794,6 +1845,9 @@ class MediaRouter2ServiceImpl { .findRouterWithSessionLocked(uniqueSessionId); long uniqueRequestId = toUniqueRequestId(managerRecord.mManagerId, requestId); mMediaRouterMetricLogger.addRequestInfo( uniqueRequestId, MEDIA_ROUTER_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_SELECT_ROUTE); managerRecord.mUserRecord.mHandler.sendMessage( obtainMessage(UserHandler::selectRouteOnHandler, managerRecord.mUserRecord.mHandler, Loading @@ -1820,6 +1874,10 @@ class MediaRouter2ServiceImpl { .findRouterWithSessionLocked(uniqueSessionId); long uniqueRequestId = toUniqueRequestId(managerRecord.mManagerId, requestId); mMediaRouterMetricLogger.addRequestInfo( uniqueRequestId, MEDIA_ROUTER_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_DESELECT_ROUTE); managerRecord.mUserRecord.mHandler.sendMessage( obtainMessage(UserHandler::deselectRouteOnHandler, managerRecord.mUserRecord.mHandler, Loading Loading @@ -1851,6 +1909,10 @@ class MediaRouter2ServiceImpl { .findRouterWithSessionLocked(uniqueSessionId); long uniqueRequestId = toUniqueRequestId(managerRecord.mManagerId, requestId); mMediaRouterMetricLogger.addRequestInfo( uniqueRequestId, MEDIA_ROUTER_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_TRANSFER_TO_ROUTE); managerRecord.mUserRecord.mHandler.sendMessage( obtainMessage( UserHandler::transferToRouteOnHandler, Loading Loading @@ -2792,7 +2854,8 @@ class MediaRouter2ServiceImpl { if (!addedRoutes.isEmpty()) { // If routes were added, newInfo cannot be null. Slog.i(TAG, Slog.i( TAG, toLoggingMessage( /* source= */ "addProviderRoutes", newInfo.getUniqueId(), Loading Loading @@ -2954,7 +3017,7 @@ class MediaRouter2ServiceImpl { private void selectRouteOnHandler(long uniqueRequestId, @Nullable RouterRecord routerRecord, @NonNull String uniqueSessionId, @NonNull MediaRoute2Info route) { if (!checkArgumentsForSessionControl(routerRecord, uniqueSessionId, route, "selecting")) { "selecting", uniqueRequestId)) { return; } Loading @@ -2963,8 +3026,12 @@ class MediaRouter2ServiceImpl { if (provider == null) { return; } provider.selectRoute(uniqueRequestId, getOriginalId(uniqueSessionId), route.getOriginalId()); provider.selectRoute( uniqueRequestId, getOriginalId(uniqueSessionId), route.getOriginalId()); // Log the success result. mMediaRouterMetricLogger.logRequestResult( uniqueRequestId, MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_SUCCESS); } // routerRecord can be null if the session is system's or RCN. Loading @@ -2972,7 +3039,7 @@ class MediaRouter2ServiceImpl { @Nullable RouterRecord routerRecord, @NonNull String uniqueSessionId, @NonNull MediaRoute2Info route) { if (!checkArgumentsForSessionControl(routerRecord, uniqueSessionId, route, "deselecting")) { "deselecting", uniqueRequestId)) { return; } Loading @@ -2982,8 +3049,12 @@ class MediaRouter2ServiceImpl { return; } provider.deselectRoute(uniqueRequestId, getOriginalId(uniqueSessionId), route.getOriginalId()); provider.deselectRoute( uniqueRequestId, getOriginalId(uniqueSessionId), route.getOriginalId()); // Log the success result. mMediaRouterMetricLogger.logRequestResult( uniqueRequestId, MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_SUCCESS); } // routerRecord can be null if the session is system's or RCN. Loading @@ -2996,7 +3067,7 @@ class MediaRouter2ServiceImpl { @NonNull MediaRoute2Info route, @RoutingSessionInfo.TransferReason int transferReason) { if (!checkArgumentsForSessionControl(routerRecord, uniqueSessionId, route, "transferring to")) { "transferring to", uniqueRequestId)) { return; } Loading @@ -3016,18 +3087,25 @@ class MediaRouter2ServiceImpl { getOriginalId(uniqueSessionId), route.getOriginalId(), transferReason); // Log the success result. mMediaRouterMetricLogger.logRequestResult( uniqueRequestId, MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_SUCCESS); } // routerRecord is null if and only if the session is created without the request, which // includes the system's session and RCN cases. private boolean checkArgumentsForSessionControl(@Nullable RouterRecord routerRecord, @NonNull String uniqueSessionId, @NonNull MediaRoute2Info route, @NonNull String description) { @NonNull String description, long uniqueRequestId) { final String providerId = route.getProviderId(); final MediaRoute2Provider provider = findProvider(providerId); if (provider == null) { Slog.w(TAG, "Ignoring " + description + " route since no provider found for " + "given route=" + route); mMediaRouterMetricLogger.logRequestResult( uniqueRequestId, MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_INVALID_COMMAND); return false; } Loading @@ -3050,6 +3128,9 @@ class MediaRouter2ServiceImpl { + getPackageNameFromNullableRecord(matchingRecord) + " route=" + route); mMediaRouterMetricLogger.logRequestResult( uniqueRequestId, MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_ROUTER_RECORD_NOT_FOUND); return false; } Loading @@ -3057,6 +3138,9 @@ class MediaRouter2ServiceImpl { if (sessionId == null) { Slog.w(TAG, "Failed to get original session id from unique session id. " + "uniqueSessionId=" + uniqueSessionId); mMediaRouterMetricLogger.logRequestResult( uniqueRequestId, MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_INVALID_SESSION_ID); return false; } Loading Loading @@ -3168,6 +3252,10 @@ class MediaRouter2ServiceImpl { } matchingRequest.mRouterRecord.notifySessionCreated( toOriginalRequestId(uniqueRequestId), sessionInfo); // Log the success result. mMediaRouterMetricLogger.logRequestResult( uniqueRequestId, MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_SUCCESS); } /** Loading Loading @@ -3255,10 +3343,14 @@ class MediaRouter2ServiceImpl { // Currently, only manager records can get notified of failures. // TODO(b/282936553): Notify regular routers of request failures. // Log the request result. mMediaRouterMetricLogger.logRequestResult( uniqueRequestId, MediaRouterMetricLogger.convertResultFromReason(reason)); } private boolean handleSessionCreationRequestFailed(@NonNull MediaRoute2Provider provider, long uniqueRequestId, int reason) { private boolean handleSessionCreationRequestFailed( @NonNull MediaRoute2Provider provider, long uniqueRequestId, int reason) { // Check whether the failure is about creating a session SessionCreationRequest matchingRequest = null; for (SessionCreationRequest request : mSessionCreationRequests) { Loading Loading @@ -3385,8 +3477,8 @@ class MediaRouter2ServiceImpl { } } private void notifySessionCreatedToManagers(long managerRequestId, @NonNull RoutingSessionInfo session) { private void notifySessionCreatedToManagers( long managerRequestId, @NonNull RoutingSessionInfo session) { int requesterId = toRequesterId(managerRequestId); int originalRequestId = toOriginalRequestId(managerRequestId); Loading Loading
services/core/Android.bp +8 −0 Original line number Diff line number Diff line Loading @@ -121,6 +121,13 @@ genrule { out: ["com/android/server/location/contexthub/ContextHubStatsLog.java"], } genrule { name: "statslog-mediarouter-java-gen", tools: ["stats-log-api-gen"], cmd: "$(location stats-log-api-gen) --java $(out) --module mediarouter --javaPackage com.android.server.media --javaClass MediaRouterStatsLog", out: ["com/android/server/media/MediaRouterStatsLog.java"], } java_library_static { name: "services.core.unboosted", defaults: [ Loading @@ -136,6 +143,7 @@ java_library_static { ":android.hardware.tv.mediaquality-V1-java-source", ":statslog-art-java-gen", ":statslog-contexthub-java-gen", ":statslog-mediarouter-java-gen", ":services.core-aidl-sources", ":services.core-sources", ":services.core.protologsrc", Loading
services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java +128 −36 Original line number Diff line number Diff line Loading @@ -25,8 +25,20 @@ import static android.media.MediaRouter2.SCANNING_STATE_SCANNING_FULL; import static android.media.MediaRouter2.SCANNING_STATE_WHILE_INTERACTIVE; import static android.media.MediaRouter2Utils.getOriginalId; import static android.media.MediaRouter2Utils.getProviderId; import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage; import static com.android.server.media.MediaRouterStatsLog.MEDIA_ROUTER_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_CREATE_SESSION; import static com.android.server.media.MediaRouterStatsLog.MEDIA_ROUTER_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_DESELECT_ROUTE; import static com.android.server.media.MediaRouterStatsLog.MEDIA_ROUTER_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_RELEASE_SESSION; import static com.android.server.media.MediaRouterStatsLog.MEDIA_ROUTER_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_SELECT_ROUTE; import static com.android.server.media.MediaRouterStatsLog.MEDIA_ROUTER_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_TRANSFER_TO_ROUTE; import static com.android.server.media.MediaRouterStatsLog.MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_INVALID_COMMAND; import static com.android.server.media.MediaRouterStatsLog.MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_INVALID_ROUTE_ID; import static com.android.server.media.MediaRouterStatsLog.MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_INVALID_SESSION_ID; import static com.android.server.media.MediaRouterStatsLog.MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_MANAGER_RECORD_NOT_FOUND; import static com.android.server.media.MediaRouterStatsLog.MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_PERMISSION_DENIED; import static com.android.server.media.MediaRouterStatsLog.MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_ROUTER_RECORD_NOT_FOUND; import static com.android.server.media.MediaRouterStatsLog.MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_SUCCESS; import static com.android.server.media.MediaRouterStatsLog.MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_UNSPECIFIED; import android.Manifest; import android.annotation.NonNull; Loading Loading @@ -64,14 +76,12 @@ import android.util.ArrayMap; import android.util.Log; import android.util.Slog; import android.util.SparseArray; import com.android.internal.annotations.GuardedBy; import com.android.internal.util.function.pooled.PooledLambda; import com.android.media.flags.Flags; import com.android.server.LocalServices; import com.android.server.pm.UserManagerInternal; import com.android.server.statusbar.StatusBarManagerInternal; import java.io.PrintWriter; import java.lang.ref.WeakReference; import java.util.ArrayList; Loading Loading @@ -130,9 +140,14 @@ class MediaRouter2ServiceImpl { private final ArrayMap<IBinder, RouterRecord> mAllRouterRecords = new ArrayMap<>(); @GuardedBy("mLock") private final ArrayMap<IBinder, ManagerRecord> mAllManagerRecords = new ArrayMap<>(); @GuardedBy("mLock") private int mCurrentActiveUserId = -1; @GuardedBy("mLock") private static final MediaRouterMetricLogger mMediaRouterMetricLogger = new MediaRouterMetricLogger(); private final ActivityManager.OnUidImportanceListener mOnUidImportanceListener = (uid, importance) -> { synchronized (mLock) { Loading Loading @@ -350,8 +365,8 @@ class MediaRouter2ServiceImpl { } } public void setDiscoveryRequestWithRouter2(@NonNull IMediaRouter2 router, @NonNull RouteDiscoveryPreference preference) { public void setDiscoveryRequestWithRouter2( @NonNull IMediaRouter2 router, @NonNull RouteDiscoveryPreference preference) { Objects.requireNonNull(router, "router must not be null"); Objects.requireNonNull(preference, "preference must not be null"); Loading Loading @@ -409,8 +424,8 @@ class MediaRouter2ServiceImpl { } } public void setRouteVolumeWithRouter2(@NonNull IMediaRouter2 router, @NonNull MediaRoute2Info route, int volume) { public void setRouteVolumeWithRouter2( @NonNull IMediaRouter2 router, @NonNull MediaRoute2Info route, int volume) { Objects.requireNonNull(router, "router must not be null"); Objects.requireNonNull(route, "route must not be null"); Loading Loading @@ -439,12 +454,7 @@ class MediaRouter2ServiceImpl { try { synchronized (mLock) { requestCreateSessionWithRouter2Locked( requestId, managerRequestId, router, oldSession, route, sessionHints); requestId, managerRequestId, router, oldSession, route, sessionHints); } } finally { Binder.restoreCallingIdentity(token); Loading Loading @@ -1326,6 +1336,9 @@ class MediaRouter2ServiceImpl { final RouterRecord routerRecord = mAllRouterRecords.get(binder); if (routerRecord == null) { mMediaRouterMetricLogger.logOperationFailure( MEDIA_ROUTER_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_CREATE_SESSION, MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_ROUTER_RECORD_NOT_FOUND); return; } Loading @@ -1344,15 +1357,22 @@ class MediaRouter2ServiceImpl { if (managerRequestId != MediaRoute2ProviderService.REQUEST_ID_NONE) { ManagerRecord manager = userHandler.findManagerWithId(toRequesterId(managerRequestId)); if (manager == null || manager.mLastSessionCreationRequest == null) { Slog.w(TAG, "requestCreateSessionWithRouter2Locked: " + "Ignoring unknown request."); Slog.w(TAG, "requestCreateSessionWithRouter2Locked: Ignoring unknown request."); mMediaRouterMetricLogger.logOperationFailure( MEDIA_ROUTER_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_CREATE_SESSION, MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_MANAGER_RECORD_NOT_FOUND); routerRecord.notifySessionCreationFailed(requestId); return; } if (!TextUtils.equals(manager.mLastSessionCreationRequest.mOldSession.getId(), oldSession.getId())) { Slog.w(TAG, "requestCreateSessionWithRouter2Locked: " if (!TextUtils.equals( manager.mLastSessionCreationRequest.mOldSession.getId(), oldSession.getId())) { Slog.w( TAG, "requestCreateSessionWithRouter2Locked: " + "Ignoring unmatched routing session."); mMediaRouterMetricLogger.logOperationFailure( MEDIA_ROUTER_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_CREATE_SESSION, MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_INVALID_SESSION_ID); routerRecord.notifySessionCreationFailed(requestId); return; } Loading @@ -1364,8 +1384,13 @@ class MediaRouter2ServiceImpl { && route.isSystemRoute()) { route = manager.mLastSessionCreationRequest.mRoute; } else { Slog.w(TAG, "requestCreateSessionWithRouter2Locked: " Slog.w( TAG, "requestCreateSessionWithRouter2Locked: " + "Ignoring unmatched route."); mMediaRouterMetricLogger.logOperationFailure( MEDIA_ROUTER_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_CREATE_SESSION, MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_INVALID_ROUTE_ID); routerRecord.notifySessionCreationFailed(requestId); return; } Loading @@ -1376,14 +1401,19 @@ class MediaRouter2ServiceImpl { if (route.isSystemRoute() && !routerRecord.hasSystemRoutingPermission() && !TextUtils.equals(route.getId(), defaultRouteId)) { Slog.w(TAG, "MODIFY_AUDIO_ROUTING permission is required to transfer to" + route); Slog.w(TAG, "MODIFY_AUDIO_ROUTING permission is required to transfer to" + route); mMediaRouterMetricLogger.logOperationFailure( MEDIA_ROUTER_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_CREATE_SESSION, MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_PERMISSION_DENIED); routerRecord.notifySessionCreationFailed(requestId); return; } } long uniqueRequestId = toUniqueRequestId(routerRecord.mRouterId, requestId); mMediaRouterMetricLogger.addRequestInfo( uniqueRequestId, MEDIA_ROUTER_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_CREATE_SESSION); userHandler.sendMessage( obtainMessage( UserHandler::requestCreateSessionWithRouter2OnHandler, Loading @@ -1403,6 +1433,9 @@ class MediaRouter2ServiceImpl { final RouterRecord routerRecord = mAllRouterRecords.get(binder); if (routerRecord == null) { mMediaRouterMetricLogger.logOperationFailure( MEDIA_ROUTER_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_SELECT_ROUTE, MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_ROUTER_RECORD_NOT_FOUND); return; } Loading @@ -1411,6 +1444,9 @@ class MediaRouter2ServiceImpl { TextUtils.formatSimple( "selectRouteWithRouter2 | router: %s(id: %d), route: %s", routerRecord.mPackageName, routerRecord.mRouterId, route.getId())); mMediaRouterMetricLogger.logOperationTriggered( MEDIA_ROUTER_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_SELECT_ROUTE, MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_UNSPECIFIED); routerRecord.mUserRecord.mHandler.sendMessage( obtainMessage(UserHandler::selectRouteOnHandler, Loading @@ -1425,6 +1461,9 @@ class MediaRouter2ServiceImpl { final RouterRecord routerRecord = mAllRouterRecords.get(binder); if (routerRecord == null) { mMediaRouterMetricLogger.logOperationFailure( MEDIA_ROUTER_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_DESELECT_ROUTE, MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_ROUTER_RECORD_NOT_FOUND); return; } Loading @@ -1433,6 +1472,9 @@ class MediaRouter2ServiceImpl { TextUtils.formatSimple( "deselectRouteWithRouter2 | router: %s(id: %d), route: %s", routerRecord.mPackageName, routerRecord.mRouterId, route.getId())); mMediaRouterMetricLogger.logOperationTriggered( MEDIA_ROUTER_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_DESELECT_ROUTE, MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_UNSPECIFIED); routerRecord.mUserRecord.mHandler.sendMessage( obtainMessage(UserHandler::deselectRouteOnHandler, Loading @@ -1450,6 +1492,9 @@ class MediaRouter2ServiceImpl { final RouterRecord routerRecord = mAllRouterRecords.get(binder); if (routerRecord == null) { mMediaRouterMetricLogger.logOperationFailure( MEDIA_ROUTER_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_TRANSFER_TO_ROUTE, MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_ROUTER_RECORD_NOT_FOUND); return; } Loading @@ -1458,6 +1503,9 @@ class MediaRouter2ServiceImpl { TextUtils.formatSimple( "transferToRouteWithRouter2 | router: %s(id: %d), route: %s", routerRecord.mPackageName, routerRecord.mRouterId, route.getId())); mMediaRouterMetricLogger.logOperationTriggered( MEDIA_ROUTER_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_TRANSFER_TO_ROUTE, MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_UNSPECIFIED); UserHandler userHandler = routerRecord.mUserRecord.mHandler; String defaultRouteId = userHandler.getSystemProvider().getDefaultRoute().getId(); Loading Loading @@ -1516,6 +1564,9 @@ class MediaRouter2ServiceImpl { final RouterRecord routerRecord = mAllRouterRecords.get(binder); if (routerRecord == null) { mMediaRouterMetricLogger.logOperationFailure( MEDIA_ROUTER_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_RELEASE_SESSION, MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_ROUTER_RECORD_NOT_FOUND); return; } Loading Loading @@ -1794,6 +1845,9 @@ class MediaRouter2ServiceImpl { .findRouterWithSessionLocked(uniqueSessionId); long uniqueRequestId = toUniqueRequestId(managerRecord.mManagerId, requestId); mMediaRouterMetricLogger.addRequestInfo( uniqueRequestId, MEDIA_ROUTER_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_SELECT_ROUTE); managerRecord.mUserRecord.mHandler.sendMessage( obtainMessage(UserHandler::selectRouteOnHandler, managerRecord.mUserRecord.mHandler, Loading @@ -1820,6 +1874,10 @@ class MediaRouter2ServiceImpl { .findRouterWithSessionLocked(uniqueSessionId); long uniqueRequestId = toUniqueRequestId(managerRecord.mManagerId, requestId); mMediaRouterMetricLogger.addRequestInfo( uniqueRequestId, MEDIA_ROUTER_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_DESELECT_ROUTE); managerRecord.mUserRecord.mHandler.sendMessage( obtainMessage(UserHandler::deselectRouteOnHandler, managerRecord.mUserRecord.mHandler, Loading Loading @@ -1851,6 +1909,10 @@ class MediaRouter2ServiceImpl { .findRouterWithSessionLocked(uniqueSessionId); long uniqueRequestId = toUniqueRequestId(managerRecord.mManagerId, requestId); mMediaRouterMetricLogger.addRequestInfo( uniqueRequestId, MEDIA_ROUTER_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_TRANSFER_TO_ROUTE); managerRecord.mUserRecord.mHandler.sendMessage( obtainMessage( UserHandler::transferToRouteOnHandler, Loading Loading @@ -2792,7 +2854,8 @@ class MediaRouter2ServiceImpl { if (!addedRoutes.isEmpty()) { // If routes were added, newInfo cannot be null. Slog.i(TAG, Slog.i( TAG, toLoggingMessage( /* source= */ "addProviderRoutes", newInfo.getUniqueId(), Loading Loading @@ -2954,7 +3017,7 @@ class MediaRouter2ServiceImpl { private void selectRouteOnHandler(long uniqueRequestId, @Nullable RouterRecord routerRecord, @NonNull String uniqueSessionId, @NonNull MediaRoute2Info route) { if (!checkArgumentsForSessionControl(routerRecord, uniqueSessionId, route, "selecting")) { "selecting", uniqueRequestId)) { return; } Loading @@ -2963,8 +3026,12 @@ class MediaRouter2ServiceImpl { if (provider == null) { return; } provider.selectRoute(uniqueRequestId, getOriginalId(uniqueSessionId), route.getOriginalId()); provider.selectRoute( uniqueRequestId, getOriginalId(uniqueSessionId), route.getOriginalId()); // Log the success result. mMediaRouterMetricLogger.logRequestResult( uniqueRequestId, MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_SUCCESS); } // routerRecord can be null if the session is system's or RCN. Loading @@ -2972,7 +3039,7 @@ class MediaRouter2ServiceImpl { @Nullable RouterRecord routerRecord, @NonNull String uniqueSessionId, @NonNull MediaRoute2Info route) { if (!checkArgumentsForSessionControl(routerRecord, uniqueSessionId, route, "deselecting")) { "deselecting", uniqueRequestId)) { return; } Loading @@ -2982,8 +3049,12 @@ class MediaRouter2ServiceImpl { return; } provider.deselectRoute(uniqueRequestId, getOriginalId(uniqueSessionId), route.getOriginalId()); provider.deselectRoute( uniqueRequestId, getOriginalId(uniqueSessionId), route.getOriginalId()); // Log the success result. mMediaRouterMetricLogger.logRequestResult( uniqueRequestId, MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_SUCCESS); } // routerRecord can be null if the session is system's or RCN. Loading @@ -2996,7 +3067,7 @@ class MediaRouter2ServiceImpl { @NonNull MediaRoute2Info route, @RoutingSessionInfo.TransferReason int transferReason) { if (!checkArgumentsForSessionControl(routerRecord, uniqueSessionId, route, "transferring to")) { "transferring to", uniqueRequestId)) { return; } Loading @@ -3016,18 +3087,25 @@ class MediaRouter2ServiceImpl { getOriginalId(uniqueSessionId), route.getOriginalId(), transferReason); // Log the success result. mMediaRouterMetricLogger.logRequestResult( uniqueRequestId, MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_SUCCESS); } // routerRecord is null if and only if the session is created without the request, which // includes the system's session and RCN cases. private boolean checkArgumentsForSessionControl(@Nullable RouterRecord routerRecord, @NonNull String uniqueSessionId, @NonNull MediaRoute2Info route, @NonNull String description) { @NonNull String description, long uniqueRequestId) { final String providerId = route.getProviderId(); final MediaRoute2Provider provider = findProvider(providerId); if (provider == null) { Slog.w(TAG, "Ignoring " + description + " route since no provider found for " + "given route=" + route); mMediaRouterMetricLogger.logRequestResult( uniqueRequestId, MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_INVALID_COMMAND); return false; } Loading @@ -3050,6 +3128,9 @@ class MediaRouter2ServiceImpl { + getPackageNameFromNullableRecord(matchingRecord) + " route=" + route); mMediaRouterMetricLogger.logRequestResult( uniqueRequestId, MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_ROUTER_RECORD_NOT_FOUND); return false; } Loading @@ -3057,6 +3138,9 @@ class MediaRouter2ServiceImpl { if (sessionId == null) { Slog.w(TAG, "Failed to get original session id from unique session id. " + "uniqueSessionId=" + uniqueSessionId); mMediaRouterMetricLogger.logRequestResult( uniqueRequestId, MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_INVALID_SESSION_ID); return false; } Loading Loading @@ -3168,6 +3252,10 @@ class MediaRouter2ServiceImpl { } matchingRequest.mRouterRecord.notifySessionCreated( toOriginalRequestId(uniqueRequestId), sessionInfo); // Log the success result. mMediaRouterMetricLogger.logRequestResult( uniqueRequestId, MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_SUCCESS); } /** Loading Loading @@ -3255,10 +3343,14 @@ class MediaRouter2ServiceImpl { // Currently, only manager records can get notified of failures. // TODO(b/282936553): Notify regular routers of request failures. // Log the request result. mMediaRouterMetricLogger.logRequestResult( uniqueRequestId, MediaRouterMetricLogger.convertResultFromReason(reason)); } private boolean handleSessionCreationRequestFailed(@NonNull MediaRoute2Provider provider, long uniqueRequestId, int reason) { private boolean handleSessionCreationRequestFailed( @NonNull MediaRoute2Provider provider, long uniqueRequestId, int reason) { // Check whether the failure is about creating a session SessionCreationRequest matchingRequest = null; for (SessionCreationRequest request : mSessionCreationRequests) { Loading Loading @@ -3385,8 +3477,8 @@ class MediaRouter2ServiceImpl { } } private void notifySessionCreatedToManagers(long managerRequestId, @NonNull RoutingSessionInfo session) { private void notifySessionCreatedToManagers( long managerRequestId, @NonNull RoutingSessionInfo session) { int requesterId = toRequesterId(managerRequestId); int originalRequestId = toOriginalRequestId(managerRequestId); Loading