Loading packages/SystemUI/src/com/android/systemui/log/SessionTracker.java +34 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading @@ -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 Loading Loading @@ -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; Loading @@ -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=" Loading @@ -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 Loading @@ -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); } } }; Loading Loading @@ -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; } } } packages/SystemUI/tests/src/com/android/systemui/log/SessionTrackerTest.java +62 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -64,6 +66,8 @@ public class SessionTrackerTest extends SysuiTestCase { private KeyguardUpdateMonitor mKeyguardUpdateMonitor; @Mock private KeyguardStateController mKeyguardStateController; @Mock private UiEventLogger mUiEventLogger; @Captor ArgumentCaptor<KeyguardUpdateMonitorCallback> mKeyguardUpdateMonitorCallbackCaptor; Loading @@ -87,7 +91,8 @@ public class SessionTrackerTest extends SysuiTestCase { mStatusBarService, mAuthController, mKeyguardUpdateMonitor, mKeyguardStateController mKeyguardStateController, mUiEventLogger ); } Loading Loading @@ -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()); Loading Loading
packages/SystemUI/src/com/android/systemui/log/SessionTracker.java +34 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading @@ -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 Loading Loading @@ -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; Loading @@ -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=" Loading @@ -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 Loading @@ -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); } } }; Loading Loading @@ -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; } } }
packages/SystemUI/tests/src/com/android/systemui/log/SessionTrackerTest.java +62 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -64,6 +66,8 @@ public class SessionTrackerTest extends SysuiTestCase { private KeyguardUpdateMonitor mKeyguardUpdateMonitor; @Mock private KeyguardStateController mKeyguardStateController; @Mock private UiEventLogger mUiEventLogger; @Captor ArgumentCaptor<KeyguardUpdateMonitorCallback> mKeyguardUpdateMonitorCallbackCaptor; Loading @@ -87,7 +91,8 @@ public class SessionTrackerTest extends SysuiTestCase { mStatusBarService, mAuthController, mKeyguardUpdateMonitor, mKeyguardStateController mKeyguardStateController, mUiEventLogger ); } Loading Loading @@ -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()); Loading