xref: /aosp_15_r20/development/tools/winscope/src/trace/trace_type.ts (revision 90c8c64db3049935a07c6143d7fd006e26f8ecca)
1/*
2 * Copyright (C) 2022 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
17import {QueryResult} from 'trace_processor/query_result';
18import {MediaBasedTraceEntry} from './media_based_trace_entry';
19import {HierarchyTreeNode} from './tree_node/hierarchy_tree_node';
20import {PropertyTreeNode} from './tree_node/property_tree_node';
21
22export enum TraceType {
23  WINDOW_MANAGER,
24  SURFACE_FLINGER,
25  SCREEN_RECORDING,
26  SCREENSHOT,
27  TRANSACTIONS,
28  TRANSACTIONS_LEGACY,
29  WAYLAND,
30  WAYLAND_DUMP,
31  PROTO_LOG,
32  SYSTEM_UI,
33  INPUT_METHOD_CLIENTS,
34  INPUT_METHOD_MANAGER_SERVICE,
35  INPUT_METHOD_SERVICE,
36  EVENT_LOG,
37  WM_TRANSITION,
38  SHELL_TRANSITION,
39  TRANSITION,
40  CUJS,
41  TEST_TRACE_STRING,
42  TEST_TRACE_NUMBER,
43  VIEW_CAPTURE,
44  INPUT_MOTION_EVENT,
45  INPUT_KEY_EVENT,
46  INPUT_EVENT_MERGED,
47  SEARCH,
48}
49
50export type ImeTraceType =
51  | TraceType.INPUT_METHOD_CLIENTS
52  | TraceType.INPUT_METHOD_MANAGER_SERVICE
53  | TraceType.INPUT_METHOD_SERVICE;
54
55export interface TraceEntryTypeMap {
56  [TraceType.PROTO_LOG]: PropertyTreeNode;
57  [TraceType.SURFACE_FLINGER]: HierarchyTreeNode;
58  [TraceType.SCREEN_RECORDING]: MediaBasedTraceEntry;
59  [TraceType.SCREENSHOT]: MediaBasedTraceEntry;
60  [TraceType.SYSTEM_UI]: object;
61  [TraceType.TRANSACTIONS]: PropertyTreeNode;
62  [TraceType.TRANSACTIONS_LEGACY]: object;
63  [TraceType.WAYLAND]: object;
64  [TraceType.WAYLAND_DUMP]: object;
65  [TraceType.WINDOW_MANAGER]: HierarchyTreeNode;
66  [TraceType.INPUT_METHOD_CLIENTS]: HierarchyTreeNode;
67  [TraceType.INPUT_METHOD_MANAGER_SERVICE]: HierarchyTreeNode;
68  [TraceType.INPUT_METHOD_SERVICE]: HierarchyTreeNode;
69  [TraceType.EVENT_LOG]: PropertyTreeNode;
70  [TraceType.WM_TRANSITION]: PropertyTreeNode;
71  [TraceType.SHELL_TRANSITION]: PropertyTreeNode;
72  [TraceType.TRANSITION]: PropertyTreeNode;
73  [TraceType.CUJS]: PropertyTreeNode;
74  [TraceType.TEST_TRACE_STRING]: string;
75  [TraceType.TEST_TRACE_NUMBER]: number;
76  [TraceType.VIEW_CAPTURE]: HierarchyTreeNode;
77  [TraceType.INPUT_MOTION_EVENT]: PropertyTreeNode;
78  [TraceType.INPUT_KEY_EVENT]: PropertyTreeNode;
79  [TraceType.INPUT_EVENT_MERGED]: PropertyTreeNode;
80  [TraceType.SEARCH]: QueryResult;
81}
82
83export class TraceTypeUtils {
84  private static UI_PIPELINE_ORDER = [
85    TraceType.INPUT_EVENT_MERGED,
86    TraceType.INPUT_METHOD_CLIENTS,
87    TraceType.INPUT_METHOD_SERVICE,
88    TraceType.INPUT_METHOD_MANAGER_SERVICE,
89    TraceType.PROTO_LOG,
90    TraceType.WINDOW_MANAGER,
91    TraceType.TRANSACTIONS,
92    TraceType.SURFACE_FLINGER,
93    TraceType.SCREEN_RECORDING,
94  ];
95
96  private static TRACES_WITH_VIEWERS_DISPLAY_ORDER = [
97    TraceType.SEARCH,
98    TraceType.SCREEN_RECORDING,
99    TraceType.SCREENSHOT,
100    TraceType.SURFACE_FLINGER,
101    TraceType.WINDOW_MANAGER,
102    TraceType.INPUT_EVENT_MERGED,
103    TraceType.INPUT_METHOD_CLIENTS,
104    TraceType.INPUT_METHOD_MANAGER_SERVICE,
105    TraceType.INPUT_METHOD_SERVICE,
106    TraceType.TRANSACTIONS,
107    TraceType.TRANSACTIONS_LEGACY,
108    TraceType.PROTO_LOG,
109    TraceType.VIEW_CAPTURE,
110    TraceType.TRANSITION,
111    TraceType.CUJS,
112  ];
113
114  static isTraceTypeWithViewer(t: TraceType): boolean {
115    return TraceTypeUtils.TRACES_WITH_VIEWERS_DISPLAY_ORDER.includes(t);
116  }
117
118  static compareByUiPipelineOrder(t: TraceType, u: TraceType) {
119    const tIndex = TraceTypeUtils.findIndexInOrder(
120      t,
121      TraceTypeUtils.UI_PIPELINE_ORDER,
122    );
123    const uIndex = TraceTypeUtils.findIndexInOrder(
124      u,
125      TraceTypeUtils.UI_PIPELINE_ORDER,
126    );
127    return tIndex >= 0 && uIndex >= 0 && tIndex < uIndex;
128  }
129
130  static compareByDisplayOrder(t: TraceType, u: TraceType) {
131    const tIndex = TraceTypeUtils.findIndexInOrder(
132      t,
133      TraceTypeUtils.TRACES_WITH_VIEWERS_DISPLAY_ORDER,
134    );
135    const uIndex = TraceTypeUtils.findIndexInOrder(
136      u,
137      TraceTypeUtils.TRACES_WITH_VIEWERS_DISPLAY_ORDER,
138    );
139    return tIndex - uIndex;
140  }
141
142  static getReasonForNoTraceVisualization(t: TraceType): string {
143    switch (t) {
144      case TraceType.WM_TRANSITION:
145        return 'Must also upload a shell transitions trace to visualize transitions.';
146      case TraceType.SHELL_TRANSITION:
147        return 'Must also upload a wm transitions trace to visualize transitions.';
148      case TraceType.EVENT_LOG:
149        return 'Uploaded file does not contain CUJs. Only CUJ visualization is supported in Winscope.';
150      default:
151        return 'Visualization for this trace is not supported in Winscope.';
152    }
153  }
154
155  private static findIndexInOrder(
156    traceType: TraceType,
157    order: TraceType[],
158  ): number {
159    return order.findIndex((type) => {
160      return type === traceType;
161    });
162  }
163}
164