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