From 2be074c097351fa94ebf7df5b8dc3d69f108afe1 Mon Sep 17 00:00:00 2001 From: Santiago Seifert Date: Tue, 27 Sep 2022 11:22:53 +0000 Subject: [PATCH] Use UserSwitchObserver to detect switches in the running user The current implementation relies on listening for Intent.ACTION_USER_SWITCHED, which can take more than 30 seconds to propagate, making UserSwitchObserver a more reliable option. Bug: 242188673 Test: atest mediaroutertest CtsMediaBetterTogetherTestCases Test: Manually tested casting on secondary users. Test: Pending CL to verify route availability on secondary users as part of the linked bug. Change-Id: I67765a671bce590495b73ef7df6bf72ba3c9f03a Merged-In: I67765a671bce590495b73ef7df6bf72ba3c9f03a --- .../server/media/MediaRouter2ServiceImpl.java | 5 +-- .../server/media/MediaRouterService.java | 40 ++++++++++++------- 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java index e27cbeaab139f..1e23d16328eec 100644 --- a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java +++ b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java @@ -601,10 +601,9 @@ class MediaRouter2ServiceImpl { } } - //TODO(b/136703681): Review this is handling multi-user properly. - void switchUser() { + // TODO(b/136703681): Review this is handling multi-user properly. + void switchUser(int userId) { synchronized (mLock) { - int userId = ActivityManager.getCurrentUser(); if (mCurrentUserId != userId) { final int oldUserId = mCurrentUserId; mCurrentUserId = userId; // do this first diff --git a/services/core/java/com/android/server/media/MediaRouterService.java b/services/core/java/com/android/server/media/MediaRouterService.java index e61f55381b0c7..2893b85962fdb 100644 --- a/services/core/java/com/android/server/media/MediaRouterService.java +++ b/services/core/java/com/android/server/media/MediaRouterService.java @@ -17,7 +17,9 @@ package com.android.server.media; import android.annotation.NonNull; +import android.annotation.RequiresPermission; import android.app.ActivityManager; +import android.app.UserSwitchObserver; import android.bluetooth.BluetoothA2dp; import android.bluetooth.BluetoothDevice; import android.content.BroadcastReceiver; @@ -217,18 +219,27 @@ public final class MediaRouterService extends IMediaRouterService.Stub context.registerReceiverAsUser(mReceiver, UserHandle.ALL, intentFilter, null, null); } - public void systemRunning() { - IntentFilter filter = new IntentFilter(Intent.ACTION_USER_SWITCHED); - mContext.registerReceiver(new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - if (intent.getAction().equals(Intent.ACTION_USER_SWITCHED)) { - switchUser(); - } - } - }, filter); - - switchUser(); + /** + * Initializes the MediaRouter service. + * + * @throws RemoteException If an error occurs while registering the {@link UserSwitchObserver}. + */ + @RequiresPermission( + anyOf = { + "android.permission.INTERACT_ACROSS_USERS", + "android.permission.INTERACT_ACROSS_USERS_FULL" + }) + public void systemRunning() throws RemoteException { + ActivityManager.getService() + .registerUserSwitchObserver( + new UserSwitchObserver() { + @Override + public void onUserSwitchComplete(int newUserId) { + switchUser(newUserId); + } + }, + TAG); + switchUser(ActivityManager.getCurrentUser()); } @Override @@ -702,9 +713,8 @@ public final class MediaRouterService extends IMediaRouterService.Stub } } - void switchUser() { + void switchUser(int userId) { synchronized (mLock) { - int userId = ActivityManager.getCurrentUser(); if (mCurrentUserId != userId) { final int oldUserId = mCurrentUserId; mCurrentUserId = userId; // do this first @@ -721,7 +731,7 @@ public final class MediaRouterService extends IMediaRouterService.Stub } } } - mService2.switchUser(); + mService2.switchUser(userId); } void clientDied(ClientRecord clientRecord) {