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

Commit 5042f4ed authored by Lucas Dupin's avatar Lucas Dupin
Browse files

Migrate UserSwitcherActivity to new back API

Test: atest UserSwitcherActivityTest
Bug: 238358031
Change-Id: I6173f0c70de3e975cff34471ae24126bcd9de3ef
parent f73ff9ec
Loading
Loading
Loading
Loading
+16 −1
Original line number Diff line number Diff line
@@ -36,6 +36,8 @@ import android.widget.AdapterView
import android.widget.ArrayAdapter
import android.widget.ImageView
import android.widget.TextView
import android.window.OnBackInvokedCallback
import android.window.OnBackInvokedDispatcher
import androidx.activity.ComponentActivity
import androidx.constraintlayout.helper.widget.Flow
import androidx.lifecycle.ViewModelProvider
@@ -67,7 +69,7 @@ private const val USER_VIEW = "user_view"
/**
 * Support a fullscreen user switcher
 */
class UserSwitcherActivity @Inject constructor(
open class UserSwitcherActivity @Inject constructor(
    private val userSwitcherController: UserSwitcherController,
    private val broadcastDispatcher: BroadcastDispatcher,
    private val falsingCollector: FalsingCollector,
@@ -83,6 +85,7 @@ class UserSwitcherActivity @Inject constructor(
    private var popupMenu: UserSwitcherPopupMenu? = null
    private lateinit var addButton: View
    private var addUserRecords = mutableListOf<UserRecord>()
    private val onBackCallback = OnBackInvokedCallback { finish() }
    private val userSwitchedCallback: UserTracker.Callback = object : UserTracker.Callback {
        override fun onUserChanged(newUser: Int, userContext: Context) {
            finish()
@@ -105,7 +108,11 @@ class UserSwitcherActivity @Inject constructor(

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        createActivity()
    }

    @VisibleForTesting
    fun createActivity() {
        setContentView(R.layout.user_switcher_fullscreen)
        window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
@@ -148,6 +155,9 @@ class UserSwitcherActivity @Inject constructor(
            }
        }

        onBackInvokedDispatcher.registerOnBackInvokedCallback(
                OnBackInvokedDispatcher.PRIORITY_DEFAULT, onBackCallback)

        userSwitcherController.init(parent)
        initBroadcastReceiver()

@@ -278,7 +288,12 @@ class UserSwitcherActivity @Inject constructor(
        if (isUsingModernArchitecture()) {
            return
        }
        destroyActivity()
    }

    @VisibleForTesting
    fun destroyActivity() {
        onBackInvokedDispatcher.unregisterOnBackInvokedCallback(onBackCallback)
        broadcastDispatcher.unregisterReceiver(broadcastReceiver)
        userTracker.removeCallback(userSwitchedCallback)
    }
+66 −2
Original line number Diff line number Diff line
@@ -16,11 +16,17 @@

package com.android.systemui.user

import android.app.Application
import android.os.UserManager
import android.testing.AndroidTestingRunner
import android.testing.TestableLooper.RunWithLooper
import android.view.LayoutInflater
import android.view.View
import android.view.Window
import android.window.OnBackInvokedCallback
import android.window.OnBackInvokedDispatcher
import androidx.test.filters.SmallTest
import com.android.systemui.R
import com.android.systemui.SysuiTestCase
import com.android.systemui.broadcast.BroadcastDispatcher
import com.android.systemui.classifier.FalsingCollector
@@ -29,12 +35,25 @@ import com.android.systemui.plugins.FalsingManager
import com.android.systemui.settings.UserTracker
import com.android.systemui.statusbar.policy.UserSwitcherController
import com.android.systemui.user.ui.viewmodel.UserSwitcherViewModel
import com.android.systemui.util.concurrency.FakeExecutor
import com.android.systemui.util.time.FakeSystemClock
import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Test
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.any
import org.mockito.Mockito.anyInt
import org.mockito.Mockito.doNothing
import org.mockito.Mockito.eq
import org.mockito.Mockito.mock
import org.mockito.Mockito.spy
import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations
import java.util.concurrent.Executor

@SmallTest
@RunWith(AndroidTestingRunner::class)
@@ -60,11 +79,22 @@ class UserSwitcherActivityTest : SysuiTestCase() {
    private lateinit var flags: FeatureFlags
    @Mock
    private lateinit var viewModelFactoryLazy: dagger.Lazy<UserSwitcherViewModel.Factory>
    @Mock
    private lateinit var onBackDispatcher: OnBackInvokedDispatcher
    @Mock
    private lateinit var decorView: View
    @Mock
    private lateinit var window: Window
    @Mock
    private lateinit var userSwitcherRootView: UserSwitcherRootView
    @Captor
    private lateinit var onBackInvokedCallback: ArgumentCaptor<OnBackInvokedCallback>
    var isFinished = false

    @Before
    fun setUp() {
        MockitoAnnotations.initMocks(this)
        activity = UserSwitcherActivity(
        activity = spy(object : UserSwitcherActivity(
            userSwitcherController,
            broadcastDispatcher,
            falsingCollector,
@@ -73,7 +103,21 @@ class UserSwitcherActivityTest : SysuiTestCase() {
            userTracker,
            flags,
            viewModelFactoryLazy,
        )
        ) {
            override fun getOnBackInvokedDispatcher() = onBackDispatcher
            override fun getMainExecutor(): Executor = FakeExecutor(FakeSystemClock())
            override fun finish() {
                isFinished = true
            }
        })
        `when`(activity.window).thenReturn(window)
        `when`(window.decorView).thenReturn(decorView)
        `when`(activity.findViewById<UserSwitcherRootView>(R.id.user_switcher_root))
                .thenReturn(userSwitcherRootView)
        `when`(activity.findViewById<View>(R.id.cancel)).thenReturn(mock(View::class.java))
        `when`(activity.findViewById<View>(R.id.add)).thenReturn(mock(View::class.java))
        `when`(activity.application).thenReturn(mock(Application::class.java))
        doNothing().`when`(activity).setContentView(anyInt())
    }

    @Test
@@ -85,4 +129,24 @@ class UserSwitcherActivityTest : SysuiTestCase() {
        assertThat(activity.getMaxColumns(7)).isEqualTo(4)
        assertThat(activity.getMaxColumns(9)).isEqualTo(5)
    }

    @Test
    fun onCreate_callbackRegistration() {
        activity.createActivity()
        verify(onBackDispatcher).registerOnBackInvokedCallback(
                eq(OnBackInvokedDispatcher.PRIORITY_DEFAULT), any())

        activity.destroyActivity()
        verify(onBackDispatcher).unregisterOnBackInvokedCallback(any())
    }

    @Test
    fun onBackInvokedCallback_finishesActivity() {
        activity.createActivity()
        verify(onBackDispatcher).registerOnBackInvokedCallback(
                eq(OnBackInvokedDispatcher.PRIORITY_DEFAULT), onBackInvokedCallback.capture())

        onBackInvokedCallback.value.onBackInvoked()
        assertThat(isFinished).isTrue()
    }
}