• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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