Loading libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +4 −2 Original line number Diff line number Diff line Loading @@ -1306,7 +1306,8 @@ public abstract class WMShellModule { WindowDecorCaptionHandleRepository windowDecorCaptionHandleRepository, DesktopWindowingEducationTooltipController desktopWindowingEducationTooltipController, @ShellMainThread CoroutineScope applicationScope, @ShellBackgroundThread MainCoroutineDispatcher backgroundDispatcher) { @ShellBackgroundThread MainCoroutineDispatcher backgroundDispatcher, DesktopModeUiEventLogger desktopModeUiEventLogger) { return new AppHandleEducationController( context, appHandleEducationFilter, Loading @@ -1314,7 +1315,8 @@ public abstract class WMShellModule { windowDecorCaptionHandleRepository, desktopWindowingEducationTooltipController, applicationScope, backgroundDispatcher); backgroundDispatcher, desktopModeUiEventLogger); } @WMSingleton Loading libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeUiEventLogger.kt +19 −1 Original line number Diff line number Diff line Loading @@ -149,7 +149,25 @@ class DesktopModeUiEventLogger( @UiEvent(doc = "Enter multi-instance by using the New Window button") DESKTOP_WINDOW_MULTI_INSTANCE_NEW_WINDOW_CLICK(2069), @UiEvent(doc = "Enter multi-instance by clicking an icon in the Manage Windows menu") DESKTOP_WINDOW_MULTI_INSTANCE_MANAGE_WINDOWS_ICON_CLICK(2070); DESKTOP_WINDOW_MULTI_INSTANCE_MANAGE_WINDOWS_ICON_CLICK(2070), @UiEvent(doc = "Education tooltip on the app handle is shown") APP_HANDLE_EDUCATION_TOOLTIP_SHOWN(2097), @UiEvent(doc = "Education tooltip on the app handle is clicked") APP_HANDLE_EDUCATION_TOOLTIP_CLICKED(2098), @UiEvent(doc = "Education tooltip on the app handle is dismissed by the user") APP_HANDLE_EDUCATION_TOOLTIP_DISMISSED(2099), @UiEvent(doc = "Enter desktop mode education tooltip on the app handle menu is shown") ENTER_DESKTOP_MODE_EDUCATION_TOOLTIP_SHOWN(2100), @UiEvent(doc = "Enter desktop mode education tooltip on the app handle menu is clicked") ENTER_DESKTOP_MODE_EDUCATION_TOOLTIP_CLICKED(2101), @UiEvent(doc = "Enter desktop mode education tooltip is dismissed by the user") ENTER_DESKTOP_MODE_EDUCATION_TOOLTIP_DISMISSED(2102), @UiEvent(doc = "Exit desktop mode education tooltip on the app header menu is shown") EXIT_DESKTOP_MODE_EDUCATION_TOOLTIP_SHOWN(2103), @UiEvent(doc = "Exit desktop mode education tooltip on the app header menu is clicked") EXIT_DESKTOP_MODE_EDUCATION_TOOLTIP_CLICKED(2104), @UiEvent(doc = "Exit desktop mode education tooltip is dismissed by the user") EXIT_DESKTOP_MODE_EDUCATION_TOOLTIP_DISMISSED(2105); override fun getId(): Int = mId } Loading libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/education/AppHandleEducationController.kt +48 −9 Original line number Diff line number Diff line Loading @@ -26,6 +26,8 @@ import android.view.View.LAYOUT_DIRECTION_RTL import com.android.window.flags.Flags import com.android.wm.shell.R import com.android.wm.shell.desktopmode.CaptionState import com.android.wm.shell.desktopmode.DesktopModeUiEventLogger import com.android.wm.shell.desktopmode.DesktopModeUiEventLogger.DesktopUiEventEnum import com.android.wm.shell.desktopmode.WindowDecorCaptionHandleRepository import com.android.wm.shell.desktopmode.education.data.AppHandleEducationDatastoreRepository import com.android.wm.shell.shared.annotations.ShellBackgroundThread Loading Loading @@ -62,6 +64,7 @@ class AppHandleEducationController( private val windowingEducationViewController: DesktopWindowingEducationTooltipController, @ShellMainThread private val applicationCoroutineScope: CoroutineScope, @ShellBackgroundThread private val backgroundDispatcher: MainCoroutineDispatcher, private val desktopModeUiEventLogger: DesktopModeUiEventLogger, ) { private lateinit var openHandleMenuCallback: (Int) -> Unit private lateinit var toDesktopModeCallback: (Int, DesktopModeTransitionSource) -> Unit Loading Loading @@ -171,6 +174,7 @@ class AppHandleEducationController( private fun showEducation(captionState: CaptionState) { val appHandleBounds = (captionState as CaptionState.AppHandle).globalAppHandleBounds val taskInfo = captionState.runningTaskInfo val tooltipGlobalCoordinates = Point(appHandleBounds.left + appHandleBounds.width() / 2, appHandleBounds.bottom) // Populate information important to inflate app handle education tooltip. Loading @@ -188,22 +192,34 @@ class AppHandleEducationController( arrowDirection = DesktopWindowingEducationTooltipController.TooltipArrowDirection.UP, onEducationClickAction = { openHandleMenuCallback(captionState.runningTaskInfo.taskId) openHandleMenuCallback(taskInfo.taskId) desktopModeUiEventLogger.log( taskInfo, DesktopUiEventEnum.APP_HANDLE_EDUCATION_TOOLTIP_CLICKED, ) }, onDismissAction = { // TODO: b/341320146 - Log previous tooltip was dismissed desktopModeUiEventLogger.log( taskInfo, DesktopUiEventEnum.APP_HANDLE_EDUCATION_TOOLTIP_DISMISSED, ) }, ) windowingEducationViewController.showEducationTooltip( tooltipViewConfig = appHandleTooltipConfig, taskId = captionState.runningTaskInfo.taskId, taskId = taskInfo.taskId, ) desktopModeUiEventLogger.log( taskInfo, DesktopUiEventEnum.APP_HANDLE_EDUCATION_TOOLTIP_SHOWN, ) } /** Show tooltip that points to windowing image button in app handle menu */ private suspend fun showWindowingImageButtonTooltip(captionState: CaptionState.AppHandle) { val appInfoPillHeight = getSize(R.dimen.desktop_mode_handle_menu_app_info_pill_height) val taskInfo = captionState.runningTaskInfo val windowingOptionPillHeight = getSize(R.dimen.desktop_mode_handle_menu_windowing_pill_height) val appHandleMenuWidth = Loading Loading @@ -245,24 +261,36 @@ class AppHandleEducationController( DesktopWindowingEducationTooltipController.TooltipArrowDirection.HORIZONTAL, onEducationClickAction = { toDesktopModeCallback( captionState.runningTaskInfo.taskId, taskInfo.taskId, DesktopModeTransitionSource.APP_HANDLE_MENU_BUTTON, ) desktopModeUiEventLogger.log( taskInfo, DesktopUiEventEnum.ENTER_DESKTOP_MODE_EDUCATION_TOOLTIP_CLICKED, ) }, onDismissAction = { // TODO: b/341320146 - Log previous tooltip was dismissed desktopModeUiEventLogger.log( taskInfo, DesktopUiEventEnum.ENTER_DESKTOP_MODE_EDUCATION_TOOLTIP_DISMISSED, ) }, ) windowingEducationViewController.showEducationTooltip( taskId = captionState.runningTaskInfo.taskId, taskId = taskInfo.taskId, tooltipViewConfig = windowingImageButtonTooltipConfig, ) desktopModeUiEventLogger.log( taskInfo, DesktopUiEventEnum.ENTER_DESKTOP_MODE_EDUCATION_TOOLTIP_SHOWN, ) } /** Show tooltip that points to app chip button and educates user on how to exit desktop mode */ private suspend fun showExitWindowingTooltip(captionState: CaptionState.AppHeader) { val globalAppChipBounds = captionState.globalAppChipBounds val taskInfo = captionState.runningTaskInfo val tooltipGlobalCoordinates = Point( if (isRtl()) { Loading @@ -287,16 +315,27 @@ class AppHandleEducationController( arrowDirection = DesktopWindowingEducationTooltipController.TooltipArrowDirection.HORIZONTAL, onDismissAction = { // TODO: b/341320146 - Log previous tooltip was dismissed desktopModeUiEventLogger.log( taskInfo, DesktopUiEventEnum.EXIT_DESKTOP_MODE_EDUCATION_TOOLTIP_DISMISSED, ) }, onEducationClickAction = { openHandleMenuCallback(captionState.runningTaskInfo.taskId) openHandleMenuCallback(taskInfo.taskId) desktopModeUiEventLogger.log( taskInfo, DesktopUiEventEnum.EXIT_DESKTOP_MODE_EDUCATION_TOOLTIP_CLICKED, ) }, ) windowingEducationViewController.showEducationTooltip( taskId = captionState.runningTaskInfo.taskId, taskId = taskInfo.taskId, tooltipViewConfig = exitWindowingTooltipConfig, ) desktopModeUiEventLogger.log( taskInfo, DesktopUiEventEnum.EXIT_DESKTOP_MODE_EDUCATION_TOOLTIP_SHOWN, ) } /** Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/education/AppHandleEducationControllerTest.kt +10 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,8 @@ import com.android.modules.utils.testing.ExtendedMockitoRule import com.android.window.flags.Flags import com.android.wm.shell.ShellTestCase import com.android.wm.shell.desktopmode.CaptionState import com.android.wm.shell.desktopmode.DesktopModeUiEventLogger import com.android.wm.shell.desktopmode.DesktopModeUiEventLogger.DesktopUiEventEnum import com.android.wm.shell.desktopmode.WindowDecorCaptionHandleRepository import com.android.wm.shell.desktopmode.education.AppHandleEducationController.Companion.APP_HANDLE_EDUCATION_DELAY_MILLIS import com.android.wm.shell.desktopmode.education.AppHandleEducationController.Companion.TOOLTIP_VISIBLE_DURATION_MILLIS Loading Loading @@ -86,6 +88,7 @@ class AppHandleEducationControllerTest : ShellTestCase() { @Mock private lateinit var mockDataStoreRepository: AppHandleEducationDatastoreRepository @Mock private lateinit var mockCaptionHandleRepository: WindowDecorCaptionHandleRepository @Mock private lateinit var mockTooltipController: DesktopWindowingEducationTooltipController @Mock private lateinit var mockDesktopModeUiEventLogger: DesktopModeUiEventLogger @Before fun setUp() { Loading @@ -105,6 +108,7 @@ class AppHandleEducationControllerTest : ShellTestCase() { mockTooltipController, testScope.backgroundScope, Dispatchers.Main, mockDesktopModeUiEventLogger, ) } Loading @@ -123,6 +127,8 @@ class AppHandleEducationControllerTest : ShellTestCase() { verify(mockTooltipController, times(1)).showEducationTooltip(any(), any()) verify(mockDataStoreRepository, times(1)) .updateAppHandleHintViewedTimestampMillis(eq(true)) verify(mockDesktopModeUiEventLogger, times(1)) .log(any(), eq(DesktopUiEventEnum.APP_HANDLE_EDUCATION_TOOLTIP_SHOWN)) } @Test Loading Loading @@ -155,6 +161,8 @@ class AppHandleEducationControllerTest : ShellTestCase() { verify(mockTooltipController, times(1)).showEducationTooltip(any(), any()) verify(mockDataStoreRepository, times(1)) .updateEnterDesktopModeHintViewedTimestampMillis(eq(true)) verify(mockDesktopModeUiEventLogger, times(1)) .log(any(), eq(DesktopUiEventEnum.ENTER_DESKTOP_MODE_EDUCATION_TOOLTIP_SHOWN)) } @Test Loading @@ -170,6 +178,8 @@ class AppHandleEducationControllerTest : ShellTestCase() { verify(mockTooltipController, times(1)).showEducationTooltip(any(), any()) verify(mockDataStoreRepository, times(1)) .updateExitDesktopModeHintViewedTimestampMillis(eq(true)) verify(mockDesktopModeUiEventLogger, times(1)) .log(any(), eq(DesktopUiEventEnum.EXIT_DESKTOP_MODE_EDUCATION_TOOLTIP_SHOWN)) } @Test Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +4 −2 Original line number Diff line number Diff line Loading @@ -1306,7 +1306,8 @@ public abstract class WMShellModule { WindowDecorCaptionHandleRepository windowDecorCaptionHandleRepository, DesktopWindowingEducationTooltipController desktopWindowingEducationTooltipController, @ShellMainThread CoroutineScope applicationScope, @ShellBackgroundThread MainCoroutineDispatcher backgroundDispatcher) { @ShellBackgroundThread MainCoroutineDispatcher backgroundDispatcher, DesktopModeUiEventLogger desktopModeUiEventLogger) { return new AppHandleEducationController( context, appHandleEducationFilter, Loading @@ -1314,7 +1315,8 @@ public abstract class WMShellModule { windowDecorCaptionHandleRepository, desktopWindowingEducationTooltipController, applicationScope, backgroundDispatcher); backgroundDispatcher, desktopModeUiEventLogger); } @WMSingleton Loading
libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeUiEventLogger.kt +19 −1 Original line number Diff line number Diff line Loading @@ -149,7 +149,25 @@ class DesktopModeUiEventLogger( @UiEvent(doc = "Enter multi-instance by using the New Window button") DESKTOP_WINDOW_MULTI_INSTANCE_NEW_WINDOW_CLICK(2069), @UiEvent(doc = "Enter multi-instance by clicking an icon in the Manage Windows menu") DESKTOP_WINDOW_MULTI_INSTANCE_MANAGE_WINDOWS_ICON_CLICK(2070); DESKTOP_WINDOW_MULTI_INSTANCE_MANAGE_WINDOWS_ICON_CLICK(2070), @UiEvent(doc = "Education tooltip on the app handle is shown") APP_HANDLE_EDUCATION_TOOLTIP_SHOWN(2097), @UiEvent(doc = "Education tooltip on the app handle is clicked") APP_HANDLE_EDUCATION_TOOLTIP_CLICKED(2098), @UiEvent(doc = "Education tooltip on the app handle is dismissed by the user") APP_HANDLE_EDUCATION_TOOLTIP_DISMISSED(2099), @UiEvent(doc = "Enter desktop mode education tooltip on the app handle menu is shown") ENTER_DESKTOP_MODE_EDUCATION_TOOLTIP_SHOWN(2100), @UiEvent(doc = "Enter desktop mode education tooltip on the app handle menu is clicked") ENTER_DESKTOP_MODE_EDUCATION_TOOLTIP_CLICKED(2101), @UiEvent(doc = "Enter desktop mode education tooltip is dismissed by the user") ENTER_DESKTOP_MODE_EDUCATION_TOOLTIP_DISMISSED(2102), @UiEvent(doc = "Exit desktop mode education tooltip on the app header menu is shown") EXIT_DESKTOP_MODE_EDUCATION_TOOLTIP_SHOWN(2103), @UiEvent(doc = "Exit desktop mode education tooltip on the app header menu is clicked") EXIT_DESKTOP_MODE_EDUCATION_TOOLTIP_CLICKED(2104), @UiEvent(doc = "Exit desktop mode education tooltip is dismissed by the user") EXIT_DESKTOP_MODE_EDUCATION_TOOLTIP_DISMISSED(2105); override fun getId(): Int = mId } Loading
libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/education/AppHandleEducationController.kt +48 −9 Original line number Diff line number Diff line Loading @@ -26,6 +26,8 @@ import android.view.View.LAYOUT_DIRECTION_RTL import com.android.window.flags.Flags import com.android.wm.shell.R import com.android.wm.shell.desktopmode.CaptionState import com.android.wm.shell.desktopmode.DesktopModeUiEventLogger import com.android.wm.shell.desktopmode.DesktopModeUiEventLogger.DesktopUiEventEnum import com.android.wm.shell.desktopmode.WindowDecorCaptionHandleRepository import com.android.wm.shell.desktopmode.education.data.AppHandleEducationDatastoreRepository import com.android.wm.shell.shared.annotations.ShellBackgroundThread Loading Loading @@ -62,6 +64,7 @@ class AppHandleEducationController( private val windowingEducationViewController: DesktopWindowingEducationTooltipController, @ShellMainThread private val applicationCoroutineScope: CoroutineScope, @ShellBackgroundThread private val backgroundDispatcher: MainCoroutineDispatcher, private val desktopModeUiEventLogger: DesktopModeUiEventLogger, ) { private lateinit var openHandleMenuCallback: (Int) -> Unit private lateinit var toDesktopModeCallback: (Int, DesktopModeTransitionSource) -> Unit Loading Loading @@ -171,6 +174,7 @@ class AppHandleEducationController( private fun showEducation(captionState: CaptionState) { val appHandleBounds = (captionState as CaptionState.AppHandle).globalAppHandleBounds val taskInfo = captionState.runningTaskInfo val tooltipGlobalCoordinates = Point(appHandleBounds.left + appHandleBounds.width() / 2, appHandleBounds.bottom) // Populate information important to inflate app handle education tooltip. Loading @@ -188,22 +192,34 @@ class AppHandleEducationController( arrowDirection = DesktopWindowingEducationTooltipController.TooltipArrowDirection.UP, onEducationClickAction = { openHandleMenuCallback(captionState.runningTaskInfo.taskId) openHandleMenuCallback(taskInfo.taskId) desktopModeUiEventLogger.log( taskInfo, DesktopUiEventEnum.APP_HANDLE_EDUCATION_TOOLTIP_CLICKED, ) }, onDismissAction = { // TODO: b/341320146 - Log previous tooltip was dismissed desktopModeUiEventLogger.log( taskInfo, DesktopUiEventEnum.APP_HANDLE_EDUCATION_TOOLTIP_DISMISSED, ) }, ) windowingEducationViewController.showEducationTooltip( tooltipViewConfig = appHandleTooltipConfig, taskId = captionState.runningTaskInfo.taskId, taskId = taskInfo.taskId, ) desktopModeUiEventLogger.log( taskInfo, DesktopUiEventEnum.APP_HANDLE_EDUCATION_TOOLTIP_SHOWN, ) } /** Show tooltip that points to windowing image button in app handle menu */ private suspend fun showWindowingImageButtonTooltip(captionState: CaptionState.AppHandle) { val appInfoPillHeight = getSize(R.dimen.desktop_mode_handle_menu_app_info_pill_height) val taskInfo = captionState.runningTaskInfo val windowingOptionPillHeight = getSize(R.dimen.desktop_mode_handle_menu_windowing_pill_height) val appHandleMenuWidth = Loading Loading @@ -245,24 +261,36 @@ class AppHandleEducationController( DesktopWindowingEducationTooltipController.TooltipArrowDirection.HORIZONTAL, onEducationClickAction = { toDesktopModeCallback( captionState.runningTaskInfo.taskId, taskInfo.taskId, DesktopModeTransitionSource.APP_HANDLE_MENU_BUTTON, ) desktopModeUiEventLogger.log( taskInfo, DesktopUiEventEnum.ENTER_DESKTOP_MODE_EDUCATION_TOOLTIP_CLICKED, ) }, onDismissAction = { // TODO: b/341320146 - Log previous tooltip was dismissed desktopModeUiEventLogger.log( taskInfo, DesktopUiEventEnum.ENTER_DESKTOP_MODE_EDUCATION_TOOLTIP_DISMISSED, ) }, ) windowingEducationViewController.showEducationTooltip( taskId = captionState.runningTaskInfo.taskId, taskId = taskInfo.taskId, tooltipViewConfig = windowingImageButtonTooltipConfig, ) desktopModeUiEventLogger.log( taskInfo, DesktopUiEventEnum.ENTER_DESKTOP_MODE_EDUCATION_TOOLTIP_SHOWN, ) } /** Show tooltip that points to app chip button and educates user on how to exit desktop mode */ private suspend fun showExitWindowingTooltip(captionState: CaptionState.AppHeader) { val globalAppChipBounds = captionState.globalAppChipBounds val taskInfo = captionState.runningTaskInfo val tooltipGlobalCoordinates = Point( if (isRtl()) { Loading @@ -287,16 +315,27 @@ class AppHandleEducationController( arrowDirection = DesktopWindowingEducationTooltipController.TooltipArrowDirection.HORIZONTAL, onDismissAction = { // TODO: b/341320146 - Log previous tooltip was dismissed desktopModeUiEventLogger.log( taskInfo, DesktopUiEventEnum.EXIT_DESKTOP_MODE_EDUCATION_TOOLTIP_DISMISSED, ) }, onEducationClickAction = { openHandleMenuCallback(captionState.runningTaskInfo.taskId) openHandleMenuCallback(taskInfo.taskId) desktopModeUiEventLogger.log( taskInfo, DesktopUiEventEnum.EXIT_DESKTOP_MODE_EDUCATION_TOOLTIP_CLICKED, ) }, ) windowingEducationViewController.showEducationTooltip( taskId = captionState.runningTaskInfo.taskId, taskId = taskInfo.taskId, tooltipViewConfig = exitWindowingTooltipConfig, ) desktopModeUiEventLogger.log( taskInfo, DesktopUiEventEnum.EXIT_DESKTOP_MODE_EDUCATION_TOOLTIP_SHOWN, ) } /** Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/education/AppHandleEducationControllerTest.kt +10 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,8 @@ import com.android.modules.utils.testing.ExtendedMockitoRule import com.android.window.flags.Flags import com.android.wm.shell.ShellTestCase import com.android.wm.shell.desktopmode.CaptionState import com.android.wm.shell.desktopmode.DesktopModeUiEventLogger import com.android.wm.shell.desktopmode.DesktopModeUiEventLogger.DesktopUiEventEnum import com.android.wm.shell.desktopmode.WindowDecorCaptionHandleRepository import com.android.wm.shell.desktopmode.education.AppHandleEducationController.Companion.APP_HANDLE_EDUCATION_DELAY_MILLIS import com.android.wm.shell.desktopmode.education.AppHandleEducationController.Companion.TOOLTIP_VISIBLE_DURATION_MILLIS Loading Loading @@ -86,6 +88,7 @@ class AppHandleEducationControllerTest : ShellTestCase() { @Mock private lateinit var mockDataStoreRepository: AppHandleEducationDatastoreRepository @Mock private lateinit var mockCaptionHandleRepository: WindowDecorCaptionHandleRepository @Mock private lateinit var mockTooltipController: DesktopWindowingEducationTooltipController @Mock private lateinit var mockDesktopModeUiEventLogger: DesktopModeUiEventLogger @Before fun setUp() { Loading @@ -105,6 +108,7 @@ class AppHandleEducationControllerTest : ShellTestCase() { mockTooltipController, testScope.backgroundScope, Dispatchers.Main, mockDesktopModeUiEventLogger, ) } Loading @@ -123,6 +127,8 @@ class AppHandleEducationControllerTest : ShellTestCase() { verify(mockTooltipController, times(1)).showEducationTooltip(any(), any()) verify(mockDataStoreRepository, times(1)) .updateAppHandleHintViewedTimestampMillis(eq(true)) verify(mockDesktopModeUiEventLogger, times(1)) .log(any(), eq(DesktopUiEventEnum.APP_HANDLE_EDUCATION_TOOLTIP_SHOWN)) } @Test Loading Loading @@ -155,6 +161,8 @@ class AppHandleEducationControllerTest : ShellTestCase() { verify(mockTooltipController, times(1)).showEducationTooltip(any(), any()) verify(mockDataStoreRepository, times(1)) .updateEnterDesktopModeHintViewedTimestampMillis(eq(true)) verify(mockDesktopModeUiEventLogger, times(1)) .log(any(), eq(DesktopUiEventEnum.ENTER_DESKTOP_MODE_EDUCATION_TOOLTIP_SHOWN)) } @Test Loading @@ -170,6 +178,8 @@ class AppHandleEducationControllerTest : ShellTestCase() { verify(mockTooltipController, times(1)).showEducationTooltip(any(), any()) verify(mockDataStoreRepository, times(1)) .updateExitDesktopModeHintViewedTimestampMillis(eq(true)) verify(mockDesktopModeUiEventLogger, times(1)) .log(any(), eq(DesktopUiEventEnum.EXIT_DESKTOP_MODE_EDUCATION_TOOLTIP_SHOWN)) } @Test Loading