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