Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 27ff98f7 authored by Evan Laird's avatar Evan Laird
Browse files

Move showUserSwitcher to UserInteractor

This method will be needed by the status bar user chip, and has the
equivalent behavior that was defined in `FooterActionsInteractor`. This
CL moves the implementation + tests up from `FooterActionsInteractor` to
a new dependency on `UserInteractor`

Test: atest UserInteractorTest
Bug: 254246505
Change-Id: Ia78513a0f86a5ade8727855f677919abac82b3b1
parent e182b0d4
Loading
Loading
Loading
Loading
+3 −23
Original line number Diff line number Diff line
@@ -32,8 +32,6 @@ import com.android.systemui.animation.Expandable
import com.android.systemui.broadcast.BroadcastDispatcher
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.flags.FeatureFlags
import com.android.systemui.flags.Flags
import com.android.systemui.globalactions.GlobalActionsDialogLite
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.qs.FgsManagerController
@@ -42,10 +40,9 @@ import com.android.systemui.qs.footer.data.model.UserSwitcherStatusModel
import com.android.systemui.qs.footer.data.repository.ForegroundServicesRepository
import com.android.systemui.qs.footer.data.repository.UserSwitcherRepository
import com.android.systemui.qs.footer.domain.model.SecurityButtonConfig
import com.android.systemui.qs.user.UserSwitchDialogController
import com.android.systemui.security.data.repository.SecurityRepository
import com.android.systemui.statusbar.policy.DeviceProvisionedController
import com.android.systemui.user.UserSwitcherActivity
import com.android.systemui.user.domain.interactor.UserInteractor
import javax.inject.Inject
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.flow.Flow
@@ -100,13 +97,12 @@ class FooterActionsInteractorImpl
@Inject
constructor(
    private val activityStarter: ActivityStarter,
    private val featureFlags: FeatureFlags,
    private val metricsLogger: MetricsLogger,
    private val uiEventLogger: UiEventLogger,
    private val deviceProvisionedController: DeviceProvisionedController,
    private val qsSecurityFooterUtils: QSSecurityFooterUtils,
    private val fgsManagerController: FgsManagerController,
    private val userSwitchDialogController: UserSwitchDialogController,
    private val userInteractor: UserInteractor,
    securityRepository: SecurityRepository,
    foregroundServicesRepository: ForegroundServicesRepository,
    userSwitcherRepository: UserSwitcherRepository,
@@ -182,22 +178,6 @@ constructor(
    }

    override fun showUserSwitcher(context: Context, expandable: Expandable) {
        if (!featureFlags.isEnabled(Flags.FULL_SCREEN_USER_SWITCHER)) {
            userSwitchDialogController.showDialog(context, expandable)
            return
        }

        val intent =
            Intent(context, UserSwitcherActivity::class.java).apply {
                addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK)
            }

        activityStarter.startActivity(
            intent,
            true /* dismissShade */,
            expandable.activityLaunchController(),
            true /* showOverlockscreenwhenlocked */,
            UserHandle.SYSTEM,
        )
        userInteractor.showUserSwitcher(context, expandable)
    }
}
+25 −0
Original line number Diff line number Diff line
@@ -34,15 +34,19 @@ import android.util.Log
import com.android.internal.util.UserIcons
import com.android.systemui.R
import com.android.systemui.SystemUISecondaryUserService
import com.android.systemui.animation.Expandable
import com.android.systemui.broadcast.BroadcastDispatcher
import com.android.systemui.common.shared.model.Text
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.flags.FeatureFlags
import com.android.systemui.flags.Flags
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.qs.user.UserSwitchDialogController
import com.android.systemui.telephony.domain.interactor.TelephonyInteractor
import com.android.systemui.user.UserSwitcherActivity
import com.android.systemui.user.data.model.UserSwitcherSettingsModel
import com.android.systemui.user.data.repository.UserRepository
import com.android.systemui.user.data.source.UserRecord
@@ -81,6 +85,7 @@ constructor(
    private val repository: UserRepository,
    private val activityStarter: ActivityStarter,
    private val keyguardInteractor: KeyguardInteractor,
    private val featureFlags: FeatureFlags,
    private val manager: UserManager,
    @Application private val applicationScope: CoroutineScope,
    telephonyInteractor: TelephonyInteractor,
@@ -468,6 +473,26 @@ constructor(
        }
    }

    fun showUserSwitcher(context: Context, expandable: Expandable) {
        if (!featureFlags.isEnabled(Flags.FULL_SCREEN_USER_SWITCHER)) {
            showDialog(ShowDialogRequestModel.ShowUserSwitcherDialog)
            return
        }

        val intent =
            Intent(context, UserSwitcherActivity::class.java).apply {
                addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK)
            }

        activityStarter.startActivity(
            intent,
            true /* dismissShade */,
            expandable.activityLaunchController(),
            true /* showOverlockscreenwhenlocked */,
            UserHandle.SYSTEM,
        )
    }

    private fun showDialog(request: ShowDialogRequestModel) {
        _dialogShowRequests.value = request
    }
