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