Loading services/core/java/com/android/server/display/DisplayManagerService.java +17 −8 Original line number Diff line number Diff line Loading @@ -674,9 +674,8 @@ public final class DisplayManagerService extends SystemService { mConfigParameterProvider = new DeviceConfigParameterProvider(DeviceConfigInterface.REAL); mExtraDisplayLoggingPackageName = DisplayProperties.debug_vri_package().orElse(null); mExtraDisplayEventLogging = !TextUtils.isEmpty(mExtraDisplayLoggingPackageName); // TODO(b/400384229): stats service needs to react to mirror-extended switch mExternalDisplayStatsService = new ExternalDisplayStatsService(mContext, mHandler, this::isExtendedDisplayAllowed); () -> !shouldMirrorBuiltInDisplay()); mDisplayNotificationManager = new DisplayNotificationManager(mFlags, mContext, mExternalDisplayStatsService); mExternalDisplayPolicy = new ExternalDisplayPolicy(new ExternalDisplayPolicyInjector()); Loading Loading @@ -813,7 +812,11 @@ public final class DisplayManagerService extends SystemService { handleMinimalPostProcessingAllowedSettingChange(); if (mFlags.isDisplayContentModeManagementEnabled()) { updateMirrorBuiltInDisplaySettingLocked(/*shouldSendDisplayChangeEvent=*/ true); if (updateMirrorBuiltInDisplaySettingLocked( /*shouldSendDisplayChangeEvent=*/ true)) { mExternalDisplayPolicy.handleMirrorBuiltInDisplaySettingChangeLocked( /*enableDisplays=*/ true); } } final UserManager userManager = getUserManager(); Loading Loading @@ -1240,8 +1243,11 @@ public final class DisplayManagerService extends SystemService { if (Settings.Secure.getUriFor(MIRROR_BUILT_IN_DISPLAY).equals(uri)) { synchronized (mSyncRoot) { if (mFlags.isDisplayContentModeManagementEnabled()) { updateMirrorBuiltInDisplaySettingLocked(/*shouldSendDisplayChangeEvent=*/ true); if (updateMirrorBuiltInDisplaySettingLocked( /*shouldSendDisplayChangeEvent=*/ true)) { mExternalDisplayPolicy.handleMirrorBuiltInDisplaySettingChangeLocked( /*enableDisplays=*/ true); } } } return; Loading @@ -1262,12 +1268,13 @@ public final class DisplayManagerService extends SystemService { 1, UserHandle.USER_CURRENT) != 0); } private void updateMirrorBuiltInDisplaySettingLocked(boolean shouldSendDisplayChangeEvent) { private boolean updateMirrorBuiltInDisplaySettingLocked(boolean shouldSendDisplayChangeEvent) { ContentResolver resolver = mContext.getContentResolver(); final boolean mirrorBuiltInDisplay = Settings.Secure.getIntForUser(resolver, MIRROR_BUILT_IN_DISPLAY, 0, UserHandle.USER_CURRENT) != 0; if (mMirrorBuiltInDisplay == mirrorBuiltInDisplay) { return; // No change in setting. return false; } mMirrorBuiltInDisplay = mirrorBuiltInDisplay; if (mFlags.isDisplayContentModeManagementEnabled()) { Loading @@ -1276,6 +1283,8 @@ public final class DisplayManagerService extends SystemService { shouldSendDisplayChangeEvent); }); } // setting changed. return true; } private void restoreResolutionFromBackup() { Loading Loading @@ -2440,7 +2449,7 @@ public final class DisplayManagerService extends SystemService { updateLogicalDisplayState(display); mExternalDisplayPolicy.handleLogicalDisplayAddedLocked(display); mExternalDisplayPolicy.handleLogicalDisplayContentModeChange(display); if (mFlags.isApplyDisplayChangedDuringDisplayAddedEnabled()) { applyDisplayChangedLocked(display); Loading services/core/java/com/android/server/display/ExternalDisplayPolicy.java +27 −4 Original line number Diff line number Diff line Loading @@ -125,6 +125,8 @@ class ExternalDisplayPolicy { } /** * Handles the displays which were connected before the boot completed. * Handles content mode for external displays. * Starts listening for temperature changes. */ void onBootCompleted() { Loading @@ -142,6 +144,10 @@ class ExternalDisplayPolicy { mDisplayIdsWaitingForBootCompletion.clear(); } if (mFlags.isDisplayContentModeManagementEnabled()) { handleMirrorBuiltInDisplaySettingChangeLocked(/*enableDisplays=*/ false); } if (!mFlags.isConnectedDisplayErrorHandlingEnabled()) { if (DEBUG) { Slog.d(TAG, "ConnectedDisplayErrorHandlingEnabled is not enabled on your device:" Loading @@ -155,6 +161,22 @@ class ExternalDisplayPolicy { } } /** * Handles content mode change for all displays and * enables all external displays if needed. */ void handleMirrorBuiltInDisplaySettingChangeLocked(boolean enableDisplays) { mLogicalDisplayMapper.forEachLocked(logicalDisplay -> { if (!isExternalDisplayLocked(logicalDisplay)) { return; } if (!logicalDisplay.isEnabledLocked() && enableDisplays) { setExternalDisplayEnabledLocked(logicalDisplay, true); } handleLogicalDisplayContentModeChange(logicalDisplay); }); } /** * Checks the display type is external, and if it is external then enables/disables it. */ Loading Loading @@ -236,14 +258,15 @@ class ExternalDisplayPolicy { } /** * Upon external display gets added. * Upon external display content mode change. */ void handleLogicalDisplayAddedLocked(@NonNull final LogicalDisplay logicalDisplay) { if (!isExternalDisplayLocked(logicalDisplay)) { void handleLogicalDisplayContentModeChange(@NonNull final LogicalDisplay logicalDisplay) { if (!isExternalDisplayLocked(logicalDisplay) || !logicalDisplay.isEnabledLocked()) { return; } mExternalDisplayStatsService.onDisplayAdded(logicalDisplay.getDisplayIdLocked()); mExternalDisplayStatsService.onDisplayContentModeChange( logicalDisplay.getDisplayIdLocked()); } /** Loading services/core/java/com/android/server/display/ExternalDisplayStatsService.java +1 −1 Original line number Diff line number Diff line Loading @@ -241,7 +241,7 @@ public final class ExternalDisplayStatsService { logStateConnected(display.getDisplayIdLocked()); } void onDisplayAdded(int displayId) { void onDisplayContentModeChange(int displayId) { if (mInjector.isExtendedDisplayEnabled()) { logStateExtended(displayId); } else { Loading services/tests/displayservicetests/src/com/android/server/display/ExternalDisplayPolicyTest.java +4 −3 Original line number Diff line number Diff line Loading @@ -194,9 +194,10 @@ public class ExternalDisplayPolicyTest { } @Test public void testHandleDisplayAdded() { mExternalDisplayPolicy.handleLogicalDisplayAddedLocked(mMockedLogicalDisplay); verify(mMockedExternalDisplayStatsService).onDisplayAdded(eq(EXTERNAL_DISPLAY_ID)); public void testHandleDisplayContentModeChange() { mExternalDisplayPolicy.handleLogicalDisplayContentModeChange(mMockedLogicalDisplay); verify(mMockedExternalDisplayStatsService).onDisplayContentModeChange( eq(EXTERNAL_DISPLAY_ID)); } @Test Loading services/tests/displayservicetests/src/com/android/server/display/ExternalDisplayStatsServiceTest.java +29 −5 Original line number Diff line number Diff line Loading @@ -154,7 +154,7 @@ public class ExternalDisplayStatsServiceTest { public void testDisplayInteractivityChangesWhileMirroring( @TestParameter final boolean isExternalDisplayUsedForAudio) { mExternalDisplayStatsService.onDisplayConnected(mMockedLogicalDisplay); mExternalDisplayStatsService.onDisplayAdded(EXTERNAL_DISPLAY_ID); mExternalDisplayStatsService.onDisplayContentModeChange(EXTERNAL_DISPLAY_ID); mHandler.flush(); assertThat(mInteractivityReceiver).isNotNull(); Loading Loading @@ -234,7 +234,7 @@ public class ExternalDisplayStatsServiceTest { initAudioPlayback(isExternalDisplayUsedForAudio); clearInvocations(mMockedInjector); mExternalDisplayStatsService.onDisplayAdded(EXTERNAL_DISPLAY_ID); mExternalDisplayStatsService.onDisplayContentModeChange(EXTERNAL_DISPLAY_ID); verify(mMockedInjector).writeLog(FrameworkStatsLog.EXTERNAL_DISPLAY_STATE_CHANGED, FrameworkStatsLog.EXTERNAL_DISPLAY_STATE_CHANGED__STATE__MIRRORING, /*numberOfDisplays=*/ 1, Loading @@ -250,20 +250,44 @@ public class ExternalDisplayStatsServiceTest { clearInvocations(mMockedInjector); when(mMockedInjector.isExtendedDisplayEnabled()).thenReturn(true); mExternalDisplayStatsService.onDisplayAdded(EXTERNAL_DISPLAY_ID); mExternalDisplayStatsService.onDisplayContentModeChange(EXTERNAL_DISPLAY_ID); verify(mMockedInjector).writeLog(FrameworkStatsLog.EXTERNAL_DISPLAY_STATE_CHANGED, FrameworkStatsLog.EXTERNAL_DISPLAY_STATE_CHANGED__STATE__EXTENDED, /*numberOfDisplays=*/ 1, isExternalDisplayUsedForAudio); } @Test public void testOnDisplayContentModeChange( @TestParameter final boolean isExternalDisplayUsedForAudio) { mExternalDisplayStatsService.onDisplayConnected(mMockedLogicalDisplay); mHandler.flush(); initAudioPlayback(isExternalDisplayUsedForAudio); clearInvocations(mMockedInjector); when(mMockedInjector.isExtendedDisplayEnabled()).thenReturn(true); mExternalDisplayStatsService.onDisplayContentModeChange(EXTERNAL_DISPLAY_ID); verify(mMockedInjector).writeLog(FrameworkStatsLog.EXTERNAL_DISPLAY_STATE_CHANGED, FrameworkStatsLog.EXTERNAL_DISPLAY_STATE_CHANGED__STATE__EXTENDED, /*numberOfDisplays=*/ 1, isExternalDisplayUsedForAudio); clearInvocations(mMockedInjector); when(mMockedInjector.isExtendedDisplayEnabled()).thenReturn(false); mExternalDisplayStatsService.onDisplayContentModeChange(EXTERNAL_DISPLAY_ID); verify(mMockedInjector).writeLog(FrameworkStatsLog.EXTERNAL_DISPLAY_STATE_CHANGED, FrameworkStatsLog.EXTERNAL_DISPLAY_STATE_CHANGED__STATE__MIRRORING, /*numberOfDisplays=*/ 1, isExternalDisplayUsedForAudio); } @Test public void testOnDisplayDisabled( @TestParameter final boolean isExternalDisplayUsedForAudio) { mExternalDisplayStatsService.onDisplayConnected(mMockedLogicalDisplay); mHandler.flush(); initAudioPlayback(isExternalDisplayUsedForAudio); mExternalDisplayStatsService.onDisplayAdded(EXTERNAL_DISPLAY_ID); mExternalDisplayStatsService.onDisplayContentModeChange(EXTERNAL_DISPLAY_ID); clearInvocations(mMockedInjector); mExternalDisplayStatsService.onDisplayDisabled(EXTERNAL_DISPLAY_ID); Loading Loading @@ -299,7 +323,7 @@ public class ExternalDisplayStatsServiceTest { mExternalDisplayStatsService.onDisplayConnected(mMockedLogicalDisplay); mHandler.flush(); initAudioPlayback(isExternalDisplayUsedForAudio); mExternalDisplayStatsService.onDisplayAdded(EXTERNAL_DISPLAY_ID); mExternalDisplayStatsService.onDisplayContentModeChange(EXTERNAL_DISPLAY_ID); clearInvocations(mMockedInjector); mExternalDisplayStatsService.onPresentationWindowAdded(EXTERNAL_DISPLAY_ID); Loading Loading
services/core/java/com/android/server/display/DisplayManagerService.java +17 −8 Original line number Diff line number Diff line Loading @@ -674,9 +674,8 @@ public final class DisplayManagerService extends SystemService { mConfigParameterProvider = new DeviceConfigParameterProvider(DeviceConfigInterface.REAL); mExtraDisplayLoggingPackageName = DisplayProperties.debug_vri_package().orElse(null); mExtraDisplayEventLogging = !TextUtils.isEmpty(mExtraDisplayLoggingPackageName); // TODO(b/400384229): stats service needs to react to mirror-extended switch mExternalDisplayStatsService = new ExternalDisplayStatsService(mContext, mHandler, this::isExtendedDisplayAllowed); () -> !shouldMirrorBuiltInDisplay()); mDisplayNotificationManager = new DisplayNotificationManager(mFlags, mContext, mExternalDisplayStatsService); mExternalDisplayPolicy = new ExternalDisplayPolicy(new ExternalDisplayPolicyInjector()); Loading Loading @@ -813,7 +812,11 @@ public final class DisplayManagerService extends SystemService { handleMinimalPostProcessingAllowedSettingChange(); if (mFlags.isDisplayContentModeManagementEnabled()) { updateMirrorBuiltInDisplaySettingLocked(/*shouldSendDisplayChangeEvent=*/ true); if (updateMirrorBuiltInDisplaySettingLocked( /*shouldSendDisplayChangeEvent=*/ true)) { mExternalDisplayPolicy.handleMirrorBuiltInDisplaySettingChangeLocked( /*enableDisplays=*/ true); } } final UserManager userManager = getUserManager(); Loading Loading @@ -1240,8 +1243,11 @@ public final class DisplayManagerService extends SystemService { if (Settings.Secure.getUriFor(MIRROR_BUILT_IN_DISPLAY).equals(uri)) { synchronized (mSyncRoot) { if (mFlags.isDisplayContentModeManagementEnabled()) { updateMirrorBuiltInDisplaySettingLocked(/*shouldSendDisplayChangeEvent=*/ true); if (updateMirrorBuiltInDisplaySettingLocked( /*shouldSendDisplayChangeEvent=*/ true)) { mExternalDisplayPolicy.handleMirrorBuiltInDisplaySettingChangeLocked( /*enableDisplays=*/ true); } } } return; Loading @@ -1262,12 +1268,13 @@ public final class DisplayManagerService extends SystemService { 1, UserHandle.USER_CURRENT) != 0); } private void updateMirrorBuiltInDisplaySettingLocked(boolean shouldSendDisplayChangeEvent) { private boolean updateMirrorBuiltInDisplaySettingLocked(boolean shouldSendDisplayChangeEvent) { ContentResolver resolver = mContext.getContentResolver(); final boolean mirrorBuiltInDisplay = Settings.Secure.getIntForUser(resolver, MIRROR_BUILT_IN_DISPLAY, 0, UserHandle.USER_CURRENT) != 0; if (mMirrorBuiltInDisplay == mirrorBuiltInDisplay) { return; // No change in setting. return false; } mMirrorBuiltInDisplay = mirrorBuiltInDisplay; if (mFlags.isDisplayContentModeManagementEnabled()) { Loading @@ -1276,6 +1283,8 @@ public final class DisplayManagerService extends SystemService { shouldSendDisplayChangeEvent); }); } // setting changed. return true; } private void restoreResolutionFromBackup() { Loading Loading @@ -2440,7 +2449,7 @@ public final class DisplayManagerService extends SystemService { updateLogicalDisplayState(display); mExternalDisplayPolicy.handleLogicalDisplayAddedLocked(display); mExternalDisplayPolicy.handleLogicalDisplayContentModeChange(display); if (mFlags.isApplyDisplayChangedDuringDisplayAddedEnabled()) { applyDisplayChangedLocked(display); Loading
services/core/java/com/android/server/display/ExternalDisplayPolicy.java +27 −4 Original line number Diff line number Diff line Loading @@ -125,6 +125,8 @@ class ExternalDisplayPolicy { } /** * Handles the displays which were connected before the boot completed. * Handles content mode for external displays. * Starts listening for temperature changes. */ void onBootCompleted() { Loading @@ -142,6 +144,10 @@ class ExternalDisplayPolicy { mDisplayIdsWaitingForBootCompletion.clear(); } if (mFlags.isDisplayContentModeManagementEnabled()) { handleMirrorBuiltInDisplaySettingChangeLocked(/*enableDisplays=*/ false); } if (!mFlags.isConnectedDisplayErrorHandlingEnabled()) { if (DEBUG) { Slog.d(TAG, "ConnectedDisplayErrorHandlingEnabled is not enabled on your device:" Loading @@ -155,6 +161,22 @@ class ExternalDisplayPolicy { } } /** * Handles content mode change for all displays and * enables all external displays if needed. */ void handleMirrorBuiltInDisplaySettingChangeLocked(boolean enableDisplays) { mLogicalDisplayMapper.forEachLocked(logicalDisplay -> { if (!isExternalDisplayLocked(logicalDisplay)) { return; } if (!logicalDisplay.isEnabledLocked() && enableDisplays) { setExternalDisplayEnabledLocked(logicalDisplay, true); } handleLogicalDisplayContentModeChange(logicalDisplay); }); } /** * Checks the display type is external, and if it is external then enables/disables it. */ Loading Loading @@ -236,14 +258,15 @@ class ExternalDisplayPolicy { } /** * Upon external display gets added. * Upon external display content mode change. */ void handleLogicalDisplayAddedLocked(@NonNull final LogicalDisplay logicalDisplay) { if (!isExternalDisplayLocked(logicalDisplay)) { void handleLogicalDisplayContentModeChange(@NonNull final LogicalDisplay logicalDisplay) { if (!isExternalDisplayLocked(logicalDisplay) || !logicalDisplay.isEnabledLocked()) { return; } mExternalDisplayStatsService.onDisplayAdded(logicalDisplay.getDisplayIdLocked()); mExternalDisplayStatsService.onDisplayContentModeChange( logicalDisplay.getDisplayIdLocked()); } /** Loading
services/core/java/com/android/server/display/ExternalDisplayStatsService.java +1 −1 Original line number Diff line number Diff line Loading @@ -241,7 +241,7 @@ public final class ExternalDisplayStatsService { logStateConnected(display.getDisplayIdLocked()); } void onDisplayAdded(int displayId) { void onDisplayContentModeChange(int displayId) { if (mInjector.isExtendedDisplayEnabled()) { logStateExtended(displayId); } else { Loading
services/tests/displayservicetests/src/com/android/server/display/ExternalDisplayPolicyTest.java +4 −3 Original line number Diff line number Diff line Loading @@ -194,9 +194,10 @@ public class ExternalDisplayPolicyTest { } @Test public void testHandleDisplayAdded() { mExternalDisplayPolicy.handleLogicalDisplayAddedLocked(mMockedLogicalDisplay); verify(mMockedExternalDisplayStatsService).onDisplayAdded(eq(EXTERNAL_DISPLAY_ID)); public void testHandleDisplayContentModeChange() { mExternalDisplayPolicy.handleLogicalDisplayContentModeChange(mMockedLogicalDisplay); verify(mMockedExternalDisplayStatsService).onDisplayContentModeChange( eq(EXTERNAL_DISPLAY_ID)); } @Test Loading
services/tests/displayservicetests/src/com/android/server/display/ExternalDisplayStatsServiceTest.java +29 −5 Original line number Diff line number Diff line Loading @@ -154,7 +154,7 @@ public class ExternalDisplayStatsServiceTest { public void testDisplayInteractivityChangesWhileMirroring( @TestParameter final boolean isExternalDisplayUsedForAudio) { mExternalDisplayStatsService.onDisplayConnected(mMockedLogicalDisplay); mExternalDisplayStatsService.onDisplayAdded(EXTERNAL_DISPLAY_ID); mExternalDisplayStatsService.onDisplayContentModeChange(EXTERNAL_DISPLAY_ID); mHandler.flush(); assertThat(mInteractivityReceiver).isNotNull(); Loading Loading @@ -234,7 +234,7 @@ public class ExternalDisplayStatsServiceTest { initAudioPlayback(isExternalDisplayUsedForAudio); clearInvocations(mMockedInjector); mExternalDisplayStatsService.onDisplayAdded(EXTERNAL_DISPLAY_ID); mExternalDisplayStatsService.onDisplayContentModeChange(EXTERNAL_DISPLAY_ID); verify(mMockedInjector).writeLog(FrameworkStatsLog.EXTERNAL_DISPLAY_STATE_CHANGED, FrameworkStatsLog.EXTERNAL_DISPLAY_STATE_CHANGED__STATE__MIRRORING, /*numberOfDisplays=*/ 1, Loading @@ -250,20 +250,44 @@ public class ExternalDisplayStatsServiceTest { clearInvocations(mMockedInjector); when(mMockedInjector.isExtendedDisplayEnabled()).thenReturn(true); mExternalDisplayStatsService.onDisplayAdded(EXTERNAL_DISPLAY_ID); mExternalDisplayStatsService.onDisplayContentModeChange(EXTERNAL_DISPLAY_ID); verify(mMockedInjector).writeLog(FrameworkStatsLog.EXTERNAL_DISPLAY_STATE_CHANGED, FrameworkStatsLog.EXTERNAL_DISPLAY_STATE_CHANGED__STATE__EXTENDED, /*numberOfDisplays=*/ 1, isExternalDisplayUsedForAudio); } @Test public void testOnDisplayContentModeChange( @TestParameter final boolean isExternalDisplayUsedForAudio) { mExternalDisplayStatsService.onDisplayConnected(mMockedLogicalDisplay); mHandler.flush(); initAudioPlayback(isExternalDisplayUsedForAudio); clearInvocations(mMockedInjector); when(mMockedInjector.isExtendedDisplayEnabled()).thenReturn(true); mExternalDisplayStatsService.onDisplayContentModeChange(EXTERNAL_DISPLAY_ID); verify(mMockedInjector).writeLog(FrameworkStatsLog.EXTERNAL_DISPLAY_STATE_CHANGED, FrameworkStatsLog.EXTERNAL_DISPLAY_STATE_CHANGED__STATE__EXTENDED, /*numberOfDisplays=*/ 1, isExternalDisplayUsedForAudio); clearInvocations(mMockedInjector); when(mMockedInjector.isExtendedDisplayEnabled()).thenReturn(false); mExternalDisplayStatsService.onDisplayContentModeChange(EXTERNAL_DISPLAY_ID); verify(mMockedInjector).writeLog(FrameworkStatsLog.EXTERNAL_DISPLAY_STATE_CHANGED, FrameworkStatsLog.EXTERNAL_DISPLAY_STATE_CHANGED__STATE__MIRRORING, /*numberOfDisplays=*/ 1, isExternalDisplayUsedForAudio); } @Test public void testOnDisplayDisabled( @TestParameter final boolean isExternalDisplayUsedForAudio) { mExternalDisplayStatsService.onDisplayConnected(mMockedLogicalDisplay); mHandler.flush(); initAudioPlayback(isExternalDisplayUsedForAudio); mExternalDisplayStatsService.onDisplayAdded(EXTERNAL_DISPLAY_ID); mExternalDisplayStatsService.onDisplayContentModeChange(EXTERNAL_DISPLAY_ID); clearInvocations(mMockedInjector); mExternalDisplayStatsService.onDisplayDisabled(EXTERNAL_DISPLAY_ID); Loading Loading @@ -299,7 +323,7 @@ public class ExternalDisplayStatsServiceTest { mExternalDisplayStatsService.onDisplayConnected(mMockedLogicalDisplay); mHandler.flush(); initAudioPlayback(isExternalDisplayUsedForAudio); mExternalDisplayStatsService.onDisplayAdded(EXTERNAL_DISPLAY_ID); mExternalDisplayStatsService.onDisplayContentModeChange(EXTERNAL_DISPLAY_ID); clearInvocations(mMockedInjector); mExternalDisplayStatsService.onPresentationWindowAdded(EXTERNAL_DISPLAY_ID); Loading