diff options
| author | 2022-11-16 23:18:04 +0000 | |
|---|---|---|
| committer | 2022-11-16 23:18:04 +0000 | |
| commit | f1aaea75884b4287dbeabbefd9b27785dc9f46a4 (patch) | |
| tree | d4a27616e63d7861227f89b8a4fe50a119a26cbe | |
| parent | ad81dbda160439d80a6e7e000e757e14405108f3 (diff) | |
| parent | b8d6c0a94834079f5598dc920a818fd4d67bf636 (diff) | |
Merge "Replace getCurrentUser() calls with UserTracker" into tm-qpr-dev
64 files changed, 536 insertions, 614 deletions
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index 463c00660787..130493487ba9 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -145,6 +145,7 @@ import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dump.DumpManager; import com.android.systemui.log.SessionTracker; import com.android.systemui.plugins.statusbar.StatusBarStateController; +import com.android.systemui.settings.UserTracker; import com.android.systemui.shared.system.TaskStackChangeListener; import com.android.systemui.shared.system.TaskStackChangeListeners; import com.android.systemui.statusbar.StatusBarState; @@ -279,6 +280,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab } private final Context mContext; + private final UserTracker mUserTracker; private final KeyguardUpdateMonitorLogger mLogger; private final boolean mIsPrimaryUser; private final AuthController mAuthController; @@ -884,13 +886,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab mHandler.removeCallbacks(mFpCancelNotReceived); } try { - final int userId; - try { - userId = ActivityManager.getService().getCurrentUser().id; - } catch (RemoteException e) { - mLogger.logException(e, "Failed to get current user id"); - return; - } + final int userId = mUserTracker.getUserId(); if (userId != authUserId) { mLogger.logFingerprintAuthForWrongUser(authUserId); return; @@ -1108,13 +1104,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab mLogger.d("Aborted successful auth because device is going to sleep."); return; } - final int userId; - try { - userId = ActivityManager.getService().getCurrentUser().id; - } catch (RemoteException e) { - mLogger.logException(e, "Failed to get current user id"); - return; - } + final int userId = mUserTracker.getUserId(); if (userId != authUserId) { mLogger.logFaceAuthForWrongUser(authUserId); return; @@ -1964,6 +1954,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab @Inject protected KeyguardUpdateMonitor( Context context, + UserTracker userTracker, @Main Looper mainLooper, BroadcastDispatcher broadcastDispatcher, SecureSettings secureSettings, @@ -1996,6 +1987,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab FaceWakeUpTriggersConfig faceWakeUpTriggersConfig) { mContext = context; mSubscriptionManager = subscriptionManager; + mUserTracker = userTracker; mTelephonyListenerManager = telephonyListenerManager; mDeviceProvisioned = isDeviceProvisionedInSettingsDb(); mStrongAuthTracker = new StrongAuthTracker(context, this::notifyStrongAuthStateChanged, @@ -2227,7 +2219,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab TaskStackChangeListeners.getInstance().registerTaskStackListener(mTaskStackListener); mIsPrimaryUser = mUserManager.isPrimaryUser(); - int user = ActivityManager.getCurrentUser(); + int user = mUserTracker.getUserId(); mUserIsUnlocked.put(user, mUserManager.isUserUnlocked(user)); mLogoutEnabled = mDevicePolicyManager.isLogoutEnabled(); updateSecondaryLockscreenRequirement(user); @@ -3853,7 +3845,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab pw.println(" " + subId + "=" + mServiceStates.get(subId)); } if (mFpm != null && mFpm.isHardwareDetected()) { - final int userId = ActivityManager.getCurrentUser(); + final int userId = mUserTracker.getUserId(); final int strongAuthFlags = mStrongAuthTracker.getStrongAuthForUser(userId); BiometricAuthenticated fingerprint = mUserFingerprintAuthenticated.get(userId); pw.println(" Fingerprint state (user=" + userId + ")"); @@ -3891,7 +3883,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab } } if (mFaceManager != null && mFaceManager.isHardwareDetected()) { - final int userId = ActivityManager.getCurrentUser(); + final int userId = mUserTracker.getUserId(); final int strongAuthFlags = mStrongAuthTracker.getStrongAuthForUser(userId); BiometricAuthenticated face = mUserFaceAuthenticated.get(userId); pw.println(" Face authentication state (user=" + userId + ")"); diff --git a/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java b/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java index 9a0bfc19f848..ad9609f9ec42 100644 --- a/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java +++ b/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java @@ -29,17 +29,17 @@ import android.util.ArrayMap; import android.util.DisplayMetrics; import android.view.LayoutInflater; +import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; -import androidx.lifecycle.Observer; -import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.colorextraction.SysuiColorExtractor; import com.android.systemui.dagger.SysUISingleton; +import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dock.DockManager; import com.android.systemui.dock.DockManager.DockEventListener; import com.android.systemui.plugins.ClockPlugin; import com.android.systemui.plugins.PluginListener; -import com.android.systemui.settings.CurrentUserObservable; +import com.android.systemui.settings.UserTracker; import com.android.systemui.shared.plugins.PluginManager; import java.util.ArrayList; @@ -47,6 +47,7 @@ import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.concurrent.Executor; import java.util.function.Supplier; import javax.inject.Inject; @@ -69,7 +70,8 @@ public final class ClockManager { private final ContentResolver mContentResolver; private final SettingsWrapper mSettingsWrapper; private final Handler mMainHandler = new Handler(Looper.getMainLooper()); - private final CurrentUserObservable mCurrentUserObservable; + private final UserTracker mUserTracker; + private final Executor mMainExecutor; /** * Observe settings changes to know when to switch the clock face. @@ -80,7 +82,7 @@ public final class ClockManager { public void onChange(boolean selfChange, Collection<Uri> uris, int flags, int userId) { if (Objects.equals(userId, - mCurrentUserObservable.getCurrentUser().getValue())) { + mUserTracker.getUserId())) { reload(); } } @@ -89,7 +91,13 @@ public final class ClockManager { /** * Observe user changes and react by potentially loading the custom clock for the new user. */ - private final Observer<Integer> mCurrentUserObserver = (newUserId) -> reload(); + private final UserTracker.Callback mUserChangedCallback = + new UserTracker.Callback() { + @Override + public void onUserChanged(int newUser, @NonNull Context userContext) { + reload(); + } + }; private final PluginManager mPluginManager; @Nullable private final DockManager mDockManager; @@ -129,22 +137,24 @@ public final class ClockManager { @Inject public ClockManager(Context context, LayoutInflater layoutInflater, PluginManager pluginManager, SysuiColorExtractor colorExtractor, - @Nullable DockManager dockManager, BroadcastDispatcher broadcastDispatcher) { + @Nullable DockManager dockManager, UserTracker userTracker, + @Main Executor mainExecutor) { this(context, layoutInflater, pluginManager, colorExtractor, - context.getContentResolver(), new CurrentUserObservable(broadcastDispatcher), + context.getContentResolver(), userTracker, mainExecutor, new SettingsWrapper(context.getContentResolver()), dockManager); } @VisibleForTesting ClockManager(Context context, LayoutInflater layoutInflater, PluginManager pluginManager, SysuiColorExtractor colorExtractor, - ContentResolver contentResolver, CurrentUserObservable currentUserObservable, + ContentResolver contentResolver, UserTracker userTracker, Executor mainExecutor, SettingsWrapper settingsWrapper, DockManager dockManager) { mContext = context; mPluginManager = pluginManager; mContentResolver = contentResolver; mSettingsWrapper = settingsWrapper; - mCurrentUserObservable = currentUserObservable; + mUserTracker = userTracker; + mMainExecutor = mainExecutor; mDockManager = dockManager; mPreviewClocks = new AvailableClocks(); @@ -226,7 +236,7 @@ public final class ClockManager { mContentResolver.registerContentObserver( Settings.Secure.getUriFor(Settings.Secure.DOCKED_CLOCK_FACE), false, mContentObserver, UserHandle.USER_ALL); - mCurrentUserObservable.getCurrentUser().observeForever(mCurrentUserObserver); + mUserTracker.addCallback(mUserChangedCallback, mMainExecutor); if (mDockManager != null) { mDockManager.addListener(mDockEventListener); } @@ -235,7 +245,7 @@ public final class ClockManager { private void unregister() { mPluginManager.removePluginListener(mPreviewClocks); mContentResolver.unregisterContentObserver(mContentObserver); - mCurrentUserObservable.getCurrentUser().removeObserver(mCurrentUserObserver); + mUserTracker.removeCallback(mUserChangedCallback); if (mDockManager != null) { mDockManager.removeListener(mDockEventListener); } @@ -363,7 +373,7 @@ public final class ClockManager { ClockPlugin plugin = null; if (ClockManager.this.isDocked()) { final String name = mSettingsWrapper.getDockedClockFace( - mCurrentUserObservable.getCurrentUser().getValue()); + mUserTracker.getUserId()); if (name != null) { plugin = mClocks.get(name); if (plugin != null) { @@ -372,7 +382,7 @@ public final class ClockManager { } } final String name = mSettingsWrapper.getLockScreenCustomClockFace( - mCurrentUserObservable.getCurrentUser().getValue()); + mUserTracker.getUserId()); if (name != null) { plugin = mClocks.get(name); } diff --git a/packages/SystemUI/src/com/android/systemui/Dependency.java b/packages/SystemUI/src/com/android/systemui/Dependency.java index a5fdc68226e8..51bcd6b18936 100644 --- a/packages/SystemUI/src/com/android/systemui/Dependency.java +++ b/packages/SystemUI/src/com/android/systemui/Dependency.java @@ -70,6 +70,7 @@ import com.android.systemui.qs.ReduceBrightColorsController; import com.android.systemui.qs.tiles.dialog.InternetDialogFactory; import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.screenrecord.RecordingController; +import com.android.systemui.settings.UserTracker; import com.android.systemui.shade.ShadeController; import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.shared.system.ActivityManagerWrapper; @@ -357,6 +358,7 @@ public class Dependency { @Inject Lazy<GroupExpansionManager> mGroupExpansionManagerLazy; @Inject Lazy<SystemUIDialogManager> mSystemUIDialogManagerLazy; @Inject Lazy<DialogLaunchAnimator> mDialogLaunchAnimatorLazy; + @Inject Lazy<UserTracker> mUserTrackerLazy; @Inject public Dependency() { @@ -564,6 +566,7 @@ public class Dependency { mProviders.put(GroupExpansionManager.class, mGroupExpansionManagerLazy::get); mProviders.put(SystemUIDialogManager.class, mSystemUIDialogManagerLazy::get); mProviders.put(DialogLaunchAnimator.class, mDialogLaunchAnimatorLazy::get); + mProviders.put(UserTracker.class, mUserTrackerLazy::get); Dependency.setInstance(this); } diff --git a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java index 45f9385a2620..7e3b1389792c 100644 --- a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java +++ b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java @@ -26,7 +26,6 @@ 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.app.ActivityManager; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -901,7 +900,7 @@ public class ScreenDecorations implements CoreStartable, Tunable , Dumpable { private final BroadcastReceiver mUserSwitchIntentReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - int newUserId = ActivityManager.getCurrentUser(); + int newUserId = mUserTracker.getUserId(); if (DEBUG) { Log.d(TAG, "UserSwitched newUserId=" + newUserId); } diff --git a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterViewController.java b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterViewController.java index 77cb9d1bf594..f4ec33ad24b5 100644 --- a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterViewController.java +++ b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterViewController.java @@ -17,21 +17,23 @@ package com.android.systemui.battery; import static android.provider.Settings.System.SHOW_BATTERY_PERCENT; -import android.app.ActivityManager; import android.content.ContentResolver; +import android.content.Context; import android.database.ContentObserver; import android.net.Uri; import android.os.Handler; +import android.os.HandlerExecutor; import android.provider.Settings; import android.text.TextUtils; import android.util.ArraySet; import android.view.View; -import com.android.systemui.broadcast.BroadcastDispatcher; +import androidx.annotation.NonNull; + import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.Flags; -import com.android.systemui.settings.CurrentUserTracker; +import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.phone.StatusBarIconController; import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.ConfigurationController; @@ -44,12 +46,13 @@ import javax.inject.Inject; public class BatteryMeterViewController extends ViewController<BatteryMeterView> { private final ConfigurationController mConfigurationController; private final TunerService mTunerService; + private final Handler mMainHandler; private final ContentResolver mContentResolver; private final BatteryController mBatteryController; private final String mSlotBattery; private final SettingObserver mSettingObserver; - private final CurrentUserTracker mCurrentUserTracker; + private final UserTracker mUserTracker; private final ConfigurationController.ConfigurationListener mConfigurationListener = new ConfigurationController.ConfigurationListener() { @@ -93,6 +96,16 @@ public class BatteryMeterViewController extends ViewController<BatteryMeterView> } }; + private final UserTracker.Callback mUserChangedCallback = + new UserTracker.Callback() { + @Override + public void onUserChanged(int newUser, @NonNull Context userContext) { + mContentResolver.unregisterContentObserver(mSettingObserver); + registerShowBatteryPercentObserver(newUser); + mView.updateShowPercent(); + } + }; + // Some places may need to show the battery conditionally, and not obey the tuner private boolean mIgnoreTunerUpdates; private boolean mIsSubscribedForTunerUpdates; @@ -100,16 +113,18 @@ public class BatteryMeterViewController extends ViewController<BatteryMeterView> @Inject public BatteryMeterViewController( BatteryMeterView view, + UserTracker userTracker, ConfigurationController configurationController, TunerService tunerService, - BroadcastDispatcher broadcastDispatcher, @Main Handler mainHandler, ContentResolver contentResolver, FeatureFlags featureFlags, BatteryController batteryController) { super(view); + mUserTracker = userTracker; mConfigurationController = configurationController; mTunerService = tunerService; + mMainHandler = mainHandler; mContentResolver = contentResolver; mBatteryController = batteryController; @@ -117,15 +132,7 @@ public class BatteryMeterViewController extends ViewController<BatteryMeterView> mView.setDisplayShieldEnabled(featureFlags.isEnabled(Flags.BATTERY_SHIELD_ICON)); mSlotBattery = getResources().getString(com.android.internal.R.string.status_bar_battery); - mSettingObserver = new SettingObserver(mainHandler); - mCurrentUserTracker = new CurrentUserTracker(broadcastDispatcher) { - @Override - public void onUserSwitched(int newUserId) { - contentResolver.unregisterContentObserver(mSettingObserver); - registerShowBatteryPercentObserver(newUserId); - mView.updateShowPercent(); - } - }; + mSettingObserver = new SettingObserver(mMainHandler); } @Override @@ -134,9 +141,9 @@ public class BatteryMeterViewController extends ViewController<BatteryMeterView> subscribeForTunerUpdates(); mBatteryController.addCallback(mBatteryStateChangeCallback); - registerShowBatteryPercentObserver(ActivityManager.getCurrentUser()); + registerShowBatteryPercentObserver(mUserTracker.getUserId()); registerGlobalBatteryUpdateObserver(); - mCurrentUserTracker.startTracking(); + mUserTracker.addCallback(mUserChangedCallback, new HandlerExecutor(mMainHandler)); mView.updateShowPercent(); } @@ -147,7 +154,7 @@ public class BatteryMeterViewController extends ViewController<BatteryMeterView> unsubscribeFromTunerUpdates(); mBatteryController.removeCallback(mBatteryStateChangeCallback); - mCurrentUserTracker.stopTracking(); + mUserTracker.removeCallback(mUserChangedCallback); mContentResolver.unregisterContentObserver(mSettingObserver); } diff --git a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsEditingActivity.kt b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsEditingActivity.kt index b11103a4d27b..7df08651d5ab 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsEditingActivity.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsEditingActivity.kt @@ -18,6 +18,7 @@ package com.android.systemui.controls.management import android.app.ActivityOptions import android.content.ComponentName +import android.content.Context import android.content.Intent import android.os.Bundle import android.util.Log @@ -33,21 +34,23 @@ import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.RecyclerView import com.android.systemui.R -import com.android.systemui.broadcast.BroadcastDispatcher import com.android.systemui.controls.CustomIconCache import com.android.systemui.controls.controller.ControlsControllerImpl import com.android.systemui.controls.controller.StructureInfo import com.android.systemui.controls.ui.ControlsActivity import com.android.systemui.controls.ui.ControlsUiController -import com.android.systemui.settings.CurrentUserTracker +import com.android.systemui.dagger.qualifiers.Main +import com.android.systemui.settings.UserTracker +import java.util.concurrent.Executor import javax.inject.Inject /** * Activity for rearranging and removing controls for a given structure */ open class ControlsEditingActivity @Inject constructor( + @Main private val mainExecutor: Executor, private val controller: ControlsControllerImpl, - private val broadcastDispatcher: BroadcastDispatcher, + private val userTracker: UserTracker, private val customIconCache: CustomIconCache, private val uiController: ControlsUiController ) : ComponentActivity() { @@ -66,12 +69,12 @@ open class ControlsEditingActivity @Inject constructor( private lateinit var subtitle: TextView private lateinit var saveButton: View - private val currentUserTracker = object : CurrentUserTracker(broadcastDispatcher) { + private val userTrackerCallback: UserTracker.Callback = object : UserTracker.Callback { private val startingUser = controller.currentUserId - override fun onUserSwitched(newUserId: Int) { - if (newUserId != startingUser) { - stopTracking() + override fun onUserChanged(newUser: Int, userContext: Context) { + if (newUser != startingUser) { + userTracker.removeCallback(this) finish() } } @@ -104,7 +107,7 @@ open class ControlsEditingActivity @Inject constructor( super.onStart() setUpList() - currentUserTracker.startTracking() + userTracker.addCallback(userTrackerCallback, mainExecutor) if (DEBUG) { Log.d(TAG, "Registered onBackInvokedCallback") @@ -115,7 +118,7 @@ open class ControlsEditingActivity @Inject constructor( override fun onStop() { super.onStop() - currentUserTracker.stopTracking() + userTracker.removeCallback(userTrackerCallback) if (DEBUG) { Log.d(TAG, "Unregistered onBackInvokedCallback") @@ -248,7 +251,7 @@ open class ControlsEditingActivity @Inject constructor( } override fun onDestroy() { - currentUserTracker.stopTracking() + userTracker.removeCallback(userTrackerCallback) super.onDestroy() } } diff --git a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsFavoritingActivity.kt b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsFavoritingActivity.kt index 9b2a72823d86..3e97d3132bc7 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsFavoritingActivity.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsFavoritingActivity.kt @@ -20,6 +20,7 @@ import android.animation.Animator import android.animation.AnimatorListenerAdapter import android.app.ActivityOptions import android.content.ComponentName +import android.content.Context import android.content.Intent import android.content.res.Configuration import android.os.Bundle @@ -39,7 +40,6 @@ import androidx.activity.ComponentActivity import androidx.viewpager2.widget.ViewPager2 import com.android.systemui.Prefs import com.android.systemui.R -import com.android.systemui.broadcast.BroadcastDispatcher import com.android.systemui.controls.ControlsServiceInfo import com.android.systemui.controls.TooltipManager import com.android.systemui.controls.controller.ControlsControllerImpl @@ -47,7 +47,7 @@ import com.android.systemui.controls.controller.StructureInfo import com.android.systemui.controls.ui.ControlsActivity import com.android.systemui.controls.ui.ControlsUiController import com.android.systemui.dagger.qualifiers.Main -import com.android.systemui.settings.CurrentUserTracker +import com.android.systemui.settings.UserTracker import java.text.Collator import java.util.concurrent.Executor import java.util.function.Consumer @@ -57,7 +57,7 @@ open class ControlsFavoritingActivity @Inject constructor( @Main private val executor: Executor, private val controller: ControlsControllerImpl, private val listingController: ControlsListingController, - private val broadcastDispatcher: BroadcastDispatcher, + private val userTracker: UserTracker, private val uiController: ControlsUiController ) : ComponentActivity() { @@ -95,12 +95,12 @@ open class ControlsFavoritingActivity @Inject constructor( private var cancelLoadRunnable: Runnable? = null private var isPagerLoaded = false - private val currentUserTracker = object : CurrentUserTracker(broadcastDispatcher) { + private val userTrackerCallback: UserTracker.Callback = object : UserTracker.Callback { private val startingUser = controller.currentUserId - override fun onUserSwitched(newUserId: Int) { - if (newUserId != startingUser) { - stopTracking() + override fun onUserChanged(newUser: Int, userContext: Context) { + if (newUser != startingUser) { + userTracker.removeCallback(this) finish() } } @@ -363,7 +363,7 @@ open class ControlsFavoritingActivity @Inject constructor( super.onStart() listingController.addCallback(listingCallback) - currentUserTracker.startTracking() + userTracker.addCallback(userTrackerCallback, executor) if (DEBUG) { Log.d(TAG, "Registered onBackInvokedCallback") @@ -388,7 +388,7 @@ open class ControlsFavoritingActivity @Inject constructor( super.onStop() listingController.removeCallback(listingCallback) - currentUserTracker.stopTracking() + userTracker.removeCallback(userTrackerCallback) if (DEBUG) { Log.d(TAG, "Unregistered onBackInvokedCallback") diff --git a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsProviderSelectorActivity.kt b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsProviderSelectorActivity.kt index 47690a7fa487..90bc5d0f8daa 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsProviderSelectorActivity.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsProviderSelectorActivity.kt @@ -18,6 +18,7 @@ package com.android.systemui.controls.management import android.app.ActivityOptions import android.content.ComponentName +import android.content.Context import android.content.Intent import android.os.Bundle import android.util.Log @@ -33,13 +34,12 @@ import androidx.activity.ComponentActivity import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.android.systemui.R -import com.android.systemui.broadcast.BroadcastDispatcher import com.android.systemui.controls.controller.ControlsController import com.android.systemui.controls.ui.ControlsActivity import com.android.systemui.controls.ui.ControlsUiController import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.dagger.qualifiers.Main -import com.android.systemui.settings.CurrentUserTracker +import com.android.systemui.settings.UserTracker import java.util.concurrent.Executor import javax.inject.Inject @@ -51,7 +51,7 @@ open class ControlsProviderSelectorActivity @Inject constructor( @Background private val backExecutor: Executor, private val listingController: ControlsListingController, private val controlsController: ControlsController, - private val broadcastDispatcher: BroadcastDispatcher, + private val userTracker: UserTracker, private val uiController: ControlsUiController ) : ComponentActivity() { @@ -62,12 +62,12 @@ open class ControlsProviderSelectorActivity @Inject constructor( } private var backShouldExit = false private lateinit var recyclerView: RecyclerView - private val currentUserTracker = object : CurrentUserTracker(broadcastDispatcher) { + private val userTrackerCallback: UserTracker.Callback = object : UserTracker.Callback { private val startingUser = listingController.currentUserId - override fun onUserSwitched(newUserId: Int) { - if (newUserId != startingUser) { - stopTracking() + override fun onUserChanged(newUser: Int, userContext: Context) { + if (newUser != startingUser) { + userTracker.removeCallback(this) finish() } } @@ -129,7 +129,7 @@ open class ControlsProviderSelectorActivity @Inject constructor( override fun onStart() { super.onStart() - currentUserTracker.startTracking() + userTracker.addCallback(userTrackerCallback, executor) recyclerView.alpha = 0.0f recyclerView.adapter = AppAdapter( @@ -161,7 +161,7 @@ open class ControlsProviderSelectorActivity @Inject constructor( override fun onStop() { super.onStop() - currentUserTracker.stopTracking() + userTracker.removeCallback(userTrackerCallback) if (DEBUG) { Log.d(TAG, "Unregistered onBackInvokedCallback") @@ -190,7 +190,7 @@ open class ControlsProviderSelectorActivity @Inject constructor( } override fun onDestroy() { - currentUserTracker.stopTracking() + userTracker.removeCallback(userTrackerCallback) super.onDestroy() } diff --git a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsRequestDialog.kt b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsRequestDialog.kt index b376455ee815..86bde5c3cf4d 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsRequestDialog.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsRequestDialog.kt @@ -19,6 +19,7 @@ package com.android.systemui.controls.management import android.app.AlertDialog import android.app.Dialog import android.content.ComponentName +import android.content.Context import android.content.DialogInterface import android.content.Intent import android.os.Bundle @@ -32,18 +33,20 @@ import android.widget.ImageView import android.widget.TextView import androidx.activity.ComponentActivity import com.android.systemui.R -import com.android.systemui.broadcast.BroadcastDispatcher import com.android.systemui.controls.ControlsServiceInfo import com.android.systemui.controls.controller.ControlInfo import com.android.systemui.controls.controller.ControlsController import com.android.systemui.controls.ui.RenderInfo -import com.android.systemui.settings.CurrentUserTracker +import com.android.systemui.dagger.qualifiers.Main +import com.android.systemui.settings.UserTracker import com.android.systemui.statusbar.phone.SystemUIDialog +import java.util.concurrent.Executor import javax.inject.Inject open class ControlsRequestDialog @Inject constructor( + @Main private val mainExecutor: Executor, private val controller: ControlsController, - private val broadcastDispatcher: BroadcastDispatcher, + private val userTracker: UserTracker, private val controlsListingController: ControlsListingController ) : ComponentActivity(), DialogInterface.OnClickListener, DialogInterface.OnCancelListener { @@ -58,12 +61,12 @@ open class ControlsRequestDialog @Inject constructor( override fun onServicesUpdated(serviceInfos: List<ControlsServiceInfo>) {} } - private val currentUserTracker = object : CurrentUserTracker(broadcastDispatcher) { + private val userTrackerCallback: UserTracker.Callback = object : UserTracker.Callback { private val startingUser = controller.currentUserId - override fun onUserSwitched(newUserId: Int) { - if (newUserId != startingUser) { - stopTracking() + override fun onUserChanged(newUser: Int, userContext: Context) { + if (newUser != startingUser) { + userTracker.removeCallback(this) finish() } } @@ -72,7 +75,7 @@ open class ControlsRequestDialog @Inject constructor( override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - currentUserTracker.startTracking() + userTracker.addCallback(userTrackerCallback, mainExecutor) controlsListingController.addCallback(callback) val requestUser = intent.getIntExtra(Intent.EXTRA_USER_ID, UserHandle.USER_NULL) @@ -118,7 +121,7 @@ open class ControlsRequestDialog @Inject constructor( override fun onDestroy() { dialog?.dismiss() - currentUserTracker.stopTracking() + userTracker.removeCallback(userTrackerCallback) controlsListingController.removeCallback(callback) super.onDestroy() } diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java index 9a091e725818..833ff3ff9746 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java @@ -22,7 +22,6 @@ import static com.android.systemui.plugins.SensorManagerPlugin.Sensor.TYPE_WAKE_ import static com.android.systemui.plugins.SensorManagerPlugin.Sensor.TYPE_WAKE_LOCK_SCREEN; import android.annotation.AnyThread; -import android.app.ActivityManager; import android.database.ContentObserver; import android.hardware.Sensor; import android.hardware.SensorManager; @@ -47,6 +46,7 @@ import com.android.internal.logging.UiEventLoggerImpl; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.biometrics.AuthController; import com.android.systemui.plugins.SensorManagerPlugin; +import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.policy.DevicePostureController; import com.android.systemui.util.sensors.AsyncSensorManager; @@ -96,6 +96,7 @@ public class DozeSensors { private final SecureSettings mSecureSettings; private final DevicePostureController mDevicePostureController; private final AuthController mAuthController; + private final UserTracker mUserTracker; private final boolean mScreenOffUdfpsEnabled; // Sensors @@ -149,7 +150,8 @@ public class DozeSensors { ProximitySensor proximitySensor, SecureSettings secureSettings, AuthController authController, - DevicePostureController devicePostureController + DevicePostureController devicePostureController, + UserTracker userTracker ) { mSensorManager = sensorManager; mConfig = config; @@ -167,6 +169,7 @@ public class DozeSensors { mDevicePostureController = devicePostureController; mDevicePosture = mDevicePostureController.getDevicePosture(); mAuthController = authController; + mUserTracker = userTracker; mUdfpsEnrolled = mAuthController.isUdfpsEnrolled(KeyguardUpdateMonitor.getCurrentUser()); @@ -438,7 +441,7 @@ public class DozeSensors { private final ContentObserver mSettingsObserver = new ContentObserver(mHandler) { @Override public void onChange(boolean selfChange, Collection<Uri> uris, int flags, int userId) { - if (userId != ActivityManager.getCurrentUser()) { + if (userId != mUserTracker.getUserId()) { return; } for (TriggerSensor s : mTriggerSensors) { diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java index 32cb1c01b776..0b69b80689e0 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java @@ -45,6 +45,7 @@ import com.android.systemui.dock.DockManager; import com.android.systemui.doze.DozeMachine.State; import com.android.systemui.doze.dagger.DozeScope; import com.android.systemui.log.SessionTracker; +import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.policy.DevicePostureController; import com.android.systemui.statusbar.policy.KeyguardStateController; @@ -188,7 +189,8 @@ public class DozeTriggers implements DozeMachine.Part { UiEventLogger uiEventLogger, SessionTracker sessionTracker, KeyguardStateController keyguardStateController, - DevicePostureController devicePostureController) { + DevicePostureController devicePostureController, + UserTracker userTracker) { mContext = context; mDozeHost = dozeHost; mConfig = config; @@ -200,7 +202,7 @@ public class DozeTriggers implements DozeMachine.Part { mDozeSensors = new DozeSensors(mSensorManager, dozeParameters, config, wakeLock, this::onSensor, this::onProximityFar, dozeLog, proximitySensor, - secureSettings, authController, devicePostureController); + secureSettings, authController, devicePostureController, userTracker); mDockManager = dockManager; mProxCheck = proxCheck; mDozeLog = dozeLog; diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java index 3ef5499237f1..db2cd91374e5 100644 --- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java +++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java @@ -125,6 +125,7 @@ import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.GlobalActions.GlobalActionsManager; import com.android.systemui.plugins.GlobalActionsPanelPlugin; import com.android.systemui.scrim.ScrimDrawable; +import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.NotificationShadeWindowController; import com.android.systemui.statusbar.VibratorHelper; import com.android.systemui.statusbar.phone.CentralSurfaces; @@ -201,6 +202,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene protected final SecureSettings mSecureSettings; protected final Resources mResources; private final ConfigurationController mConfigurationController; + private final UserTracker mUserTracker; private final UserManager mUserManager; private final TrustManager mTrustManager; private final IActivityManager mIActivityManager; @@ -339,6 +341,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene @NonNull VibratorHelper vibrator, @Main Resources resources, ConfigurationController configurationController, + UserTracker userTracker, KeyguardStateController keyguardStateController, UserManager userManager, TrustManager trustManager, @@ -370,6 +373,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene mSecureSettings = secureSettings; mResources = resources; mConfigurationController = configurationController; + mUserTracker = userTracker; mUserManager = userManager; mTrustManager = trustManager; mIActivityManager = iActivityManager; @@ -1198,11 +1202,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene } protected UserInfo getCurrentUser() { - try { - return mIActivityManager.getCurrentUser(); - } catch (RemoteException re) { - return null; - } + return mUserTracker.getUserInfo(); } /** diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java index 2a737970907a..34ae1a199346 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java @@ -17,7 +17,6 @@ package com.android.systemui.keyguard; import android.annotation.AnyThread; -import android.app.ActivityManager; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; @@ -52,6 +51,7 @@ import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.systemui.R; import com.android.systemui.SystemUIAppComponentFactory; import com.android.systemui.plugins.statusbar.StatusBarStateController; +import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.NotificationMediaManager; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.phone.DozeParameters; @@ -140,6 +140,8 @@ public class KeyguardSliceProvider extends SliceProvider implements public KeyguardBypassController mKeyguardBypassController; @Inject public KeyguardUpdateMonitor mKeyguardUpdateMonitor; + @Inject + UserTracker mUserTracker; private CharSequence mMediaTitle; private CharSequence mMediaArtist; protected boolean mDozing; @@ -355,7 +357,7 @@ public class KeyguardSliceProvider extends SliceProvider implements synchronized (this) { if (withinNHoursLocked(mNextAlarmInfo, ALARM_VISIBILITY_HOURS)) { String pattern = android.text.format.DateFormat.is24HourFormat(getContext(), - ActivityManager.getCurrentUser()) ? "HH:mm" : "h:mm"; + mUserTracker.getUserId()) ? "HH:mm" : "h:mm"; mNextAlarm = android.text.format.DateFormat.format(pattern, mNextAlarmInfo.getTriggerTime()).toString(); } else { diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 5ed0bff99b61..250317b067bf 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -36,7 +36,6 @@ import static com.android.systemui.DejankUtils.whitelistIpcs; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; -import android.app.ActivityManager; import android.app.ActivityTaskManager; import android.app.AlarmManager; import android.app.PendingIntent; @@ -124,6 +123,7 @@ import com.android.systemui.dump.DumpManager; import com.android.systemui.keyguard.dagger.KeyguardModule; import com.android.systemui.navigationbar.NavigationModeController; import com.android.systemui.plugins.statusbar.StatusBarStateController; +import com.android.systemui.settings.UserTracker; import com.android.systemui.shade.NotificationPanelViewController; import com.android.systemui.shade.ShadeController; import com.android.systemui.shade.ShadeExpansionStateManager; @@ -263,6 +263,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, private AlarmManager mAlarmManager; private AudioManager mAudioManager; private StatusBarManager mStatusBarManager; + private final UserTracker mUserTracker; private final SysuiStatusBarStateController mStatusBarStateController; private final Executor mUiBgExecutor; private final ScreenOffAnimationController mScreenOffAnimationController; @@ -720,7 +721,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, @Override public void keyguardDone(boolean strongAuth, int targetUserId) { - if (targetUserId != ActivityManager.getCurrentUser()) { + if (targetUserId != mUserTracker.getUserId()) { return; } if (DEBUG) Log.d(TAG, "keyguardDone"); @@ -743,7 +744,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, public void keyguardDonePending(boolean strongAuth, int targetUserId) { Trace.beginSection("KeyguardViewMediator.mViewMediatorCallback#keyguardDonePending"); if (DEBUG) Log.d(TAG, "keyguardDonePending"); - if (targetUserId != ActivityManager.getCurrentUser()) { + if (targetUserId != mUserTracker.getUserId()) { Trace.endSection(); return; } @@ -1136,6 +1137,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, */ public KeyguardViewMediator( Context context, + UserTracker userTracker, FalsingCollector falsingCollector, LockPatternUtils lockPatternUtils, BroadcastDispatcher broadcastDispatcher, @@ -1161,6 +1163,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, Lazy<NotificationShadeWindowController> notificationShadeWindowControllerLazy, Lazy<ActivityLaunchAnimator> activityLaunchAnimator) { mContext = context; + mUserTracker = userTracker; mFalsingCollector = falsingCollector; mLockPatternUtils = lockPatternUtils; mBroadcastDispatcher = broadcastDispatcher; @@ -1241,7 +1244,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE); - KeyguardUpdateMonitor.setCurrentUser(ActivityManager.getCurrentUser()); + KeyguardUpdateMonitor.setCurrentUser(mUserTracker.getUserId()); // Assume keyguard is showing (unless it's disabled) until we know for sure, unless Keyguard // is disabled. diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java b/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java index 78a7c9e35eb7..ef3c44340e57 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java @@ -47,6 +47,7 @@ import com.android.systemui.keyguard.data.repository.KeyguardRepositoryModule; import com.android.systemui.keyguard.domain.interactor.StartKeyguardTransitionModule; import com.android.systemui.keyguard.domain.quickaffordance.KeyguardQuickAffordanceModule; import com.android.systemui.navigationbar.NavigationModeController; +import com.android.systemui.settings.UserTracker; import com.android.systemui.shade.ShadeController; import com.android.systemui.statusbar.NotificationShadeDepthController; import com.android.systemui.statusbar.NotificationShadeWindowController; @@ -86,6 +87,7 @@ public class KeyguardModule { @SysUISingleton public static KeyguardViewMediator newKeyguardViewMediator( Context context, + UserTracker userTracker, FalsingCollector falsingCollector, LockPatternUtils lockPatternUtils, BroadcastDispatcher broadcastDispatcher, @@ -114,6 +116,7 @@ public class KeyguardModule { Lazy<ActivityLaunchAnimator> activityLaunchAnimator) { return new KeyguardViewMediator( context, + userTracker, falsingCollector, lockPatternUtils, broadcastDispatcher, diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/pipeline/MediaDataFilter.kt b/packages/SystemUI/src/com/android/systemui/media/controls/pipeline/MediaDataFilter.kt index 45b319b274b2..cf71d675865b 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/pipeline/MediaDataFilter.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/pipeline/MediaDataFilter.kt @@ -20,13 +20,12 @@ import android.content.Context import android.os.SystemProperties import android.util.Log import com.android.internal.annotations.VisibleForTesting -import com.android.systemui.broadcast.BroadcastDispatcher import com.android.systemui.broadcast.BroadcastSender import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.media.controls.models.player.MediaData import com.android.systemui.media.controls.models.recommendation.SmartspaceMediaData import com.android.systemui.media.controls.util.MediaUiEventLogger -import com.android.systemui.settings.CurrentUserTracker +import com.android.systemui.settings.UserTracker import com.android.systemui.statusbar.NotificationLockscreenUserManager import com.android.systemui.util.time.SystemClock import java.util.SortedMap @@ -62,14 +61,13 @@ class MediaDataFilter @Inject constructor( private val context: Context, - private val broadcastDispatcher: BroadcastDispatcher, + private val userTracker: UserTracker, private val broadcastSender: BroadcastSender, private val lockscreenUserManager: NotificationLockscreenUserManager, @Main private val executor: Executor, private val systemClock: SystemClock, private val logger: MediaUiEventLogger ) : MediaDataManager.Listener { - private val userTracker: CurrentUserTracker private val _listeners: MutableSet<MediaDataManager.Listener> = mutableSetOf() internal val listeners: Set<MediaDataManager.Listener> get() = _listeners.toSet() @@ -81,15 +79,15 @@ constructor( private var smartspaceMediaData: SmartspaceMediaData = EMPTY_SMARTSPACE_MEDIA_DATA private var reactivatedKey: String? = null - init { - userTracker = - object : CurrentUserTracker(broadcastDispatcher) { - override fun onUserSwitched(newUserId: Int) { - // Post this so we can be sure lockscreenUserManager already got the broadcast - executor.execute { handleUserSwitched(newUserId) } - } + private val userTrackerCallback = + object : UserTracker.Callback { + override fun onUserChanged(newUser: Int, userContext: Context) { + handleUserSwitched(newUser) } - userTracker.startTracking() + } + + init { + userTracker.addCallback(userTrackerCallback, executor) } override fun onMediaDataLoaded( diff --git a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/data/RecentTaskListProvider.kt b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/data/RecentTaskListProvider.kt index e8b49cd8ec1c..7a77c476aa11 100644 --- a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/data/RecentTaskListProvider.kt +++ b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/data/RecentTaskListProvider.kt @@ -16,19 +16,19 @@ package com.android.systemui.mediaprojection.appselector.data -import android.app.ActivityManager import android.app.ActivityManager.RECENT_IGNORE_UNAVAILABLE import com.android.systemui.dagger.qualifiers.Background +import com.android.systemui.settings.UserTracker import com.android.systemui.util.kotlin.getOrNull import com.android.wm.shell.recents.RecentTasks import com.android.wm.shell.util.GroupedRecentTaskInfo import java.util.Optional +import java.util.concurrent.Executor import javax.inject.Inject import kotlin.coroutines.resume import kotlin.coroutines.suspendCoroutine import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.withContext -import java.util.concurrent.Executor interface RecentTaskListProvider { /** Loads recent tasks, the returned task list is from the most-recent to least-recent order */ @@ -40,7 +40,8 @@ class ShellRecentTaskListProvider constructor( @Background private val coroutineDispatcher: CoroutineDispatcher, @Background private val backgroundExecutor: Executor, - private val recentTasks: Optional<RecentTasks> + private val recentTasks: Optional<RecentTasks>, + private val userTracker: UserTracker ) : RecentTaskListProvider { private val recents by lazy { recentTasks.getOrNull() } @@ -67,10 +68,8 @@ constructor( getRecentTasks( Integer.MAX_VALUE, RECENT_IGNORE_UNAVAILABLE, - ActivityManager.getCurrentUser(), + userTracker.userId, backgroundExecutor - ) { tasks -> - continuation.resume(tasks) - } + ) { tasks -> continuation.resume(tasks) } } } diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java index c319a827da44..ed1e018c681a 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java @@ -59,7 +59,6 @@ import android.window.BackEvent; import com.android.internal.config.sysui.SystemUiDeviceConfigFlags; import com.android.internal.policy.GestureNavigationSettingsObserver; import com.android.systemui.R; -import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.flags.FeatureFlags; @@ -71,7 +70,7 @@ import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.NavigationEdgeBackPlugin; import com.android.systemui.plugins.PluginListener; import com.android.systemui.recents.OverviewProxyService; -import com.android.systemui.settings.CurrentUserTracker; +import com.android.systemui.settings.UserTracker; import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.InputChannelCompat; @@ -102,8 +101,8 @@ import javax.inject.Provider; /** * Utility class to handle edge swipes for back gesture */ -public class EdgeBackGestureHandler extends CurrentUserTracker - implements PluginListener<NavigationEdgeBackPlugin>, ProtoTraceable<SystemUiTraceProto> { +public class EdgeBackGestureHandler implements PluginListener<NavigationEdgeBackPlugin>, + ProtoTraceable<SystemUiTraceProto> { private static final String TAG = "EdgeBackGestureHandler"; private static final int MAX_LONG_PRESS_TIMEOUT = SystemProperties.getInt( @@ -172,6 +171,7 @@ public class EdgeBackGestureHandler extends CurrentUserTracker private final Context mContext; + private final UserTracker mUserTracker; private final OverviewProxyService mOverviewProxyService; private final SysUiState mSysUiState; private Runnable mStateChangeCallback; @@ -319,6 +319,15 @@ public class EdgeBackGestureHandler extends CurrentUserTracker private final Consumer<Boolean> mOnIsInPipStateChangedListener = (isInPip) -> mIsInPip = isInPip; + private final UserTracker.Callback mUserChangedCallback = + new UserTracker.Callback() { + @Override + public void onUserChanged(int newUser, @NonNull Context userContext) { + updateIsEnabled(); + updateCurrentUserResources(); + } + }; + EdgeBackGestureHandler( Context context, OverviewProxyService overviewProxyService, @@ -326,7 +335,7 @@ public class EdgeBackGestureHandler extends CurrentUserTracker PluginManager pluginManager, @Main Executor executor, @Background Executor backgroundExecutor, - BroadcastDispatcher broadcastDispatcher, + UserTracker userTracker, ProtoTracer protoTracer, NavigationModeController navigationModeController, BackPanelController.Factory backPanelControllerFactory, @@ -338,11 +347,11 @@ public class EdgeBackGestureHandler extends CurrentUserTracker Provider<NavigationBarEdgePanel> navigationBarEdgePanelProvider, Provider<BackGestureTfClassifierProvider> backGestureTfClassifierProviderProvider, FeatureFlags featureFlags) { - super(broadcastDispatcher); mContext = context; mDisplayId = context.getDisplayId(); mMainExecutor = executor; mBackgroundExecutor = backgroundExecutor; + mUserTracker = userTracker; mOverviewProxyService = overviewProxyService; mSysUiState = sysUiState; mPluginManager = pluginManager; @@ -444,12 +453,6 @@ public class EdgeBackGestureHandler extends CurrentUserTracker } } - @Override - public void onUserSwitched(int newUserId) { - updateIsEnabled(); - updateCurrentUserResources(); - } - /** * @see NavigationBarView#onAttachedToWindow() */ @@ -459,7 +462,7 @@ public class EdgeBackGestureHandler extends CurrentUserTracker mOverviewProxyService.addCallback(mQuickSwitchListener); mSysUiState.addCallback(mSysUiStateCallback); updateIsEnabled(); - startTracking(); + mUserTracker.addCallback(mUserChangedCallback, mMainExecutor); } /** @@ -471,7 +474,7 @@ public class EdgeBackGestureHandler extends CurrentUserTracker mOverviewProxyService.removeCallback(mQuickSwitchListener); mSysUiState.removeCallback(mSysUiStateCallback); updateIsEnabled(); - stopTracking(); + mUserTracker.removeCallback(mUserChangedCallback); } /** @@ -1074,7 +1077,7 @@ public class EdgeBackGestureHandler extends CurrentUserTracker private final PluginManager mPluginManager; private final Executor mExecutor; private final Executor mBackgroundExecutor; - private final BroadcastDispatcher mBroadcastDispatcher; + private final UserTracker mUserTracker; private final ProtoTracer mProtoTracer; private final NavigationModeController mNavigationModeController; private final BackPanelController.Factory mBackPanelControllerFactory; @@ -1094,7 +1097,7 @@ public class EdgeBackGestureHandler extends CurrentUserTracker PluginManager pluginManager, @Main Executor executor, @Background Executor backgroundExecutor, - BroadcastDispatcher broadcastDispatcher, + UserTracker userTracker, ProtoTracer protoTracer, NavigationModeController navigationModeController, BackPanelController.Factory backPanelControllerFactory, @@ -1112,7 +1115,7 @@ public class EdgeBackGestureHandler extends CurrentUserTracker mPluginManager = pluginManager; mExecutor = executor; mBackgroundExecutor = backgroundExecutor; - mBroadcastDispatcher = broadcastDispatcher; + mUserTracker = userTracker; mProtoTracer = protoTracer; mNavigationModeController = navigationModeController; mBackPanelControllerFactory = backPanelControllerFactory; @@ -1135,7 +1138,7 @@ public class EdgeBackGestureHandler extends CurrentUserTracker mPluginManager, mExecutor, mBackgroundExecutor, - mBroadcastDispatcher, + mUserTracker, mProtoTracer, mNavigationModeController, mBackPanelControllerFactory, diff --git a/packages/SystemUI/src/com/android/systemui/qs/SettingObserver.java b/packages/SystemUI/src/com/android/systemui/qs/SettingObserver.java index 6b0abd41dfff..7794fa071f45 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/SettingObserver.java +++ b/packages/SystemUI/src/com/android/systemui/qs/SettingObserver.java @@ -16,7 +16,6 @@ package com.android.systemui.qs; -import android.app.ActivityManager; import android.database.ContentObserver; import android.os.Handler; @@ -47,10 +46,6 @@ public abstract class SettingObserver extends ContentObserver implements Listena this(settingsProxy, handler, settingName, userId, 0); } - public SettingObserver(SettingsProxy settingsProxy, Handler handler, String settingName) { - this(settingsProxy, handler, settingName, ActivityManager.getCurrentUser()); - } - public SettingObserver(SettingsProxy settingsProxy, Handler handler, String settingName, int userId, int defaultValue) { super(handler); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java index 86d4fa3002fc..033dbe0f82ee 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java @@ -48,6 +48,7 @@ import com.android.systemui.qs.QSHost; import com.android.systemui.qs.SettingObserver; import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.qs.tileimpl.QSTileImpl; +import com.android.systemui.settings.UserTracker; import com.android.systemui.util.settings.GlobalSettings; import javax.inject.Inject; @@ -74,14 +75,16 @@ public class AirplaneModeTile extends QSTileImpl<BooleanState> { QSLogger qsLogger, BroadcastDispatcher broadcastDispatcher, Lazy<ConnectivityManager> lazyConnectivityManager, - GlobalSettings globalSettings + GlobalSettings globalSettings, + UserTracker userTracker ) { super(host, backgroundLooper, mainHandler, falsingManager, metricsLogger, statusBarStateController, activityStarter, qsLogger); mBroadcastDispatcher = broadcastDispatcher; mLazyConnectivityManager = lazyConnectivityManager; - mSetting = new SettingObserver(globalSettings, mHandler, Global.AIRPLANE_MODE_ON) { + mSetting = new SettingObserver(globalSettings, mHandler, Global.AIRPLANE_MODE_ON, + userTracker.getUserId()) { @Override protected void handleValueChanged(int value, boolean observedChange) { // mHandler is the background handler so calling this is OK diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DreamTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DreamTile.java index 4abe3097dfe2..5bc209a840cb 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DreamTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DreamTile.java @@ -108,14 +108,14 @@ public class DreamTile extends QSTileImpl<QSTile.BooleanState> { mDreamManager = dreamManager; mBroadcastDispatcher = broadcastDispatcher; mEnabledSettingObserver = new SettingObserver(secureSettings, mHandler, - Settings.Secure.SCREENSAVER_ENABLED) { + Settings.Secure.SCREENSAVER_ENABLED, userTracker.getUserId()) { @Override protected void handleValueChanged(int value, boolean observedChange) { refreshState(); } }; mDreamSettingObserver = new SettingObserver(secureSettings, mHandler, - Settings.Secure.SCREENSAVER_COMPONENTS) { + Settings.Secure.SCREENSAVER_COMPONENTS, userTracker.getUserId()) { @Override protected void handleValueChanged(int value, boolean observedChange) { refreshState(); diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java index ba97297421b3..547b496beaff 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java +++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java @@ -78,8 +78,8 @@ import com.android.internal.logging.UiEventLogger; import com.android.internal.policy.ScreenDecorationsUtils; import com.android.internal.util.ScreenshotHelper; 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.keyguard.KeyguardUnlockAnimationController; import com.android.systemui.keyguard.ScreenLifecycle; @@ -90,12 +90,11 @@ import com.android.systemui.navigationbar.NavigationBarView; import com.android.systemui.navigationbar.NavigationModeController; import com.android.systemui.navigationbar.buttons.KeyButtonView; import com.android.systemui.recents.OverviewProxyService.OverviewProxyListener; -import com.android.systemui.settings.CurrentUserTracker; +import com.android.systemui.settings.UserTracker; import com.android.systemui.shade.NotificationPanelViewController; import com.android.systemui.shared.recents.IOverviewProxy; import com.android.systemui.shared.recents.ISystemUiProxy; import com.android.systemui.shared.recents.model.Task; -import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.NotificationShadeWindowController; @@ -108,20 +107,19 @@ import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import java.util.Optional; +import java.util.concurrent.Executor; import java.util.function.Supplier; import javax.inject.Inject; import dagger.Lazy; - /** * Class to send information from overview to launcher with a binder. */ @SysUISingleton -public class OverviewProxyService extends CurrentUserTracker implements - CallbackController<OverviewProxyListener>, NavigationModeController.ModeChangedListener, - Dumpable { +public class OverviewProxyService implements CallbackController<OverviewProxyListener>, + NavigationModeController.ModeChangedListener, Dumpable { private static final String ACTION_QUICKSTEP = "android.intent.action.QUICKSTEP_SERVICE"; @@ -133,6 +131,7 @@ public class OverviewProxyService extends CurrentUserTracker implements private static final long MAX_BACKOFF_MILLIS = 10 * 60 * 1000; private final Context mContext; + private final Executor mMainExecutor; private final ShellInterface mShellInterface; private final Lazy<Optional<CentralSurfaces>> mCentralSurfacesOptionalLazy; private SysUiState mSysUiState; @@ -145,6 +144,7 @@ public class OverviewProxyService extends CurrentUserTracker implements private final Intent mQuickStepIntent; private final ScreenshotHelper mScreenshotHelper; private final CommandQueue mCommandQueue; + private final UserTracker mUserTracker; private final KeyguardUnlockAnimationController mSysuiUnlockAnimationController; private final UiEventLogger mUiEventLogger; @@ -417,7 +417,7 @@ public class OverviewProxyService extends CurrentUserTracker implements return; } - mCurrentBoundedUserId = getCurrentUserId(); + mCurrentBoundedUserId = mUserTracker.getUserId(); mOverviewProxy = IOverviewProxy.Stub.asInterface(service); Bundle params = new Bundle(); @@ -498,34 +498,44 @@ public class OverviewProxyService extends CurrentUserTracker implements } }; + private final UserTracker.Callback mUserChangedCallback = + new UserTracker.Callback() { + @Override + public void onUserChanged(int newUser, @NonNull Context userContext) { + mConnectionBackoffAttempts = 0; + internalConnectToCurrentUser(); + } + }; + @SuppressWarnings("OptionalUsedAsFieldOrParameterType") @Inject public OverviewProxyService(Context context, + @Main Executor mainExecutor, CommandQueue commandQueue, ShellInterface shellInterface, Lazy<NavigationBarController> navBarControllerLazy, Lazy<Optional<CentralSurfaces>> centralSurfacesOptionalLazy, NavigationModeController navModeController, NotificationShadeWindowController statusBarWinController, SysUiState sysUiState, - BroadcastDispatcher broadcastDispatcher, + UserTracker userTracker, ScreenLifecycle screenLifecycle, UiEventLogger uiEventLogger, KeyguardUnlockAnimationController sysuiUnlockAnimationController, AssistUtils assistUtils, DumpManager dumpManager) { - super(broadcastDispatcher); - // b/241601880: This component shouldn't be running for a non-primary user if (!Process.myUserHandle().equals(UserHandle.SYSTEM)) { Log.e(TAG_OPS, "Unexpected initialization for non-primary user", new Throwable()); } mContext = context; + mMainExecutor = mainExecutor; mShellInterface = shellInterface; mCentralSurfacesOptionalLazy = centralSurfacesOptionalLazy; mHandler = new Handler(); mNavBarControllerLazy = navBarControllerLazy; mStatusBarWinController = statusBarWinController; + mUserTracker = userTracker; mConnectionBackoffAttempts = 0; mRecentsComponentName = ComponentName.unflattenFromString(context.getString( com.android.internal.R.string.config_recentsComponentName)); @@ -566,7 +576,7 @@ public class OverviewProxyService extends CurrentUserTracker implements mCommandQueue = commandQueue; // Listen for user setup - startTracking(); + mUserTracker.addCallback(mUserChangedCallback, mMainExecutor); screenLifecycle.addObserver(mLifecycleObserver); @@ -579,12 +589,6 @@ public class OverviewProxyService extends CurrentUserTracker implements assistUtils.registerVoiceInteractionSessionListener(mVoiceInteractionSessionListener); } - @Override - public void onUserSwitched(int newUserId) { - mConnectionBackoffAttempts = 0; - internalConnectToCurrentUser(); - } - public void onVoiceSessionWindowVisibilityChanged(boolean visible) { mSysUiState.setFlag(SYSUI_STATE_VOICE_INTERACTION_WINDOW_SHOWING, visible) .commitUpdate(mContext.getDisplayId()); @@ -712,7 +716,7 @@ public class OverviewProxyService extends CurrentUserTracker implements mBound = mContext.bindServiceAsUser(launcherServiceIntent, mOverviewServiceConnection, Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE_WHILE_AWAKE, - UserHandle.of(getCurrentUserId())); + UserHandle.of(mUserTracker.getUserId())); } catch (SecurityException e) { Log.e(TAG_OPS, "Unable to bind because of security error", e); } @@ -941,7 +945,7 @@ public class OverviewProxyService extends CurrentUserTracker implements } private void updateEnabledState() { - final int currentUser = ActivityManagerWrapper.getInstance().getCurrentUserId(); + final int currentUser = mUserTracker.getUserId(); mIsEnabled = mContext.getPackageManager().resolveServiceAsUser(mQuickStepIntent, MATCH_SYSTEM_ONLY, currentUser) != null; } diff --git a/packages/SystemUI/src/com/android/systemui/settings/CurrentUserObservable.java b/packages/SystemUI/src/com/android/systemui/settings/CurrentUserObservable.java deleted file mode 100644 index dea8c32dc88d..000000000000 --- a/packages/SystemUI/src/com/android/systemui/settings/CurrentUserObservable.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.settings; - -import androidx.lifecycle.LiveData; -import androidx.lifecycle.MutableLiveData; - -import com.android.systemui.broadcast.BroadcastDispatcher; - -/** - * A class that has an observable for the current user. - */ -public class CurrentUserObservable { - - private final CurrentUserTracker mTracker; - - private final MutableLiveData<Integer> mCurrentUser = new MutableLiveData<Integer>() { - @Override - protected void onActive() { - super.onActive(); - mTracker.startTracking(); - } - - @Override - protected void onInactive() { - super.onInactive(); - mTracker.stopTracking(); - } - }; - - public CurrentUserObservable(BroadcastDispatcher broadcastDispatcher) { - mTracker = new CurrentUserTracker(broadcastDispatcher) { - @Override - public void onUserSwitched(int newUserId) { - mCurrentUser.setValue(newUserId); - } - }; - } - - /** - * Returns the current user that can be observed. - */ - public LiveData<Integer> getCurrentUser() { - if (mCurrentUser.getValue() == null) { - mCurrentUser.setValue(mTracker.getCurrentUserId()); - } - return mCurrentUser; - } -} diff --git a/packages/SystemUI/src/com/android/systemui/settings/CurrentUserTracker.java b/packages/SystemUI/src/com/android/systemui/settings/CurrentUserTracker.java deleted file mode 100644 index 9599d77bf65a..000000000000 --- a/packages/SystemUI/src/com/android/systemui/settings/CurrentUserTracker.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.settings; - -import android.app.ActivityManager; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.os.UserHandle; - -import com.android.internal.annotations.VisibleForTesting; -import com.android.systemui.broadcast.BroadcastDispatcher; - -import java.util.ArrayList; -import java.util.List; -import java.util.function.Consumer; - -public abstract class CurrentUserTracker { - private final UserReceiver mUserReceiver; - - private Consumer<Integer> mCallback = this::onUserSwitched; - - public CurrentUserTracker(BroadcastDispatcher broadcastDispatcher) { - this(UserReceiver.getInstance(broadcastDispatcher)); - } - - @VisibleForTesting - CurrentUserTracker(UserReceiver receiver) { - mUserReceiver = receiver; - } - - public int getCurrentUserId() { - return mUserReceiver.getCurrentUserId(); - } - - public void startTracking() { - mUserReceiver.addTracker(mCallback); - } - - public void stopTracking() { - mUserReceiver.removeTracker(mCallback); - } - - public abstract void onUserSwitched(int newUserId); - - @VisibleForTesting - static class UserReceiver extends BroadcastReceiver { - private static UserReceiver sInstance; - - private boolean mReceiverRegistered; - private int mCurrentUserId; - private final BroadcastDispatcher mBroadcastDispatcher; - - private List<Consumer<Integer>> mCallbacks = new ArrayList<>(); - - @VisibleForTesting - UserReceiver(BroadcastDispatcher broadcastDispatcher) { - mBroadcastDispatcher = broadcastDispatcher; - } - - static UserReceiver getInstance(BroadcastDispatcher broadcastDispatcher) { - if (sInstance == null) { - sInstance = new UserReceiver(broadcastDispatcher); - } - return sInstance; - } - - @Override - public void onReceive(Context context, Intent intent) { - if (Intent.ACTION_USER_SWITCHED.equals(intent.getAction())) { - notifyUserSwitched(intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0)); - } - } - - public int getCurrentUserId() { - return mCurrentUserId; - } - - private void addTracker(Consumer<Integer> callback) { - if (!mCallbacks.contains(callback)) { - mCallbacks.add(callback); - } - if (!mReceiverRegistered) { - mCurrentUserId = ActivityManager.getCurrentUser(); - IntentFilter filter = new IntentFilter(Intent.ACTION_USER_SWITCHED); - mBroadcastDispatcher.registerReceiver(this, filter, null, - UserHandle.ALL); - mReceiverRegistered = true; - } - } - - private void removeTracker(Consumer<Integer> callback) { - if (mCallbacks.contains(callback)) { - mCallbacks.remove(callback); - if (mCallbacks.size() == 0 && mReceiverRegistered) { - mBroadcastDispatcher.unregisterReceiver(this); - mReceiverRegistered = false; - } - } - } - - private void notifyUserSwitched(int newUserId) { - if (mCurrentUserId != newUserId) { - mCurrentUserId = newUserId; - List<Consumer<Integer>> callbacks = new ArrayList<>(mCallbacks); - for (Consumer<Integer> consumer : callbacks) { - // Accepting may modify this list - if (mCallbacks.contains(consumer)) { - consumer.accept(newUserId); - } - } - } - } - } -} diff --git a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessController.java b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessController.java index 7801c68586f1..5880003cdb1a 100644 --- a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessController.java +++ b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessController.java @@ -21,6 +21,7 @@ import static com.android.settingslib.display.BrightnessUtils.convertGammaToLine import static com.android.settingslib.display.BrightnessUtils.convertLinearToGammaFloat; import android.animation.ValueAnimator; +import android.annotation.NonNull; import android.content.ContentResolver; import android.content.Context; import android.database.ContentObserver; @@ -46,11 +47,13 @@ import com.android.internal.display.BrightnessSynchronizer; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settingslib.RestrictedLockUtilsInternal; -import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.qualifiers.Background; -import com.android.systemui.settings.CurrentUserTracker; +import com.android.systemui.dagger.qualifiers.Main; +import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.policy.BrightnessMirrorController; +import java.util.concurrent.Executor; + import javax.inject.Inject; public class BrightnessController implements ToggleSlider.Listener, MirroredBrightnessController { @@ -74,9 +77,10 @@ public class BrightnessController implements ToggleSlider.Listener, MirroredBrig private final Context mContext; private final ToggleSlider mControl; private final DisplayManager mDisplayManager; - private final CurrentUserTracker mUserTracker; + private final UserTracker mUserTracker; private final IVrManager mVrManager; + private final Executor mMainExecutor; private final Handler mBackgroundHandler; private final BrightnessObserver mBrightnessObserver; @@ -169,7 +173,7 @@ public class BrightnessController implements ToggleSlider.Listener, MirroredBrig } mBrightnessObserver.startObserving(); - mUserTracker.startTracking(); + mUserTracker.addCallback(mUserChangedCallback, mMainExecutor); // Update the slider and mode before attaching the listener so we don't // receive the onChanged notifications for the initial values. @@ -197,7 +201,7 @@ public class BrightnessController implements ToggleSlider.Listener, MirroredBrig } mBrightnessObserver.stopObserving(); - mUserTracker.stopTracking(); + mUserTracker.removeCallback(mUserChangedCallback); mHandler.sendEmptyMessage(MSG_DETACH_LISTENER); } @@ -275,22 +279,27 @@ public class BrightnessController implements ToggleSlider.Listener, MirroredBrig } }; + private final UserTracker.Callback mUserChangedCallback = + new UserTracker.Callback() { + @Override + public void onUserChanged(int newUser, @NonNull Context userContext) { + mBackgroundHandler.post(mUpdateModeRunnable); + mBackgroundHandler.post(mUpdateSliderRunnable); + } + }; + public BrightnessController( Context context, ToggleSlider control, - BroadcastDispatcher broadcastDispatcher, + UserTracker userTracker, + @Main Executor mainExecutor, @Background Handler bgHandler) { mContext = context; mControl = control; mControl.setMax(GAMMA_SPACE_MAX); + mMainExecutor = mainExecutor; mBackgroundHandler = bgHandler; - mUserTracker = new CurrentUserTracker(broadcastDispatcher) { - @Override - public void onUserSwitched(int newUserId) { - mBackgroundHandler.post(mUpdateModeRunnable); - mBackgroundHandler.post(mUpdateSliderRunnable); - } - }; + mUserTracker = userTracker; mBrightnessObserver = new BrightnessObserver(mHandler); mDisplayId = mContext.getDisplayId(); @@ -364,7 +373,7 @@ public class BrightnessController implements ToggleSlider.Listener, MirroredBrig mControl.setEnforcedAdmin( RestrictedLockUtilsInternal.checkIfRestrictionEnforced(mContext, UserManager.DISALLOW_CONFIG_BRIGHTNESS, - mUserTracker.getCurrentUserId())); + mUserTracker.getUserId())); } }); } @@ -440,16 +449,19 @@ public class BrightnessController implements ToggleSlider.Listener, MirroredBrig /** Factory for creating a {@link BrightnessController}. */ public static class Factory { private final Context mContext; - private final BroadcastDispatcher mBroadcastDispatcher; + private final UserTracker mUserTracker; + private final Executor mMainExecutor; private final Handler mBackgroundHandler; @Inject public Factory( Context context, - BroadcastDispatcher broadcastDispatcher, + UserTracker userTracker, + @Main Executor mainExecutor, @Background Handler bgHandler) { mContext = context; - mBroadcastDispatcher = broadcastDispatcher; + mUserTracker = userTracker; + mMainExecutor = mainExecutor; mBackgroundHandler = bgHandler; } @@ -458,7 +470,8 @@ public class BrightnessController implements ToggleSlider.Listener, MirroredBrig return new BrightnessController( mContext, toggleSlider, - mBroadcastDispatcher, + mUserTracker, + mMainExecutor, mBackgroundHandler); } } diff --git a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessDialog.java b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessDialog.java index d5a395436271..e208be957510 100644 --- a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessDialog.java +++ b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessDialog.java @@ -34,10 +34,12 @@ import android.widget.FrameLayout; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.systemui.R; -import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.qualifiers.Background; +import com.android.systemui.dagger.qualifiers.Main; +import com.android.systemui.settings.UserTracker; import java.util.List; +import java.util.concurrent.Executor; import javax.inject.Inject; @@ -46,16 +48,19 @@ public class BrightnessDialog extends Activity { private BrightnessController mBrightnessController; private final BrightnessSliderController.Factory mToggleSliderFactory; - private final BroadcastDispatcher mBroadcastDispatcher; + private final UserTracker mUserTracker; + private final Executor mMainExecutor; private final Handler mBackgroundHandler; @Inject public BrightnessDialog( - BroadcastDispatcher broadcastDispatcher, + UserTracker userTracker, BrightnessSliderController.Factory factory, + @Main Executor mainExecutor, @Background Handler bgHandler) { - mBroadcastDispatcher = broadcastDispatcher; + mUserTracker = userTracker; mToggleSliderFactory = factory; + mMainExecutor = mainExecutor; mBackgroundHandler = bgHandler; } @@ -101,7 +106,7 @@ public class BrightnessDialog extends Activity { frame.addView(controller.getRootView(), MATCH_PARENT, WRAP_CONTENT); mBrightnessController = new BrightnessController( - this, controller, mBroadcastDispatcher, mBackgroundHandler); + this, controller, mUserTracker, mMainExecutor, mBackgroundHandler); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java index 184dc253bfc6..cdefae6b87f9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java @@ -19,7 +19,6 @@ import static android.app.admin.DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER import static com.android.systemui.DejankUtils.whitelistIpcs; -import android.app.ActivityManager; import android.app.KeyguardManager; import android.app.Notification; import android.app.admin.DevicePolicyManager; @@ -50,6 +49,7 @@ import com.android.systemui.dump.DumpManager; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener; import com.android.systemui.recents.OverviewProxyService; +import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection; import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider; @@ -93,6 +93,7 @@ public class NotificationLockscreenUserManagerImpl implements private final SparseBooleanArray mUsersInLockdownLatestResult = new SparseBooleanArray(); private final SparseBooleanArray mShouldHideNotifsLatestResult = new SparseBooleanArray(); private final UserManager mUserManager; + private final UserTracker mUserTracker; private final List<UserChangedListener> mListeners = new ArrayList<>(); private final BroadcastDispatcher mBroadcastDispatcher; private final NotificationClickNotifier mClickNotifier; @@ -195,6 +196,7 @@ public class NotificationLockscreenUserManagerImpl implements BroadcastDispatcher broadcastDispatcher, DevicePolicyManager devicePolicyManager, UserManager userManager, + UserTracker userTracker, Lazy<NotificationVisibilityProvider> visibilityProviderLazy, Lazy<CommonNotifCollection> commonNotifCollectionLazy, NotificationClickNotifier clickNotifier, @@ -210,7 +212,8 @@ public class NotificationLockscreenUserManagerImpl implements mMainHandler = mainHandler; mDevicePolicyManager = devicePolicyManager; mUserManager = userManager; - mCurrentUserId = ActivityManager.getCurrentUser(); + mUserTracker = userTracker; + mCurrentUserId = mUserTracker.getUserId(); mVisibilityProviderLazy = visibilityProviderLazy; mCommonNotifCollectionLazy = commonNotifCollectionLazy; mClickNotifier = clickNotifier; @@ -295,7 +298,7 @@ public class NotificationLockscreenUserManagerImpl implements mContext.registerReceiver(mBaseBroadcastReceiver, internalFilter, PERMISSION_SELF, null, Context.RECEIVER_EXPORTED_UNAUDITED); - mCurrentUserId = ActivityManager.getCurrentUser(); // in case we reg'd receiver too late + mCurrentUserId = mUserTracker.getUserId(); // in case we reg'd receiver too late updateCurrentProfilesCache(); mSettingsObserver.onChange(false); // set up diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java index 3cc53c16f28b..fe488a9b8336 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java @@ -39,6 +39,7 @@ import android.net.wifi.WifiManager; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; +import android.os.HandlerExecutor; import android.os.Looper; import android.provider.Settings; import android.telephony.CarrierConfigManager; @@ -76,7 +77,7 @@ import com.android.systemui.log.dagger.StatusBarNetworkControllerLog; import com.android.systemui.plugins.log.LogBuffer; import com.android.systemui.plugins.log.LogLevel; import com.android.systemui.qs.tiles.dialog.InternetDialogFactory; -import com.android.systemui.settings.CurrentUserTracker; +import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.DataSaverController; import com.android.systemui.statusbar.policy.DataSaverControllerImpl; @@ -129,7 +130,7 @@ public class NetworkControllerImpl extends BroadcastReceiver private final boolean mHasMobileDataFeature; private final SubscriptionDefaults mSubDefaults; private final DataSaverController mDataSaverController; - private final CurrentUserTracker mUserTracker; + private final UserTracker mUserTracker; private final BroadcastDispatcher mBroadcastDispatcher; private final DemoModeController mDemoModeController; private final Object mLock = new Object(); @@ -213,6 +214,14 @@ public class NetworkControllerImpl extends BroadcastReceiver } }; + private final UserTracker.Callback mUserChangedCallback = + new UserTracker.Callback() { + @Override + public void onUserChanged(int newUser, @NonNull Context userContext) { + NetworkControllerImpl.this.onUserSwitched(newUser); + } + }; + /** * Construct this controller object and register for updates. */ @@ -225,6 +234,7 @@ public class NetworkControllerImpl extends BroadcastReceiver CallbackHandler callbackHandler, DeviceProvisionedController deviceProvisionedController, BroadcastDispatcher broadcastDispatcher, + UserTracker userTracker, ConnectivityManager connectivityManager, TelephonyManager telephonyManager, TelephonyListenerManager telephonyListenerManager, @@ -252,6 +262,7 @@ public class NetworkControllerImpl extends BroadcastReceiver new SubscriptionDefaults(), deviceProvisionedController, broadcastDispatcher, + userTracker, demoModeController, carrierConfigTracker, trackerFactory, @@ -278,6 +289,7 @@ public class NetworkControllerImpl extends BroadcastReceiver SubscriptionDefaults defaultsHandler, DeviceProvisionedController deviceProvisionedController, BroadcastDispatcher broadcastDispatcher, + UserTracker userTracker, DemoModeController demoModeController, CarrierConfigTracker carrierConfigTracker, WifiStatusTrackerFactory trackerFactory, @@ -334,13 +346,9 @@ public class NetworkControllerImpl extends BroadcastReceiver // AIRPLANE_MODE_CHANGED is sent at boot; we've probably already missed it updateAirplaneMode(true /* force callback */); - mUserTracker = new CurrentUserTracker(broadcastDispatcher) { - @Override - public void onUserSwitched(int newUserId) { - NetworkControllerImpl.this.onUserSwitched(newUserId); - } - }; - mUserTracker.startTracking(); + mUserTracker = userTracker; + mUserTracker.addCallback(mUserChangedCallback, new HandlerExecutor(mMainHandler)); + deviceProvisionedController.addCallback(new DeviceProvisionedListener() { @Override public void onUserSetupChanged() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java index 8793a57e4ef8..1d7dfe199871 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java @@ -17,7 +17,6 @@ package com.android.systemui.statusbar.phone; import android.annotation.Nullable; -import android.app.ActivityManager; import android.app.IWallpaperManager; import android.app.IWallpaperManagerCallback; import android.app.WallpaperColors; @@ -45,6 +44,7 @@ import com.android.systemui.Dumpable; 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 com.android.systemui.statusbar.NotificationMediaManager; import libcore.io.IoUtils; @@ -82,10 +82,11 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen KeyguardUpdateMonitor keyguardUpdateMonitor, DumpManager dumpManager, NotificationMediaManager mediaManager, - @Main Handler mainHandler) { + @Main Handler mainHandler, + UserTracker userTracker) { dumpManager.registerDumpable(getClass().getSimpleName(), this); mWallpaperManager = wallpaperManager; - mCurrentUserId = ActivityManager.getCurrentUser(); + mCurrentUserId = userTracker.getUserId(); mUpdateMonitor = keyguardUpdateMonitor; mMediaManager = mediaManager; mH = mainHandler; 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 94d1bf4be806..26e6db664e07 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ManagedProfileControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ManagedProfileControllerImpl.java @@ -14,7 +14,6 @@ package com.android.systemui.statusbar.phone; -import android.app.ActivityManager; import android.app.StatusBarManager; import android.content.BroadcastReceiver; import android.content.Context; @@ -28,6 +27,7 @@ import androidx.annotation.NonNull; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.SysUISingleton; +import com.android.systemui.settings.UserTracker; import java.util.ArrayList; import java.util.LinkedList; @@ -44,6 +44,7 @@ public class ManagedProfileControllerImpl implements ManagedProfileController { private final Context mContext; private final UserManager mUserManager; + private final UserTracker mUserTracker; private final BroadcastDispatcher mBroadcastDispatcher; private final LinkedList<UserInfo> mProfiles; private boolean mListening; @@ -52,9 +53,11 @@ public class ManagedProfileControllerImpl implements ManagedProfileController { /** */ @Inject - public ManagedProfileControllerImpl(Context context, BroadcastDispatcher broadcastDispatcher) { + public ManagedProfileControllerImpl(Context context, UserTracker userTracker, + BroadcastDispatcher broadcastDispatcher) { mContext = context; mUserManager = UserManager.get(mContext); + mUserTracker = userTracker; mBroadcastDispatcher = broadcastDispatcher; mProfiles = new LinkedList<UserInfo>(); } @@ -90,7 +93,7 @@ public class ManagedProfileControllerImpl implements ManagedProfileController { private void reloadManagedProfiles() { synchronized (mProfiles) { boolean hadProfile = mProfiles.size() > 0; - int user = ActivityManager.getCurrentUser(); + int user = mUserTracker.getUserId(); mProfiles.clear(); for (UserInfo ui : mUserManager.getEnabledProfiles(user)) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarViewModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarViewModule.java index 615f2304ecf9..206c0aa0d7a4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarViewModule.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarViewModule.java @@ -28,13 +28,13 @@ import com.android.systemui.R; import com.android.systemui.battery.BatteryMeterView; import com.android.systemui.battery.BatteryMeterViewController; import com.android.systemui.biometrics.AuthRippleView; -import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.Flags; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.privacy.OngoingPrivacyChip; +import com.android.systemui.settings.UserTracker; import com.android.systemui.shade.CombinedShadeHeadersConstraintManager; import com.android.systemui.shade.CombinedShadeHeadersConstraintManagerImpl; import com.android.systemui.shade.NotificationPanelView; @@ -221,9 +221,9 @@ public abstract class StatusBarViewModule { @Named(LARGE_SCREEN_BATTERY_CONTROLLER) static BatteryMeterViewController getBatteryMeterViewController( @Named(SPLIT_SHADE_BATTERY_VIEW) BatteryMeterView batteryMeterView, + UserTracker userTracker, ConfigurationController configurationController, TunerService tunerService, - BroadcastDispatcher broadcastDispatcher, @Main Handler mainHandler, ContentResolver contentResolver, FeatureFlags featureFlags, @@ -231,9 +231,9 @@ public abstract class StatusBarViewModule { ) { return new BatteryMeterViewController( batteryMeterView, + userTracker, configurationController, tunerService, - broadcastDispatcher, mainHandler, contentResolver, featureFlags, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java index aae0f93a0e19..38b3769c1071 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java @@ -17,7 +17,6 @@ package com.android.systemui.statusbar.policy; import android.annotation.Nullable; -import android.app.ActivityManager; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothProfile; @@ -41,6 +40,7 @@ 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.settings.UserTracker; import java.io.PrintWriter; import java.lang.ref.WeakReference; @@ -83,6 +83,7 @@ public class BluetoothControllerImpl implements BluetoothController, BluetoothCa @Inject public BluetoothControllerImpl( Context context, + UserTracker userTracker, DumpManager dumpManager, BluetoothLogger logger, @Background Looper bgLooper, @@ -100,7 +101,7 @@ public class BluetoothControllerImpl implements BluetoothController, BluetoothCa mLocalBluetoothManager.getBluetoothAdapter().getBluetoothState()); } mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE); - mCurrentUser = ActivityManager.getCurrentUser(); + mCurrentUser = userTracker.getUserId(); mDumpManager.registerDumpable(TAG, this); } 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 576962dee747..d84cbcc60853 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java @@ -16,6 +16,7 @@ package com.android.systemui.statusbar.policy; +import android.annotation.NonNull; import android.app.StatusBarManager; import android.content.BroadcastReceiver; import android.content.Context; @@ -49,7 +50,7 @@ import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.demomode.DemoModeCommandReceiver; import com.android.systemui.plugins.DarkIconDispatcher; import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver; -import com.android.systemui.settings.CurrentUserTracker; +import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.phone.StatusBarIconController; import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener; @@ -79,7 +80,7 @@ public class Clock extends TextView implements private static final String SHOW_SECONDS = "show_seconds"; private static final String VISIBILITY = "visibility"; - private final CurrentUserTracker mCurrentUserTracker; + private final UserTracker mUserTracker; private final CommandQueue mCommandQueue; private int mCurrentUserId; @@ -114,6 +115,14 @@ public class Clock extends TextView implements private final BroadcastDispatcher mBroadcastDispatcher; + private final UserTracker.Callback mUserChangedCallback = + new UserTracker.Callback() { + @Override + public void onUserChanged(int newUser, @NonNull Context userContext) { + mCurrentUserId = newUser; + } + }; + public Clock(Context context, AttributeSet attrs) { this(context, attrs, 0); } @@ -132,12 +141,7 @@ public class Clock extends TextView implements a.recycle(); } mBroadcastDispatcher = Dependency.get(BroadcastDispatcher.class); - mCurrentUserTracker = new CurrentUserTracker(mBroadcastDispatcher) { - @Override - public void onUserSwitched(int newUserId) { - mCurrentUserId = newUserId; - } - }; + mUserTracker = Dependency.get(UserTracker.class); } @Override @@ -196,8 +200,8 @@ public class Clock extends TextView implements Dependency.get(TunerService.class).addTunable(this, CLOCK_SECONDS, StatusBarIconController.ICON_HIDE_LIST); mCommandQueue.addCallback(this); - mCurrentUserTracker.startTracking(); - mCurrentUserId = mCurrentUserTracker.getCurrentUserId(); + mUserTracker.addCallback(mUserChangedCallback, mContext.getMainExecutor()); + mCurrentUserId = mUserTracker.getUserId(); } // The time zone may have changed while the receiver wasn't registered, so update the Time @@ -227,7 +231,7 @@ public class Clock extends TextView implements mAttached = false; Dependency.get(TunerService.class).removeTunable(this); mCommandQueue.removeCallback(this); - mCurrentUserTracker.stopTracking(); + mUserTracker.removeCallback(mUserChangedCallback); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotControllerImpl.java index 69b55c81f48b..a4821e0e9299 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotControllerImpl.java @@ -18,7 +18,6 @@ package com.android.systemui.statusbar.policy; import static android.net.TetheringManager.TETHERING_WIFI; -import android.app.ActivityManager; import android.content.Context; import android.net.ConnectivityManager; import android.net.TetheringManager; @@ -38,6 +37,7 @@ 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.settings.UserTracker; import java.io.PrintWriter; import java.util.ArrayList; @@ -59,6 +59,7 @@ public class HotspotControllerImpl implements HotspotController, WifiManager.Sof private final WifiManager mWifiManager; private final Handler mMainHandler; private final Context mContext; + private final UserTracker mUserTracker; private int mHotspotState; private volatile int mNumConnectedDevices; @@ -95,10 +96,12 @@ public class HotspotControllerImpl implements HotspotController, WifiManager.Sof @Inject public HotspotControllerImpl( Context context, + UserTracker userTracker, @Main Handler mainHandler, @Background Handler backgroundHandler, DumpManager dumpManager) { mContext = context; + mUserTracker = userTracker; mTetheringManager = context.getSystemService(TetheringManager.class); mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); mMainHandler = mainHandler; @@ -125,7 +128,7 @@ public class HotspotControllerImpl implements HotspotController, WifiManager.Sof @Override public boolean isHotspotSupported() { return mIsTetheringSupportedConfig && mIsTetheringSupported && mHasTetherableWifiRegexs - && UserManager.get(mContext).isUserAdmin(ActivityManager.getCurrentUser()); + && UserManager.get(mContext).isUserAdmin(mUserTracker.getUserId()); } public void dump(PrintWriter pw, String[] args) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java index cc241d924d45..ba947149d287 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java @@ -16,7 +16,6 @@ package com.android.systemui.statusbar.policy; import android.annotation.Nullable; -import android.app.ActivityManager; import android.app.admin.DeviceAdminInfo; import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManager.DeviceOwnerType; @@ -55,8 +54,9 @@ import com.android.systemui.R; 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.settings.CurrentUserTracker; +import com.android.systemui.settings.UserTracker; import org.xmlpull.v1.XmlPullParserException; @@ -70,7 +70,7 @@ import javax.inject.Inject; /** */ @SysUISingleton -public class SecurityControllerImpl extends CurrentUserTracker implements SecurityController { +public class SecurityControllerImpl implements SecurityController { private static final String TAG = "SecurityController"; private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); @@ -84,11 +84,13 @@ public class SecurityControllerImpl extends CurrentUserTracker implements Securi private static final int CA_CERT_LOADING_RETRY_TIME_IN_MS = 30_000; private final Context mContext; + private final UserTracker mUserTracker; private final ConnectivityManager mConnectivityManager; private final VpnManager mVpnManager; private final DevicePolicyManager mDevicePolicyManager; private final PackageManager mPackageManager; private final UserManager mUserManager; + private final Executor mMainExecutor; private final Executor mBgExecutor; @GuardedBy("mCallbacks") @@ -102,18 +104,28 @@ public class SecurityControllerImpl extends CurrentUserTracker implements Securi // Needs to be cached here since the query has to be asynchronous private ArrayMap<Integer, Boolean> mHasCACerts = new ArrayMap<Integer, Boolean>(); + private final UserTracker.Callback mUserChangedCallback = + new UserTracker.Callback() { + @Override + public void onUserChanged(int newUser, @NonNull Context userContext) { + onUserSwitched(newUser); + } + }; + /** */ @Inject public SecurityControllerImpl( Context context, + UserTracker userTracker, @Background Handler bgHandler, BroadcastDispatcher broadcastDispatcher, + @Main Executor mainExecutor, @Background Executor bgExecutor, DumpManager dumpManager ) { - super(broadcastDispatcher); mContext = context; + mUserTracker = userTracker; mDevicePolicyManager = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE); mConnectivityManager = (ConnectivityManager) @@ -121,6 +133,7 @@ public class SecurityControllerImpl extends CurrentUserTracker implements Securi mVpnManager = context.getSystemService(VpnManager.class); mPackageManager = context.getPackageManager(); mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE); + mMainExecutor = mainExecutor; mBgExecutor = bgExecutor; dumpManager.registerDumpable(getClass().getSimpleName(), this); @@ -133,8 +146,8 @@ public class SecurityControllerImpl extends CurrentUserTracker implements Securi // TODO: re-register network callback on user change. mConnectivityManager.registerNetworkCallback(REQUEST, mNetworkCallback); - onUserSwitched(ActivityManager.getCurrentUser()); - startTracking(); + onUserSwitched(mUserTracker.getUserId()); + mUserTracker.addCallback(mUserChangedCallback, mMainExecutor); } public void dump(PrintWriter pw, String[] args) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserInfoControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserInfoControllerImpl.java index 29285f886f4e..a593d518c207 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserInfoControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserInfoControllerImpl.java @@ -16,7 +16,6 @@ package com.android.systemui.statusbar.policy; -import android.app.ActivityManager; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -28,7 +27,6 @@ import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.os.AsyncTask; -import android.os.RemoteException; import android.os.UserHandle; import android.os.UserManager; import android.provider.ContactsContract; @@ -40,8 +38,11 @@ import com.android.internal.util.UserIcons; import com.android.settingslib.drawable.UserIconDrawable; import com.android.systemui.R; 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.concurrent.Executor; import javax.inject.Inject; @@ -53,6 +54,7 @@ public class UserInfoControllerImpl implements UserInfoController { private static final String TAG = "UserInfoController"; private final Context mContext; + private final UserTracker mUserTracker; private final ArrayList<OnUserInfoChangedListener> mCallbacks = new ArrayList<OnUserInfoChangedListener>(); private AsyncTask<Void, Void, UserInfoQueryResult> mUserInfoTask; @@ -64,11 +66,11 @@ public class UserInfoControllerImpl implements UserInfoController { /** */ @Inject - public UserInfoControllerImpl(Context context) { + public UserInfoControllerImpl(Context context, @Main Executor mainExecutor, + UserTracker userTracker) { mContext = context; - IntentFilter filter = new IntentFilter(); - filter.addAction(Intent.ACTION_USER_SWITCHED); - mContext.registerReceiver(mReceiver, filter); + mUserTracker = userTracker; + mUserTracker.addCallback(mUserChangedCallback, mainExecutor); IntentFilter profileFilter = new IntentFilter(); profileFilter.addAction(ContactsContract.Intents.ACTION_PROFILE_CHANGED); @@ -88,15 +90,13 @@ public class UserInfoControllerImpl implements UserInfoController { mCallbacks.remove(callback); } - private final BroadcastReceiver mReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - final String action = intent.getAction(); - if (Intent.ACTION_USER_SWITCHED.equals(action)) { - reloadUserInfo(); - } - } - }; + private final UserTracker.Callback mUserChangedCallback = + new UserTracker.Callback() { + @Override + public void onUserChanged(int newUser, @NonNull Context userContext) { + reloadUserInfo(); + } + }; private final BroadcastReceiver mProfileReceiver = new BroadcastReceiver() { @Override @@ -104,15 +104,11 @@ public class UserInfoControllerImpl implements UserInfoController { final String action = intent.getAction(); if (ContactsContract.Intents.ACTION_PROFILE_CHANGED.equals(action) || Intent.ACTION_USER_INFO_CHANGED.equals(action)) { - try { - final int currentUser = ActivityManager.getService().getCurrentUser().id; - final int changedUser = - intent.getIntExtra(Intent.EXTRA_USER_HANDLE, getSendingUserId()); - if (changedUser == currentUser) { - reloadUserInfo(); - } - } catch (RemoteException e) { - Log.e(TAG, "Couldn't get current user id for profile change", e); + final int currentUser = mUserTracker.getUserId(); + final int changedUser = + intent.getIntExtra(Intent.EXTRA_USER_HANDLE, getSendingUserId()); + if (changedUser == currentUser) { + reloadUserInfo(); } } } @@ -130,15 +126,12 @@ public class UserInfoControllerImpl implements UserInfoController { Context currentUserContext; UserInfo userInfo; try { - userInfo = ActivityManager.getService().getCurrentUser(); + userInfo = mUserTracker.getUserInfo(); currentUserContext = mContext.createPackageContextAsUser("android", 0, new UserHandle(userInfo.id)); } catch (PackageManager.NameNotFoundException e) { Log.e(TAG, "Couldn't create user context", e); throw new RuntimeException(e); - } catch (RemoteException e) { - Log.e(TAG, "Couldn't get user info", e); - throw new RuntimeException(e); } final int userId = userInfo.id; final boolean isGuest = userInfo.isGuest(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java index 9866389a39d7..b135d0d8c9dc 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java @@ -16,7 +16,6 @@ package com.android.systemui.statusbar.policy; -import android.app.ActivityManager; import android.app.AlarmManager; import android.app.NotificationManager; import android.content.BroadcastReceiver; @@ -28,6 +27,7 @@ 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.os.UserManager; import android.provider.Settings.Global; @@ -46,7 +46,7 @@ import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dump.DumpManager; import com.android.systemui.qs.SettingObserver; -import com.android.systemui.settings.CurrentUserTracker; +import com.android.systemui.settings.UserTracker; import com.android.systemui.util.Utils; import com.android.systemui.util.settings.GlobalSettings; @@ -58,14 +58,15 @@ import javax.inject.Inject; /** Platform implementation of the zen mode controller. **/ @SysUISingleton -public class ZenModeControllerImpl extends CurrentUserTracker - implements ZenModeController, Dumpable { +public class ZenModeControllerImpl implements ZenModeController, Dumpable { private static final String TAG = "ZenModeController"; private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); private final ArrayList<Callback> mCallbacks = new ArrayList<>(); private final Object mCallbacksLock = new Object(); private final Context mContext; + private final UserTracker mUserTracker; + private final BroadcastDispatcher mBroadcastDispatcher; private final SettingObserver mModeSetting; private final SettingObserver mConfigSetting; private final NotificationManager mNoMan; @@ -80,23 +81,45 @@ public class ZenModeControllerImpl extends CurrentUserTracker private long mZenUpdateTime; private NotificationManager.Policy mConsolidatedNotificationPolicy; + private final UserTracker.Callback mUserChangedCallback = + new UserTracker.Callback() { + @Override + public void onUserChanged(int newUser, Context userContext) { + mUserId = newUser; + if (mRegistered) { + mBroadcastDispatcher.unregisterReceiver(mReceiver); + } + final IntentFilter filter = new IntentFilter( + AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED); + filter.addAction(NotificationManager.ACTION_EFFECTS_SUPPRESSOR_CHANGED); + mBroadcastDispatcher.registerReceiver(mReceiver, filter, null, + UserHandle.of(mUserId)); + mRegistered = true; + mSetupObserver.register(); + } + }; + @Inject public ZenModeControllerImpl( Context context, @Main Handler handler, BroadcastDispatcher broadcastDispatcher, DumpManager dumpManager, - GlobalSettings globalSettings) { - super(broadcastDispatcher); + GlobalSettings globalSettings, + UserTracker userTracker) { mContext = context; - mModeSetting = new SettingObserver(globalSettings, handler, Global.ZEN_MODE) { + mBroadcastDispatcher = broadcastDispatcher; + mUserTracker = userTracker; + mModeSetting = new SettingObserver(globalSettings, handler, Global.ZEN_MODE, + userTracker.getUserId()) { @Override protected void handleValueChanged(int value, boolean observedChange) { updateZenMode(value); fireZenChanged(value); } }; - mConfigSetting = new SettingObserver(globalSettings, handler, Global.ZEN_MODE_CONFIG_ETAG) { + mConfigSetting = new SettingObserver(globalSettings, handler, Global.ZEN_MODE_CONFIG_ETAG, + userTracker.getUserId()) { @Override protected void handleValueChanged(int value, boolean observedChange) { updateZenModeConfig(); @@ -112,7 +135,7 @@ public class ZenModeControllerImpl extends CurrentUserTracker mSetupObserver = new SetupObserver(handler); mSetupObserver.register(); mUserManager = context.getSystemService(UserManager.class); - startTracking(); + mUserTracker.addCallback(mUserChangedCallback, new HandlerExecutor(handler)); dumpManager.registerDumpable(getClass().getSimpleName(), this); } @@ -120,7 +143,7 @@ public class ZenModeControllerImpl extends CurrentUserTracker @Override public boolean isVolumeRestricted() { return mUserManager.hasUserRestriction(UserManager.DISALLOW_ADJUST_VOLUME, - new UserHandle(mUserId)); + UserHandle.of(mUserId)); } @Override @@ -183,19 +206,6 @@ public class ZenModeControllerImpl extends CurrentUserTracker } @Override - public void onUserSwitched(int userId) { - mUserId = userId; - if (mRegistered) { - mContext.unregisterReceiver(mReceiver); - } - final IntentFilter filter = new IntentFilter(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED); - filter.addAction(NotificationManager.ACTION_EFFECTS_SUPPRESSOR_CHANGED); - mContext.registerReceiverAsUser(mReceiver, new UserHandle(mUserId), filter, null, null); - mRegistered = true; - mSetupObserver.register(); - } - - @Override public ComponentName getEffectsSuppressor() { return NotificationManager.from(mContext).getEffectsSuppressor(); } @@ -208,7 +218,7 @@ public class ZenModeControllerImpl extends CurrentUserTracker @Override public int getCurrentUser() { - return ActivityManager.getCurrentUser(); + return mUserTracker.getUserId(); } private void fireNextAlarmChanged() { diff --git a/packages/SystemUI/src/com/android/systemui/util/time/DateFormatUtil.java b/packages/SystemUI/src/com/android/systemui/util/time/DateFormatUtil.java index d7c4e93bb26e..3c570810b318 100644 --- a/packages/SystemUI/src/com/android/systemui/util/time/DateFormatUtil.java +++ b/packages/SystemUI/src/com/android/systemui/util/time/DateFormatUtil.java @@ -16,10 +16,11 @@ package com.android.systemui.util.time; -import android.app.ActivityManager; import android.content.Context; import android.text.format.DateFormat; +import com.android.systemui.settings.UserTracker; + import javax.inject.Inject; /** @@ -27,14 +28,16 @@ import javax.inject.Inject; */ public class DateFormatUtil { private final Context mContext; + private final UserTracker mUserTracker; @Inject - public DateFormatUtil(Context context) { + public DateFormatUtil(Context context, UserTracker userTracker) { mContext = context; + mUserTracker = userTracker; } /** Returns true if the phone is in 24 hour format. */ public boolean is24HourFormat() { - return DateFormat.is24HourFormat(mContext, ActivityManager.getCurrentUser()); + return DateFormat.is24HourFormat(mContext, mUserTracker.getUserId()); } } diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java index 23e3235bd690..89cbc7aa054a 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java @@ -115,6 +115,7 @@ import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dump.DumpManager; import com.android.systemui.log.SessionTracker; import com.android.systemui.plugins.statusbar.StatusBarStateController; +import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.telephony.TelephonyListenerManager; @@ -159,6 +160,8 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { private static final int FINGERPRINT_SENSOR_ID = 1; @Mock + private UserTracker mUserTracker; + @Mock private DumpManager mDumpManager; @Mock private KeyguardUpdateMonitor.StrongAuthTracker mStrongAuthTracker; @@ -309,8 +312,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { ExtendedMockito.doReturn(SubscriptionManager.INVALID_SUBSCRIPTION_ID) .when(SubscriptionManager::getDefaultSubscriptionId); KeyguardUpdateMonitor.setCurrentUser(mCurrentUserId); - ExtendedMockito.doReturn(KeyguardUpdateMonitor.getCurrentUser()) - .when(ActivityManager::getCurrentUser); + when(mUserTracker.getUserId()).thenReturn(mCurrentUserId); ExtendedMockito.doReturn(mActivityService).when(ActivityManager::getService); mFaceWakeUpTriggersConfig = new FaceWakeUpTriggersConfig( @@ -1037,6 +1039,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { @Test public void testSecondaryLockscreenRequirement() { KeyguardUpdateMonitor.setCurrentUser(UserHandle.myUserId()); + when(mUserTracker.getUserId()).thenReturn(UserHandle.myUserId()); int user = KeyguardUpdateMonitor.getCurrentUser(); String packageName = "fake.test.package"; String cls = "FakeService"; @@ -2041,7 +2044,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { AtomicBoolean mSimStateChanged = new AtomicBoolean(false); protected TestableKeyguardUpdateMonitor(Context context) { - super(context, + super(context, mUserTracker, TestableLooper.get(KeyguardUpdateMonitorTest.this).getLooper(), mBroadcastDispatcher, mSecureSettings, mDumpManager, mBackgroundExecutor, mMainExecutor, diff --git a/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockManagerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockManagerTest.java index ff4412e97c04..27701be66761 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockManagerTest.java @@ -17,6 +17,7 @@ package com.android.keyguard.clock; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; @@ -30,15 +31,15 @@ import android.testing.AndroidTestingRunner; import android.testing.TestableLooper.RunWithLooper; import android.view.LayoutInflater; -import androidx.lifecycle.MutableLiveData; - import com.android.systemui.SysuiTestCase; import com.android.systemui.colorextraction.SysuiColorExtractor; import com.android.systemui.dock.DockManager; import com.android.systemui.dock.DockManagerFake; import com.android.systemui.plugins.ClockPlugin; -import com.android.systemui.settings.CurrentUserObservable; +import com.android.systemui.settings.UserTracker; import com.android.systemui.shared.plugins.PluginManager; +import com.android.systemui.util.concurrency.FakeExecutor; +import com.android.systemui.util.time.FakeSystemClock; import org.junit.After; import org.junit.Before; @@ -52,8 +53,7 @@ import java.util.Arrays; @SmallTest @RunWith(AndroidTestingRunner.class) -// Need to run tests on main looper because LiveData operations such as setData, observe, -// removeObserver cannot be invoked on a background thread. +// Need to run tests on main looper to allow for onClockChanged operation to happen synchronously. @RunWithLooper(setAsMainLooper = true) public final class ClockManagerTest extends SysuiTestCase { @@ -63,14 +63,16 @@ public final class ClockManagerTest extends SysuiTestCase { private static final int SECONDARY_USER_ID = 11; private static final Uri SETTINGS_URI = null; + private final FakeSystemClock mFakeSystemClock = new FakeSystemClock(); + private final FakeExecutor mMainExecutor = new FakeExecutor(mFakeSystemClock); private ClockManager mClockManager; private ContentObserver mContentObserver; private DockManagerFake mFakeDockManager; - private MutableLiveData<Integer> mCurrentUser; + private ArgumentCaptor<UserTracker.Callback> mUserTrackerCallbackCaptor; @Mock PluginManager mMockPluginManager; @Mock SysuiColorExtractor mMockColorExtractor; @Mock ContentResolver mMockContentResolver; - @Mock CurrentUserObservable mMockCurrentUserObserable; + @Mock UserTracker mUserTracker; @Mock SettingsWrapper mMockSettingsWrapper; @Mock ClockManager.ClockChangedListener mMockListener1; @Mock ClockManager.ClockChangedListener mMockListener2; @@ -83,18 +85,18 @@ public final class ClockManagerTest extends SysuiTestCase { mFakeDockManager = new DockManagerFake(); - mCurrentUser = new MutableLiveData<>(); - mCurrentUser.setValue(MAIN_USER_ID); - when(mMockCurrentUserObserable.getCurrentUser()).thenReturn(mCurrentUser); + when(mUserTracker.getUserId()).thenReturn(MAIN_USER_ID); + mUserTrackerCallbackCaptor = ArgumentCaptor.forClass(UserTracker.Callback.class); mClockManager = new ClockManager(getContext(), inflater, mMockPluginManager, mMockColorExtractor, mMockContentResolver, - mMockCurrentUserObserable, mMockSettingsWrapper, mFakeDockManager); + mUserTracker, mMainExecutor, mMockSettingsWrapper, mFakeDockManager); mClockManager.addBuiltinClock(() -> new BubbleClockController( getContext().getResources(), inflater, mMockColorExtractor)); mClockManager.addOnClockChangedListener(mMockListener1); mClockManager.addOnClockChangedListener(mMockListener2); + verify(mUserTracker).addCallback(mUserTrackerCallbackCaptor.capture(), any()); reset(mMockListener1, mMockListener2); mContentObserver = mClockManager.getContentObserver(); @@ -221,7 +223,7 @@ public final class ClockManagerTest extends SysuiTestCase { @Test public void onUserChanged_defaultClock() { // WHEN the user changes - mCurrentUser.setValue(SECONDARY_USER_ID); + switchUser(SECONDARY_USER_ID); // THEN the plugin is null for the default clock face assertThat(mClockManager.getCurrentClock()).isNull(); } @@ -232,7 +234,7 @@ public final class ClockManagerTest extends SysuiTestCase { when(mMockSettingsWrapper.getLockScreenCustomClockFace(SECONDARY_USER_ID)).thenReturn( BUBBLE_CLOCK); // WHEN the user changes - mCurrentUser.setValue(SECONDARY_USER_ID); + switchUser(SECONDARY_USER_ID); // THEN the plugin is the bubble clock face. assertThat(mClockManager.getCurrentClock()).isInstanceOf(BUBBLE_CLOCK_CLASS); } @@ -244,8 +246,13 @@ public final class ClockManagerTest extends SysuiTestCase { // AND the second user as selected the bubble clock for the dock when(mMockSettingsWrapper.getDockedClockFace(SECONDARY_USER_ID)).thenReturn(BUBBLE_CLOCK); // WHEN the user changes - mCurrentUser.setValue(SECONDARY_USER_ID); + switchUser(SECONDARY_USER_ID); // THEN the plugin is the bubble clock face. assertThat(mClockManager.getCurrentClock()).isInstanceOf(BUBBLE_CLOCK_CLASS); } + + private void switchUser(int newUser) { + when(mUserTracker.getUserId()).thenReturn(newUser); + mUserTrackerCallbackCaptor.getValue().onUserChanged(newUser, mContext); + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/battery/BatteryMeterViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/battery/BatteryMeterViewControllerTest.java index bc8f96198b27..1482f291b57a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/battery/BatteryMeterViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/battery/BatteryMeterViewControllerTest.java @@ -34,9 +34,9 @@ import android.provider.Settings; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; -import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.flags.FakeFeatureFlags; import com.android.systemui.flags.Flags; +import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.tuner.TunerService; @@ -52,12 +52,12 @@ public class BatteryMeterViewControllerTest extends SysuiTestCase { private BatteryMeterView mBatteryMeterView; @Mock + private UserTracker mUserTracker; + @Mock private ConfigurationController mConfigurationController; @Mock private TunerService mTunerService; @Mock - private BroadcastDispatcher mBroadcastDispatcher; - @Mock private Handler mHandler; @Mock private ContentResolver mContentResolver; @@ -153,9 +153,9 @@ public class BatteryMeterViewControllerTest extends SysuiTestCase { private void initController() { mController = new BatteryMeterViewController( mBatteryMeterView, + mUserTracker, mConfigurationController, mTunerService, - mBroadcastDispatcher, mHandler, mContentResolver, mFeatureFlags, diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsEditingActivityTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsEditingActivityTest.kt index 0b72a68005a6..3b6f7d19e93e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsEditingActivityTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsEditingActivityTest.kt @@ -10,10 +10,12 @@ import androidx.test.filters.SmallTest import androidx.test.rule.ActivityTestRule import androidx.test.runner.intercepting.SingleActivityFactory import com.android.systemui.SysuiTestCase -import com.android.systemui.broadcast.BroadcastDispatcher import com.android.systemui.controls.CustomIconCache import com.android.systemui.controls.controller.ControlsControllerImpl import com.android.systemui.controls.ui.ControlsUiController +import com.android.systemui.settings.UserTracker +import com.android.systemui.util.concurrency.FakeExecutor +import com.android.systemui.util.time.FakeSystemClock import java.util.concurrent.CountDownLatch import org.junit.Before import org.junit.Rule @@ -30,9 +32,11 @@ import org.mockito.MockitoAnnotations @RunWith(AndroidTestingRunner::class) @TestableLooper.RunWithLooper class ControlsEditingActivityTest : SysuiTestCase() { + private val uiExecutor = FakeExecutor(FakeSystemClock()) + @Mock lateinit var controller: ControlsControllerImpl - @Mock lateinit var broadcastDispatcher: BroadcastDispatcher + @Mock lateinit var userTracker: UserTracker @Mock lateinit var customIconCache: CustomIconCache @@ -54,8 +58,9 @@ class ControlsEditingActivityTest : SysuiTestCase() { ) { override fun create(intent: Intent?): TestableControlsEditingActivity { return TestableControlsEditingActivity( + uiExecutor, controller, - broadcastDispatcher, + userTracker, customIconCache, uiController, mockDispatcher, @@ -92,13 +97,14 @@ class ControlsEditingActivityTest : SysuiTestCase() { } public class TestableControlsEditingActivity( + private val executor: FakeExecutor, private val controller: ControlsControllerImpl, - private val broadcastDispatcher: BroadcastDispatcher, + private val userTracker: UserTracker, private val customIconCache: CustomIconCache, private val uiController: ControlsUiController, private val mockDispatcher: OnBackInvokedDispatcher, private val latch: CountDownLatch - ) : ControlsEditingActivity(controller, broadcastDispatcher, customIconCache, uiController) { + ) : ControlsEditingActivity(executor, controller, userTracker, customIconCache, uiController) { override fun getOnBackInvokedDispatcher(): OnBackInvokedDispatcher { return mockDispatcher } diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsFavoritingActivityTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsFavoritingActivityTest.kt index 4b0f7e6cd736..0f06de2a0684 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsFavoritingActivityTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsFavoritingActivityTest.kt @@ -9,10 +9,10 @@ import androidx.test.filters.SmallTest import androidx.test.rule.ActivityTestRule import androidx.test.runner.intercepting.SingleActivityFactory import com.android.systemui.SysuiTestCase -import com.android.systemui.broadcast.BroadcastDispatcher import com.android.systemui.controls.controller.ControlsControllerImpl import com.android.systemui.controls.ui.ControlsUiController import com.android.systemui.dagger.qualifiers.Main +import com.android.systemui.settings.UserTracker import com.google.common.util.concurrent.MoreExecutors import java.util.concurrent.CountDownLatch import java.util.concurrent.Executor @@ -37,7 +37,7 @@ class ControlsFavoritingActivityTest : SysuiTestCase() { @Mock lateinit var listingController: ControlsListingController - @Mock lateinit var broadcastDispatcher: BroadcastDispatcher + @Mock lateinit var userTracker: UserTracker @Mock lateinit var uiController: ControlsUiController @@ -60,7 +60,7 @@ class ControlsFavoritingActivityTest : SysuiTestCase() { executor, controller, listingController, - broadcastDispatcher, + userTracker, uiController, mockDispatcher, latch @@ -97,7 +97,7 @@ class ControlsFavoritingActivityTest : SysuiTestCase() { executor: Executor, controller: ControlsControllerImpl, listingController: ControlsListingController, - broadcastDispatcher: BroadcastDispatcher, + userTracker: UserTracker, uiController: ControlsUiController, private val mockDispatcher: OnBackInvokedDispatcher, private val latch: CountDownLatch @@ -106,7 +106,7 @@ class ControlsFavoritingActivityTest : SysuiTestCase() { executor, controller, listingController, - broadcastDispatcher, + userTracker, uiController ) { override fun getOnBackInvokedDispatcher(): OnBackInvokedDispatcher { diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsProviderSelectorActivityTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsProviderSelectorActivityTest.kt index acc62227cde6..56c3efe1b8e6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsProviderSelectorActivityTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsProviderSelectorActivityTest.kt @@ -25,11 +25,11 @@ import androidx.test.filters.SmallTest import androidx.test.rule.ActivityTestRule import androidx.test.runner.intercepting.SingleActivityFactory import com.android.systemui.SysuiTestCase -import com.android.systemui.broadcast.BroadcastDispatcher import com.android.systemui.controls.controller.ControlsController import com.android.systemui.controls.ui.ControlsUiController import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.dagger.qualifiers.Main +import com.android.systemui.settings.UserTracker import com.google.common.util.concurrent.MoreExecutors import java.util.concurrent.CountDownLatch import java.util.concurrent.Executor @@ -56,7 +56,7 @@ class ControlsProviderSelectorActivityTest : SysuiTestCase() { @Mock lateinit var controlsController: ControlsController - @Mock lateinit var broadcastDispatcher: BroadcastDispatcher + @Mock lateinit var userTracker: UserTracker @Mock lateinit var uiController: ControlsUiController @@ -80,7 +80,7 @@ class ControlsProviderSelectorActivityTest : SysuiTestCase() { backExecutor, listingController, controlsController, - broadcastDispatcher, + userTracker, uiController, mockDispatcher, latch @@ -118,7 +118,7 @@ class ControlsProviderSelectorActivityTest : SysuiTestCase() { backExecutor: Executor, listingController: ControlsListingController, controlsController: ControlsController, - broadcastDispatcher: BroadcastDispatcher, + userTracker: UserTracker, uiController: ControlsUiController, private val mockDispatcher: OnBackInvokedDispatcher, private val latch: CountDownLatch @@ -128,7 +128,7 @@ class ControlsProviderSelectorActivityTest : SysuiTestCase() { backExecutor, listingController, controlsController, - broadcastDispatcher, + userTracker, uiController ) { override fun getOnBackInvokedDispatcher(): OnBackInvokedDispatcher { diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsRequestDialogTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsRequestDialogTest.kt index efb3db700804..314b17625f00 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsRequestDialogTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsRequestDialogTest.kt @@ -34,6 +34,7 @@ import androidx.test.runner.intercepting.SingleActivityFactory import com.android.systemui.SysuiTestCase import com.android.systemui.controls.controller.ControlInfo import com.android.systemui.controls.controller.ControlsController +import com.android.systemui.settings.UserTracker import com.android.systemui.util.mockito.capture import com.android.systemui.util.mockito.eq import org.junit.After @@ -46,9 +47,10 @@ import org.junit.runner.RunWith import org.mockito.ArgumentCaptor import org.mockito.Captor import org.mockito.Mock -import org.mockito.Mockito.`when` import org.mockito.Mockito.verify +import org.mockito.Mockito.`when` import org.mockito.MockitoAnnotations +import java.util.concurrent.Executor @MediumTest @RunWith(AndroidTestingRunner::class) @@ -67,6 +69,10 @@ class ControlsRequestDialogTest : SysuiTestCase() { private lateinit var controller: ControlsController @Mock + private lateinit var mainExecutor: Executor + @Mock + private lateinit var userTracker: UserTracker + @Mock private lateinit var listingController: ControlsListingController @Mock private lateinit var iIntentSender: IIntentSender @@ -81,8 +87,9 @@ class ControlsRequestDialogTest : SysuiTestCase() { ) { override fun create(intent: Intent?): TestControlsRequestDialog { return TestControlsRequestDialog( + mainExecutor, controller, - fakeBroadcastDispatcher, + userTracker, listingController ) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/management/TestControlsRequestDialog.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/management/TestControlsRequestDialog.kt index 3f6308b18d03..ec239f64e254 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/controls/management/TestControlsRequestDialog.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/controls/management/TestControlsRequestDialog.kt @@ -16,11 +16,13 @@ package com.android.systemui.controls.management -import com.android.systemui.broadcast.BroadcastDispatcher import com.android.systemui.controls.controller.ControlsController +import com.android.systemui.settings.UserTracker +import java.util.concurrent.Executor class TestControlsRequestDialog( + mainExecutor: Executor, controller: ControlsController, - dispatcher: BroadcastDispatcher, + userTracker: UserTracker, listingController: ControlsListingController -) : ControlsRequestDialog(controller, dispatcher, listingController)
\ No newline at end of file +) : ControlsRequestDialog(mainExecutor, controller, userTracker, listingController) diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java index c40c187d572a..20d3cd59cc16 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java @@ -49,6 +49,7 @@ import com.android.systemui.SysuiTestCase; import com.android.systemui.biometrics.AuthController; import com.android.systemui.doze.DozeSensors.TriggerSensor; import com.android.systemui.plugins.SensorManagerPlugin; +import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.policy.DevicePostureController; import com.android.systemui.util.sensors.AsyncSensorManager; @@ -97,6 +98,8 @@ public class DozeSensorsTest extends SysuiTestCase { @Mock private DevicePostureController mDevicePostureController; @Mock + private UserTracker mUserTracker; + @Mock private ProximitySensor mProximitySensor; // Capture listeners so that they can be used to send events @@ -426,7 +429,7 @@ public class DozeSensorsTest extends SysuiTestCase { DozeSensors dozeSensors = new DozeSensors(mSensorManager, mDozeParameters, mAmbientDisplayConfiguration, mWakeLock, mCallback, mProxCallback, mDozeLog, mProximitySensor, mFakeSettings, mAuthController, - mDevicePostureController); + mDevicePostureController, mUserTracker); for (TriggerSensor sensor : dozeSensors.mTriggerSensors) { assertFalse(sensor.mIgnoresSetting); @@ -438,7 +441,7 @@ public class DozeSensorsTest extends SysuiTestCase { super(mSensorManager, mDozeParameters, mAmbientDisplayConfiguration, mWakeLock, mCallback, mProxCallback, mDozeLog, mProximitySensor, mFakeSettings, mAuthController, - mDevicePostureController); + mDevicePostureController, mUserTracker); for (TriggerSensor sensor : mTriggerSensors) { if (sensor instanceof PluginSensor && ((PluginSensor) sensor).mPluginSensor.getType() diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java index 6091d3a93f14..82432ce31fa2 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java @@ -49,6 +49,7 @@ import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dock.DockManager; import com.android.systemui.doze.DozeTriggers.DozingUpdateUiEvent; import com.android.systemui.log.SessionTracker; +import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.policy.DevicePostureController; import com.android.systemui.statusbar.policy.KeyguardStateController; @@ -98,6 +99,8 @@ public class DozeTriggersTest extends SysuiTestCase { @Mock private DevicePostureController mDevicePostureController; @Mock + private UserTracker mUserTracker; + @Mock private SessionTracker mSessionTracker; private DozeTriggers mTriggers; @@ -131,7 +134,7 @@ public class DozeTriggersTest extends SysuiTestCase { asyncSensorManager, wakeLock, mDockManager, mProximitySensor, mProximityCheck, mDozeLog, mBroadcastDispatcher, new FakeSettings(), mAuthController, mUiEventLogger, mSessionTracker, mKeyguardStateController, - mDevicePostureController); + mDevicePostureController, mUserTracker); mTriggers.setDozeMachine(mMachine); waitForSensorManager(); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogLiteTest.java b/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogLiteTest.java index 8b1554c1f66f..d52616bfefcc 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogLiteTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogLiteTest.java @@ -63,6 +63,7 @@ import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.colorextraction.SysuiColorExtractor; import com.android.systemui.plugins.GlobalActions; import com.android.systemui.settings.UserContextProvider; +import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.NotificationShadeWindowController; import com.android.systemui.statusbar.VibratorHelper; import com.android.systemui.statusbar.phone.CentralSurfaces; @@ -103,6 +104,7 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase { @Mock private SecureSettings mSecureSettings; @Mock private Resources mResources; @Mock private ConfigurationController mConfigurationController; + @Mock private UserTracker mUserTracker; @Mock private KeyguardStateController mKeyguardStateController; @Mock private UserManager mUserManager; @Mock private TrustManager mTrustManager; @@ -152,6 +154,7 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase { mVibratorHelper, mResources, mConfigurationController, + mUserTracker, mKeyguardStateController, mUserManager, mTrustManager, diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java index 23516c94d851..729a1ccd30f9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java @@ -48,6 +48,7 @@ import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.SystemUIInitializerImpl; import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.statusbar.StatusBarStateController; +import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.NotificationMediaManager; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.phone.DozeParameters; @@ -93,6 +94,8 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { private NextAlarmController mNextAlarmController; @Mock private KeyguardUpdateMonitor mKeyguardUpdateMonitor; + @Mock + private UserTracker mUserTracker; private TestableKeyguardSliceProvider mProvider; private boolean mIsZenMode; @@ -105,6 +108,7 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { mProvider.attachInfo(getContext(), null); reset(mContentResolver); SliceProvider.setSpecs(new HashSet<>(Arrays.asList(SliceSpecs.LIST))); + when(mUserTracker.getUserId()).thenReturn(100); } @After @@ -267,6 +271,7 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { mKeyguardBypassController = KeyguardSliceProviderTest.this.mKeyguardBypassController; mMediaManager = KeyguardSliceProviderTest.this.mNotificationMediaManager; mKeyguardUpdateMonitor = KeyguardSliceProviderTest.this.mKeyguardUpdateMonitor; + mUserTracker = KeyguardSliceProviderTest.this.mUserTracker; } @Override diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java index b6780a12e6a9..45aaaa2418a1 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java @@ -57,6 +57,7 @@ import com.android.systemui.classifier.FalsingCollectorFake; import com.android.systemui.dreams.DreamOverlayStateController; import com.android.systemui.dump.DumpManager; import com.android.systemui.navigationbar.NavigationModeController; +import com.android.systemui.settings.UserTracker; import com.android.systemui.shade.ShadeController; import com.android.systemui.statusbar.NotificationShadeDepthController; import com.android.systemui.statusbar.NotificationShadeWindowController; @@ -86,6 +87,7 @@ import dagger.Lazy; public class KeyguardViewMediatorTest extends SysuiTestCase { private KeyguardViewMediator mViewMediator; + private @Mock UserTracker mUserTracker; private @Mock DevicePolicyManager mDevicePolicyManager; private @Mock LockPatternUtils mLockPatternUtils; private @Mock KeyguardUpdateMonitor mUpdateMonitor; @@ -286,6 +288,7 @@ public class KeyguardViewMediatorTest extends SysuiTestCase { private void createAndStartViewMediator() { mViewMediator = new KeyguardViewMediator( mContext, + mUserTracker, mFalsingCollector, mLockPatternUtils, mBroadcastDispatcher, diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/controls/pipeline/MediaDataFilterTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/controls/pipeline/MediaDataFilterTest.kt index 575b1c6b126e..9d33e6f84972 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/controls/pipeline/MediaDataFilterTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/controls/pipeline/MediaDataFilterTest.kt @@ -22,13 +22,13 @@ import android.testing.TestableLooper import androidx.test.filters.SmallTest import com.android.internal.logging.InstanceId import com.android.systemui.SysuiTestCase -import com.android.systemui.broadcast.BroadcastDispatcher import com.android.systemui.broadcast.BroadcastSender import com.android.systemui.media.controls.MediaTestUtils import com.android.systemui.media.controls.models.player.MediaData import com.android.systemui.media.controls.models.recommendation.SmartspaceMediaData import com.android.systemui.media.controls.ui.MediaPlayerData import com.android.systemui.media.controls.util.MediaUiEventLogger +import com.android.systemui.settings.UserTracker import com.android.systemui.statusbar.NotificationLockscreenUserManager import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.eq @@ -64,7 +64,7 @@ private val SMARTSPACE_INSTANCE_ID = InstanceId.fakeInstanceId(456)!! class MediaDataFilterTest : SysuiTestCase() { @Mock private lateinit var listener: MediaDataManager.Listener - @Mock private lateinit var broadcastDispatcher: BroadcastDispatcher + @Mock private lateinit var userTracker: UserTracker @Mock private lateinit var broadcastSender: BroadcastSender @Mock private lateinit var mediaDataManager: MediaDataManager @Mock private lateinit var lockscreenUserManager: NotificationLockscreenUserManager @@ -85,7 +85,7 @@ class MediaDataFilterTest : SysuiTestCase() { mediaDataFilter = MediaDataFilter( context, - broadcastDispatcher, + userTracker, broadcastSender, lockscreenUserManager, executor, diff --git a/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/data/ShellRecentTaskListProviderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/data/ShellRecentTaskListProviderTest.kt index 939af16d81cd..d35a21236ae8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/data/ShellRecentTaskListProviderTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/data/ShellRecentTaskListProviderTest.kt @@ -4,6 +4,7 @@ import android.app.ActivityManager.RecentTaskInfo import android.testing.AndroidTestingRunner import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase +import com.android.systemui.settings.UserTracker import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.mock import com.android.systemui.util.mockito.whenever @@ -11,11 +12,11 @@ import com.android.wm.shell.recents.RecentTasks import com.android.wm.shell.util.GroupedRecentTaskInfo import com.google.common.truth.Truth.assertThat import java.util.* +import java.util.function.Consumer import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.runBlocking import org.junit.Test import org.junit.runner.RunWith -import java.util.function.Consumer @RunWith(AndroidTestingRunner::class) @SmallTest @@ -23,8 +24,14 @@ class ShellRecentTaskListProviderTest : SysuiTestCase() { private val dispatcher = Dispatchers.Unconfined private val recentTasks: RecentTasks = mock() + private val userTracker: UserTracker = mock() private val recentTaskListProvider = - ShellRecentTaskListProvider(dispatcher, Runnable::run, Optional.of(recentTasks)) + ShellRecentTaskListProvider( + dispatcher, + Runnable::run, + Optional.of(recentTasks), + userTracker + ) @Test fun loadRecentTasks_oneTask_returnsTheSameTask() { diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/AirplaneModeTileTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/AirplaneModeTileTest.kt index 73a0cbc5054d..030c59faa696 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/AirplaneModeTileTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/AirplaneModeTileTest.kt @@ -34,6 +34,7 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.qs.QSHost import com.android.systemui.qs.logging.QSLogger import com.android.systemui.qs.tileimpl.QSTileImpl +import com.android.systemui.settings.UserTracker import com.android.systemui.util.settings.GlobalSettings import com.google.common.truth.Truth.assertThat import dagger.Lazy @@ -64,6 +65,8 @@ class AirplaneModeTileTest : SysuiTestCase() { private lateinit var mConnectivityManager: Lazy<ConnectivityManager> @Mock private lateinit var mGlobalSettings: GlobalSettings + @Mock + private lateinit var mUserTracker: UserTracker private lateinit var mTestableLooper: TestableLooper private lateinit var mTile: AirplaneModeTile @@ -87,7 +90,8 @@ class AirplaneModeTileTest : SysuiTestCase() { mQsLogger, mBroadcastDispatcher, mConnectivityManager, - mGlobalSettings) + mGlobalSettings, + mUserTracker) } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/settings/CurrentUserTrackerTest.java b/packages/SystemUI/tests/src/com/android/systemui/settings/CurrentUserTrackerTest.java deleted file mode 100644 index 1b515c6bbdbd..000000000000 --- a/packages/SystemUI/tests/src/com/android/systemui/settings/CurrentUserTrackerTest.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License - */ - -package com.android.systemui.settings; - -import android.content.Intent; - -import androidx.test.filters.SmallTest; - -import com.android.systemui.SysuiTestCase; -import com.android.systemui.broadcast.BroadcastDispatcher; - -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; - -/** - * Testing functionality of the current user tracker - */ -@SmallTest -public class CurrentUserTrackerTest extends SysuiTestCase { - - private CurrentUserTracker mTracker; - private CurrentUserTracker.UserReceiver mReceiver; - @Mock - private BroadcastDispatcher mBroadcastDispatcher; - - @Before - public void setUp() { - MockitoAnnotations.initMocks(this); - mReceiver = new CurrentUserTracker.UserReceiver(mBroadcastDispatcher); - mTracker = new CurrentUserTracker(mReceiver) { - @Override - public void onUserSwitched(int newUserId) { - stopTracking(); - } - }; - } - - @Test - public void testBroadCastDoesntCrashOnConcurrentModification() { - mTracker.startTracking(); - CurrentUserTracker secondTracker = new CurrentUserTracker(mReceiver) { - @Override - public void onUserSwitched(int newUserId) { - stopTracking(); - } - }; - secondTracker.startTracking(); - triggerUserSwitch(); - } - /** - * Simulates a user switch event. - */ - private void triggerUserSwitch() { - Intent intent = new Intent(Intent.ACTION_USER_SWITCHED); - intent.putExtra(Intent.EXTRA_USER_HANDLE, 1); - mReceiver.onReceive(getContext(), intent); - } -} diff --git a/packages/SystemUI/tests/src/com/android/systemui/settings/brightness/BrightnessDialogTest.kt b/packages/SystemUI/tests/src/com/android/systemui/settings/brightness/BrightnessDialogTest.kt index 1130bda9b881..9d1802a686fa 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/settings/brightness/BrightnessDialogTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/settings/brightness/BrightnessDialogTest.kt @@ -28,9 +28,10 @@ import androidx.test.rule.ActivityTestRule import androidx.test.runner.intercepting.SingleActivityFactory import com.android.systemui.R import com.android.systemui.SysuiTestCase -import com.android.systemui.broadcast.BroadcastDispatcher +import com.android.systemui.settings.UserTracker import com.android.systemui.util.mockito.any import com.google.common.truth.Truth.assertThat +import java.util.concurrent.Executor import org.junit.After import org.junit.Before import org.junit.Rule @@ -45,7 +46,9 @@ import org.mockito.MockitoAnnotations @TestableLooper.RunWithLooper class BrightnessDialogTest : SysuiTestCase() { + @Mock private lateinit var userTracker: UserTracker @Mock private lateinit var brightnessSliderControllerFactory: BrightnessSliderController.Factory + @Mock private lateinit var mainExecutor: Executor @Mock private lateinit var backgroundHandler: Handler @Mock private lateinit var brightnessSliderController: BrightnessSliderController @@ -56,8 +59,9 @@ class BrightnessDialogTest : SysuiTestCase() { object : SingleActivityFactory<TestDialog>(TestDialog::class.java) { override fun create(intent: Intent?): TestDialog { return TestDialog( - fakeBroadcastDispatcher, + userTracker, brightnessSliderControllerFactory, + mainExecutor, backgroundHandler ) } @@ -100,8 +104,15 @@ class BrightnessDialogTest : SysuiTestCase() { } class TestDialog( - broadcastDispatcher: BroadcastDispatcher, + userTracker: UserTracker, brightnessSliderControllerFactory: BrightnessSliderController.Factory, + mainExecutor: Executor, backgroundHandler: Handler - ) : BrightnessDialog(broadcastDispatcher, brightnessSliderControllerFactory, backgroundHandler) + ) : + BrightnessDialog( + userTracker, + brightnessSliderControllerFactory, + mainExecutor, + backgroundHandler + ) } 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 bdafa4893c9e..15a687d2adc7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java @@ -53,6 +53,7 @@ import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dump.DumpManager; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.recents.OverviewProxyService; +import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.NotificationLockscreenUserManager.NotificationStateChangedListener; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder; @@ -78,6 +79,8 @@ public class NotificationLockscreenUserManagerTest extends SysuiTestCase { private NotificationPresenter mPresenter; @Mock private UserManager mUserManager; + @Mock + private UserTracker mUserTracker; // Dependency mocks: @Mock @@ -115,6 +118,7 @@ public class NotificationLockscreenUserManagerTest extends SysuiTestCase { MockitoAnnotations.initMocks(this); int currentUserId = ActivityManager.getCurrentUser(); + when(mUserTracker.getUserId()).thenReturn(currentUserId); mSettings = new FakeSettings(); mSettings.setUserId(ActivityManager.getCurrentUser()); mCurrentUser = new UserInfo(currentUserId, "", 0); @@ -344,6 +348,7 @@ public class NotificationLockscreenUserManagerTest extends SysuiTestCase { mBroadcastDispatcher, mDevicePolicyManager, mUserManager, + mUserTracker, (() -> mVisibilityProvider), (() -> mNotifCollection), mClickNotifier, diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerBaseTest.java index 9c870b5aa363..faf4592d26e3 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerBaseTest.java @@ -71,6 +71,7 @@ import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.demomode.DemoModeController; import com.android.systemui.dump.DumpManager; import com.android.systemui.plugins.log.LogBuffer; +import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy; import com.android.systemui.statusbar.policy.DeviceProvisionedController; import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener; @@ -116,6 +117,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase { protected TelephonyManager mMockTm; protected TelephonyListenerManager mTelephonyListenerManager; protected BroadcastDispatcher mMockBd; + protected UserTracker mUserTracker; protected Config mConfig; protected CallbackHandler mCallbackHandler; protected SubscriptionDefaults mMockSubDefaults; @@ -172,6 +174,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase { mMockSm = mock(SubscriptionManager.class); mMockCm = mock(ConnectivityManager.class); mMockBd = mock(BroadcastDispatcher.class); + mUserTracker = mock(UserTracker.class); mMockNsm = mock(NetworkScoreManager.class); mMockSubDefaults = mock(SubscriptionDefaults.class); mCarrierConfigTracker = mock(CarrierConfigTracker.class); @@ -246,6 +249,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase { mMockSubDefaults, mMockProvisionController, mMockBd, + mUserTracker, mDemoModeController, mCarrierConfigTracker, mWifiStatusTrackerFactory, diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerDataTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerDataTest.java index 1d112262765e..ca75a40300cb 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerDataTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerDataTest.java @@ -154,6 +154,7 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest { mMockSubDefaults, mock(DeviceProvisionedController.class), mMockBd, + mUserTracker, mDemoModeController, mock(CarrierConfigTracker.class), mWifiStatusTrackerFactory, diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerSignalTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerSignalTest.java index d5f5105036d3..84c242cda459 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerSignalTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerSignalTest.java @@ -82,6 +82,7 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { mMockSubDefaults, mMockProvisionController, mMockBd, + mUserTracker, mDemoModeController, mCarrierConfigTracker, mWifiStatusTrackerFactory, @@ -118,6 +119,7 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { mMockSubDefaults, mMockProvisionController, mMockBd, + mUserTracker, mDemoModeController, mCarrierConfigTracker, mWifiStatusTrackerFactory, @@ -152,6 +154,7 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { mMockSubDefaults, mock(DeviceProvisionedController.class), mMockBd, + mUserTracker, mDemoModeController, mock(CarrierConfigTracker.class), mWifiStatusTrackerFactory, @@ -189,6 +192,7 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { mMockSubDefaults, mock(DeviceProvisionedController.class), mMockBd, + mUserTracker, mDemoModeController, mock(CarrierConfigTracker.class), mWifiStatusTrackerFactory, @@ -274,6 +278,7 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { mMockSubDefaults, mock(DeviceProvisionedController.class), mMockBd, + mUserTracker, mDemoModeController, mock(CarrierConfigTracker.class), mWifiStatusTrackerFactory, diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BluetoothControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BluetoothControllerImplTest.java index d0391ac0795c..833cabbaecf4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BluetoothControllerImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BluetoothControllerImplTest.java @@ -43,6 +43,7 @@ import com.android.settingslib.bluetooth.LocalBluetoothProfileManager; import com.android.systemui.SysuiTestCase; import com.android.systemui.bluetooth.BluetoothLogger; import com.android.systemui.dump.DumpManager; +import com.android.systemui.settings.UserTracker; import org.junit.Before; import org.junit.Test; @@ -56,6 +57,7 @@ import java.util.List; @SmallTest public class BluetoothControllerImplTest extends SysuiTestCase { + private UserTracker mUserTracker; private LocalBluetoothManager mMockBluetoothManager; private CachedBluetoothDeviceManager mMockDeviceManager; private LocalBluetoothAdapter mMockAdapter; @@ -70,6 +72,7 @@ public class BluetoothControllerImplTest extends SysuiTestCase { mTestableLooper = TestableLooper.get(this); mMockBluetoothManager = mDependency.injectMockDependency(LocalBluetoothManager.class); mDevices = new ArrayList<>(); + mUserTracker = mock(UserTracker.class); mMockDeviceManager = mock(CachedBluetoothDeviceManager.class); when(mMockDeviceManager.getCachedDevicesCopy()).thenReturn(mDevices); when(mMockBluetoothManager.getCachedDeviceManager()).thenReturn(mMockDeviceManager); @@ -81,6 +84,7 @@ public class BluetoothControllerImplTest extends SysuiTestCase { mMockDumpManager = mock(DumpManager.class); mBluetoothControllerImpl = new BluetoothControllerImpl(mContext, + mUserTracker, mMockDumpManager, mock(BluetoothLogger.class), mTestableLooper.getLooper(), diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/HotspotControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/HotspotControllerImplTest.java index 26df03f31b9a..dc08aba7d5e5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/HotspotControllerImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/HotspotControllerImplTest.java @@ -41,6 +41,7 @@ import androidx.test.filters.SmallTest; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.dump.DumpManager; +import com.android.systemui.settings.UserTracker; import org.junit.Before; import org.junit.Test; @@ -61,6 +62,8 @@ import java.util.concurrent.Executor; public class HotspotControllerImplTest extends SysuiTestCase { @Mock + private UserTracker mUserTracker; + @Mock private DumpManager mDumpManager; @Mock private TetheringManager mTetheringManager; @@ -104,7 +107,8 @@ public class HotspotControllerImplTest extends SysuiTestCase { Handler handler = new Handler(mLooper.getLooper()); - mController = new HotspotControllerImpl(mContext, handler, handler, mDumpManager); + mController = new HotspotControllerImpl(mContext, mUserTracker, handler, handler, + mDumpManager); verify(mTetheringManager) .registerTetheringEventCallback(any(), mTetheringCallbackCaptor.capture()); } @@ -191,7 +195,7 @@ public class HotspotControllerImplTest extends SysuiTestCase { Handler handler = new Handler(mLooper.getLooper()); HotspotController controller = - new HotspotControllerImpl(mContext, handler, handler, mDumpManager); + new HotspotControllerImpl(mContext, mUserTracker, handler, handler, mDumpManager); verifyNoMoreInteractions(mTetheringManager); assertFalse(controller.isHotspotSupported()); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SecurityControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SecurityControllerTest.java index d44cdb24421a..15235b68c881 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SecurityControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SecurityControllerTest.java @@ -50,6 +50,7 @@ import androidx.test.runner.AndroidJUnit4; import com.android.systemui.SysuiTestCase; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dump.DumpManager; +import com.android.systemui.settings.UserTracker; import com.android.systemui.util.concurrency.FakeExecutor; import com.android.systemui.util.time.FakeSystemClock; @@ -72,10 +73,12 @@ public class SecurityControllerTest extends SysuiTestCase { private final DevicePolicyManager mDevicePolicyManager = mock(DevicePolicyManager.class); private final IKeyChainService.Stub mKeyChainService = mock(IKeyChainService.Stub.class); private final UserManager mUserManager = mock(UserManager.class); + private final UserTracker mUserTracker = mock(UserTracker.class); private final BroadcastDispatcher mBroadcastDispatcher = mock(BroadcastDispatcher.class); private final Handler mHandler = mock(Handler.class); private SecurityControllerImpl mSecurityController; private ConnectivityManager mConnectivityManager = mock(ConnectivityManager.class); + private FakeExecutor mMainExecutor; private FakeExecutor mBgExecutor; private BroadcastReceiver mBroadcastReceiver; @@ -102,11 +105,14 @@ public class SecurityControllerTest extends SysuiTestCase { ArgumentCaptor<BroadcastReceiver> brCaptor = ArgumentCaptor.forClass(BroadcastReceiver.class); + mMainExecutor = new FakeExecutor(new FakeSystemClock()); mBgExecutor = new FakeExecutor(new FakeSystemClock()); mSecurityController = new SecurityControllerImpl( mContext, + mUserTracker, mHandler, mBroadcastDispatcher, + mMainExecutor, mBgExecutor, Mockito.mock(DumpManager.class)); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ZenModeControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ZenModeControllerImplTest.java index 3fe1a9f6ed97..c06dbdcf3a1b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ZenModeControllerImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ZenModeControllerImplTest.java @@ -35,6 +35,7 @@ import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dump.DumpManager; +import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.policy.ZenModeController.Callback; import com.android.systemui.util.settings.FakeSettings; @@ -58,6 +59,8 @@ public class ZenModeControllerImplTest extends SysuiTestCase { BroadcastDispatcher mBroadcastDispatcher; @Mock DumpManager mDumpManager; + @Mock + UserTracker mUserTracker; private ZenModeControllerImpl mController; @@ -72,7 +75,8 @@ public class ZenModeControllerImplTest extends SysuiTestCase { Handler.createAsync(Looper.myLooper()), mBroadcastDispatcher, mDumpManager, - new FakeSettings()); + new FakeSettings(), + mUserTracker); } @Test |