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

Commit 9dd56cd2 authored by Peter Kalauskas's avatar Peter Kalauskas Committed by Android (Google) Code Review
Browse files

Merge "Update QS footer when multi-user setting changed"

parents 2dda2584 7a1d17b9
Loading
Loading
Loading
Loading
+20 −2
Original line number Diff line number Diff line
@@ -17,8 +17,10 @@
package com.android.systemui.qs

import android.content.Intent
import android.os.Handler
import android.os.UserManager
import android.provider.Settings
import android.provider.Settings.Global.USER_SWITCHER_ENABLED
import android.view.View
import android.widget.Toast
import androidx.annotation.VisibleForTesting
@@ -35,6 +37,7 @@ import com.android.systemui.plugins.FalsingManager
import com.android.systemui.qs.FooterActionsController.ExpansionState.COLLAPSED
import com.android.systemui.qs.FooterActionsController.ExpansionState.EXPANDED
import com.android.systemui.qs.dagger.QSFlagsModule.PM_LITE_ENABLED
import com.android.systemui.settings.UserTracker
import com.android.systemui.statusbar.phone.MultiUserSwitchController
import com.android.systemui.statusbar.phone.SettingsButton
import com.android.systemui.statusbar.policy.DeviceProvisionedController
@@ -42,6 +45,7 @@ import com.android.systemui.statusbar.policy.UserInfoController
import com.android.systemui.statusbar.policy.UserInfoController.OnUserInfoChangedListener
import com.android.systemui.tuner.TunerService
import com.android.systemui.util.ViewController
import com.android.systemui.util.settings.GlobalSettings
import javax.inject.Inject
import javax.inject.Named

