Add support for tracing Window Manager events in UiTraceListener.

This change introduces a new option, `TRACE_WM_KEY`, to enable the `android.windowmanager` data source in Perfetto traces. When enabled, verbose Window Manager logs are collected at a frame frequency.

Bug: 438461160
Change-Id: I344411ef4521f500df7b146d07d3437216c9aa14
diff --git a/libraries/flicker/collector/src/android/tools/collectors/UiTraceListener.java b/libraries/flicker/collector/src/android/tools/collectors/UiTraceListener.java
index 8e4d8c1..f23edd9 100644
--- a/libraries/flicker/collector/src/android/tools/collectors/UiTraceListener.java
+++ b/libraries/flicker/collector/src/android/tools/collectors/UiTraceListener.java
@@ -44,6 +44,7 @@
     public static final String TRACE_LAYERS_KEY = "trace_layers";
     public static final String TRACE_SHELL_TRANSITIONS_KEY = "trace_shell_transitions";
     public static final String TRACE_INPUT_KEY = "trace_input";
+    public static final String TRACE_WM_KEY = "trace_windows";
     public static final String PROTOLOG_GROUPS_KEY = "protolog_groups";
 
     public UiTraceListener() {
@@ -171,6 +172,22 @@
                                             .setAndroidInputEventConfig(inputConfig)));
         }
 
+        // Window Manager
+        if (traceWindows(args)) {
+            Log.d(LOG_TAG, "Enabling window manager datasource");
+            var wmConfig =
+                    PerfettoConfig.WindowManagerConfig.newBuilder()
+                            .setLogLevel(PerfettoConfig.WindowManagerConfig.LogLevel.LOG_LEVEL_VERBOSE)
+                            .setLogFrequency(
+                                    PerfettoConfig.WindowManagerConfig.LogFrequency.LOG_FREQUENCY_FRAME);
+            config.addDataSources(
+                    PerfettoConfig.TraceConfig.DataSource.newBuilder()
+                            .setConfig(
+                                    PerfettoConfig.DataSourceConfig.newBuilder()
+                                            .setName("android.windowmanager")
+                                            .setWindowmanagerConfig(wmConfig)));
+        }
+
         // Protolog
         String protologGroups = args.getString(PROTOLOG_GROUPS_KEY);
         if (protologGroups != null && !protologGroups.isEmpty()) {
@@ -214,4 +231,8 @@
     protected boolean traceInput(Bundle args) {
         return Boolean.parseBoolean(args.getString(TRACE_INPUT_KEY, "false"));
     }
+
+    protected boolean traceWindows(Bundle args) {
+        return Boolean.parseBoolean(args.getString(TRACE_WM_KEY, "false"));
+    }
 }
diff --git a/libraries/flicker/collector/test/src/android/tools/collectors/UiTraceListenerTest.java b/libraries/flicker/collector/test/src/android/tools/collectors/UiTraceListenerTest.java
index 5d63f07..ce34ad1 100644
--- a/libraries/flicker/collector/test/src/android/tools/collectors/UiTraceListenerTest.java
+++ b/libraries/flicker/collector/test/src/android/tools/collectors/UiTraceListenerTest.java
@@ -60,6 +60,7 @@
         b.putString(UiTraceListener.TRACE_LAYERS_KEY, "false");
         b.putString(UiTraceListener.TRACE_SHELL_TRANSITIONS_KEY, "false");
         b.putString(UiTraceListener.TRACE_INPUT_KEY, "false");
+        b.putString(UiTraceListener.TRACE_WM_KEY, "false");
         b.putString(UiTraceListener.PROTOLOG_GROUPS_KEY, "");
 
         UiTraceListener listener = new UiTraceListener(b, List.of());
@@ -81,6 +82,7 @@
         b.putString(UiTraceListener.TRACE_LAYERS_KEY, "true");
         b.putString(UiTraceListener.TRACE_SHELL_TRANSITIONS_KEY, "true");
         b.putString(UiTraceListener.TRACE_INPUT_KEY, "true");
+        b.putString(UiTraceListener.TRACE_WM_KEY, "true");
         b.putString(UiTraceListener.PROTOLOG_GROUPS_KEY, "WM_DEBUG_FOCUS,WM_DEBUG_ADD_REMOVE");
 
         UiTraceListener listener = new UiTraceListener(b, List.of());
@@ -98,6 +100,7 @@
         assertTrue(sourceNames.contains("com.android.wm.shell.transition"));
         assertTrue(sourceNames.contains("android.input.inputevent"));
         assertTrue(sourceNames.contains("android.protolog"));
+        assertTrue(sourceNames.contains("android.windowmanager"));
 
         PerfettoConfig.TraceConfig.DataSource protologSource =
                 config.getDataSourcesList().stream()
@@ -119,6 +122,7 @@
         b.putString(UiTraceListener.TRACE_LAYERS_KEY, "true");
         b.putString(UiTraceListener.TRACE_SHELL_TRANSITIONS_KEY, "true");
         b.putString(UiTraceListener.TRACE_INPUT_KEY, "true");
+        b.putString(UiTraceListener.TRACE_WM_KEY, "true");
         b.putString(UiTraceListener.PROTOLOG_GROUPS_KEY, "WM_DEBUG_FOCUS,WM_DEBUG_ADD_REMOVE");
 
         var listener = new UiTraceListener(b, List.of());