summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Lucas Dupin <dupin@google.com> 2022-09-13 20:04:57 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2022-09-13 20:04:57 +0000
commita18d909d2345b32d55159241ebd6348b901571b4 (patch)
treea7d1b656f066fb4342ae4e03155192009f5cc9d0
parent86125487cadc102248ab3ad952d1e1e5b077f804 (diff)
parent5042f4edfc4f890b35603d0303cd3c1455d978d4 (diff)
Merge "Migrate UserSwitcherActivity to new back API" into tm-qpr-dev
-rw-r--r--packages/SystemUI/src/com/android/systemui/user/UserSwitcherActivity.kt17
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/user/UserSwitcherActivityTest.kt68
2 files changed, 82 insertions, 3 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/user/UserSwitcherActivity.kt b/packages/SystemUI/src/com/android/systemui/user/UserSwitcherActivity.kt
index 8a51cd6c7e94..d43f739f9e71 100644
--- a/packages/SystemUI/src/com/android/systemui/user/UserSwitcherActivity.kt
+++ b/packages/SystemUI/src/com/android/systemui/user/UserSwitcherActivity.kt
@@ -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)
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/user/UserSwitcherActivityTest.kt b/packages/SystemUI/tests/src/com/android/systemui/user/UserSwitcherActivityTest.kt
index 439beaab6c7e..3968bb798bb7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/user/UserSwitcherActivityTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/user/UserSwitcherActivityTest.kt
@@ -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()
+ }
}