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

Commit 3b60531e authored by Peter Kalauskas's avatar Peter Kalauskas
Browse files

New UiEvent for lockscreen user switch icon tapped

Test: KeyguardQsUserSwitchControllerTest
Bug: 215755714
Bug: 194829040
Change-Id: Ia3763a20eaaa7f9c13a6746c466226d54a68bfdf
parent feb567fa
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -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;

+10 −2
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -151,6 +155,7 @@ public class KeyguardQsUserSwitchController extends ViewController<FrameLayout>
        mUserDetailAdapter = new KeyguardUserDetailAdapter(context, userDetailViewAdapterProvider);
        mFeatureFlags = featureFlags;
        mUserSwitchDialogController = userSwitchDialogController;
        mUiEventLogger = uiEventLogger;
    }

    @Override
@@ -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 {
+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)
    }
}