+3 −0
Original line number Diff line number Diff line
@@ -43,4 +43,7 @@ sealed class ShowDialogRequestModel(
        val onExitGuestUser: (guestId: Int, targetId: Int, forceRemoveGuest: Boolean) -> Unit,
        override val dialogShower: UserSwitchDialogController.DialogShower?,
    ) : ShowDialogRequestModel(dialogShower)

    /** Show the user switcher dialog */
    object ShowUserSwitcherDialog : ShowDialogRequestModel()
}
+68 −0
Original line number Diff line number Diff line
package com.android.systemui.user.ui.dialog

import android.content.Context
import android.content.Intent
import android.provider.Settings
import android.view.LayoutInflater
import com.android.internal.logging.UiEventLogger
import com.android.systemui.R
import com.android.systemui.animation.DialogLaunchAnimator
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.plugins.FalsingManager
import com.android.systemui.qs.QSUserSwitcherEvent
import com.android.systemui.qs.tiles.UserDetailView
import com.android.systemui.statusbar.phone.SystemUIDialog

/**
 * Extracted from the old UserSwitchDialogController. This is the dialog version of the full-screen
 * user switcher. See config_enableFullscreenUserSwitcher
 */
class UserSwitchDialog(
    context: Context,
    adapter: UserDetailView.Adapter,
    uiEventLogger: UiEventLogger,
    falsingManager: FalsingManager,
    activityStarter: ActivityStarter,
    dialogLaunchAnimator: DialogLaunchAnimator,
) : SystemUIDialog(context) {
    init {
        setShowForAllUsers(true)
        setCanceledOnTouchOutside(true)
        setTitle(R.string.qs_user_switch_dialog_title)
        setPositiveButton(R.string.quick_settings_done) { _, _ ->
            uiEventLogger.log(QSUserSwitcherEvent.QS_USER_DETAIL_CLOSE)
        }
        setNeutralButton(
            R.string.quick_settings_more_user_settings,
            { _, _ ->
                if (!falsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) {
                    uiEventLogger.log(QSUserSwitcherEvent.QS_USER_MORE_SETTINGS)
                    val controller =
                        dialogLaunchAnimator.createActivityLaunchController(
                            getButton(BUTTON_NEUTRAL)
                        )

                    if (controller == null) {
                        dismiss()
                    }

                    activityStarter.postStartActivityDismissingKeyguard(
                        USER_SETTINGS_INTENT,
                        0,
                        controller
                    )
                }
            },
            false /* dismissOnClick */
        )
        val gridFrame =
            LayoutInflater.from(this.context).inflate(R.layout.qs_user_dialog_content, null)
        setView(gridFrame)

        adapter.linkToViewGroup(gridFrame.findViewById(R.id.grid))
    }

    companion object {
        private val USER_SETTINGS_INTENT = Intent(Settings.ACTION_USER_SETTINGS)
    }
}
+22 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ package com.android.systemui.user.ui.dialog
import android.app.Dialog
import android.content.Context
import com.android.internal.jank.InteractionJankMonitor
import com.android.internal.logging.UiEventLogger
import com.android.settingslib.users.UserCreatingDialog
import com.android.systemui.CoreStartable
import com.android.systemui.animation.DialogCuj
@@ -27,11 +28,14 @@ import com.android.systemui.animation.DialogLaunchAnimator
import com.android.systemui.broadcast.BroadcastSender
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.plugins.FalsingManager
import com.android.systemui.qs.tiles.UserDetailView
import com.android.systemui.user.domain.interactor.UserInteractor
import com.android.systemui.user.domain.model.ShowDialogRequestModel
import dagger.Lazy
import javax.inject.Inject
import javax.inject.Provider
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.launch
@@ -47,6 +51,9 @@ constructor(
    private val broadcastSender: Lazy<BroadcastSender>,
    private val dialogLaunchAnimator: Lazy<DialogLaunchAnimator>,
    private val interactor: Lazy<UserInteractor>,
    private val userDetailAdapterProvider: Provider<UserDetailView.Adapter>,
    private val eventLogger: Lazy<UiEventLogger>,
    private val activityStarter: Lazy<ActivityStarter>,
) : CoreStartable {

    private var currentDialog: Dialog? = null
@@ -108,6 +115,21 @@ constructor(
                                    INTERACTION_JANK_EXIT_GUEST_MODE_TAG,
                                ),
                            )
                        is ShowDialogRequestModel.ShowUserSwitcherDialog ->
                            Pair(
                                UserSwitchDialog(
                                    context = context.get(),
                                    adapter = userDetailAdapterProvider.get(),
                                    uiEventLogger = eventLogger.get(),
                                    falsingManager = falsingManager.get(),
                                    activityStarter = activityStarter.get(),
                                    dialogLaunchAnimator = dialogLaunchAnimator.get(),
                                ),
                                DialogCuj(
                                    InteractionJankMonitor.CUJ_USER_DIALOG_OPEN,
                                    INTERACTION_JANK_EXIT_GUEST_MODE_TAG,
                                ),
                            )
                    }
                currentDialog = dialog

Loading