From c84155243aef72790c798f71e8673994fe50cf7f Mon Sep 17 00:00:00 2001 From: Nataniel Borges Date: Fri, 23 Apr 2021 15:05:54 +0200 Subject: [PATCH] 5/ Show Flicker properties on Winscope (WM) - Use flicker object on the property tree - Keep `proto` entry on the property tree with the original proto file - Use `prettyPrint` method on flicker to format output for winscope Bug: 185516271 Test: build winscope and open WM traces Change-Id: I1c9f1a106b82f487b78d1b386cc091d21715e04d --- tools/winscope/src/TraceView.vue | 40 +--- .../src/flickerlib/ObjectFormatter.ts | 188 +++++++++++++++++- .../src/flickerlib/WindowManagerState.ts | 10 +- tools/winscope/src/flickerlib/common.js | 87 +++++++- tools/winscope/src/flickerlib/mixin.ts | 27 ++- .../src/flickerlib/windows/Activity.ts | 4 +- .../src/flickerlib/windows/ActivityTask.ts | 4 +- .../src/flickerlib/windows/DisplayArea.ts | 4 +- .../src/flickerlib/windows/DisplayContent.ts | 4 +- .../src/flickerlib/windows/WindowContainer.ts | 4 +- .../src/flickerlib/windows/WindowState.ts | 8 +- .../src/flickerlib/windows/WindowToken.ts | 4 +- tools/winscope/src/transform.js | 54 ----- 13 files changed, 302 insertions(+), 136 deletions(-) diff --git a/tools/winscope/src/TraceView.vue b/tools/winscope/src/TraceView.vue index 65dc0e095..0c38783ac 100644 --- a/tools/winscope/src/TraceView.vue +++ b/tools/winscope/src/TraceView.vue @@ -120,49 +120,13 @@ import PropertiesTreeElement from './PropertiesTreeElement.vue'; import {ObjectTransformer} from './transform.js'; import {DiffGenerator, defaultModifiedCheck} from './utils/diff.js'; -// eslint-disable-next-line camelcase -import {format_transform_type, is_simple_transform} from './matrix_utils.js'; import {TRACE_TYPES, DUMP_TYPES} from './decode.js'; import {stableIdCompatibilityFixup} from './utils/utils.js'; import {CompatibleFeatures} from './utils/compatibility.js'; -function formatColorTransform(vals) { - const fixedVals = vals.map((v) => v.toFixed(1)); - let formatted = ``; - for (let i = 0; i < fixedVals.length; i += 4) { - formatted += `[`; - formatted += fixedVals.slice(i, i + 4).join(', '); - formatted += `] `; - } - return formatted; -} - function formatProto(obj) { - if (!obj || !obj.$type) { - return; - } - if (obj.$type.name === 'RectProto') { - return `(${obj.left}, ${obj.top}) - (${obj.right}, ${obj.bottom})`; - } else if (obj.$type.name === 'FloatRectProto') { - return `(${obj.left.toFixed(3)}, ${obj.top.toFixed(3)}) - ` + - `(${obj.right.toFixed(3)}, ${obj.bottom.toFixed(3)})`; - } else if (obj.$type.name === 'PositionProto') { - return `(${obj.x.toFixed(3)}, ${obj.y.toFixed(3)})`; - } else if (obj.$type.name === 'SizeProto') { - return `${obj.w} x ${obj.h}`; - } else if (obj.$type.name === 'ColorProto') { - return `r:${obj.r} g:${obj.g} \n b:${obj.b} a:${obj.a}`; - } else if (obj.$type.name === 'TransformProto') { - const transformType = format_transform_type(obj); - if (is_simple_transform(obj)) { - return `${transformType}`; - } - return `${transformType} dsdx:${obj.dsdx.toFixed(3)} ` + - `dtdx:${obj.dtdx.toFixed(3)} dsdy:${obj.dsdy.toFixed(3)} ` + - `dtdy:${obj.dtdy.toFixed(3)}`; - } else if (obj.$type.name === 'ColorTransformProto') { - const formated = formatColorTransform(obj.val); - return `${formated}`; + if (obj?.prettyPrint) { + return obj.prettyPrint(); } } diff --git a/tools/winscope/src/flickerlib/ObjectFormatter.ts b/tools/winscope/src/flickerlib/ObjectFormatter.ts index 5bbf7cc51..98f078d06 100644 --- a/tools/winscope/src/flickerlib/ObjectFormatter.ts +++ b/tools/winscope/src/flickerlib/ObjectFormatter.ts @@ -14,24 +14,196 @@ * limitations under the License. */ +import {toBounds, toBuffer, toColor, toPoint, toRect, + toRectF, toRegion, toTransform} from './common'; +import intDefMapping from + '../../../../../prebuilts/misc/common/winscope/intDefMapping.json'; + export default class ObjectFormatter { + private static INVALID_ELEMENT_PROPERTIES = ['length', 'name', 'prototype', 'children', + 'childrenWindows', 'ref', 'root', 'layers', 'resolvedChildren'] + + private static FLICKER_INTDEF_MAP = new Map([ + [`WindowLayoutParams.type`, `android.view.WindowManager.LayoutParams.WindowType`], + [`WindowLayoutParams.flags`, `android.view.WindowManager.LayoutParams.Flags`], + [`WindowLayoutParams.privateFlags`, `android.view.WindowManager.LayoutParams.PrivateFlags`], + [`WindowLayoutParams.gravity`, `android.view.Gravity.GravityFlags`], + [`WindowLayoutParams.softInputMode`, `android.view.WindowManager.LayoutParams.WindowType`], + [`WindowLayoutParams.systemUiVisibilityFlags`, `android.view.WindowManager.LayoutParams.SystemUiVisibilityFlags`], + [`WindowLayoutParams.subtreeSystemUiVisibilityFlags`, `android.view.WindowManager.LayoutParams.SystemUiVisibilityFlags`], + [`WindowLayoutParams.behavior`, `android.view.WindowInsetsController.Behavior`], + [`WindowLayoutParams.fitInsetsSides`, `android.view.WindowInsets.Side.InsetsSide`], + + [`Configuration.windowingMode`, `android.app.WindowConfiguration.WindowingMode`], + [`WindowConfiguration.windowingMode`, `android.app.WindowConfiguration.WindowingMode`], + [`Configuration.orientation`, `android.content.pm.ActivityInfo.ScreenOrientation`], + [`WindowConfiguration.orientation`, `android.content.pm.ActivityInfo.ScreenOrientation`], + [`WindowState.orientation`, `android.content.pm.ActivityInfo.ScreenOrientation`], + ]) + static format(obj: any): {} { const entries = Object.entries(obj) + .filter(it => !it[0].includes(`$`)) + .filter(it => !this.INVALID_ELEMENT_PROPERTIES.includes(it[0])) const sortedEntries = entries.sort() const result: any = {} sortedEntries.forEach(entry => { const key = entry[0] - const value = entry[1] - if (value && typeof(value) == `object`) { - result[key] = this.format(value) - } else { - result[key] = value + const value: any = entry[1] + + if (value) { + // flicker obj + if (value.prettyPrint) { + result[key] = value.prettyPrint() + } else { + // converted proto to flicker + const translatedObject = this.translateObject(value) + if (translatedObject) { + result[key] = translatedObject.prettyPrint() + // objects - recursive call + } else if (value && typeof(value) == `object`) { + result[key] = this.format(value) + } else { + // values + result[key] = this.translateIntDef(obj, key, value) + } + } + } }) - // Reassign prototype to ensure formatters work - result.__proto__ = obj.__proto__ - return result + return Object.freeze(result) } + + /** + * Translate some predetermined proto objects into their flicker equivalent + * + * Returns null if the object cannot be translated + * + * @param obj Object to translate + */ + private static translateObject(obj) { + const type = obj?.$type?.name + switch(type) { + case `SizeProto`: return toBounds(obj) + case `ActiveBufferProto`: return toBuffer(obj) + case `ColorProto`: return toColor(obj) + case `PointProto`: return toPoint(obj) + case `RectProto`: return toRect(obj) + case `FloatRectProto`: return toRectF(obj) + case `RegionProto`: return toRegion(obj) + case `TransformProto`: return toTransform(obj) + case 'ColorTransformProto': { + const formatted = this.formatColorTransform(obj.val); + return `${formatted}`; + } + } + + return null + } + + private static formatColorTransform(vals) { + const fixedVals = vals.map((v) => v.toFixed(1)); + let formatted = ``; + for (let i = 0; i < fixedVals.length; i += 4) { + formatted += `[`; + formatted += fixedVals.slice(i, i + 4).join(', '); + formatted += `] `; + } + return formatted; + } + + /** + * Obtains from the proto field, the metadata related to the typedef type (if any) + * + * @param obj Proto object + * @param propertyName Property to search + */ + private static getTypeDefSpec(obj: any, propertyName: string): string { + const fields = obj?.$type?.fields + if (!fields) { + return null + } + + const options = fields[propertyName]?.options + if (!options) { + return null + } + + return options["(.android.typedef)"] + } + + /** + * Translate intdef properties into their string representation + * + * For proto objects check the + * + * @param parentObj Object containing the value to parse + * @param propertyName Property to search + * @param value Property value + */ + private static translateIntDef(parentObj: any, propertyName: string, value: any): string { + const parentClassName = parentObj.constructor.name + const propertyPath = `${parentClassName}.${propertyName}` + + let translatedValue = value + // Parse Flicker objects (no intdef annotation supported) + if (this.FLICKER_INTDEF_MAP.has(propertyPath)) { + translatedValue = this.getIntFlagsAsStrings(value, + this.FLICKER_INTDEF_MAP.get(propertyPath)) + } else { + // If it's a proto, search on the proto definition for the intdef type + const typeDefSpec = this.getTypeDefSpec(parentObj, propertyName) + if (typeDefSpec) { + translatedValue = this.getIntFlagsAsStrings(value, typeDefSpec) + } + } + + return translatedValue + } + + /** + * Translate a property from its numerical value into its string representation + * + * @param intFlags Property value + * @param annotationType IntDef type to use + */ + private static getIntFlagsAsStrings(intFlags: any, annotationType: string) { + const flags = []; + + const mapping = intDefMapping[annotationType].values; + const knownFlagValues = Object.keys(mapping).reverse().map(x => parseInt(x)); + + if (mapping.length == 0) { + console.warn("No mapping for type", annotationType) + return intFlags + "" + } + + // Will only contain bits that have not been associated with a flag. + const parsedIntFlags = parseInt(intFlags); + let leftOver = parsedIntFlags; + + for (const flagValue of knownFlagValues) { + if (((leftOver & flagValue) && ((intFlags & flagValue) === flagValue)) + || (parsedIntFlags === 0 && flagValue === 0)) { + flags.push(mapping[flagValue]); + + leftOver = leftOver & ~flagValue; + } + } + + if (flags.length === 0) { + console.error('No valid flag mappings found for ', + intFlags, 'of type', annotationType); + } + + if (leftOver) { + // If 0 is a valid flag value that isn't in the intDefMapping + // it will be ignored + flags.push(leftOver); + } + + return flags.join(' | '); + } } \ No newline at end of file diff --git a/tools/winscope/src/flickerlib/WindowManagerState.ts b/tools/winscope/src/flickerlib/WindowManagerState.ts index 429f10db7..0537e71ee 100644 --- a/tools/winscope/src/flickerlib/WindowManagerState.ts +++ b/tools/winscope/src/flickerlib/WindowManagerState.ts @@ -15,8 +15,7 @@ */ import { asRawTreeViewObject } from '../utils/diff.js' -import { nanosToString, TimeUnits } from "../utils/utils.js" -import { getWMPropertiesForDisplay } from './mixin' +import { getPropertiesForDisplay } from './mixin' import { KeyguardControllerState, @@ -52,11 +51,10 @@ WindowManagerState.fromProto = function ({proto, timestamp = 0, where = ""}): Wi entry.kind = entry.constructor.name entry.rects = entry.windowStates.reverse().map(it => it.rect) - entry.obj = getWMPropertiesForDisplay(proto) - entry.obj["isComplete"] = entry.isComplete() - if (!entry.obj.isComplete) { - entry.obj["isIncompleteReason"] = entry.getIsIncompleteReason() + if (!entry.isComplete()) { + entry.isIncompleteReason = entry.getIsIncompleteReason() } + entry.obj = getPropertiesForDisplay(proto, entry) entry.shortName = entry.name entry.chips = [] entry.visible = true diff --git a/tools/winscope/src/flickerlib/common.js b/tools/winscope/src/flickerlib/common.js index d69299ffc..7e329f18e 100644 --- a/tools/winscope/src/flickerlib/common.js +++ b/tools/winscope/src/flickerlib/common.js @@ -51,14 +51,81 @@ const WindowState = require('flicker').com.android.server.wm.traces.common. const WindowToken = require('flicker').com.android.server.wm.traces.common. windowmanager.windows.WindowToken; -const Rect = require('flicker').com.android.server.wm.traces.common.Rect; +const Matrix = require('flicker').com.android.server.wm.traces.common.layers.Transform.Matrix; +const Transform = require('flicker').com.android.server.wm.traces.common.layers.Transform; + const Bounds = require('flicker').com.android.server.wm.traces.common.Bounds; +const Buffer = require('flicker').com.android.server.wm.traces.common.Buffer; +const Color = require('flicker').com.android.server.wm.traces.common.Color; +const Point = require('flicker').com.android.server.wm.traces.common.Point; +const Rect = require('flicker').com.android.server.wm.traces.common.Rect; +const RectF = require('flicker').com.android.server.wm.traces.common.RectF; +const Region = require('flicker').com.android.server.wm.traces.common.Region; + +function toBounds(proto) { + if (proto == null) { + return null + } + return new Bounds(proto.width ?? proto.w ?? 0, proto.height ?? proto.h ?? 0) +} + +function toBuffer(proto) { + if (proto == null) { + return null + } + return new Buffer(proto.width ?? 0, proto.height ?? 0, proto.stride ?? 0, proto.format ?? 0) +} + +function toColor(proto) { + if (proto == null) { + return null + } + return new Color(proto.r ?? 0, proto.g ?? 0, proto.b ?? 0, proto.a ?? 0) +} + +function toPoint(proto) { + if (proto == null) { + return null + } + return new Point(proto.x ?? 0, proto.y ?? 0) +} function toRect(proto) { if (proto == null) { return null } - return new Rect(proto.left, proto.top, proto.right, proto.bottom) + return new Rect(proto.left ?? 0, proto.top ?? 0, proto.right ?? 0, proto.bottom ?? 0) +} + +function toRectF(proto) { + if (proto == null) { + return null + } + return new RectF(proto.left ?? 0, proto.top ?? 0, proto.right ?? 0, proto.bottom ?? 0) +} + +function toRegion(proto) { + if (proto == null) { + return null + } + + let rects = [] + for (let rectNr in proto.rect) { + const rect = proto.rect[rectNr] + const parsedRect = toRect(rect) + rects.push(parsedRect) + } + + return new Region(rects) +} + +function toTransform(proto) { + if (proto == null) { + return null + } + const matrix = new Matrix(proto.dsdx ?? 0, proto.dtdx ?? 0, + proto.tx ?? 0, proto.dsdy ?? 0, proto.dtdy ?? 0, proto.ty ?? 0) + return new Transform(proto.type ?? 0, matrix) } export { @@ -78,7 +145,19 @@ export { WindowManagerPolicy, WindowManagerTrace, WindowManagerState, - Rect, Bounds, - toRect + Buffer, + Color, + Point, + Rect, + RectF, + Region, + toBounds, + toBuffer, + toColor, + toPoint, + toRect, + toRectF, + toRegion, + toTransform }; diff --git a/tools/winscope/src/flickerlib/mixin.ts b/tools/winscope/src/flickerlib/mixin.ts index 8c5844b0e..3672e1e41 100644 --- a/tools/winscope/src/flickerlib/mixin.ts +++ b/tools/winscope/src/flickerlib/mixin.ts @@ -22,18 +22,23 @@ import ObjectFormatter from "./ObjectFormatter" * @param entry WM hierarchy element * @param proto Associated proto object */ -export function getWMPropertiesForDisplay(proto: any): any { - const obj = Object.assign({}, proto) +export function getPropertiesForDisplay(proto: any, entry: any): any { + let obj = Object.assign({}, entry) if (obj.children) delete obj.children - if (obj.childWindows) delete obj.childWindows - if (obj.childrenWindows) delete obj.childrenWindows - if (obj.childContainers) delete obj.childContainers - if (obj.windowToken) delete obj.windowToken - if (obj.rootDisplayArea) delete obj.rootDisplayArea - if (obj.rootWindowContainer) delete obj.rootWindowContainer - if (obj.windowContainer?.children) delete obj.windowContainer.children + // obj = ObjectFormatter.format(obj) - return ObjectFormatter.format(obj) + obj.proto = Object.assign({}, proto) + if (obj.proto.children) delete obj.proto.children + if (obj.proto.childWindows) delete obj.proto.childWindows + if (obj.proto.childrenWindows) delete obj.proto.childrenWindows + if (obj.proto.childContainers) delete obj.proto.childContainers + if (obj.proto.windowToken) delete obj.proto.windowToken + if (obj.proto.rootDisplayArea) delete obj.proto.rootDisplayArea + if (obj.proto.rootWindowContainer) delete obj.proto.rootWindowContainer + if (obj.proto.windowContainer?.children) delete obj.proto.windowContainer.children + obj = ObjectFormatter.format(obj) + + return obj } export function shortenName(name: any): string { @@ -43,4 +48,4 @@ export function shortenName(name: any): string { } const className = classParts.slice(-1)[0] // last element return `${classParts[0]}.${classParts[1]}.(...).${className}` -} \ No newline at end of file +} diff --git a/tools/winscope/src/flickerlib/windows/Activity.ts b/tools/winscope/src/flickerlib/windows/Activity.ts index 01cf7aec9..6192c67c1 100644 --- a/tools/winscope/src/flickerlib/windows/Activity.ts +++ b/tools/winscope/src/flickerlib/windows/Activity.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { getWMPropertiesForDisplay, shortenName } from '../mixin' +import { getPropertiesForDisplay, shortenName } from '../mixin' import { asRawTreeViewObject } from '../../utils/diff.js' import { Activity } from "../common" import WindowContainer from "./WindowContainer" @@ -41,7 +41,7 @@ Activity.fromProto = function (proto): Activity { windowContainer ) - entry.obj = getWMPropertiesForDisplay(proto) + entry.obj = getPropertiesForDisplay(proto, entry) entry.kind = entry.constructor.name entry.shortName = shortenName(entry.name) entry.rawTreeViewObject = asRawTreeViewObject(entry) diff --git a/tools/winscope/src/flickerlib/windows/ActivityTask.ts b/tools/winscope/src/flickerlib/windows/ActivityTask.ts index acda9f388..b29aa793a 100644 --- a/tools/winscope/src/flickerlib/windows/ActivityTask.ts +++ b/tools/winscope/src/flickerlib/windows/ActivityTask.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { getWMPropertiesForDisplay, shortenName } from '../mixin' +import { getPropertiesForDisplay, shortenName } from '../mixin' import { asRawTreeViewObject } from '../../utils/diff.js' import { ActivityTask, toRect } from "../common" import WindowContainer from "./WindowContainer" @@ -52,7 +52,7 @@ ActivityTask.fromProto = function (proto, isActivityInTree: Boolean): ActivityTa windowContainer ) - entry.obj = getWMPropertiesForDisplay(proto) + entry.obj = getPropertiesForDisplay(proto, entry) entry.kind = entry.constructor.name entry.shortName = shortenName(entry.name) entry.rawTreeViewObject = asRawTreeViewObject(entry) diff --git a/tools/winscope/src/flickerlib/windows/DisplayArea.ts b/tools/winscope/src/flickerlib/windows/DisplayArea.ts index 26336f2c8..e992f426d 100644 --- a/tools/winscope/src/flickerlib/windows/DisplayArea.ts +++ b/tools/winscope/src/flickerlib/windows/DisplayArea.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { getWMPropertiesForDisplay, shortenName } from '../mixin' +import { getPropertiesForDisplay, shortenName } from '../mixin' import { asRawTreeViewObject } from '../../utils/diff.js' import { DisplayArea } from "../common" import WindowContainer from "./WindowContainer" @@ -33,7 +33,7 @@ DisplayArea.fromProto = function (proto, isActivityInTree: Boolean): DisplayArea } const entry = new DisplayArea(proto.isTaskDisplayArea, windowContainer) - entry.obj = getWMPropertiesForDisplay(proto) + entry.obj = getPropertiesForDisplay(proto, entry) entry.kind = entry.constructor.name entry.shortName = shortenName(entry.name) entry.rawTreeViewObject = asRawTreeViewObject(entry) diff --git a/tools/winscope/src/flickerlib/windows/DisplayContent.ts b/tools/winscope/src/flickerlib/windows/DisplayContent.ts index fad22f2e2..41efb1ee5 100644 --- a/tools/winscope/src/flickerlib/windows/DisplayContent.ts +++ b/tools/winscope/src/flickerlib/windows/DisplayContent.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { getWMPropertiesForDisplay, shortenName } from '../mixin' +import { getPropertiesForDisplay, shortenName } from '../mixin' import { asRawTreeViewObject } from '../../utils/diff.js' import { toRect, DisplayContent, Rect } from "../common" import WindowContainer from "./WindowContainer" @@ -61,7 +61,7 @@ DisplayContent.fromProto = function (proto, isActivityInTree: Boolean): DisplayC windowContainer ) - entry.obj = getWMPropertiesForDisplay(proto) + entry.obj = getPropertiesForDisplay(proto, entry) entry.kind = entry.constructor.name entry.shortName = shortenName(entry.name) entry.rawTreeViewObject = asRawTreeViewObject(entry) diff --git a/tools/winscope/src/flickerlib/windows/WindowContainer.ts b/tools/winscope/src/flickerlib/windows/WindowContainer.ts index c0ab48455..756494573 100644 --- a/tools/winscope/src/flickerlib/windows/WindowContainer.ts +++ b/tools/winscope/src/flickerlib/windows/WindowContainer.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { getWMPropertiesForDisplay, shortenName } from '../mixin' +import { getPropertiesForDisplay, shortenName } from '../mixin' import { asRawTreeViewObject } from '../../utils/diff.js' import { @@ -60,7 +60,7 @@ WindowContainer.fromProto = function ({ // we remove the children property from the object to avoid it showing the // the properties view of the element as we can always see those elements' // properties by changing the target element in the hierarchy tree view. - entry.obj = getWMPropertiesForDisplay(proto) + entry.obj = getPropertiesForDisplay(proto, entry) entry.kind = entry.constructor.name entry.shortName = shortenName(entry.name) entry.rawTreeViewObject = asRawTreeViewObject(entry) diff --git a/tools/winscope/src/flickerlib/windows/WindowState.ts b/tools/winscope/src/flickerlib/windows/WindowState.ts index 4c6ef1b5a..d2eb5655e 100644 --- a/tools/winscope/src/flickerlib/windows/WindowState.ts +++ b/tools/winscope/src/flickerlib/windows/WindowState.ts @@ -14,9 +14,9 @@ * limitations under the License. */ -import { getWMPropertiesForDisplay, shortenName } from '../mixin' +import { getPropertiesForDisplay, shortenName } from '../mixin' import { asRawTreeViewObject } from '../../utils/diff.js' -import { toRect, WindowState, WindowLayoutParams } from "../common" +import { toRect, Bounds, WindowState, WindowLayoutParams } from "../common" import { VISIBLE_CHIP } from '../treeview/Chips' import WindowContainer from "./WindowContainer" @@ -62,6 +62,8 @@ import WindowContainer from "./WindowContainer" proto.animator?.surface?.layer ?? 0, proto.animator?.surface?.shown ?? false, windowType, + new Bounds(proto.requestedWidth, proto.requestedHeight), + toRect(proto.surfacePosition), toRect(proto.windowFrames?.frame ?? null), toRect(proto.windowFrames?.containingFrame ?? null), toRect(proto.windowFrames?.parentFrame ?? null), @@ -75,10 +77,10 @@ import WindowContainer from "./WindowContainer" ) entry.kind = entry.constructor.name - entry.obj = getWMPropertiesForDisplay(proto) entry.rect = entry.frame entry.rect.ref = entry entry.rect.label = entry.name + entry.obj = getPropertiesForDisplay(proto, entry) entry.shortName = shortenName(entry.name) entry.visible = entry.isVisible ?? false entry.chips = entry.isVisible ? [VISIBLE_CHIP] : [] diff --git a/tools/winscope/src/flickerlib/windows/WindowToken.ts b/tools/winscope/src/flickerlib/windows/WindowToken.ts index 9d1465316..edc57dd05 100644 --- a/tools/winscope/src/flickerlib/windows/WindowToken.ts +++ b/tools/winscope/src/flickerlib/windows/WindowToken.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { getWMPropertiesForDisplay, shortenName } from '../mixin' +import { getPropertiesForDisplay, shortenName } from '../mixin' import { asRawTreeViewObject } from '../../utils/diff.js' import { WindowToken } from "../common" import WindowContainer from "./WindowContainer" @@ -34,7 +34,7 @@ WindowToken.fromProto = function (proto, isActivityInTree: Boolean): WindowToken } const entry = new WindowToken(windowContainer) entry.kind = entry.constructor.name - entry.obj = getWMPropertiesForDisplay(proto) + entry.obj = getPropertiesForDisplay(proto, entry) entry.shortName = shortenName(entry.name) entry.rawTreeViewObject = asRawTreeViewObject(entry) diff --git a/tools/winscope/src/transform.js b/tools/winscope/src/transform.js index 0f1c02642..f944ecbc8 100644 --- a/tools/winscope/src/transform.js +++ b/tools/winscope/src/transform.js @@ -15,8 +15,6 @@ */ import {DiffType} from './utils/diff.js'; -import intDefMapping from - '../../../../prebuilts/misc/common/winscope/intDefMapping.json'; // kind - a type used for categorization of different levels // name - name of the node @@ -339,20 +337,6 @@ class ObjectTransformer { fieldOptionsToUse = compareWithFieldOptions; } } - - const annotationType = fieldOptionsToUse?.['(.android.typedef)']; - if (annotationType) { - if (intDefMapping[annotationType] === undefined) { - console.error( - `Missing intDef mapping for translation for ${annotationType}`); - } else if (intDefMapping[annotationType].flag) { - transformedObj.name = `${getIntFlagsAsStrings( - transformedObj.name, annotationType)} (${transformedObj.name})`; - } else { - transformedObj.name = `${intDefMapping[annotationType] - .values[transformedObj.name]} (${transformedObj.name})`; - } - } } if (transformOptions.keepOriginal) { @@ -368,44 +352,6 @@ class ObjectTransformer { } } -function getIntFlagsAsStrings(intFlags, annotationType) { - const flags = []; - - const mapping = intDefMapping[annotationType].values; - const knownFlagValues = Object.keys(mapping).reverse().map(x => parseInt(x)); - - if (mapping.length == 0) { - console.warn("No mapping for type", annotationType) - return intFlags + "" - } - - // Will only contain bits that have not been associated with a flag. - const parsedIntFlags = parseInt(intFlags); - let leftOver = parsedIntFlags; - - for (const flagValue of knownFlagValues) { - if (((leftOver & flagValue) && ((intFlags & flagValue) === flagValue)) - || (parsedIntFlags === 0 && flagValue === 0)) { - flags.push(mapping[flagValue]); - - leftOver = leftOver & ~flagValue; - } - } - - if (flags.length === 0) { - console.error('No valid flag mappings found for ', - intFlags, 'of type', annotationType); - } - - if (leftOver) { - // If 0 is a valid flag value that isn't in the intDefMapping - // it will be ignored - flags.push(leftOver); - } - - return flags.join(' | '); -} - // eslint-disable-next-line camelcase function nanos_to_string(elapsedRealtimeNanos) { const units = [