Migrate UserSwitcherActivity to new back API

Test: atest UserSwitcherActivityTest
Bug: 238358031
Change-Id: I6173f0c70de3e975cff34471ae24126bcd9de3ef
This commit is contained in:
Lucas Dupin
2022-09-07 19:42:29 -07:00
parent f73ff9ec58
commit 5042f4edfc
2 changed files with 82 additions and 3 deletions

View File

@@ -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)
}

View File

@@ -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()
}
}