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

Commit 23126151 authored by Beverly Tai's avatar Beverly Tai Committed by Android (Google) Code Review
Browse files

Merge "Add Keyguard session end UIEvents" into udc-dev

parents 928fc7cd 1cdbdc9a
Loading
Loading
Loading
Loading
+34 −3
Original line number Diff line number Diff line
@@ -28,6 +28,8 @@ import androidx.annotation.NonNull;

import com.android.internal.logging.InstanceId;
import com.android.internal.logging.InstanceIdSequence;
import com.android.internal.logging.UiEvent;
import com.android.internal.logging.UiEventLogger;
import com.android.internal.statusbar.IStatusBarService;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
@@ -60,6 +62,7 @@ public class SessionTracker implements CoreStartable {
    private final AuthController mAuthController;
    private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
    private final KeyguardStateController mKeyguardStateController;
    private final UiEventLogger mUiEventLogger;
    private final Map<Integer, InstanceId> mSessionToInstanceId = new HashMap<>();

    private boolean mKeyguardSessionStarted;
@@ -69,12 +72,14 @@ public class SessionTracker implements CoreStartable {
            IStatusBarService statusBarService,
            AuthController authController,
            KeyguardUpdateMonitor keyguardUpdateMonitor,
            KeyguardStateController keyguardStateController
            KeyguardStateController keyguardStateController,
            UiEventLogger uiEventLogger
    ) {
        mStatusBarManagerService = statusBarService;
        mAuthController = authController;
        mKeyguardUpdateMonitor = keyguardUpdateMonitor;
        mKeyguardStateController = keyguardStateController;
        mUiEventLogger = uiEventLogger;
    }

    @Override
@@ -116,6 +121,10 @@ public class SessionTracker implements CoreStartable {
    }

    private void endSession(int type) {
        endSession(type, null);
    }

    private void endSession(int type, @Nullable SessionUiEvent endSessionUiEvent) {
        if (mSessionToInstanceId.getOrDefault(type, null) == null) {
            Log.e(TAG, "session [" + getString(type) + "] was not started");
            return;
@@ -127,6 +136,9 @@ public class SessionTracker implements CoreStartable {
            if (DEBUG) {
                Log.d(TAG, "Session end for [" + getString(type) + "] id=" + instanceId);
            }
            if (endSessionUiEvent != null) {
                mUiEventLogger.log(endSessionUiEvent, instanceId);
            }
            mStatusBarManagerService.onSessionEnded(type, instanceId);
        } catch (RemoteException e) {
            Log.e(TAG, "Unable to send onSessionEnded for session="
@@ -139,7 +151,7 @@ public class SessionTracker implements CoreStartable {
        @Override
        public void onStartedGoingToSleep(int why) {
            if (mKeyguardSessionStarted) {
                endSession(SESSION_KEYGUARD);
                endSession(SESSION_KEYGUARD, SessionUiEvent.KEYGUARD_SESSION_END_GOING_TO_SLEEP);
            }

            // Start a new session whenever the device goes to sleep
@@ -162,7 +174,8 @@ public class SessionTracker implements CoreStartable {
                startSession(SESSION_KEYGUARD);
            } else if (!keyguardShowing && wasSessionStarted) {
                mKeyguardSessionStarted = false;
                endSession(SESSION_KEYGUARD);
                endSession(SESSION_KEYGUARD,
                        SessionUiEvent.KEYGUARD_SESSION_END_KEYGUARD_GOING_AWAY);
            }
        }
    };
@@ -200,4 +213,22 @@ public class SessionTracker implements CoreStartable {

        return "unknownType=" + sessionType;
    }

    enum SessionUiEvent implements UiEventLogger.UiEventEnum {
        @UiEvent(doc = "A keyguard session ended due to the keyguard going away.")
        KEYGUARD_SESSION_END_KEYGUARD_GOING_AWAY(1354),

        @UiEvent(doc = "A keyguard session ended due to display going to sleep.")
        KEYGUARD_SESSION_END_GOING_TO_SLEEP(1355);

        private final int mId;
        SessionUiEvent(int id) {
            mId = id;
        }

        @Override
        public int getId() {
            return mId;
        }
    }
}
+62 −1
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import static junit.framework.Assert.assertNull;
import static org.junit.Assert.assertNotEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -37,6 +38,7 @@ import android.testing.TestableLooper;
import androidx.test.filters.SmallTest;

import com.android.internal.logging.InstanceId;
import com.android.internal.logging.UiEventLogger;
import com.android.internal.statusbar.IStatusBarService;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
@@ -64,6 +66,8 @@ public class SessionTrackerTest extends SysuiTestCase {
    private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
    @Mock
    private KeyguardStateController mKeyguardStateController;
    @Mock
    private UiEventLogger mUiEventLogger;

    @Captor
    ArgumentCaptor<KeyguardUpdateMonitorCallback> mKeyguardUpdateMonitorCallbackCaptor;
@@ -87,7 +91,8 @@ public class SessionTrackerTest extends SysuiTestCase {
                mStatusBarService,
                mAuthController,
                mKeyguardUpdateMonitor,
                mKeyguardStateController
                mKeyguardStateController,
                mUiEventLogger
        );
    }

@@ -238,6 +243,62 @@ public class SessionTrackerTest extends SysuiTestCase {
                eq(SESSION_KEYGUARD), any(InstanceId.class));
    }

    @Test
    public void uiEventLoggedOnEndSessionWhenDeviceStartsSleeping() throws RemoteException {
        // GIVEN session tracker start
        mSessionTracker.start();
        captureKeyguardUpdateMonitorCallback();
        captureKeyguardStateControllerCallback();

        // GIVEN keyguard becomes visible (ie: from lockdown), so there's a valid keyguard
        // session running
        when(mKeyguardStateController.isShowing()).thenReturn(true);
        mKeyguardStateCallback.onKeyguardShowingChanged();

        // WHEN device starts going to sleep
        mKeyguardUpdateMonitorCallback.onStartedGoingToSleep(0);

        // THEN UI event is logged
        verify(mUiEventLogger).log(
                eq(SessionTracker.SessionUiEvent.KEYGUARD_SESSION_END_GOING_TO_SLEEP),
                any(InstanceId.class));
    }

    @Test
    public void noUiEventLoggedOnEndSessionWhenDeviceStartsSleepingWithoutStartSession()
            throws RemoteException {
        // GIVEN session tracker start without any valid sessions
        mSessionTracker.start();
        captureKeyguardUpdateMonitorCallback();

        // WHEN device starts going to sleep when there was no started sessions
        mKeyguardUpdateMonitorCallback.onStartedGoingToSleep(0);

        // THEN UI event is never logged
        verify(mUiEventLogger, never()).log(
                eq(SessionTracker.SessionUiEvent.KEYGUARD_SESSION_END_GOING_TO_SLEEP),
                any(InstanceId.class));
    }

    @Test
    public void uiEventLoggedOnEndSessionWhenKeyguardGoingAway() throws RemoteException {
        // GIVEN session tracker started w/o any sessions
        mSessionTracker.start();
        captureKeyguardUpdateMonitorCallback();
        captureKeyguardStateControllerCallback();

        // WHEN keyguard was showing and now it's not
        when(mKeyguardStateController.isShowing()).thenReturn(true);
        mKeyguardStateCallback.onKeyguardShowingChanged();
        when(mKeyguardStateController.isShowing()).thenReturn(false);
        mKeyguardStateCallback.onKeyguardShowingChanged();

        // THEN UI event is logged
        verify(mUiEventLogger).log(
                eq(SessionTracker.SessionUiEvent.KEYGUARD_SESSION_END_KEYGUARD_GOING_AWAY),
                any(InstanceId.class));
    }

    void captureKeyguardUpdateMonitorCallback() {
        verify(mKeyguardUpdateMonitor).registerCallback(
                mKeyguardUpdateMonitorCallbackCaptor.capture());