@@ -55,6 +59,7 @@ class FooterActionsController @Inject constructor(
    private val qsPanelController: QSPanelController,
    private val activityStarter: ActivityStarter,
    private val userManager: UserManager,
    private val userTracker: UserTracker,
    private val userInfoController: UserInfoController,
    private val multiUserSwitchController: MultiUserSwitchController,
    private val deviceProvisionedController: DeviceProvisionedController,
@@ -64,7 +69,9 @@ class FooterActionsController @Inject constructor(
    private val globalActionsDialog: GlobalActionsDialogLite,
    private val uiEventLogger: UiEventLogger,
    @Named(PM_LITE_ENABLED) private val showPMLiteButton: Boolean,
    private val buttonsVisibleState: ExpansionState
    private val buttonsVisibleState: ExpansionState,
    private val globalSetting: GlobalSettings,
    private val handler: Handler
) : ViewController<FooterActionsView>(view) {

    enum class ExpansionState { COLLAPSED, EXPANDED }
@@ -83,6 +90,16 @@ class FooterActionsController @Inject constructor(
        mView.onUserInfoChanged(picture, isGuestUser)
    }

    private val multiUserSetting =
            object : SettingObserver(
                    globalSetting, handler, USER_SWITCHER_ENABLED, userTracker.userId) {
                override fun handleValueChanged(value: Int, observedChange: Boolean) {
                    if (observedChange) {
                        updateView()
                    }
                }
            }

    private val onClickListener = View.OnClickListener { v ->
        // Don't do anything until views are unhidden. Don't do anything if the tap looks
        // suspicious.
@@ -182,6 +199,7 @@ class FooterActionsController @Inject constructor(
            return
        }
        this.listening = listening
        multiUserSetting.isListening = listening
        if (this.listening) {
            userInfoController.addCallback(onUserInfoChangedListener)
            updateView()
+11 −3
Original line number Diff line number Diff line
@@ -16,18 +16,22 @@

package com.android.systemui.qs

import android.os.Handler
import android.os.UserManager
import com.android.internal.logging.MetricsLogger
import com.android.internal.logging.UiEventLogger
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.globalactions.GlobalActionsDialogLite
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.plugins.FalsingManager
import com.android.systemui.qs.FooterActionsController.ExpansionState
import com.android.systemui.qs.dagger.QSFlagsModule
import com.android.systemui.settings.UserTracker
import com.android.systemui.statusbar.phone.MultiUserSwitchController
import com.android.systemui.statusbar.policy.DeviceProvisionedController
import com.android.systemui.statusbar.policy.UserInfoController
import com.android.systemui.tuner.TunerService
import com.android.systemui.util.settings.GlobalSettings
import javax.inject.Inject
import javax.inject.Named

@@ -35,6 +39,7 @@ class FooterActionsControllerBuilder @Inject constructor(
    private val qsPanelController: QSPanelController,
    private val activityStarter: ActivityStarter,
    private val userManager: UserManager,
    private val userTracker: UserTracker,
    private val userInfoController: UserInfoController,
    private val multiUserSwitchControllerFactory: MultiUserSwitchController.Factory,
    private val deviceProvisionedController: DeviceProvisionedController,
@@ -43,7 +48,9 @@ class FooterActionsControllerBuilder @Inject constructor(
    private val tunerService: TunerService,
    private val globalActionsDialog: GlobalActionsDialogLite,
    private val uiEventLogger: UiEventLogger,
    @Named(QSFlagsModule.PM_LITE_ENABLED) private val showPMLiteButton: Boolean
    @Named(QSFlagsModule.PM_LITE_ENABLED) private val showPMLiteButton: Boolean,
    private val globalSettings: GlobalSettings,
    @Main private val handler: Handler
) {
    private lateinit var view: FooterActionsView
    private lateinit var buttonsVisibleState: ExpansionState
@@ -60,8 +67,9 @@ class FooterActionsControllerBuilder @Inject constructor(

    fun build(): FooterActionsController {
        return FooterActionsController(view, qsPanelController, activityStarter, userManager,
                userInfoController, multiUserSwitchControllerFactory.create(view),
                userTracker, userInfoController, multiUserSwitchControllerFactory.create(view),
                deviceProvisionedController, falsingManager, metricsLogger, tunerService,
                globalActionsDialog, uiEventLogger, showPMLiteButton, buttonsVisibleState)
                globalActionsDialog, uiEventLogger, showPMLiteButton, buttonsVisibleState,
                globalSettings, handler)
    }
}
 No newline at end of file
+31 −2
Original line number Diff line number Diff line
package com.android.systemui.qs

import android.os.Handler
import android.os.UserManager
import android.provider.Settings
import android.testing.AndroidTestingRunner
import android.testing.TestableLooper
import android.testing.ViewUtils
@@ -16,10 +18,12 @@ import com.android.systemui.classifier.FalsingManagerFake
import com.android.systemui.globalactions.GlobalActionsDialogLite
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.qs.FooterActionsController.ExpansionState
import com.android.systemui.settings.UserTracker
import com.android.systemui.statusbar.phone.MultiUserSwitchController
import com.android.systemui.statusbar.policy.DeviceProvisionedController
import com.android.systemui.statusbar.policy.UserInfoController
import com.android.systemui.tuner.TunerService
import com.android.systemui.util.settings.FakeSettings
import com.android.systemui.utils.leaks.FakeTunerService
import com.android.systemui.utils.leaks.LeakCheckedTest
import com.google.common.truth.Truth.assertThat
@@ -42,6 +46,8 @@ class FooterActionsControllerTest : LeakCheckedTest() {
    @Mock
    private lateinit var userManager: UserManager
    @Mock
    private lateinit var userTracker: UserTracker
    @Mock
    private lateinit var activityStarter: ActivityStarter
    @Mock
    private lateinit var deviceProvisionedController: DeviceProvisionedController
@@ -62,11 +68,13 @@ class FooterActionsControllerTest : LeakCheckedTest() {
    private lateinit var view: FooterActionsView
    private val falsingManager: FalsingManagerFake = FalsingManagerFake()
    private lateinit var testableLooper: TestableLooper
    private lateinit var fakeSettings: FakeSettings

    @Before
    fun setUp() {
        MockitoAnnotations.initMocks(this)
        testableLooper = TestableLooper.get(this)
        fakeSettings = FakeSettings()
        injectLeakCheckedDependencies(*LeakCheckedTest.ALL_SUPPORTED_CLASSES)
        val fakeTunerService = Dependency.get(TunerService::class.java) as FakeTunerService

@@ -74,10 +82,11 @@ class FooterActionsControllerTest : LeakCheckedTest() {
                .inflate(R.layout.footer_actions, null) as FooterActionsView

        controller = FooterActionsController(view, qsPanelController, activityStarter,
                userManager, userInfoController, multiUserSwitchController,
                userManager, userTracker, userInfoController, multiUserSwitchController,
                deviceProvisionedController, falsingManager, metricsLogger, fakeTunerService,
                globalActionsDialog, uiEventLogger, showPMLiteButton = true,
                buttonsVisibleState = ExpansionState.EXPANDED)
                buttonsVisibleState = ExpansionState.EXPANDED, fakeSettings,
                Handler(testableLooper.looper))
        controller.init()
        ViewUtils.attachView(view)
        // View looper is the testable looper associated with the test
@@ -122,4 +131,24 @@ class FooterActionsControllerTest : LeakCheckedTest() {

        assertThat(multiUserSwitch.visibility).isEqualTo(View.VISIBLE)
    }

    @Test
    fun testMultiUserSwitchUpdatedWhenSettingChanged() {
        // When expanded, listening is true
        controller.setListening(true)
        testableLooper.processAllMessages()

        val multiUserSwitch = view.requireViewById<View>(R.id.multi_user_switch)
        assertThat(multiUserSwitch.visibility).isNotEqualTo(View.VISIBLE)

        // The setting is only used as an indicator for whether the view should refresh. The actual
        // value of the setting is ignored; isMultiUserEnabled is the source of truth
        whenever(multiUserSwitchController.isMultiUserEnabled).thenReturn(true)

        // Changing the value of USER_SWITCHER_ENABLED should cause the view to update
        fakeSettings.putIntForUser(Settings.Global.USER_SWITCHER_ENABLED, 1, userTracker.userId)
        testableLooper.processAllMessages()

        assertThat(multiUserSwitch.visibility).isEqualTo(View.VISIBLE)
    }
}
 No newline at end of file