From bff66dcaacb3ef2a9f102434780d72e6f4175484 Mon Sep 17 00:00:00 2001 From: Alex Stetson Date: Mon, 24 Oct 2022 13:57:04 -0700 Subject: [PATCH] Replace ACTION_USER_SWITCHED with UserTracker ACTION_USER_SWITCHED only applies to the foreground user and will not trigger for concurrent secondary users. By replacing this with UserTracker, the switching logic can be modify to track what is relevant for a given display/user. Bug: 249831072 Test: atest SystemUIUnitTests Change-Id: I6f5d482072ae92d7dda5e1753901b3f5dc521312 --- .../systemui/GuestResumeSessionReceiver.java | 100 ++++++++---------- .../android/systemui/ScreenDecorations.java | 39 +++---- .../controller/ControlsControllerImpl.kt | 32 ++---- .../DefaultBroadcastReceiverBinder.java | 10 -- .../android/systemui/doze/DozeTriggers.java | 21 ++-- .../controls/resume/MediaResumeListener.kt | 26 +++-- .../systemui/navigationbar/NavigationBar.java | 40 +++---- .../com/android/systemui/power/PowerUI.java | 20 +++- .../recents/ScreenPinningRequest.java | 22 +++- .../screenrecord/RecordingController.java | 36 ++++--- ...NotificationLockscreenUserManagerImpl.java | 39 ++++--- .../KeyguardNotificationVisibilityProvider.kt | 26 ++--- .../phone/ManagedProfileControllerImpl.java | 56 +++++----- .../systemui/statusbar/policy/Clock.java | 2 +- .../policy/NextAlarmControllerImpl.java | 24 ++++- .../systemui/ScreenDecorationsTest.java | 7 +- .../controller/ControlsControllerImplTest.kt | 30 ++---- .../resume/MediaResumeListenerTest.kt | 26 ++++- .../navigationbar/NavigationBarTest.java | 17 +-- .../android/systemui/power/PowerUITest.java | 5 +- .../screenrecord/RecordingControllerTest.java | 14 ++- ...NotificationLockscreenUserManagerTest.java | 15 ++- ...ardNotificationVisibilityProviderTest.java | 31 ++---- 23 files changed, 331 insertions(+), 307 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/GuestResumeSessionReceiver.java b/packages/SystemUI/src/com/android/systemui/GuestResumeSessionReceiver.java index 76a7cad154195..8ae63c4e2f547 100644 --- a/packages/SystemUI/src/com/android/systemui/GuestResumeSessionReceiver.java +++ b/packages/SystemUI/src/com/android/systemui/GuestResumeSessionReceiver.java @@ -17,24 +17,25 @@ package com.android.systemui; import android.app.AlertDialog; -import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; -import android.content.Intent; -import android.content.IntentFilter; import android.content.pm.UserInfo; import android.os.UserHandle; -import android.util.Log; + +import androidx.annotation.NonNull; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.UiEventLogger; import com.android.systemui.broadcast.BroadcastDispatcher; +import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.qs.QSUserSwitcherEvent; import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.phone.SystemUIDialog; import com.android.systemui.statusbar.policy.UserSwitcherController; import com.android.systemui.util.settings.SecureSettings; +import java.util.concurrent.Executor; + import javax.inject.Inject; import dagger.assisted.Assisted; @@ -44,31 +45,66 @@ import dagger.assisted.AssistedInject; /** * Manages notification when a guest session is resumed. */ -public class GuestResumeSessionReceiver extends BroadcastReceiver { - - private static final String TAG = GuestResumeSessionReceiver.class.getSimpleName(); +public class GuestResumeSessionReceiver { @VisibleForTesting public static final String SETTING_GUEST_HAS_LOGGED_IN = "systemui.guest_has_logged_in"; @VisibleForTesting public AlertDialog mNewSessionDialog; + private final Executor mMainExecutor; private final UserTracker mUserTracker; private final SecureSettings mSecureSettings; - private final BroadcastDispatcher mBroadcastDispatcher; private final ResetSessionDialog.Factory mResetSessionDialogFactory; private final GuestSessionNotification mGuestSessionNotification; + @VisibleForTesting + public final UserTracker.Callback mUserChangedCallback = + new UserTracker.Callback() { + @Override + public void onUserChanged(int newUser, @NonNull Context userContext) { + cancelDialog(); + + UserInfo currentUser = mUserTracker.getUserInfo(); + if (!currentUser.isGuest()) { + return; + } + + int guestLoginState = mSecureSettings.getIntForUser( + SETTING_GUEST_HAS_LOGGED_IN, 0, newUser); + + if (guestLoginState == 0) { + // set 1 to indicate, 1st login + guestLoginState = 1; + mSecureSettings.putIntForUser(SETTING_GUEST_HAS_LOGGED_IN, guestLoginState, + newUser); + } else if (guestLoginState == 1) { + // set 2 to indicate, 2nd or later login + guestLoginState = 2; + mSecureSettings.putIntForUser(SETTING_GUEST_HAS_LOGGED_IN, guestLoginState, + newUser); + } + + mGuestSessionNotification.createPersistentNotification(currentUser, + (guestLoginState <= 1)); + + if (guestLoginState > 1) { + mNewSessionDialog = mResetSessionDialogFactory.create(newUser); + mNewSessionDialog.show(); + } + } + }; + @Inject public GuestResumeSessionReceiver( + @Main Executor mainExecutor, UserTracker userTracker, SecureSettings secureSettings, - BroadcastDispatcher broadcastDispatcher, GuestSessionNotification guestSessionNotification, ResetSessionDialog.Factory resetSessionDialogFactory) { + mMainExecutor = mainExecutor; mUserTracker = userTracker; mSecureSettings = secureSettings; - mBroadcastDispatcher = broadcastDispatcher; mGuestSessionNotification = guestSessionNotification; mResetSessionDialogFactory = resetSessionDialogFactory; } @@ -77,49 +113,7 @@ public class GuestResumeSessionReceiver extends BroadcastReceiver { * Register this receiver with the {@link BroadcastDispatcher} */ public void register() { - IntentFilter f = new IntentFilter(Intent.ACTION_USER_SWITCHED); - mBroadcastDispatcher.registerReceiver(this, f, null /* handler */, UserHandle.SYSTEM); - } - - @Override - public void onReceive(Context context, Intent intent) { - String action = intent.getAction(); - - if (Intent.ACTION_USER_SWITCHED.equals(action)) { - cancelDialog(); - - int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL); - if (userId == UserHandle.USER_NULL) { - Log.e(TAG, intent + " sent to " + TAG + " without EXTRA_USER_HANDLE"); - return; - } - - UserInfo currentUser = mUserTracker.getUserInfo(); - if (!currentUser.isGuest()) { - return; - } - - int guestLoginState = mSecureSettings.getIntForUser( - SETTING_GUEST_HAS_LOGGED_IN, 0, userId); - - if (guestLoginState == 0) { - // set 1 to indicate, 1st login - guestLoginState = 1; - mSecureSettings.putIntForUser(SETTING_GUEST_HAS_LOGGED_IN, guestLoginState, userId); - } else if (guestLoginState == 1) { - // set 2 to indicate, 2nd or later login - guestLoginState = 2; - mSecureSettings.putIntForUser(SETTING_GUEST_HAS_LOGGED_IN, guestLoginState, userId); - } - - mGuestSessionNotification.createPersistentNotification(currentUser, - (guestLoginState <= 1)); - - if (guestLoginState > 1) { - mNewSessionDialog = mResetSessionDialogFactory.create(userId); - mNewSessionDialog.show(); - } - } + mUserTracker.addCallback(mUserChangedCallback, mMainExecutor); } private void cancelDialog() { diff --git a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java index 7e3b1389792c4..02a6d7be7143b 100644 --- a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java +++ b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java @@ -26,10 +26,7 @@ import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_M import android.annotation.IdRes; import android.annotation.NonNull; import android.annotation.Nullable; -import android.content.BroadcastReceiver; import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.content.res.Resources; @@ -45,7 +42,6 @@ import android.hardware.graphics.common.DisplayDecorationSupport; import android.os.Handler; import android.os.SystemProperties; import android.os.Trace; -import android.os.UserHandle; import android.provider.Settings.Secure; import android.util.DisplayUtils; import android.util.Log; @@ -68,7 +64,6 @@ import androidx.annotation.VisibleForTesting; import com.android.internal.util.Preconditions; import com.android.settingslib.Utils; -import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.decor.CutoutDecorProviderFactory; @@ -128,7 +123,6 @@ public class ScreenDecorations implements CoreStartable, Tunable , Dumpable { private DisplayManager mDisplayManager; @VisibleForTesting protected boolean mIsRegistered; - private final BroadcastDispatcher mBroadcastDispatcher; private final Context mContext; private final Executor mMainExecutor; private final TunerService mTunerService; @@ -302,7 +296,6 @@ public class ScreenDecorations implements CoreStartable, Tunable , Dumpable { public ScreenDecorations(Context context, @Main Executor mainExecutor, SecureSettings secureSettings, - BroadcastDispatcher broadcastDispatcher, TunerService tunerService, UserTracker userTracker, PrivacyDotViewController dotViewController, @@ -312,7 +305,6 @@ public class ScreenDecorations implements CoreStartable, Tunable , Dumpable { mContext = context; mMainExecutor = mainExecutor; mSecureSettings = secureSettings; - mBroadcastDispatcher = broadcastDispatcher; mTunerService = tunerService; mUserTracker = userTracker; mDotViewController = dotViewController; @@ -598,10 +590,7 @@ public class ScreenDecorations implements CoreStartable, Tunable , Dumpable { mColorInversionSetting.onChange(false); updateColorInversion(mColorInversionSetting.getValue()); - IntentFilter filter = new IntentFilter(); - filter.addAction(Intent.ACTION_USER_SWITCHED); - mBroadcastDispatcher.registerReceiver(mUserSwitchIntentReceiver, filter, - mExecutor, UserHandle.ALL); + mUserTracker.addCallback(mUserChangedCallback, mExecutor); mIsRegistered = true; } else { mMainExecutor.execute(() -> mTunerService.removeTunable(this)); @@ -610,7 +599,7 @@ public class ScreenDecorations implements CoreStartable, Tunable , Dumpable { mColorInversionSetting.setListening(false); } - mBroadcastDispatcher.unregisterReceiver(mUserSwitchIntentReceiver); + mUserTracker.removeCallback(mUserChangedCallback); mIsRegistered = false; } } @@ -897,18 +886,18 @@ public class ScreenDecorations implements CoreStartable, Tunable , Dumpable { } } - private final BroadcastReceiver mUserSwitchIntentReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - int newUserId = mUserTracker.getUserId(); - if (DEBUG) { - Log.d(TAG, "UserSwitched newUserId=" + newUserId); - } - // update color inversion setting to the new user - mColorInversionSetting.setUserId(newUserId); - updateColorInversion(mColorInversionSetting.getValue()); - } - }; + private final UserTracker.Callback mUserChangedCallback = + new UserTracker.Callback() { + @Override + public void onUserChanged(int newUser, @NonNull Context userContext) { + if (DEBUG) { + Log.d(TAG, "UserSwitched newUserId=" + newUser); + } + // update color inversion setting to the new user + mColorInversionSetting.setUserId(newUser); + updateColorInversion(mColorInversionSetting.getValue()); + } + }; private void updateColorInversion(int colorsInvertedValue) { mTintColor = colorsInvertedValue != 0 ? Color.WHITE : Color.BLACK; diff --git a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt index 50ce9d4ec0f4d..757e3055bb7d4 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt @@ -33,7 +33,6 @@ import android.util.Log import com.android.internal.annotations.VisibleForTesting import com.android.systemui.Dumpable import com.android.systemui.backup.BackupHelper -import com.android.systemui.broadcast.BroadcastDispatcher import com.android.systemui.controls.ControlStatus import com.android.systemui.controls.ControlsServiceInfo import com.android.systemui.controls.management.ControlsListingController @@ -59,11 +58,10 @@ class ControlsControllerImpl @Inject constructor ( private val uiController: ControlsUiController, private val bindingController: ControlsBindingController, private val listingController: ControlsListingController, - private val broadcastDispatcher: BroadcastDispatcher, private val userFileManager: UserFileManager, + private val userTracker: UserTracker, optionalWrapper: Optional, dumpManager: DumpManager, - userTracker: UserTracker ) : Dumpable, ControlsController { companion object { @@ -120,18 +118,15 @@ class ControlsControllerImpl @Inject constructor ( userChanging = false } - private val userSwitchReceiver = object : BroadcastReceiver() { - override fun onReceive(context: Context, intent: Intent) { - if (intent.action == Intent.ACTION_USER_SWITCHED) { - userChanging = true - val newUser = - UserHandle.of(intent.getIntExtra(Intent.EXTRA_USER_HANDLE, sendingUserId)) - if (currentUser == newUser) { - userChanging = false - return - } - setValuesForUser(newUser) + private val userTrackerCallback = object : UserTracker.Callback { + override fun onUserChanged(newUser: Int, userContext: Context) { + userChanging = true + val newUserHandle = UserHandle.of(newUser) + if (currentUser == newUserHandle) { + userChanging = false + return } + setValuesForUser(newUserHandle) } } @@ -233,12 +228,7 @@ class ControlsControllerImpl @Inject constructor ( dumpManager.registerDumpable(javaClass.name, this) resetFavorites() userChanging = false - broadcastDispatcher.registerReceiver( - userSwitchReceiver, - IntentFilter(Intent.ACTION_USER_SWITCHED), - executor, - UserHandle.ALL - ) + userTracker.addCallback(userTrackerCallback, executor) context.registerReceiver( restoreFinishedReceiver, IntentFilter(BackupHelper.ACTION_RESTORE_FINISHED), @@ -250,7 +240,7 @@ class ControlsControllerImpl @Inject constructor ( } fun destroy() { - broadcastDispatcher.unregisterReceiver(userSwitchReceiver) + userTracker.removeCallback(userTrackerCallback) context.unregisterReceiver(restoreFinishedReceiver) listingController.removeCallback(listingCallback) } diff --git a/packages/SystemUI/src/com/android/systemui/dagger/DefaultBroadcastReceiverBinder.java b/packages/SystemUI/src/com/android/systemui/dagger/DefaultBroadcastReceiverBinder.java index d60a22204b3d8..3d8e4cb71acaf 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/DefaultBroadcastReceiverBinder.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/DefaultBroadcastReceiverBinder.java @@ -19,7 +19,6 @@ package com.android.systemui.dagger; import android.content.BroadcastReceiver; import com.android.systemui.GuestResetOrExitSessionReceiver; -import com.android.systemui.GuestResumeSessionReceiver; import com.android.systemui.media.dialog.MediaOutputDialogReceiver; import com.android.systemui.people.widget.PeopleSpaceWidgetPinnedReceiver; import com.android.systemui.people.widget.PeopleSpaceWidgetProvider; @@ -101,15 +100,6 @@ public abstract class DefaultBroadcastReceiverBinder { public abstract BroadcastReceiver bindPeopleSpaceWidgetProvider( PeopleSpaceWidgetProvider broadcastReceiver); - /** - * - */ - @Binds - @IntoMap - @ClassKey(GuestResumeSessionReceiver.class) - public abstract BroadcastReceiver bindGuestResumeSessionReceiver( - GuestResumeSessionReceiver broadcastReceiver); - /** * */ diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java index 0b69b80689e0b..5daf1ceaf5925 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java @@ -29,12 +29,13 @@ import android.content.Intent; import android.content.IntentFilter; import android.hardware.display.AmbientDisplayConfiguration; import android.os.SystemClock; -import android.os.UserHandle; import android.text.format.Formatter; import android.util.IndentingPrintWriter; import android.util.Log; import android.view.Display; +import androidx.annotation.NonNull; + import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.InstanceId; import com.android.internal.logging.UiEvent; @@ -100,6 +101,7 @@ public class DozeTriggers implements DozeMachine.Part { private final BroadcastDispatcher mBroadcastDispatcher; private final AuthController mAuthController; private final KeyguardStateController mKeyguardStateController; + private final UserTracker mUserTracker; private final UiEventLogger mUiEventLogger; private long mNotificationPulseTime; @@ -110,6 +112,14 @@ public class DozeTriggers implements DozeMachine.Part { private boolean mWantTouchScreenSensors; private boolean mWantSensors; + private final UserTracker.Callback mUserChangedCallback = + new UserTracker.Callback() { + @Override + public void onUserChanged(int newUser, @NonNull Context userContext) { + mDozeSensors.onUserSwitched(); + } + }; + @VisibleForTesting public enum DozingUpdateUiEvent implements UiEventLogger.UiEventEnum { @UiEvent(doc = "Dozing updated due to notification.") @@ -210,6 +220,7 @@ public class DozeTriggers implements DozeMachine.Part { mAuthController = authController; mUiEventLogger = uiEventLogger; mKeyguardStateController = keyguardStateController; + mUserTracker = userTracker; } @Override @@ -234,7 +245,7 @@ public class DozeTriggers implements DozeMachine.Part { return; } mNotificationPulseTime = SystemClock.elapsedRealtime(); - if (!mConfig.pulseOnNotificationEnabled(UserHandle.USER_CURRENT)) { + if (!mConfig.pulseOnNotificationEnabled(mUserTracker.getUserId())) { runIfNotNull(onPulseSuppressedListener); mDozeLog.tracePulseDropped("pulseOnNotificationsDisabled"); return; @@ -490,12 +501,14 @@ public class DozeTriggers implements DozeMachine.Part { mBroadcastReceiver.register(mBroadcastDispatcher); mDockManager.addListener(mDockEventListener); mDozeHost.addCallback(mHostCallback); + mUserTracker.addCallback(mUserChangedCallback, mContext.getMainExecutor()); } private void unregisterCallbacks() { mBroadcastReceiver.unregister(mBroadcastDispatcher); mDozeHost.removeCallback(mHostCallback); mDockManager.removeListener(mDockEventListener); + mUserTracker.removeCallback(mUserChangedCallback); } private void stopListeningToAllTriggers() { @@ -620,9 +633,6 @@ public class DozeTriggers implements DozeMachine.Part { requestPulse(DozeLog.PULSE_REASON_INTENT, false, /* performedProxCheck */ null /* onPulseSuppressedListener */); } - if (Intent.ACTION_USER_SWITCHED.equals(intent.getAction())) { - mDozeSensors.onUserSwitched(); - } } public void register(BroadcastDispatcher broadcastDispatcher) { @@ -630,7 +640,6 @@ public class DozeTriggers implements DozeMachine.Part { return; } IntentFilter filter = new IntentFilter(PULSE_ACTION); - filter.addAction(Intent.ACTION_USER_SWITCHED); broadcastDispatcher.registerReceiver(this, filter); mRegistered = true; } diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/resume/MediaResumeListener.kt b/packages/SystemUI/src/com/android/systemui/media/controls/resume/MediaResumeListener.kt index 4891297dbcf93..2d10b823f784e 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/resume/MediaResumeListener.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/resume/MediaResumeListener.kt @@ -32,10 +32,12 @@ import com.android.systemui.Dumpable import com.android.systemui.broadcast.BroadcastDispatcher import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Background +import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.dump.DumpManager import com.android.systemui.media.controls.models.player.MediaData import com.android.systemui.media.controls.pipeline.MediaDataManager import com.android.systemui.media.controls.pipeline.RESUME_MEDIA_TIMEOUT +import com.android.systemui.settings.UserTracker import com.android.systemui.tuner.TunerService import com.android.systemui.util.Utils import com.android.systemui.util.time.SystemClock @@ -55,6 +57,8 @@ class MediaResumeListener constructor( private val context: Context, private val broadcastDispatcher: BroadcastDispatcher, + private val userTracker: UserTracker, + @Main private val mainExecutor: Executor, @Background private val backgroundExecutor: Executor, private val tunerService: TunerService, private val mediaBrowserFactory: ResumeMediaBrowserFactory, @@ -77,18 +81,26 @@ constructor( private var currentUserId: Int = context.userId @VisibleForTesting - val userChangeReceiver = + val userUnlockReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { if (Intent.ACTION_USER_UNLOCKED == intent.action) { - loadMediaResumptionControls() - } else if (Intent.ACTION_USER_SWITCHED == intent.action) { - currentUserId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1) - loadSavedComponents() + val userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1) + if (userId == currentUserId) { + loadMediaResumptionControls() + } } } } + private val userTrackerCallback = + object : UserTracker.Callback { + override fun onUserChanged(newUser: Int, userContext: Context) { + currentUserId = newUser + loadSavedComponents() + } + } + private val mediaBrowserCallback = object : ResumeMediaBrowser.Callback() { override fun addTrack( @@ -126,13 +138,13 @@ constructor( dumpManager.registerDumpable(TAG, this) val unlockFilter = IntentFilter() unlockFilter.addAction(Intent.ACTION_USER_UNLOCKED) - unlockFilter.addAction(Intent.ACTION_USER_SWITCHED) broadcastDispatcher.registerReceiver( - userChangeReceiver, + userUnlockReceiver, unlockFilter, null, UserHandle.ALL ) + userTracker.addCallback(userTrackerCallback, mainExecutor) loadSavedComponents() } } diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java index 85d15dca12cbd..bb85a06efd339 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java @@ -52,13 +52,12 @@ import static com.android.systemui.statusbar.phone.CentralSurfaces.dumpBarTransi import static com.android.systemui.util.Utils.isGesturalModeOnDefaultDisplay; import android.annotation.IdRes; +import android.annotation.NonNull; import android.app.ActivityTaskManager; import android.app.IActivityTaskManager; import android.app.StatusBarManager; -import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; -import android.content.IntentFilter; import android.content.res.Configuration; import android.graphics.Insets; import android.graphics.PixelFormat; @@ -114,7 +113,6 @@ import com.android.internal.view.AppearanceRegion; import com.android.systemui.Gefingerpoken; import com.android.systemui.R; import com.android.systemui.assist.AssistManager; -import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.DisplayId; import com.android.systemui.dagger.qualifiers.Main; @@ -132,6 +130,7 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.recents.Recents; import com.android.systemui.settings.UserContextProvider; +import com.android.systemui.settings.UserTracker; import com.android.systemui.shade.ShadeController; import com.android.systemui.shared.navigationbar.RegionSamplingHelper; import com.android.systemui.shared.recents.utilities.Utilities; @@ -202,7 +201,7 @@ public class NavigationBar extends ViewController implements private final NotificationRemoteInputManager mNotificationRemoteInputManager; private final OverviewProxyService mOverviewProxyService; private final NavigationModeController mNavigationModeController; - private final BroadcastDispatcher mBroadcastDispatcher; + private final UserTracker mUserTracker; private final CommandQueue mCommandQueue; private final Optional mPipOptional; private final Optional mRecentsOptional; @@ -504,7 +503,7 @@ public class NavigationBar extends ViewController implements StatusBarStateController statusBarStateController, StatusBarKeyguardViewManager statusBarKeyguardViewManager, SysUiState sysUiFlagsContainer, - BroadcastDispatcher broadcastDispatcher, + UserTracker userTracker, CommandQueue commandQueue, Optional pipOptional, Optional recentsOptional, @@ -547,7 +546,7 @@ public class NavigationBar extends ViewController implements mNotificationRemoteInputManager = notificationRemoteInputManager; mOverviewProxyService = overviewProxyService; mNavigationModeController = navigationModeController; - mBroadcastDispatcher = broadcastDispatcher; + mUserTracker = userTracker; mCommandQueue = commandQueue; mPipOptional = pipOptional; mRecentsOptional = recentsOptional; @@ -726,9 +725,7 @@ public class NavigationBar extends ViewController implements prepareNavigationBarView(); checkNavBarModes(); - IntentFilter filter = new IntentFilter(Intent.ACTION_USER_SWITCHED); - mBroadcastDispatcher.registerReceiverWithHandler(mBroadcastReceiver, filter, - Handler.getMain(), UserHandle.ALL); + mUserTracker.addCallback(mUserChangedCallback, mContext.getMainExecutor()); mWakefulnessLifecycle.addObserver(mWakefulnessObserver); notifyNavigationBarScreenOn(); @@ -779,7 +776,7 @@ public class NavigationBar extends ViewController implements mView.setUpdateActiveTouchRegionsCallback(null); getBarTransitions().destroy(); mOverviewProxyService.removeCallback(mOverviewProxyListener); - mBroadcastDispatcher.unregisterReceiver(mBroadcastReceiver); + mUserTracker.removeCallback(mUserChangedCallback); mWakefulnessLifecycle.removeObserver(mWakefulnessObserver); if (mOrientationHandle != null) { resetSecondaryHandle(); @@ -1664,21 +1661,14 @@ public class NavigationBar extends ViewController implements } }; - private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - // TODO(193941146): Currently unregistering a receiver through BroadcastDispatcher is - // async, but we've already cleared the fields. Just return early in this case. - if (mView == null) { - return; - } - String action = intent.getAction(); - if (Intent.ACTION_USER_SWITCHED.equals(action)) { - // The accessibility settings may be different for the new user - updateAccessibilityStateFlags(); - } - } - }; + private final UserTracker.Callback mUserChangedCallback = + new UserTracker.Callback() { + @Override + public void onUserChanged(int newUser, @NonNull Context userContext) { + // The accessibility settings may be different for the new user + updateAccessibilityStateFlags(); + } + }; @VisibleForTesting int getNavigationIconHints() { diff --git a/packages/SystemUI/src/com/android/systemui/power/PowerUI.java b/packages/SystemUI/src/com/android/systemui/power/PowerUI.java index 1da866efc08d3..5a1ad96da7a90 100644 --- a/packages/SystemUI/src/com/android/systemui/power/PowerUI.java +++ b/packages/SystemUI/src/com/android/systemui/power/PowerUI.java @@ -39,6 +39,8 @@ import android.text.format.DateUtils; import android.util.Log; import android.util.Slog; +import androidx.annotation.NonNull; + import com.android.internal.annotations.VisibleForTesting; import com.android.settingslib.fuelgauge.Estimate; import com.android.settingslib.utils.ThreadUtils; @@ -47,6 +49,7 @@ import com.android.systemui.R; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.keyguard.WakefulnessLifecycle; +import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.phone.CentralSurfaces; @@ -80,6 +83,7 @@ public class PowerUI implements CoreStartable, CommandQueue.Callbacks { private final PowerManager mPowerManager; private final WarningsUI mWarnings; private final WakefulnessLifecycle mWakefulnessLifecycle; + private final UserTracker mUserTracker; private InattentiveSleepWarningView mOverlayView; private final Configuration mLastConfiguration = new Configuration(); private int mPlugType = 0; @@ -122,12 +126,21 @@ public class PowerUI implements CoreStartable, CommandQueue.Callbacks { } }; + private final UserTracker.Callback mUserChangedCallback = + new UserTracker.Callback() { + @Override + public void onUserChanged(int newUser, @NonNull Context userContext) { + mWarnings.userSwitched(); + } + }; + @Inject public PowerUI(Context context, BroadcastDispatcher broadcastDispatcher, CommandQueue commandQueue, Lazy> centralSurfacesOptionalLazy, WarningsUI warningsUI, EnhancedEstimates enhancedEstimates, WakefulnessLifecycle wakefulnessLifecycle, - PowerManager powerManager) { + PowerManager powerManager, + UserTracker userTracker) { mContext = context; mBroadcastDispatcher = broadcastDispatcher; mCommandQueue = commandQueue; @@ -136,6 +149,7 @@ public class PowerUI implements CoreStartable, CommandQueue.Callbacks { mEnhancedEstimates = enhancedEstimates; mPowerManager = powerManager; mWakefulnessLifecycle = wakefulnessLifecycle; + mUserTracker = userTracker; } public void start() { @@ -154,6 +168,7 @@ public class PowerUI implements CoreStartable, CommandQueue.Callbacks { false, obs, UserHandle.USER_ALL); updateBatteryWarningLevels(); mReceiver.init(); + mUserTracker.addCallback(mUserChangedCallback, mContext.getMainExecutor()); mWakefulnessLifecycle.addObserver(mWakefulnessObserver); // Check to see if we need to let the user know that the phone previously shut down due @@ -250,7 +265,6 @@ public class PowerUI implements CoreStartable, CommandQueue.Callbacks { IntentFilter filter = new IntentFilter(); filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED); filter.addAction(Intent.ACTION_BATTERY_CHANGED); - filter.addAction(Intent.ACTION_USER_SWITCHED); mBroadcastDispatcher.registerReceiverWithHandler(this, filter, mHandler); // Force get initial values. Relying on Sticky behavior until API for getting info. if (!mHasReceivedBattery) { @@ -332,8 +346,6 @@ public class PowerUI implements CoreStartable, CommandQueue.Callbacks { plugged, bucket); }); - } else if (Intent.ACTION_USER_SWITCHED.equals(action)) { - mWarnings.userSwitched(); } else { Slog.w(TAG, "unknown intent: " + intent); } diff --git a/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java b/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java index 2ee5f05549cf2..645b1256e5f16 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java +++ b/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java @@ -51,10 +51,13 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; +import androidx.annotation.NonNull; + import com.android.systemui.R; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.navigationbar.NavigationBarView; import com.android.systemui.navigationbar.NavigationModeController; +import com.android.systemui.settings.UserTracker; import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.statusbar.phone.CentralSurfaces; import com.android.systemui.util.leak.RotationUtils; @@ -76,6 +79,7 @@ public class ScreenPinningRequest implements View.OnClickListener, private final AccessibilityManager mAccessibilityService; private final WindowManager mWindowManager; private final BroadcastDispatcher mBroadcastDispatcher; + private final UserTracker mUserTracker; private RequestWindowView mRequestWindow; private int mNavBarMode; @@ -83,12 +87,21 @@ public class ScreenPinningRequest implements View.OnClickListener, /** ID of task to be pinned or locked. */ private int taskId; + private final UserTracker.Callback mUserChangedCallback = + new UserTracker.Callback() { + @Override + public void onUserChanged(int newUser, @NonNull Context userContext) { + clearPrompt(); + } + }; + @Inject public ScreenPinningRequest( Context context, Lazy> centralSurfacesOptionalLazy, NavigationModeController navigationModeController, - BroadcastDispatcher broadcastDispatcher) { + BroadcastDispatcher broadcastDispatcher, + UserTracker userTracker) { mContext = context; mCentralSurfacesOptionalLazy = centralSurfacesOptionalLazy; mAccessibilityService = (AccessibilityManager) @@ -97,6 +110,7 @@ public class ScreenPinningRequest implements View.OnClickListener, mContext.getSystemService(Context.WINDOW_SERVICE); mNavBarMode = navigationModeController.addListener(this); mBroadcastDispatcher = broadcastDispatcher; + mUserTracker = userTracker; } public void clearPrompt() { @@ -228,9 +242,9 @@ public class ScreenPinningRequest implements View.OnClickListener, } IntentFilter filter = new IntentFilter(Intent.ACTION_CONFIGURATION_CHANGED); - filter.addAction(Intent.ACTION_USER_SWITCHED); filter.addAction(Intent.ACTION_SCREEN_OFF); mBroadcastDispatcher.registerReceiver(mReceiver, filter); + mUserTracker.addCallback(mUserChangedCallback, mContext.getMainExecutor()); } private void inflateView(int rotation) { @@ -358,6 +372,7 @@ public class ScreenPinningRequest implements View.OnClickListener, @Override public void onDetachedFromWindow() { mBroadcastDispatcher.unregisterReceiver(mReceiver); + mUserTracker.removeCallback(mUserChangedCallback); } protected void onConfigurationChanged() { @@ -388,8 +403,7 @@ public class ScreenPinningRequest implements View.OnClickListener, public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_CONFIGURATION_CHANGED)) { post(mUpdateLayoutRunnable); - } else if (intent.getAction().equals(Intent.ACTION_USER_SWITCHED) - || intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { + } else if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { clearPrompt(); } } diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingController.java b/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingController.java index ce4e0ecee9140..b8684ee30b9ae 100644 --- a/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingController.java +++ b/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingController.java @@ -33,13 +33,16 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.animation.DialogLaunchAnimator; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.SysUISingleton; +import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.Flags; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.settings.UserContextProvider; +import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.policy.CallbackController; import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.Executor; import javax.inject.Inject; @@ -55,8 +58,10 @@ public class RecordingController private boolean mIsRecording; private PendingIntent mStopIntent; private CountDownTimer mCountDownTimer = null; - private BroadcastDispatcher mBroadcastDispatcher; - private UserContextProvider mUserContextProvider; + private final Executor mMainExecutor; + private final BroadcastDispatcher mBroadcastDispatcher; + private final UserContextProvider mUserContextProvider; + private final UserTracker mUserTracker; protected static final String INTENT_UPDATE_STATE = "com.android.systemui.screenrecord.UPDATE_STATE"; @@ -66,12 +71,13 @@ public class RecordingController new CopyOnWriteArrayList<>(); @VisibleForTesting - protected final BroadcastReceiver mUserChangeReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - stopRecording(); - } - }; + final UserTracker.Callback mUserChangedCallback = + new UserTracker.Callback() { + @Override + public void onUserChanged(int newUser, @NonNull Context userContext) { + stopRecording(); + } + }; @VisibleForTesting protected final BroadcastReceiver mStateChangeReceiver = new BroadcastReceiver() { @@ -92,10 +98,14 @@ public class RecordingController * Create a new RecordingController */ @Inject - public RecordingController(BroadcastDispatcher broadcastDispatcher, - UserContextProvider userContextProvider) { + public RecordingController(@Main Executor mainExecutor, + BroadcastDispatcher broadcastDispatcher, + UserContextProvider userContextProvider, + UserTracker userTracker) { + mMainExecutor = mainExecutor; mBroadcastDispatcher = broadcastDispatcher; mUserContextProvider = userContextProvider; + mUserTracker = userTracker; } /** Create a dialog to show screen recording options to the user. */ @@ -139,9 +149,7 @@ public class RecordingController } try { startIntent.send(); - IntentFilter userFilter = new IntentFilter(Intent.ACTION_USER_SWITCHED); - mBroadcastDispatcher.registerReceiver(mUserChangeReceiver, userFilter, null, - UserHandle.ALL); + mUserTracker.addCallback(mUserChangedCallback, mMainExecutor); IntentFilter stateFilter = new IntentFilter(INTENT_UPDATE_STATE); mBroadcastDispatcher.registerReceiver(mStateChangeReceiver, stateFilter, null, @@ -211,7 +219,7 @@ public class RecordingController public synchronized void updateState(boolean isRecording) { if (!isRecording && mIsRecording) { // Unregister receivers if we have stopped recording - mBroadcastDispatcher.unregisterReceiver(mUserChangeReceiver); + mUserTracker.removeCallback(mUserChangedCallback); mBroadcastDispatcher.unregisterReceiver(mStateChangeReceiver); } mIsRecording = isRecording; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java index cdefae6b87f94..f4cd985adbdb8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java @@ -30,6 +30,7 @@ import android.content.IntentSender; import android.content.pm.UserInfo; import android.database.ContentObserver; import android.os.Handler; +import android.os.HandlerExecutor; import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; @@ -37,6 +38,7 @@ import android.util.Log; import android.util.SparseArray; import android.util.SparseBooleanArray; +import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; import com.android.internal.statusbar.NotificationVisibility; @@ -127,21 +129,6 @@ public class NotificationLockscreenUserManagerImpl implements public void onReceive(Context context, Intent intent) { String action = intent.getAction(); switch (action) { - case Intent.ACTION_USER_SWITCHED: - mCurrentUserId = intent.getIntExtra( - Intent.EXTRA_USER_HANDLE, UserHandle.USER_ALL); - updateCurrentProfilesCache(); - - Log.v(TAG, "userId " + mCurrentUserId + " is in the house"); - - updateLockscreenNotificationSetting(); - updatePublicMode(); - mPresenter.onUserSwitched(mCurrentUserId); - - for (UserChangedListener listener : mListeners) { - listener.onUserChanged(mCurrentUserId); - } - break; case Intent.ACTION_USER_REMOVED: int removedUserId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1); if (removedUserId != -1) { @@ -181,6 +168,25 @@ public class NotificationLockscreenUserManagerImpl implements } }; + protected final UserTracker.Callback mUserChangedCallback = + new UserTracker.Callback() { + @Override + public void onUserChanged(int newUser, @NonNull Context userContext) { + mCurrentUserId = newUser; + updateCurrentProfilesCache(); + + Log.v(TAG, "userId " + mCurrentUserId + " is in the house"); + + updateLockscreenNotificationSetting(); + updatePublicMode(); + mPresenter.onUserSwitched(mCurrentUserId); + + for (UserChangedListener listener : mListeners) { + listener.onUserChanged(mCurrentUserId); + } + } + }; + protected final Context mContext; private final Handler mMainHandler; protected final SparseArray mCurrentProfiles = new SparseArray<>(); @@ -284,7 +290,6 @@ public class NotificationLockscreenUserManagerImpl implements null /* handler */, UserHandle.ALL); IntentFilter filter = new IntentFilter(); - filter.addAction(Intent.ACTION_USER_SWITCHED); filter.addAction(Intent.ACTION_USER_ADDED); filter.addAction(Intent.ACTION_USER_REMOVED); filter.addAction(Intent.ACTION_USER_UNLOCKED); @@ -298,6 +303,8 @@ public class NotificationLockscreenUserManagerImpl implements mContext.registerReceiver(mBaseBroadcastReceiver, internalFilter, PERMISSION_SELF, null, Context.RECEIVER_EXPORTED_UNAUDITED); + mUserTracker.addCallback(mUserChangedCallback, new HandlerExecutor(mMainHandler)); + mCurrentUserId = mUserTracker.getUserId(); // in case we reg'd receiver too late updateCurrentProfilesCache(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/KeyguardNotificationVisibilityProvider.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/KeyguardNotificationVisibilityProvider.kt index e6dbcee10f605..7513aa7fa2a27 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/KeyguardNotificationVisibilityProvider.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/KeyguardNotificationVisibilityProvider.kt @@ -2,22 +2,20 @@ package com.android.systemui.statusbar.notification.interruption import android.app.Notification import android.app.Notification.VISIBILITY_SECRET -import android.content.BroadcastReceiver import android.content.Context -import android.content.Intent -import android.content.IntentFilter import android.database.ContentObserver import android.net.Uri import android.os.Handler +import android.os.HandlerExecutor import android.os.UserHandle import android.provider.Settings import com.android.keyguard.KeyguardUpdateMonitor import com.android.keyguard.KeyguardUpdateMonitorCallback import com.android.systemui.CoreStartable -import com.android.systemui.broadcast.BroadcastDispatcher import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.plugins.statusbar.StatusBarStateController +import com.android.systemui.settings.UserTracker import com.android.systemui.statusbar.NotificationLockscreenUserManager import com.android.systemui.statusbar.StatusBarState import com.android.systemui.statusbar.SysuiStatusBarStateController @@ -78,7 +76,7 @@ private class KeyguardNotificationVisibilityProviderImpl @Inject constructor( private val keyguardUpdateMonitor: KeyguardUpdateMonitor, private val highPriorityProvider: HighPriorityProvider, private val statusBarStateController: SysuiStatusBarStateController, - private val broadcastDispatcher: BroadcastDispatcher, + private val userTracker: UserTracker, private val secureSettings: SecureSettings, private val globalSettings: GlobalSettings ) : CoreStartable, KeyguardNotificationVisibilityProvider { @@ -87,6 +85,15 @@ private class KeyguardNotificationVisibilityProviderImpl @Inject constructor( private val onStateChangedListeners = ListenerSet>() private var hideSilentNotificationsOnLockscreen: Boolean = false + private val userTrackerCallback = object : UserTracker.Callback { + override fun onUserChanged(newUser: Int, userContext: Context) { + if (isLockedOrLocking) { + // maybe public mode changed + notifyStateChanged("onUserSwitched") + } + } + } + override fun start() { readShowSilentNotificationSetting() keyguardStateController.addCallback(object : KeyguardStateController.Callback { @@ -143,14 +150,7 @@ private class KeyguardNotificationVisibilityProviderImpl @Inject constructor( notifyStateChanged("onStatusBarUpcomingStateChanged") } }) - broadcastDispatcher.registerReceiver(object : BroadcastReceiver() { - override fun onReceive(context: Context, intent: Intent) { - if (isLockedOrLocking) { - // maybe public mode changed - notifyStateChanged(intent.action!!) - } - } - }, IntentFilter(Intent.ACTION_USER_SWITCHED)) + userTracker.addCallback(userTrackerCallback, HandlerExecutor(handler)) } override fun addOnStateChangedListener(listener: Consumer) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ManagedProfileControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ManagedProfileControllerImpl.java index 26e6db664e072..4beb87ddae2d4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ManagedProfileControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ManagedProfileControllerImpl.java @@ -15,23 +15,21 @@ package com.android.systemui.statusbar.phone; import android.app.StatusBarManager; -import android.content.BroadcastReceiver; import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; import android.content.pm.UserInfo; import android.os.UserHandle; import android.os.UserManager; import androidx.annotation.NonNull; -import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.SysUISingleton; +import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.settings.UserTracker; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; +import java.util.concurrent.Executor; import javax.inject.Inject; @@ -43,9 +41,9 @@ public class ManagedProfileControllerImpl implements ManagedProfileController { private final List mCallbacks = new ArrayList<>(); private final Context mContext; + private final Executor mMainExecutor; private final UserManager mUserManager; private final UserTracker mUserTracker; - private final BroadcastDispatcher mBroadcastDispatcher; private final LinkedList mProfiles; private boolean mListening; private int mCurrentUser; @@ -53,12 +51,12 @@ public class ManagedProfileControllerImpl implements ManagedProfileController { /** */ @Inject - public ManagedProfileControllerImpl(Context context, UserTracker userTracker, - BroadcastDispatcher broadcastDispatcher) { + public ManagedProfileControllerImpl(Context context, @Main Executor mainExecutor, + UserTracker userTracker) { mContext = context; + mMainExecutor = mainExecutor; mUserManager = UserManager.get(mContext); mUserTracker = userTracker; - mBroadcastDispatcher = broadcastDispatcher; mProfiles = new LinkedList(); } @@ -130,30 +128,34 @@ public class ManagedProfileControllerImpl implements ManagedProfileController { } private void setListening(boolean listening) { + if (mListening == listening) { + return; + } mListening = listening; if (listening) { reloadManagedProfiles(); - - final IntentFilter filter = new IntentFilter(); - filter.addAction(Intent.ACTION_USER_SWITCHED); - filter.addAction(Intent.ACTION_MANAGED_PROFILE_ADDED); - filter.addAction(Intent.ACTION_MANAGED_PROFILE_REMOVED); - filter.addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABLE); - filter.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE); - mBroadcastDispatcher.registerReceiver( - mReceiver, filter, null /* handler */, UserHandle.ALL); + mUserTracker.addCallback(mUserChangedCallback, mMainExecutor); } else { - mBroadcastDispatcher.unregisterReceiver(mReceiver); + mUserTracker.removeCallback(mUserChangedCallback); } } - private final BroadcastReceiver mReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - reloadManagedProfiles(); - for (Callback callback : mCallbacks) { - callback.onManagedProfileChanged(); - } - } - }; + private final UserTracker.Callback mUserChangedCallback = + new UserTracker.Callback() { + @Override + public void onUserChanged(int newUser, @NonNull Context userContext) { + reloadManagedProfiles(); + for (Callback callback : mCallbacks) { + callback.onManagedProfileChanged(); + } + } + + @Override + public void onProfilesChanged(@NonNull List profiles) { + reloadManagedProfiles(); + for (Callback callback : mCallbacks) { + callback.onManagedProfileChanged(); + } + } + }; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java index d84cbcc60853f..6875b523a9621 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java @@ -120,6 +120,7 @@ public class Clock extends TextView implements @Override public void onUserChanged(int newUser, @NonNull Context userContext) { mCurrentUserId = newUser; + updateClock(); } }; @@ -190,7 +191,6 @@ public class Clock extends TextView implements filter.addAction(Intent.ACTION_TIME_CHANGED); filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED); - filter.addAction(Intent.ACTION_USER_SWITCHED); // NOTE: This receiver could run before this method returns, as it's not dispatching // on the main thread and BroadcastDispatcher may not need to register with Context. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NextAlarmControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NextAlarmControllerImpl.java index b234e9c4e746a..63b9ff9717d6d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NextAlarmControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NextAlarmControllerImpl.java @@ -28,11 +28,14 @@ import androidx.annotation.NonNull; import com.android.systemui.Dumpable; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.SysUISingleton; +import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dump.DumpManager; +import com.android.systemui.settings.UserTracker; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Date; +import java.util.concurrent.Executor; import javax.inject.Inject; @@ -45,22 +48,34 @@ public class NextAlarmControllerImpl extends BroadcastReceiver private final ArrayList mChangeCallbacks = new ArrayList<>(); + private final UserTracker mUserTracker; private AlarmManager mAlarmManager; private AlarmManager.AlarmClockInfo mNextAlarm; + private final UserTracker.Callback mUserChangedCallback = + new UserTracker.Callback() { + @Override + public void onUserChanged(int newUser, @NonNull Context userContext) { + updateNextAlarm(); + } + }; + /** */ @Inject public NextAlarmControllerImpl( + @Main Executor mainExecutor, AlarmManager alarmManager, BroadcastDispatcher broadcastDispatcher, - DumpManager dumpManager) { + DumpManager dumpManager, + UserTracker userTracker) { dumpManager.registerDumpable("NextAlarmController", this); mAlarmManager = alarmManager; + mUserTracker = userTracker; IntentFilter filter = new IntentFilter(); - filter.addAction(Intent.ACTION_USER_SWITCHED); filter.addAction(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED); broadcastDispatcher.registerReceiver(this, filter, null, UserHandle.ALL); + mUserTracker.addCallback(mUserChangedCallback, mainExecutor); updateNextAlarm(); } @@ -98,14 +113,13 @@ public class NextAlarmControllerImpl extends BroadcastReceiver public void onReceive(Context context, Intent intent) { final String action = intent.getAction(); - if (action.equals(Intent.ACTION_USER_SWITCHED) - || action.equals(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED)) { + if (action.equals(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED)) { updateNextAlarm(); } } private void updateNextAlarm() { - mNextAlarm = mAlarmManager.getNextAlarmClock(UserHandle.USER_CURRENT); + mNextAlarm = mAlarmManager.getNextAlarmClock(mUserTracker.getUserId()); fireNextAlarmChanged(); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java b/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java index 181839ab512fc..0627fc6c542f2 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java @@ -77,7 +77,6 @@ import androidx.test.filters.SmallTest; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.biometrics.AuthController; -import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.decor.CornerDecorProvider; import com.android.systemui.decor.CutoutDecorProviderFactory; import com.android.systemui.decor.CutoutDecorProviderImpl; @@ -132,8 +131,6 @@ public class ScreenDecorationsTest extends SysuiTestCase { @Mock private TunerService mTunerService; @Mock - private BroadcastDispatcher mBroadcastDispatcher; - @Mock private UserTracker mUserTracker; @Mock private PrivacyDotViewController mDotViewController; @@ -223,8 +220,8 @@ public class ScreenDecorationsTest extends SysuiTestCase { mExecutor)); mScreenDecorations = spy(new ScreenDecorations(mContext, mExecutor, mSecureSettings, - mBroadcastDispatcher, mTunerService, mUserTracker, mDotViewController, - mThreadFactory, mPrivacyDotDecorProviderFactory, mFaceScanningProviderFactory) { + mTunerService, mUserTracker, mDotViewController, mThreadFactory, + mPrivacyDotDecorProviderFactory, mFaceScanningProviderFactory) { @Override public void start() { super.start(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsControllerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsControllerImplTest.kt index c31fd828c730e..1b34706bd2206 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsControllerImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsControllerImplTest.kt @@ -17,7 +17,6 @@ package com.android.systemui.controls.controller import android.app.PendingIntent -import android.content.BroadcastReceiver import android.content.ComponentName import android.content.Context import android.content.ContextWrapper @@ -31,7 +30,6 @@ import android.testing.AndroidTestingRunner import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.backup.BackupHelper -import com.android.systemui.broadcast.BroadcastDispatcher import com.android.systemui.controls.ControlStatus import com.android.systemui.controls.ControlsServiceInfo import com.android.systemui.controls.management.ControlsListingController @@ -85,10 +83,8 @@ class ControlsControllerImplTest : SysuiTestCase() { @Mock private lateinit var auxiliaryPersistenceWrapper: AuxiliaryPersistenceWrapper @Mock - private lateinit var broadcastDispatcher: BroadcastDispatcher - @Mock private lateinit var listingController: ControlsListingController - @Mock(stubOnly = true) + @Mock private lateinit var userTracker: UserTracker @Mock private lateinit var userFileManager: UserFileManager @@ -104,7 +100,7 @@ class ControlsControllerImplTest : SysuiTestCase() { ArgumentCaptor @Captor - private lateinit var broadcastReceiverCaptor: ArgumentCaptor + private lateinit var userTrackerCallbackCaptor: ArgumentCaptor @Captor private lateinit var listingCallbackCaptor: ArgumentCaptor @@ -170,16 +166,15 @@ class ControlsControllerImplTest : SysuiTestCase() { uiController, bindingController, listingController, - broadcastDispatcher, userFileManager, + userTracker, Optional.of(persistenceWrapper), - mock(DumpManager::class.java), - userTracker + mock(DumpManager::class.java) ) controller.auxiliaryPersistenceWrapper = auxiliaryPersistenceWrapper - verify(broadcastDispatcher).registerReceiver( - capture(broadcastReceiverCaptor), any(), any(), eq(UserHandle.ALL), anyInt(), any() + verify(userTracker).addCallback( + capture(userTrackerCallbackCaptor), any() ) verify(listingController).addCallback(capture(listingCallbackCaptor)) @@ -227,11 +222,10 @@ class ControlsControllerImplTest : SysuiTestCase() { uiController, bindingController, listingController, - broadcastDispatcher, userFileManager, + userTracker, Optional.of(persistenceWrapper), - mock(DumpManager::class.java), - userTracker + mock(DumpManager::class.java) ) assertEquals(listOf(TEST_STRUCTURE_INFO), controller_other.getFavorites()) } @@ -518,14 +512,8 @@ class ControlsControllerImplTest : SysuiTestCase() { delayableExecutor.runAllReady() reset(persistenceWrapper) - val intent = Intent(Intent.ACTION_USER_SWITCHED).apply { - putExtra(Intent.EXTRA_USER_HANDLE, otherUser) - } - val pendingResult = mock(BroadcastReceiver.PendingResult::class.java) - `when`(pendingResult.sendingUserId).thenReturn(otherUser) - broadcastReceiverCaptor.value.pendingResult = pendingResult - broadcastReceiverCaptor.value.onReceive(mContext, intent) + userTrackerCallbackCaptor.value.onUserChanged(otherUser, mContext) verify(persistenceWrapper).changeFileAndBackupManager(any(), any()) verify(persistenceWrapper).readFavorites() diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/controls/resume/MediaResumeListenerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/controls/resume/MediaResumeListenerTest.kt index 84fdfd78e9fcc..136ace1737959 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/controls/resume/MediaResumeListenerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/controls/resume/MediaResumeListenerTest.kt @@ -38,6 +38,7 @@ import com.android.systemui.media.controls.models.player.MediaData import com.android.systemui.media.controls.models.player.MediaDeviceData import com.android.systemui.media.controls.pipeline.MediaDataManager import com.android.systemui.media.controls.pipeline.RESUME_MEDIA_TIMEOUT +import com.android.systemui.settings.UserTracker import com.android.systemui.tuner.TunerService import com.android.systemui.util.concurrency.FakeExecutor import com.android.systemui.util.time.FakeSystemClock @@ -79,6 +80,7 @@ private fun any(): T = Mockito.any() class MediaResumeListenerTest : SysuiTestCase() { @Mock private lateinit var broadcastDispatcher: BroadcastDispatcher + @Mock private lateinit var userTracker: UserTracker @Mock private lateinit var mediaDataManager: MediaDataManager @Mock private lateinit var device: MediaDeviceData @Mock private lateinit var token: MediaSession.Token @@ -131,12 +133,15 @@ class MediaResumeListenerTest : SysuiTestCase() { whenever(sharedPrefsEditor.putString(any(), any())).thenReturn(sharedPrefsEditor) whenever(mockContext.packageManager).thenReturn(context.packageManager) whenever(mockContext.contentResolver).thenReturn(context.contentResolver) + whenever(mockContext.userId).thenReturn(context.userId) executor = FakeExecutor(clock) resumeListener = MediaResumeListener( mockContext, broadcastDispatcher, + userTracker, + executor, executor, tunerService, resumeBrowserFactory, @@ -177,6 +182,8 @@ class MediaResumeListenerTest : SysuiTestCase() { MediaResumeListener( context, broadcastDispatcher, + userTracker, + executor, executor, tunerService, resumeBrowserFactory, @@ -185,7 +192,7 @@ class MediaResumeListenerTest : SysuiTestCase() { ) listener.setManager(mediaDataManager) verify(broadcastDispatcher, never()) - .registerReceiver(eq(listener.userChangeReceiver), any(), any(), any(), anyInt(), any()) + .registerReceiver(eq(listener.userUnlockReceiver), any(), any(), any(), anyInt(), any()) // When data is loaded, we do NOT execute or update anything listener.onMediaDataLoaded(KEY, OLD_KEY, data) @@ -289,7 +296,7 @@ class MediaResumeListenerTest : SysuiTestCase() { resumeListener.setManager(mediaDataManager) verify(broadcastDispatcher) .registerReceiver( - eq(resumeListener.userChangeReceiver), + eq(resumeListener.userUnlockReceiver), any(), any(), any(), @@ -299,7 +306,8 @@ class MediaResumeListenerTest : SysuiTestCase() { // When we get an unlock event val intent = Intent(Intent.ACTION_USER_UNLOCKED) - resumeListener.userChangeReceiver.onReceive(context, intent) + intent.putExtra(Intent.EXTRA_USER_HANDLE, context.userId) + resumeListener.userUnlockReceiver.onReceive(context, intent) // Then we should attempt to find recent media for each saved component verify(resumeBrowser, times(3)).findRecentMedia() @@ -375,6 +383,8 @@ class MediaResumeListenerTest : SysuiTestCase() { MediaResumeListener( mockContext, broadcastDispatcher, + userTracker, + executor, executor, tunerService, resumeBrowserFactory, @@ -386,7 +396,8 @@ class MediaResumeListenerTest : SysuiTestCase() { // When we load a component that was played recently val intent = Intent(Intent.ACTION_USER_UNLOCKED) - resumeListener.userChangeReceiver.onReceive(mockContext, intent) + intent.putExtra(Intent.EXTRA_USER_HANDLE, context.userId) + resumeListener.userUnlockReceiver.onReceive(mockContext, intent) // We add its resume controls verify(resumeBrowser, times(1)).findRecentMedia() @@ -404,6 +415,8 @@ class MediaResumeListenerTest : SysuiTestCase() { MediaResumeListener( mockContext, broadcastDispatcher, + userTracker, + executor, executor, tunerService, resumeBrowserFactory, @@ -415,7 +428,8 @@ class MediaResumeListenerTest : SysuiTestCase() { // When we load a component that is not recent val intent = Intent(Intent.ACTION_USER_UNLOCKED) - resumeListener.userChangeReceiver.onReceive(mockContext, intent) + intent.putExtra(Intent.EXTRA_USER_HANDLE, context.userId) + resumeListener.userUnlockReceiver.onReceive(mockContext, intent) // We do not try to add resume controls verify(resumeBrowser, times(0)).findRecentMedia() @@ -443,6 +457,8 @@ class MediaResumeListenerTest : SysuiTestCase() { MediaResumeListener( mockContext, broadcastDispatcher, + userTracker, + executor, executor, tunerService, resumeBrowserFactory, diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java index c1fa9b39f50b1..6687b13d71166 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java @@ -44,14 +44,11 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import android.content.BroadcastReceiver; import android.content.Context; -import android.content.IntentFilter; import android.content.res.Resources; import android.hardware.display.DisplayManagerGlobal; import android.os.Handler; import android.os.SystemClock; -import android.os.UserHandle; import android.provider.DeviceConfig; import android.telecom.TelecomManager; import android.testing.AndroidTestingRunner; @@ -79,7 +76,6 @@ import com.android.systemui.accessibility.AccessibilityButtonModeObserver; import com.android.systemui.accessibility.AccessibilityButtonTargetsObserver; import com.android.systemui.accessibility.SystemActions; import com.android.systemui.assist.AssistManager; -import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dump.DumpManager; import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.model.SysUiState; @@ -119,6 +115,7 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.util.Optional; +import java.util.concurrent.Executor; @RunWith(AndroidTestingRunner.class) @RunWithLooper(setAsMainLooper = true) @@ -166,7 +163,7 @@ public class NavigationBarTest extends SysuiTestCase { @Mock private Handler mHandler; @Mock - private BroadcastDispatcher mBroadcastDispatcher; + private UserTracker mUserTracker; @Mock private UiEventLogger mUiEventLogger; @Mock @@ -315,14 +312,10 @@ public class NavigationBarTest extends SysuiTestCase { } @Test - public void testRegisteredWithDispatcher() { + public void testRegisteredWithUserTracker() { mNavigationBar.init(); mNavigationBar.onViewAttached(); - verify(mBroadcastDispatcher).registerReceiverWithHandler( - any(BroadcastReceiver.class), - any(IntentFilter.class), - any(Handler.class), - any(UserHandle.class)); + verify(mUserTracker).addCallback(any(UserTracker.Callback.class), any(Executor.class)); } @Test @@ -457,7 +450,7 @@ public class NavigationBarTest extends SysuiTestCase { mStatusBarStateController, mStatusBarKeyguardViewManager, mMockSysUiState, - mBroadcastDispatcher, + mUserTracker, mCommandQueue, Optional.of(mock(Pip.class)), Optional.of(mock(Recents.class)), diff --git a/packages/SystemUI/tests/src/com/android/systemui/power/PowerUITest.java b/packages/SystemUI/tests/src/com/android/systemui/power/PowerUITest.java index c377c374148f1..338182a3e3048 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/power/PowerUITest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/power/PowerUITest.java @@ -48,6 +48,7 @@ import com.android.systemui.SysuiTestCase; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.power.PowerUI.WarningsUI; +import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.phone.CentralSurfaces; @@ -85,6 +86,7 @@ public class PowerUITest extends SysuiTestCase { private PowerUI mPowerUI; @Mock private EnhancedEstimates mEnhancedEstimates; @Mock private PowerManager mPowerManager; + @Mock private UserTracker mUserTracker; @Mock private WakefulnessLifecycle mWakefulnessLifecycle; @Mock private IThermalService mThermalServiceMock; private IThermalEventListener mUsbThermalEventListener; @@ -682,7 +684,8 @@ public class PowerUITest extends SysuiTestCase { private void createPowerUi() { mPowerUI = new PowerUI( mContext, mBroadcastDispatcher, mCommandQueue, mCentralSurfacesOptionalLazy, - mMockWarnings, mEnhancedEstimates, mWakefulnessLifecycle, mPowerManager); + mMockWarnings, mEnhancedEstimates, mWakefulnessLifecycle, mPowerManager, + mUserTracker); mPowerUI.mThermalService = mThermalServiceMock; } diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenrecord/RecordingControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/screenrecord/RecordingControllerTest.java index 013e58ed99d7e..69f3e987ec1d5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/screenrecord/RecordingControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/screenrecord/RecordingControllerTest.java @@ -33,6 +33,9 @@ import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.settings.UserContextProvider; +import com.android.systemui.settings.UserTracker; +import com.android.systemui.util.concurrency.FakeExecutor; +import com.android.systemui.util.time.FakeSystemClock; import org.junit.Before; import org.junit.Test; @@ -49,12 +52,16 @@ import org.mockito.MockitoAnnotations; */ public class RecordingControllerTest extends SysuiTestCase { + private FakeSystemClock mFakeSystemClock = new FakeSystemClock(); + private FakeExecutor mMainExecutor = new FakeExecutor(mFakeSystemClock); @Mock private RecordingController.RecordingStateChangeCallback mCallback; @Mock private BroadcastDispatcher mBroadcastDispatcher; @Mock private UserContextProvider mUserContextProvider; + @Mock + private UserTracker mUserTracker; private RecordingController mController; @@ -63,7 +70,8 @@ public class RecordingControllerTest extends SysuiTestCase { @Before public void setUp() { MockitoAnnotations.initMocks(this); - mController = new RecordingController(mBroadcastDispatcher, mUserContextProvider); + mController = new RecordingController(mMainExecutor, mBroadcastDispatcher, + mUserContextProvider, mUserTracker); mController.addCallback(mCallback); } @@ -176,9 +184,7 @@ public class RecordingControllerTest extends SysuiTestCase { mController.updateState(true); // and user is changed - Intent intent = new Intent(Intent.ACTION_USER_SWITCHED) - .putExtra(Intent.EXTRA_USER_HANDLE, USER_ID); - mController.mUserChangeReceiver.onReceive(mContext, intent); + mController.mUserChangedCallback.onUserChanged(USER_ID, mContext); // Ensure that the recording was stopped verify(mCallback).onRecordingEnd(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java index 15a687d2adc78..452606dfcca4d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java @@ -16,8 +16,6 @@ package com.android.systemui.statusbar; -import static android.content.Intent.ACTION_USER_SWITCHED; - import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertTrue; @@ -34,7 +32,6 @@ import android.app.Notification; import android.app.admin.DevicePolicyManager; import android.content.BroadcastReceiver; import android.content.Context; -import android.content.Intent; import android.content.pm.UserInfo; import android.database.ContentObserver; import android.os.Handler; @@ -293,11 +290,9 @@ public class NotificationLockscreenUserManagerTest extends SysuiTestCase { } @Test - public void testActionUserSwitchedCallsOnUserSwitched() { - Intent intent = new Intent() - .setAction(ACTION_USER_SWITCHED) - .putExtra(Intent.EXTRA_USER_HANDLE, mSecondaryUser.id); - mLockscreenUserManager.getBaseBroadcastReceiverForTest().onReceive(mContext, intent); + public void testUserSwitchedCallsOnUserSwitched() { + mLockscreenUserManager.getUserTrackerCallbackForTest().onUserChanged(mSecondaryUser.id, + mContext); verify(mPresenter, times(1)).onUserSwitched(mSecondaryUser.id); } @@ -366,6 +361,10 @@ public class NotificationLockscreenUserManagerTest extends SysuiTestCase { return mBaseBroadcastReceiver; } + public UserTracker.Callback getUserTrackerCallbackForTest() { + return mUserChangedCallback; + } + public ContentObserver getLockscreenSettingsObserverForTest() { return mLockscreenSettingsObserver; } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/KeyguardNotificationVisibilityProviderTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/KeyguardNotificationVisibilityProviderTest.java index 8b7b4dea155f5..6bd3f7a274130 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/KeyguardNotificationVisibilityProviderTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/KeyguardNotificationVisibilityProviderTest.java @@ -26,22 +26,17 @@ import static android.app.NotificationManager.IMPORTANCE_MIN; import static com.android.systemui.statusbar.StatusBarState.KEYGUARD; import static com.android.systemui.statusbar.StatusBarState.SHADE; import static com.android.systemui.statusbar.notification.collection.EntryUtilKt.modifyEntry; -import static com.android.systemui.util.mockito.KotlinMockitoHelpersKt.argThat; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.ArgumentMatchers.isNull; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import android.content.BroadcastReceiver; import android.content.Context; -import android.content.Intent; import android.os.Handler; import android.os.UserHandle; import android.provider.Settings; @@ -54,10 +49,10 @@ import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.systemui.CoreStartable; import com.android.systemui.SysuiTestCase; -import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.statusbar.StatusBarStateController; +import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.RankingBuilder; import com.android.systemui.statusbar.SysuiStatusBarStateController; @@ -97,7 +92,7 @@ public class KeyguardNotificationVisibilityProviderTest extends SysuiTestCase { @Mock private KeyguardUpdateMonitor mKeyguardUpdateMonitor; @Mock private HighPriorityProvider mHighPriorityProvider; @Mock private SysuiStatusBarStateController mStatusBarStateController; - @Mock private BroadcastDispatcher mBroadcastDispatcher; + @Mock private UserTracker mUserTracker; private final FakeSettings mFakeSettings = new FakeSettings(); private KeyguardNotificationVisibilityProvider mKeyguardNotificationVisibilityProvider; @@ -117,7 +112,7 @@ public class KeyguardNotificationVisibilityProviderTest extends SysuiTestCase { mKeyguardUpdateMonitor, mHighPriorityProvider, mStatusBarStateController, - mBroadcastDispatcher, + mUserTracker, mFakeSettings, mFakeSettings); mKeyguardNotificationVisibilityProvider = component.getProvider(); @@ -205,23 +200,19 @@ public class KeyguardNotificationVisibilityProviderTest extends SysuiTestCase { } @Test - public void notifyListeners_onReceiveUserSwitchBroadcast() { - ArgumentCaptor callbackCaptor = - ArgumentCaptor.forClass(BroadcastReceiver.class); - verify(mBroadcastDispatcher).registerReceiver( + public void notifyListeners_onReceiveUserSwitchCallback() { + ArgumentCaptor callbackCaptor = + ArgumentCaptor.forClass(UserTracker.Callback.class); + verify(mUserTracker).addCallback( callbackCaptor.capture(), - argThat(intentFilter -> intentFilter.hasAction(Intent.ACTION_USER_SWITCHED)), - isNull(), - isNull(), - eq(Context.RECEIVER_EXPORTED), - isNull()); - BroadcastReceiver callback = callbackCaptor.getValue(); + any()); + UserTracker.Callback callback = callbackCaptor.getValue(); Consumer listener = mock(Consumer.class); mKeyguardNotificationVisibilityProvider.addOnStateChangedListener(listener); when(mStatusBarStateController.getCurrentOrUpcomingState()).thenReturn(KEYGUARD); - callback.onReceive(mContext, new Intent(Intent.ACTION_USER_SWITCHED)); + callback.onUserChanged(CURR_USER_ID, mContext); verify(listener).accept(anyString()); } @@ -619,7 +610,7 @@ public class KeyguardNotificationVisibilityProviderTest extends SysuiTestCase { @BindsInstance KeyguardUpdateMonitor keyguardUpdateMonitor, @BindsInstance HighPriorityProvider highPriorityProvider, @BindsInstance SysuiStatusBarStateController statusBarStateController, - @BindsInstance BroadcastDispatcher broadcastDispatcher, + @BindsInstance UserTracker userTracker, @BindsInstance SecureSettings secureSettings, @BindsInstance GlobalSettings globalSettings );