1/* 2 * Copyright (C) 2024 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 {LayerFlag} from 'parsers/surface_flinger/layer_flag'; 18import {formatAsHex} from 'trace/tree_node/formatters'; 19import {AddOperation} from 'trace/tree_node/operations/add_operation'; 20import {PropertyTreeNode} from 'trace/tree_node/property_tree_node'; 21import {DEFAULT_PROPERTY_TREE_NODE_FACTORY} from 'trace/tree_node/property_tree_node_factory'; 22 23export class AddVerboseFlags extends AddOperation<PropertyTreeNode> { 24 protected override makeProperties( 25 value: PropertyTreeNode, 26 ): PropertyTreeNode[] { 27 const flags = value.getChildByName('flags')?.getValue(); 28 if (value.getChildByName('verboseFlags') || flags === undefined) return []; 29 30 const tokens: Array<string | LayerFlag> = []; 31 const verboseFlags = Object.keys(LayerFlag).filter((flag) => 32 isNaN(Number(flag)), 33 ); 34 const intFlags = Object.keys(LayerFlag).filter( 35 (flag) => !isNaN(Number(flag)), 36 ); 37 38 intFlags.forEach((intFlag, index) => { 39 if ((Number(intFlag) & flags) !== 0) { 40 tokens.push(verboseFlags[index]); 41 } 42 }); 43 44 let verboseFlagsStr = ''; 45 if (tokens.length > 0) { 46 verboseFlagsStr = `${tokens.join(' | ')} (${formatAsHex(flags)})`; 47 } 48 49 return [ 50 DEFAULT_PROPERTY_TREE_NODE_FACTORY.makeCalculatedProperty( 51 value.id, 52 'verboseFlags', 53 verboseFlagsStr, 54 ), 55 ]; 56 } 57} 58