diff options
author | 2024-07-24 22:25:01 +0000 | |
---|---|---|
committer | 2024-07-24 22:25:01 +0000 | |
commit | 8148983150f22bcbb4973d9efb38b92bd104785d (patch) | |
tree | 4bc3d15c15363e7d8ef2a75e8a444e3d92e7105f | |
parent | a6b4065e4a31e0d2d766c975ebd7119ad0c6c329 (diff) | |
parent | e06dcc288290f914b2aae03d75f04b2055befa51 (diff) |
Merge "Dont stop external display connection session" into main
2 files changed, 52 insertions, 15 deletions
diff --git a/services/core/java/com/android/server/display/ExternalDisplayStatsService.java b/services/core/java/com/android/server/display/ExternalDisplayStatsService.java index f6f23d9f01d1..608fb35cea9a 100644 --- a/services/core/java/com/android/server/display/ExternalDisplayStatsService.java +++ b/services/core/java/com/android/server/display/ExternalDisplayStatsService.java @@ -518,18 +518,24 @@ public final class ExternalDisplayStatsService { private void logExternalDisplayIdleStarted() { synchronized (mExternalDisplayStates) { for (var i = 0; i < mExternalDisplayStates.size(); i++) { - mInjector.writeLog(FrameworkStatsLog.EXTERNAL_DISPLAY_STATE_CHANGED, - KEYGUARD, i + 1, mIsExternalDisplayUsedForAudio); - if (DEBUG) { - final int displayId = mExternalDisplayStates.keyAt(i); - final int state = mExternalDisplayStates.get(displayId, DISCONNECTED_STATE); - Slog.d(TAG, "logExternalDisplayIdleStarted" - + " displayId=" + displayId - + " currentState=" + state - + " countOfExternalDisplays=" + (i + 1) - + " state=" + KEYGUARD - + " mIsExternalDisplayUsedForAudio=" - + mIsExternalDisplayUsedForAudio); + final int displayId = mExternalDisplayStates.keyAt(i); + final int state = mExternalDisplayStates.get(displayId, DISCONNECTED_STATE); + // Don't try to stop "connected" session by keyguard event. + // There is no purpose to measure how long keyguard is shown while external + // display is connected but not used for mirroring or extended display. + // Therefore there no need to log this event. + if (state != DISCONNECTED_STATE && state != CONNECTED_STATE) { + mInjector.writeLog(FrameworkStatsLog.EXTERNAL_DISPLAY_STATE_CHANGED, + KEYGUARD, i + 1, mIsExternalDisplayUsedForAudio); + if (DEBUG) { + Slog.d(TAG, "logExternalDisplayIdleStarted" + + " displayId=" + displayId + + " currentState=" + state + + " countOfExternalDisplays=" + (i + 1) + + " state=" + KEYGUARD + + " mIsExternalDisplayUsedForAudio=" + + mIsExternalDisplayUsedForAudio); + } } } } @@ -540,7 +546,11 @@ public final class ExternalDisplayStatsService { for (var i = 0; i < mExternalDisplayStates.size(); i++) { final int displayId = mExternalDisplayStates.keyAt(i); final int state = mExternalDisplayStates.get(displayId, DISCONNECTED_STATE); - if (state == DISCONNECTED_STATE) { + // No need to restart "connected" session after keyguard is stopped. + // This is because the connection is continuous even if keyguard is shown. + // In case in the future keyguard needs to be measured also while display + // is not used, then a 'keyguard finished' event needs to be emitted in this case. + if (state == DISCONNECTED_STATE || state == CONNECTED_STATE) { return; } mInjector.writeLog(FrameworkStatsLog.EXTERNAL_DISPLAY_STATE_CHANGED, diff --git a/services/tests/displayservicetests/src/com/android/server/display/ExternalDisplayStatsServiceTest.java b/services/tests/displayservicetests/src/com/android/server/display/ExternalDisplayStatsServiceTest.java index 98ba9aee406a..abb354b1414a 100644 --- a/services/tests/displayservicetests/src/com/android/server/display/ExternalDisplayStatsServiceTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/ExternalDisplayStatsServiceTest.java @@ -151,9 +151,10 @@ public class ExternalDisplayStatsServiceTest { } @Test - public void testDisplayInteractivityChanges( + public void testDisplayInteractivityChangesWhileMirroring( @TestParameter final boolean isExternalDisplayUsedForAudio) { mExternalDisplayStatsService.onDisplayConnected(mMockedLogicalDisplay); + mExternalDisplayStatsService.onDisplayAdded(EXTERNAL_DISPLAY_ID); mHandler.flush(); assertThat(mInteractivityReceiver).isNotNull(); @@ -180,12 +181,38 @@ public class ExternalDisplayStatsServiceTest { mInteractivityReceiver.onReceive(null, null); assertThat(mExternalDisplayStatsService.isInteractiveExternalDisplays()).isTrue(); verify(mMockedInjector).writeLog(FrameworkStatsLog.EXTERNAL_DISPLAY_STATE_CHANGED, - FrameworkStatsLog.EXTERNAL_DISPLAY_STATE_CHANGED__STATE__CONNECTED, + FrameworkStatsLog.EXTERNAL_DISPLAY_STATE_CHANGED__STATE__MIRRORING, /*numberOfDisplays=*/ 1, isExternalDisplayUsedForAudio); } @Test + public void testDisplayInteractivityChangesWhileConnected() { + mExternalDisplayStatsService.onDisplayConnected(mMockedLogicalDisplay); + mHandler.flush(); + assertThat(mInteractivityReceiver).isNotNull(); + clearInvocations(mMockedInjector); + + // Default is 'interactive', so no log should be written. + mInteractivityReceiver.onReceive(null, null); + assertThat(mExternalDisplayStatsService.isInteractiveExternalDisplays()).isTrue(); + verify(mMockedInjector, never()).writeLog(anyInt(), anyInt(), anyInt(), anyBoolean()); + + // Change to non-interactive should not produce log + when(mMockedInjector.isInteractive(eq(EXTERNAL_DISPLAY_ID))).thenReturn(false); + mInteractivityReceiver.onReceive(null, null); + assertThat(mExternalDisplayStatsService.isInteractiveExternalDisplays()).isFalse(); + verify(mMockedInjector, never()).writeLog(anyInt(), anyInt(), anyInt(), anyBoolean()); + clearInvocations(mMockedInjector); + + // Change back to interactive should not produce log + when(mMockedInjector.isInteractive(eq(EXTERNAL_DISPLAY_ID))).thenReturn(true); + mInteractivityReceiver.onReceive(null, null); + assertThat(mExternalDisplayStatsService.isInteractiveExternalDisplays()).isTrue(); + verify(mMockedInjector, never()).writeLog(anyInt(), anyInt(), anyInt(), anyBoolean()); + } + + @Test public void testAudioPlaybackChanges() { mExternalDisplayStatsService.onDisplayConnected(mMockedLogicalDisplay); mHandler.flush(); |