1 /* 2 * Copyright (C) 2024 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.wm.shell.desktopmode 18 19 import android.app.ActivityManager.RunningTaskInfo 20 import android.graphics.Rect 21 import android.platform.test.annotations.EnableFlags 22 import com.android.dx.mockito.inline.extended.ExtendedMockito.clearInvocations 23 import com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn 24 import com.android.dx.mockito.inline.extended.ExtendedMockito.staticMockMarker 25 import com.android.dx.mockito.inline.extended.ExtendedMockito.verify 26 import com.android.dx.mockito.inline.extended.ExtendedMockito.verifyNoMoreInteractions 27 import com.android.internal.util.FrameworkStatsLog 28 import com.android.modules.utils.testing.ExtendedMockitoRule 29 import com.android.window.flags.Flags 30 import com.android.wm.shell.EventLogTags 31 import com.android.wm.shell.ShellTestCase 32 import com.android.wm.shell.TestRunningTaskInfoBuilder 33 import com.android.wm.shell.common.DisplayController 34 import com.android.wm.shell.common.DisplayLayout 35 import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.EnterReason 36 import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.ExitReason 37 import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.FocusReason 38 import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.InputMethod 39 import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.MinimizeReason 40 import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.NO_SESSION_ID 41 import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.ResizeTrigger 42 import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.TaskSizeUpdate 43 import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.TaskUpdate 44 import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.UNSET_FOCUS_REASON 45 import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.UNSET_MINIMIZE_REASON 46 import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.UNSET_UNMINIMIZE_REASON 47 import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.UnminimizeReason 48 import com.google.common.truth.Truth.assertThat 49 import org.junit.After 50 import org.junit.Before 51 import org.junit.Rule 52 import org.junit.Test 53 import org.mockito.ArgumentMatchers.anyInt 54 import org.mockito.kotlin.eq 55 import org.mockito.kotlin.mock 56 import org.mockito.kotlin.never 57 import org.mockito.kotlin.whenever 58 59 /** Tests for [DesktopModeEventLogger]. */ 60 class DesktopModeEventLoggerTest : ShellTestCase() { 61 62 private val desktopModeEventLogger = DesktopModeEventLogger() 63 val displayController = mock<DisplayController>() 64 val displayLayout = mock<DisplayLayout>() 65 66 @JvmField 67 @Rule() 68 val extendedMockitoRule = 69 ExtendedMockitoRule.Builder(this) 70 .mockStatic(FrameworkStatsLog::class.java) 71 .mockStatic(EventLogTags::class.java) 72 .build()!! 73 74 @Before setUpnull75 fun setUp() { 76 doReturn(displayLayout).whenever(displayController).getDisplayLayout(anyInt()) 77 doReturn(DISPLAY_WIDTH).whenever(displayLayout).width() 78 doReturn(DISPLAY_HEIGHT).whenever(displayLayout).height() 79 } 80 81 @After tearDownnull82 fun tearDown() { 83 clearInvocations(staticMockMarker(FrameworkStatsLog::class.java)) 84 clearInvocations(staticMockMarker(EventLogTags::class.java)) 85 } 86 87 @Test logSessionEnter_logsEnterReasonWithNewSessionIdnull88 fun logSessionEnter_logsEnterReasonWithNewSessionId() { 89 desktopModeEventLogger.logSessionEnter(EnterReason.KEYBOARD_SHORTCUT_ENTER) 90 91 val sessionId = desktopModeEventLogger.currentSessionId.get() 92 assertThat(sessionId).isNotEqualTo(NO_SESSION_ID) 93 verifyOnlyOneUiChangedLogging( 94 FrameworkStatsLog.DESKTOP_MODE_UICHANGED__EVENT__ENTER, 95 FrameworkStatsLog.DESKTOP_MODE_UICHANGED__ENTER_REASON__KEYBOARD_SHORTCUT_ENTER, 96 0, 97 sessionId, 98 ) 99 verify { 100 EventLogTags.writeWmShellEnterDesktopMode( 101 eq(EnterReason.KEYBOARD_SHORTCUT_ENTER.reason), 102 eq(sessionId), 103 ) 104 } 105 verifyNoMoreInteractions(staticMockMarker(EventLogTags::class.java)) 106 } 107 108 @Test logSessionEnter_ongoingSession_logsEnterReasonWithNewSessionIdnull109 fun logSessionEnter_ongoingSession_logsEnterReasonWithNewSessionId() { 110 val previousSessionId = startDesktopModeSession() 111 112 desktopModeEventLogger.logSessionEnter(EnterReason.KEYBOARD_SHORTCUT_ENTER) 113 114 val sessionId = desktopModeEventLogger.currentSessionId.get() 115 assertThat(sessionId).isNotEqualTo(NO_SESSION_ID) 116 assertThat(sessionId).isNotEqualTo(previousSessionId) 117 verifyOnlyOneUiChangedLogging( 118 FrameworkStatsLog.DESKTOP_MODE_UICHANGED__EVENT__ENTER, 119 FrameworkStatsLog.DESKTOP_MODE_UICHANGED__ENTER_REASON__KEYBOARD_SHORTCUT_ENTER, 120 /* exit_reason */ 121 0, 122 sessionId, 123 ) 124 verify { 125 EventLogTags.writeWmShellEnterDesktopMode( 126 eq(EnterReason.KEYBOARD_SHORTCUT_ENTER.reason), 127 eq(sessionId), 128 ) 129 } 130 verifyNoMoreInteractions(staticMockMarker(EventLogTags::class.java)) 131 } 132 133 @Test logSessionExit_noOngoingSession_doesNotLognull134 fun logSessionExit_noOngoingSession_doesNotLog() { 135 desktopModeEventLogger.logSessionExit(ExitReason.DRAG_TO_EXIT) 136 137 verifyNoLogging() 138 verifyNoMoreInteractions(staticMockMarker(EventLogTags::class.java)) 139 } 140 141 @Test logSessionExit_logsExitReasonAndClearsSessionIdnull142 fun logSessionExit_logsExitReasonAndClearsSessionId() { 143 val sessionId = startDesktopModeSession() 144 145 desktopModeEventLogger.logSessionExit(ExitReason.DRAG_TO_EXIT) 146 147 verifyOnlyOneUiChangedLogging( 148 FrameworkStatsLog.DESKTOP_MODE_UICHANGED__EVENT__EXIT, 149 /* enter_reason */ 150 0, 151 FrameworkStatsLog.DESKTOP_MODE_UICHANGED__EXIT_REASON__DRAG_TO_EXIT, 152 sessionId, 153 ) 154 verify { 155 EventLogTags.writeWmShellExitDesktopMode( 156 eq(ExitReason.DRAG_TO_EXIT.reason), 157 eq(sessionId), 158 ) 159 } 160 verifyNoMoreInteractions(staticMockMarker(EventLogTags::class.java)) 161 assertThat(desktopModeEventLogger.currentSessionId.get()).isEqualTo(NO_SESSION_ID) 162 } 163 164 @Test logTaskAdded_noOngoingSession_doesNotLognull165 fun logTaskAdded_noOngoingSession_doesNotLog() { 166 desktopModeEventLogger.logTaskAdded(TASK_UPDATE) 167 168 verifyNoLogging() 169 verifyNoMoreInteractions(staticMockMarker(EventLogTags::class.java)) 170 } 171 172 @Test logTaskAdded_logsTaskUpdatenull173 fun logTaskAdded_logsTaskUpdate() { 174 val sessionId = startDesktopModeSession() 175 176 desktopModeEventLogger.logTaskAdded(TASK_UPDATE) 177 178 verifyOnlyOneTaskUpdateLogging( 179 FrameworkStatsLog.DESKTOP_MODE_SESSION_TASK_UPDATE__TASK_EVENT__TASK_ADDED, 180 TASK_UPDATE.instanceId, 181 TASK_UPDATE.uid, 182 TASK_UPDATE.taskHeight, 183 TASK_UPDATE.taskWidth, 184 TASK_UPDATE.taskX, 185 TASK_UPDATE.taskY, 186 sessionId, 187 UNSET_MINIMIZE_REASON, 188 UNSET_UNMINIMIZE_REASON, 189 TASK_COUNT, 190 UNSET_FOCUS_REASON, 191 ) 192 verify { 193 EventLogTags.writeWmShellDesktopModeTaskUpdate( 194 eq(FrameworkStatsLog.DESKTOP_MODE_SESSION_TASK_UPDATE__TASK_EVENT__TASK_ADDED), 195 eq(TASK_UPDATE.instanceId), 196 eq(TASK_UPDATE.uid), 197 eq(TASK_UPDATE.taskHeight), 198 eq(TASK_UPDATE.taskWidth), 199 eq(TASK_UPDATE.taskX), 200 eq(TASK_UPDATE.taskY), 201 eq(sessionId), 202 eq(UNSET_MINIMIZE_REASON), 203 eq(UNSET_UNMINIMIZE_REASON), 204 eq(TASK_COUNT), 205 eq(UNSET_FOCUS_REASON), 206 ) 207 } 208 verifyNoMoreInteractions(staticMockMarker(EventLogTags::class.java)) 209 } 210 211 @Test logTaskRemoved_noOngoingSession_doesNotLognull212 fun logTaskRemoved_noOngoingSession_doesNotLog() { 213 desktopModeEventLogger.logTaskRemoved(TASK_UPDATE) 214 215 verifyNoLogging() 216 verifyNoMoreInteractions(staticMockMarker(EventLogTags::class.java)) 217 } 218 219 @Test logTaskRemoved_taskUpdatenull220 fun logTaskRemoved_taskUpdate() { 221 val sessionId = startDesktopModeSession() 222 223 desktopModeEventLogger.logTaskRemoved(TASK_UPDATE) 224 225 verifyOnlyOneTaskUpdateLogging( 226 FrameworkStatsLog.DESKTOP_MODE_SESSION_TASK_UPDATE__TASK_EVENT__TASK_REMOVED, 227 TASK_UPDATE.instanceId, 228 TASK_UPDATE.uid, 229 TASK_UPDATE.taskHeight, 230 TASK_UPDATE.taskWidth, 231 TASK_UPDATE.taskX, 232 TASK_UPDATE.taskY, 233 sessionId, 234 UNSET_MINIMIZE_REASON, 235 UNSET_UNMINIMIZE_REASON, 236 TASK_COUNT, 237 UNSET_FOCUS_REASON, 238 ) 239 verify { 240 EventLogTags.writeWmShellDesktopModeTaskUpdate( 241 eq(FrameworkStatsLog.DESKTOP_MODE_SESSION_TASK_UPDATE__TASK_EVENT__TASK_REMOVED), 242 eq(TASK_UPDATE.instanceId), 243 eq(TASK_UPDATE.uid), 244 eq(TASK_UPDATE.taskHeight), 245 eq(TASK_UPDATE.taskWidth), 246 eq(TASK_UPDATE.taskX), 247 eq(TASK_UPDATE.taskY), 248 eq(sessionId), 249 eq(UNSET_MINIMIZE_REASON), 250 eq(UNSET_UNMINIMIZE_REASON), 251 eq(TASK_COUNT), 252 eq(UNSET_FOCUS_REASON), 253 ) 254 } 255 verifyNoMoreInteractions(staticMockMarker(EventLogTags::class.java)) 256 } 257 258 @Test logTaskInfoChanged_noOngoingSession_doesNotLognull259 fun logTaskInfoChanged_noOngoingSession_doesNotLog() { 260 desktopModeEventLogger.logTaskInfoChanged(TASK_UPDATE) 261 262 verifyNoLogging() 263 verifyNoMoreInteractions(staticMockMarker(EventLogTags::class.java)) 264 } 265 266 @Test logTaskInfoChanged_taskUpdatenull267 fun logTaskInfoChanged_taskUpdate() { 268 val sessionId = startDesktopModeSession() 269 270 desktopModeEventLogger.logTaskInfoChanged(TASK_UPDATE) 271 272 verifyOnlyOneTaskUpdateLogging( 273 FrameworkStatsLog.DESKTOP_MODE_SESSION_TASK_UPDATE__TASK_EVENT__TASK_INFO_CHANGED, 274 TASK_UPDATE.instanceId, 275 TASK_UPDATE.uid, 276 TASK_UPDATE.taskHeight, 277 TASK_UPDATE.taskWidth, 278 TASK_UPDATE.taskX, 279 TASK_UPDATE.taskY, 280 sessionId, 281 UNSET_MINIMIZE_REASON, 282 UNSET_UNMINIMIZE_REASON, 283 TASK_COUNT, 284 UNSET_FOCUS_REASON, 285 ) 286 verify { 287 EventLogTags.writeWmShellDesktopModeTaskUpdate( 288 eq( 289 FrameworkStatsLog 290 .DESKTOP_MODE_SESSION_TASK_UPDATE__TASK_EVENT__TASK_INFO_CHANGED 291 ), 292 eq(TASK_UPDATE.instanceId), 293 eq(TASK_UPDATE.uid), 294 eq(TASK_UPDATE.taskHeight), 295 eq(TASK_UPDATE.taskWidth), 296 eq(TASK_UPDATE.taskX), 297 eq(TASK_UPDATE.taskY), 298 eq(sessionId), 299 eq(UNSET_MINIMIZE_REASON), 300 eq(UNSET_UNMINIMIZE_REASON), 301 eq(TASK_COUNT), 302 eq(UNSET_FOCUS_REASON), 303 ) 304 } 305 verifyNoMoreInteractions(staticMockMarker(EventLogTags::class.java)) 306 } 307 308 @Test logTaskInfoChanged_logsTaskUpdateWithMinimizeReasonnull309 fun logTaskInfoChanged_logsTaskUpdateWithMinimizeReason() { 310 val sessionId = startDesktopModeSession() 311 312 desktopModeEventLogger.logTaskInfoChanged( 313 createTaskUpdate(minimizeReason = MinimizeReason.TASK_LIMIT) 314 ) 315 316 verifyOnlyOneTaskUpdateLogging( 317 FrameworkStatsLog.DESKTOP_MODE_SESSION_TASK_UPDATE__TASK_EVENT__TASK_INFO_CHANGED, 318 TASK_UPDATE.instanceId, 319 TASK_UPDATE.uid, 320 TASK_UPDATE.taskHeight, 321 TASK_UPDATE.taskWidth, 322 TASK_UPDATE.taskX, 323 TASK_UPDATE.taskY, 324 sessionId, 325 MinimizeReason.TASK_LIMIT.reason, 326 UNSET_UNMINIMIZE_REASON, 327 TASK_COUNT, 328 UNSET_FOCUS_REASON, 329 ) 330 verify { 331 EventLogTags.writeWmShellDesktopModeTaskUpdate( 332 eq( 333 FrameworkStatsLog 334 .DESKTOP_MODE_SESSION_TASK_UPDATE__TASK_EVENT__TASK_INFO_CHANGED 335 ), 336 eq(TASK_UPDATE.instanceId), 337 eq(TASK_UPDATE.uid), 338 eq(TASK_UPDATE.taskHeight), 339 eq(TASK_UPDATE.taskWidth), 340 eq(TASK_UPDATE.taskX), 341 eq(TASK_UPDATE.taskY), 342 eq(sessionId), 343 eq(MinimizeReason.TASK_LIMIT.reason), 344 eq(UNSET_UNMINIMIZE_REASON), 345 eq(TASK_COUNT), 346 eq(UNSET_FOCUS_REASON), 347 ) 348 } 349 verifyNoMoreInteractions(staticMockMarker(EventLogTags::class.java)) 350 } 351 352 @Test logTaskInfoChanged_logsTaskUpdateWithUnminimizeReasonnull353 fun logTaskInfoChanged_logsTaskUpdateWithUnminimizeReason() { 354 val sessionId = startDesktopModeSession() 355 356 desktopModeEventLogger.logTaskInfoChanged( 357 createTaskUpdate(unminimizeReason = UnminimizeReason.TASKBAR_TAP) 358 ) 359 360 verifyOnlyOneTaskUpdateLogging( 361 FrameworkStatsLog.DESKTOP_MODE_SESSION_TASK_UPDATE__TASK_EVENT__TASK_INFO_CHANGED, 362 TASK_UPDATE.instanceId, 363 TASK_UPDATE.uid, 364 TASK_UPDATE.taskHeight, 365 TASK_UPDATE.taskWidth, 366 TASK_UPDATE.taskX, 367 TASK_UPDATE.taskY, 368 sessionId, 369 UNSET_MINIMIZE_REASON, 370 UnminimizeReason.TASKBAR_TAP.reason, 371 TASK_COUNT, 372 UNSET_FOCUS_REASON, 373 ) 374 verify { 375 EventLogTags.writeWmShellDesktopModeTaskUpdate( 376 eq( 377 FrameworkStatsLog 378 .DESKTOP_MODE_SESSION_TASK_UPDATE__TASK_EVENT__TASK_INFO_CHANGED 379 ), 380 eq(TASK_UPDATE.instanceId), 381 eq(TASK_UPDATE.uid), 382 eq(TASK_UPDATE.taskHeight), 383 eq(TASK_UPDATE.taskWidth), 384 eq(TASK_UPDATE.taskX), 385 eq(TASK_UPDATE.taskY), 386 eq(sessionId), 387 eq(UNSET_MINIMIZE_REASON), 388 eq(UnminimizeReason.TASKBAR_TAP.reason), 389 eq(TASK_COUNT), 390 eq(UNSET_FOCUS_REASON), 391 ) 392 } 393 verifyNoMoreInteractions(staticMockMarker(EventLogTags::class.java)) 394 } 395 396 @Test logTaskInfoChanged_logsTaskUpdateWithFocusReasonnull397 fun logTaskInfoChanged_logsTaskUpdateWithFocusReason() { 398 val sessionId = startDesktopModeSession() 399 400 desktopModeEventLogger.logTaskInfoChanged( 401 createTaskUpdate(focusChangesReason = FocusReason.UNKNOWN) 402 ) 403 404 verifyOnlyOneTaskUpdateLogging( 405 FrameworkStatsLog.DESKTOP_MODE_SESSION_TASK_UPDATE__TASK_EVENT__TASK_INFO_CHANGED, 406 TASK_UPDATE.instanceId, 407 TASK_UPDATE.uid, 408 TASK_UPDATE.taskHeight, 409 TASK_UPDATE.taskWidth, 410 TASK_UPDATE.taskX, 411 TASK_UPDATE.taskY, 412 sessionId, 413 UNSET_MINIMIZE_REASON, 414 UNSET_UNMINIMIZE_REASON, 415 TASK_COUNT, 416 FocusReason.UNKNOWN.reason, 417 ) 418 verify { 419 EventLogTags.writeWmShellDesktopModeTaskUpdate( 420 eq( 421 FrameworkStatsLog 422 .DESKTOP_MODE_SESSION_TASK_UPDATE__TASK_EVENT__TASK_INFO_CHANGED 423 ), 424 eq(TASK_UPDATE.instanceId), 425 eq(TASK_UPDATE.uid), 426 eq(TASK_UPDATE.taskHeight), 427 eq(TASK_UPDATE.taskWidth), 428 eq(TASK_UPDATE.taskX), 429 eq(TASK_UPDATE.taskY), 430 eq(sessionId), 431 eq(UNSET_MINIMIZE_REASON), 432 eq(UNSET_UNMINIMIZE_REASON), 433 eq(TASK_COUNT), 434 eq(FocusReason.UNKNOWN.reason), 435 ) 436 } 437 verifyNoMoreInteractions(staticMockMarker(EventLogTags::class.java)) 438 } 439 440 @Test logTaskResizingStarted_noOngoingSession_doesNotLognull441 fun logTaskResizingStarted_noOngoingSession_doesNotLog() { 442 desktopModeEventLogger.logTaskResizingStarted( 443 ResizeTrigger.CORNER, 444 InputMethod.UNKNOWN_INPUT_METHOD, 445 createTaskInfo(), 446 ) 447 448 verifyNoLogging() 449 verifyNoMoreInteractions(staticMockMarker(EventLogTags::class.java)) 450 } 451 452 @Test 453 @EnableFlags(Flags.FLAG_ENABLE_RESIZING_METRICS) logTaskResizingStarted_logsTaskSizeUpdatedWithStartResizingStagenull454 fun logTaskResizingStarted_logsTaskSizeUpdatedWithStartResizingStage() { 455 val sessionId = startDesktopModeSession() 456 457 desktopModeEventLogger.logTaskResizingStarted( 458 ResizeTrigger.CORNER, 459 InputMethod.UNKNOWN_INPUT_METHOD, 460 createTaskInfo(), 461 TASK_SIZE_UPDATE.taskWidth, 462 TASK_SIZE_UPDATE.taskHeight, 463 displayController, 464 ) 465 466 verifyOnlyOneTaskSizeUpdatedLogging( 467 FrameworkStatsLog.DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZE_TRIGGER__CORNER_RESIZE_TRIGGER, 468 FrameworkStatsLog.DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZING_STAGE__START_RESIZING_STAGE, 469 FrameworkStatsLog.DESKTOP_MODE_TASK_SIZE_UPDATED__INPUT_METHOD__UNKNOWN_INPUT_METHOD, 470 sessionId, 471 TASK_SIZE_UPDATE.instanceId, 472 TASK_SIZE_UPDATE.uid, 473 TASK_SIZE_UPDATE.taskWidth, 474 TASK_SIZE_UPDATE.taskHeight, 475 DISPLAY_AREA, 476 ) 477 } 478 479 @Test logTaskResizingEnded_noOngoingSession_doesNotLognull480 fun logTaskResizingEnded_noOngoingSession_doesNotLog() { 481 desktopModeEventLogger.logTaskResizingEnded( 482 ResizeTrigger.CORNER, 483 InputMethod.UNKNOWN_INPUT_METHOD, 484 createTaskInfo(), 485 ) 486 487 verifyNoLogging() 488 verifyNoMoreInteractions(staticMockMarker(EventLogTags::class.java)) 489 } 490 491 @Test 492 @EnableFlags(Flags.FLAG_ENABLE_RESIZING_METRICS) logTaskResizingEnded_logsTaskSizeUpdatedWithEndResizingStagenull493 fun logTaskResizingEnded_logsTaskSizeUpdatedWithEndResizingStage() { 494 val sessionId = startDesktopModeSession() 495 496 desktopModeEventLogger.logTaskResizingEnded( 497 ResizeTrigger.CORNER, 498 InputMethod.UNKNOWN_INPUT_METHOD, 499 createTaskInfo(), 500 displayController = displayController, 501 ) 502 503 verifyOnlyOneTaskSizeUpdatedLogging( 504 FrameworkStatsLog.DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZE_TRIGGER__CORNER_RESIZE_TRIGGER, 505 FrameworkStatsLog.DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZING_STAGE__END_RESIZING_STAGE, 506 FrameworkStatsLog.DESKTOP_MODE_TASK_SIZE_UPDATED__INPUT_METHOD__UNKNOWN_INPUT_METHOD, 507 sessionId, 508 TASK_SIZE_UPDATE.instanceId, 509 TASK_SIZE_UPDATE.uid, 510 TASK_SIZE_UPDATE.taskWidth, 511 TASK_SIZE_UPDATE.taskHeight, 512 DISPLAY_AREA, 513 ) 514 } 515 startDesktopModeSessionnull516 private fun startDesktopModeSession(): Int { 517 desktopModeEventLogger.logSessionEnter(EnterReason.KEYBOARD_SHORTCUT_ENTER) 518 clearInvocations(staticMockMarker(FrameworkStatsLog::class.java)) 519 clearInvocations(staticMockMarker(EventLogTags::class.java)) 520 return desktopModeEventLogger.currentSessionId.get() 521 } 522 523 @Test logTaskInfoStateInit_logsTaskInfoChangedStateInitnull524 fun logTaskInfoStateInit_logsTaskInfoChangedStateInit() { 525 desktopModeEventLogger.logTaskInfoStateInit() 526 verify { 527 FrameworkStatsLog.write( 528 eq(FrameworkStatsLog.DESKTOP_MODE_SESSION_TASK_UPDATE), 529 /* task_event */ 530 eq( 531 FrameworkStatsLog.DESKTOP_MODE_SESSION_TASK_UPDATE__TASK_EVENT__TASK_INIT_STATSD 532 ), 533 /* instance_id */ 534 eq(0), 535 /* uid */ 536 eq(0), 537 /* task_height */ 538 eq(0), 539 /* task_width */ 540 eq(0), 541 /* task_x */ 542 eq(0), 543 /* task_y */ 544 eq(0), 545 /* session_id */ 546 eq(0), 547 /* minimize_reason */ 548 eq(UNSET_MINIMIZE_REASON), 549 /* unminimize_reason */ 550 eq(UNSET_UNMINIMIZE_REASON), 551 /* visible_task_count */ 552 eq(0), 553 /* focus_reason */ 554 eq(UNSET_FOCUS_REASON), 555 ) 556 } 557 } 558 createTaskInfonull559 private fun createTaskInfo(): RunningTaskInfo = 560 TestRunningTaskInfoBuilder() 561 .setTaskId(TASK_ID) 562 .setUid(TASK_UID) 563 .setBounds(Rect(TASK_X, TASK_Y, TASK_WIDTH, TASK_HEIGHT)) 564 .build() 565 566 private fun verifyNoLogging() { 567 verify( 568 { 569 FrameworkStatsLog.write( 570 eq(FrameworkStatsLog.DESKTOP_MODE_UI_CHANGED), 571 anyInt(), 572 anyInt(), 573 anyInt(), 574 anyInt(), 575 ) 576 }, 577 never(), 578 ) 579 verify( 580 { 581 FrameworkStatsLog.write( 582 eq(FrameworkStatsLog.DESKTOP_MODE_SESSION_TASK_UPDATE), 583 anyInt(), 584 anyInt(), 585 anyInt(), 586 anyInt(), 587 anyInt(), 588 anyInt(), 589 anyInt(), 590 anyInt(), 591 anyInt(), 592 anyInt(), 593 anyInt(), 594 anyInt(), 595 ) 596 }, 597 never(), 598 ) 599 verify( 600 { 601 FrameworkStatsLog.write( 602 eq(FrameworkStatsLog.DESKTOP_MODE_TASK_SIZE_UPDATED), 603 anyInt(), 604 anyInt(), 605 anyInt(), 606 anyInt(), 607 anyInt(), 608 anyInt(), 609 anyInt(), 610 anyInt(), 611 anyInt(), 612 ) 613 }, 614 never(), 615 ) 616 } 617 verifyOnlyOneUiChangedLoggingnull618 private fun verifyOnlyOneUiChangedLogging( 619 event: Int, 620 enterReason: Int, 621 exitReason: Int, 622 sessionId: Int, 623 ) { 624 verify({ 625 FrameworkStatsLog.write( 626 eq(FrameworkStatsLog.DESKTOP_MODE_UI_CHANGED), 627 eq(event), 628 eq(enterReason), 629 eq(exitReason), 630 eq(sessionId), 631 ) 632 }) 633 verify({ 634 FrameworkStatsLog.write( 635 eq(FrameworkStatsLog.DESKTOP_MODE_UI_CHANGED), 636 anyInt(), 637 anyInt(), 638 anyInt(), 639 anyInt(), 640 ) 641 }) 642 } 643 verifyOnlyOneTaskUpdateLoggingnull644 private fun verifyOnlyOneTaskUpdateLogging( 645 taskEvent: Int, 646 instanceId: Int, 647 uid: Int, 648 taskHeight: Int, 649 taskWidth: Int, 650 taskX: Int, 651 taskY: Int, 652 sessionId: Int, 653 minimizeReason: Int, 654 unminimizeReason: Int, 655 visibleTaskCount: Int, 656 focusChangedReason: Int, 657 ) { 658 verify({ 659 FrameworkStatsLog.write( 660 eq(FrameworkStatsLog.DESKTOP_MODE_SESSION_TASK_UPDATE), 661 eq(taskEvent), 662 eq(instanceId), 663 eq(uid), 664 eq(taskHeight), 665 eq(taskWidth), 666 eq(taskX), 667 eq(taskY), 668 eq(sessionId), 669 eq(minimizeReason), 670 eq(unminimizeReason), 671 eq(visibleTaskCount), 672 eq(focusChangedReason), 673 ) 674 }) 675 verify({ 676 FrameworkStatsLog.write( 677 eq(FrameworkStatsLog.DESKTOP_MODE_SESSION_TASK_UPDATE), 678 anyInt(), 679 anyInt(), 680 anyInt(), 681 anyInt(), 682 anyInt(), 683 anyInt(), 684 anyInt(), 685 anyInt(), 686 anyInt(), 687 anyInt(), 688 anyInt(), 689 anyInt(), 690 ) 691 }) 692 } 693 verifyOnlyOneTaskSizeUpdatedLoggingnull694 private fun verifyOnlyOneTaskSizeUpdatedLogging( 695 resizeTrigger: Int, 696 resizingStage: Int, 697 inputMethod: Int, 698 sessionId: Int, 699 instanceId: Int, 700 uid: Int, 701 taskWidth: Int, 702 taskHeight: Int, 703 displayArea: Int, 704 ) { 705 verify({ 706 FrameworkStatsLog.write( 707 eq(FrameworkStatsLog.DESKTOP_MODE_TASK_SIZE_UPDATED), 708 eq(resizeTrigger), 709 eq(resizingStage), 710 eq(inputMethod), 711 eq(sessionId), 712 eq(instanceId), 713 eq(uid), 714 eq(taskWidth), 715 eq(taskHeight), 716 eq(displayArea), 717 ) 718 }) 719 verify({ 720 FrameworkStatsLog.write( 721 eq(FrameworkStatsLog.DESKTOP_MODE_TASK_SIZE_UPDATED), 722 anyInt(), 723 anyInt(), 724 anyInt(), 725 anyInt(), 726 anyInt(), 727 anyInt(), 728 anyInt(), 729 anyInt(), 730 anyInt(), 731 ) 732 }) 733 } 734 735 private companion object { 736 private const val TASK_ID = 1 737 private const val TASK_UID = 1 738 private const val TASK_X = 0 739 private const val TASK_Y = 0 740 private const val TASK_HEIGHT = 100 741 private const val TASK_WIDTH = 100 742 private const val TASK_COUNT = 1 743 private const val DISPLAY_WIDTH = 500 744 private const val DISPLAY_HEIGHT = 500 745 private const val DISPLAY_AREA = DISPLAY_HEIGHT * DISPLAY_WIDTH 746 747 private val TASK_UPDATE = 748 TaskUpdate( 749 TASK_ID, 750 TASK_UID, 751 TASK_HEIGHT, 752 TASK_WIDTH, 753 TASK_X, 754 TASK_Y, 755 visibleTaskCount = TASK_COUNT, 756 ) 757 758 private val TASK_SIZE_UPDATE = 759 TaskSizeUpdate( 760 resizeTrigger = ResizeTrigger.UNKNOWN_RESIZE_TRIGGER, 761 inputMethod = InputMethod.UNKNOWN_INPUT_METHOD, 762 TASK_ID, 763 TASK_UID, 764 TASK_HEIGHT, 765 TASK_WIDTH, 766 DISPLAY_AREA, 767 ) 768 createTaskUpdatenull769 private fun createTaskUpdate( 770 minimizeReason: MinimizeReason? = null, 771 unminimizeReason: UnminimizeReason? = null, 772 focusChangesReason: FocusReason? = null, 773 ) = 774 TaskUpdate( 775 TASK_ID, 776 TASK_UID, 777 TASK_HEIGHT, 778 TASK_WIDTH, 779 TASK_X, 780 TASK_Y, 781 minimizeReason, 782 unminimizeReason, 783 TASK_COUNT, 784 focusChangesReason, 785 ) 786 } 787 } 788