Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenGestureLogger.java +4 −1 Original line number Diff line number Diff line Loading @@ -72,7 +72,10 @@ public class LockscreenGestureLogger { LOCKSCREEN_NOTIFICATION_FALSE_TOUCH(548), @UiEvent(doc = "Expand the notification panel while unlocked") LOCKSCREEN_UNLOCKED_NOTIFICATION_PANEL_EXPAND(549); LOCKSCREEN_UNLOCKED_NOTIFICATION_PANEL_EXPAND(549), @UiEvent(doc = "Lockscreen > Tap on switch user icon") LOCKSCREEN_SWITCH_USER_TAP(934); private final int mId; Loading packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardQsUserSwitchController.java +10 −2 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import android.view.ViewGroup; import android.view.accessibility.AccessibilityNodeInfo; import android.widget.FrameLayout; import com.android.internal.logging.UiEventLogger; import com.android.keyguard.KeyguardConstants; import com.android.keyguard.KeyguardVisibilityHelper; import com.android.keyguard.dagger.KeyguardUserSwitcherScope; Loading @@ -49,6 +50,7 @@ import com.android.systemui.statusbar.notification.PropertyAnimator; import com.android.systemui.statusbar.notification.stack.AnimationProperties; import com.android.systemui.statusbar.notification.stack.StackStateAnimator; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.LockscreenGestureLogger; import com.android.systemui.statusbar.phone.NotificationPanelViewController; import com.android.systemui.statusbar.phone.ScreenOffAnimationController; import com.android.systemui.statusbar.phone.UserAvatarView; Loading Loading @@ -82,6 +84,7 @@ public class KeyguardQsUserSwitchController extends ViewController<FrameLayout> private final KeyguardUserDetailAdapter mUserDetailAdapter; private final FeatureFlags mFeatureFlags; private final UserSwitchDialogController mUserSwitchDialogController; private final UiEventLogger mUiEventLogger; private NotificationPanelViewController mNotificationPanelViewController; private UserAvatarView mUserAvatarView; UserSwitcherController.UserRecord mCurrentUser; Loading Loading @@ -133,7 +136,8 @@ public class KeyguardQsUserSwitchController extends ViewController<FrameLayout> Provider<UserDetailView.Adapter> userDetailViewAdapterProvider, ScreenOffAnimationController screenOffAnimationController, FeatureFlags featureFlags, UserSwitchDialogController userSwitchDialogController) { UserSwitchDialogController userSwitchDialogController, UiEventLogger uiEventLogger) { super(view); if (DEBUG) Log.d(TAG, "New KeyguardQsUserSwitchController"); mContext = context; Loading @@ -151,6 +155,7 @@ public class KeyguardQsUserSwitchController extends ViewController<FrameLayout> mUserDetailAdapter = new KeyguardUserDetailAdapter(context, userDetailViewAdapterProvider); mFeatureFlags = featureFlags; mUserSwitchDialogController = userSwitchDialogController; mUiEventLogger = uiEventLogger; } @Override Loading @@ -173,7 +178,10 @@ public class KeyguardQsUserSwitchController extends ViewController<FrameLayout> return; } // Tapping anywhere in the view will open QS user panel // Tapping anywhere in the view will open the user switcher mUiEventLogger.log( LockscreenGestureLogger.LockscreenUiEvent.LOCKSCREEN_SWITCH_USER_TAP); if (mFeatureFlags.isEnabled(Flags.NEW_USER_SWITCHER)) { mUserSwitchDialogController.showDialog(mView); } else { Loading packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyguardQsUserSwitchControllerTest.kt 0 → 100644 +147 −0 Original line number Diff line number Diff line /* * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License */ package com.android.systemui.statusbar.policy import android.testing.AndroidTestingRunner import android.testing.TestableLooper import android.testing.ViewUtils import android.view.LayoutInflater import android.view.View import android.widget.FrameLayout import androidx.test.filters.SmallTest import com.android.internal.logging.UiEventLogger import com.android.systemui.R import com.android.systemui.SysuiTestCase import com.android.systemui.communal.CommunalStateController import com.android.systemui.flags.FeatureFlags import com.android.systemui.keyguard.ScreenLifecycle import com.android.systemui.plugins.FalsingManager import com.android.systemui.qs.tiles.UserDetailView import com.android.systemui.qs.user.UserSwitchDialogController import com.android.systemui.statusbar.SysuiStatusBarStateController import com.android.systemui.statusbar.phone.DozeParameters import com.android.systemui.statusbar.phone.LockscreenGestureLogger import com.android.systemui.statusbar.phone.NotificationPanelViewController import com.android.systemui.statusbar.phone.ScreenOffAnimationController import org.junit.After import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock import org.mockito.Mockito.times import org.mockito.Mockito.verify import org.mockito.Mockito.`when` import org.mockito.MockitoAnnotations import javax.inject.Provider @SmallTest @TestableLooper.RunWithLooper @RunWith(AndroidTestingRunner::class) class KeyguardQsUserSwitchControllerTest : SysuiTestCase() { @Mock private lateinit var screenLifecycle: ScreenLifecycle @Mock private lateinit var userSwitcherController: UserSwitcherController @Mock private lateinit var communalStateController: CommunalStateController @Mock private lateinit var keyguardStateController: KeyguardStateController @Mock private lateinit var falsingManager: FalsingManager @Mock private lateinit var configurationController: ConfigurationController @Mock private lateinit var statusBarStateController: SysuiStatusBarStateController @Mock private lateinit var dozeParameters: DozeParameters @Mock private lateinit var userDetailViewAdapterProvider: Provider<UserDetailView.Adapter> @Mock private lateinit var screenOffAnimationController: ScreenOffAnimationController @Mock private lateinit var featureFlags: FeatureFlags @Mock private lateinit var userSwitchDialogController: UserSwitchDialogController @Mock private lateinit var uiEventLogger: UiEventLogger @Mock private lateinit var notificationPanelViewController: NotificationPanelViewController private lateinit var view: FrameLayout private lateinit var testableLooper: TestableLooper private lateinit var keyguardQsUserSwitchController: KeyguardQsUserSwitchController @Before fun setUp() { MockitoAnnotations.initMocks(this) testableLooper = TestableLooper.get(this) view = LayoutInflater.from(context) .inflate(R.layout.keyguard_qs_user_switch, null) as FrameLayout keyguardQsUserSwitchController = KeyguardQsUserSwitchController( view, context, context.resources, screenLifecycle, userSwitcherController, communalStateController, keyguardStateController, falsingManager, configurationController, statusBarStateController, dozeParameters, userDetailViewAdapterProvider, screenOffAnimationController, featureFlags, userSwitchDialogController, uiEventLogger) ViewUtils.attachView(view) testableLooper.processAllMessages() keyguardQsUserSwitchController .setNotificationPanelViewController(notificationPanelViewController) `when`(userSwitcherController.keyguardStateController).thenReturn(keyguardStateController) `when`(userSwitcherController.keyguardStateController.isShowing).thenReturn(true) keyguardQsUserSwitchController.init() } @After fun tearDown() { ViewUtils.detachView(view) } @Test fun testUiEventLogged() { view.findViewById<View>(R.id.kg_multi_user_avatar)?.performClick() verify(uiEventLogger, times(1)) .log(LockscreenGestureLogger.LockscreenUiEvent.LOCKSCREEN_SWITCH_USER_TAP) } } Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenGestureLogger.java +4 −1 Original line number Diff line number Diff line Loading @@ -72,7 +72,10 @@ public class LockscreenGestureLogger { LOCKSCREEN_NOTIFICATION_FALSE_TOUCH(548), @UiEvent(doc = "Expand the notification panel while unlocked") LOCKSCREEN_UNLOCKED_NOTIFICATION_PANEL_EXPAND(549); LOCKSCREEN_UNLOCKED_NOTIFICATION_PANEL_EXPAND(549), @UiEvent(doc = "Lockscreen > Tap on switch user icon") LOCKSCREEN_SWITCH_USER_TAP(934); private final int mId; Loading
packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardQsUserSwitchController.java +10 −2 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import android.view.ViewGroup; import android.view.accessibility.AccessibilityNodeInfo; import android.widget.FrameLayout; import com.android.internal.logging.UiEventLogger; import com.android.keyguard.KeyguardConstants; import com.android.keyguard.KeyguardVisibilityHelper; import com.android.keyguard.dagger.KeyguardUserSwitcherScope; Loading @@ -49,6 +50,7 @@ import com.android.systemui.statusbar.notification.PropertyAnimator; import com.android.systemui.statusbar.notification.stack.AnimationProperties; import com.android.systemui.statusbar.notification.stack.StackStateAnimator; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.LockscreenGestureLogger; import com.android.systemui.statusbar.phone.NotificationPanelViewController; import com.android.systemui.statusbar.phone.ScreenOffAnimationController; import com.android.systemui.statusbar.phone.UserAvatarView; Loading Loading @@ -82,6 +84,7 @@ public class KeyguardQsUserSwitchController extends ViewController<FrameLayout> private final KeyguardUserDetailAdapter mUserDetailAdapter; private final FeatureFlags mFeatureFlags; private final UserSwitchDialogController mUserSwitchDialogController; private final UiEventLogger mUiEventLogger; private NotificationPanelViewController mNotificationPanelViewController; private UserAvatarView mUserAvatarView; UserSwitcherController.UserRecord mCurrentUser; Loading Loading @@ -133,7 +136,8 @@ public class KeyguardQsUserSwitchController extends ViewController<FrameLayout> Provider<UserDetailView.Adapter> userDetailViewAdapterProvider, ScreenOffAnimationController screenOffAnimationController, FeatureFlags featureFlags, UserSwitchDialogController userSwitchDialogController) { UserSwitchDialogController userSwitchDialogController, UiEventLogger uiEventLogger) { super(view); if (DEBUG) Log.d(TAG, "New KeyguardQsUserSwitchController"); mContext = context; Loading @@ -151,6 +155,7 @@ public class KeyguardQsUserSwitchController extends ViewController<FrameLayout> mUserDetailAdapter = new KeyguardUserDetailAdapter(context, userDetailViewAdapterProvider); mFeatureFlags = featureFlags; mUserSwitchDialogController = userSwitchDialogController; mUiEventLogger = uiEventLogger; } @Override Loading @@ -173,7 +178,10 @@ public class KeyguardQsUserSwitchController extends ViewController<FrameLayout> return; } // Tapping anywhere in the view will open QS user panel // Tapping anywhere in the view will open the user switcher mUiEventLogger.log( LockscreenGestureLogger.LockscreenUiEvent.LOCKSCREEN_SWITCH_USER_TAP); if (mFeatureFlags.isEnabled(Flags.NEW_USER_SWITCHER)) { mUserSwitchDialogController.showDialog(mView); } else { Loading
packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyguardQsUserSwitchControllerTest.kt 0 → 100644 +147 −0 Original line number Diff line number Diff line /* * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License */ package com.android.systemui.statusbar.policy import android.testing.AndroidTestingRunner import android.testing.TestableLooper import android.testing.ViewUtils import android.view.LayoutInflater import android.view.View import android.widget.FrameLayout import androidx.test.filters.SmallTest import com.android.internal.logging.UiEventLogger import com.android.systemui.R import com.android.systemui.SysuiTestCase import com.android.systemui.communal.CommunalStateController import com.android.systemui.flags.FeatureFlags import com.android.systemui.keyguard.ScreenLifecycle import com.android.systemui.plugins.FalsingManager import com.android.systemui.qs.tiles.UserDetailView import com.android.systemui.qs.user.UserSwitchDialogController import com.android.systemui.statusbar.SysuiStatusBarStateController import com.android.systemui.statusbar.phone.DozeParameters import com.android.systemui.statusbar.phone.LockscreenGestureLogger import com.android.systemui.statusbar.phone.NotificationPanelViewController import com.android.systemui.statusbar.phone.ScreenOffAnimationController import org.junit.After import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock import org.mockito.Mockito.times import org.mockito.Mockito.verify import org.mockito.Mockito.`when` import org.mockito.MockitoAnnotations import javax.inject.Provider @SmallTest @TestableLooper.RunWithLooper @RunWith(AndroidTestingRunner::class) class KeyguardQsUserSwitchControllerTest : SysuiTestCase() { @Mock private lateinit var screenLifecycle: ScreenLifecycle @Mock private lateinit var userSwitcherController: UserSwitcherController @Mock private lateinit var communalStateController: CommunalStateController @Mock private lateinit var keyguardStateController: KeyguardStateController @Mock private lateinit var falsingManager: FalsingManager @Mock private lateinit var configurationController: ConfigurationController @Mock private lateinit var statusBarStateController: SysuiStatusBarStateController @Mock private lateinit var dozeParameters: DozeParameters @Mock private lateinit var userDetailViewAdapterProvider: Provider<UserDetailView.Adapter> @Mock private lateinit var screenOffAnimationController: ScreenOffAnimationController @Mock private lateinit var featureFlags: FeatureFlags @Mock private lateinit var userSwitchDialogController: UserSwitchDialogController @Mock private lateinit var uiEventLogger: UiEventLogger @Mock private lateinit var notificationPanelViewController: NotificationPanelViewController private lateinit var view: FrameLayout private lateinit var testableLooper: TestableLooper private lateinit var keyguardQsUserSwitchController: KeyguardQsUserSwitchController @Before fun setUp() { MockitoAnnotations.initMocks(this) testableLooper = TestableLooper.get(this) view = LayoutInflater.from(context) .inflate(R.layout.keyguard_qs_user_switch, null) as FrameLayout keyguardQsUserSwitchController = KeyguardQsUserSwitchController( view, context, context.resources, screenLifecycle, userSwitcherController, communalStateController, keyguardStateController, falsingManager, configurationController, statusBarStateController, dozeParameters, userDetailViewAdapterProvider, screenOffAnimationController, featureFlags, userSwitchDialogController, uiEventLogger) ViewUtils.attachView(view) testableLooper.processAllMessages() keyguardQsUserSwitchController .setNotificationPanelViewController(notificationPanelViewController) `when`(userSwitcherController.keyguardStateController).thenReturn(keyguardStateController) `when`(userSwitcherController.keyguardStateController.isShowing).thenReturn(true) keyguardQsUserSwitchController.init() } @After fun tearDown() { ViewUtils.detachView(view) } @Test fun testUiEventLogged() { view.findViewById<View>(R.id.kg_multi_user_avatar)?.performClick() verify(uiEventLogger, times(1)) .log(LockscreenGestureLogger.LockscreenUiEvent.LOCKSCREEN_SWITCH_USER_TAP) } }