diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-06-10 01:05:46 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-06-10 01:05:46 +0000 |
commit | c5c12a2e9405bda9fec72509b613fe2b64c483de (patch) | |
tree | 58865261f0b295a9c10e392dbebec87f2b7702fb | |
parent | 46d71ab11bc7abc7235dc5bd2babf5c832433c1a (diff) | |
parent | 89570faf2c88e0c217131443f8e11a705e159624 (diff) | |
download | development-c5c12a2e9405bda9fec72509b613fe2b64c483de.tar.gz |
Snap for 10296977 from 89570faf2c88e0c217131443f8e11a705e159624 to udc-releaseandroid-vts-14.0_r1android-security-14.0.0_r1android-cts-14.0_r1
Change-Id: Ie7022526b703ff9d96658f2d95aaaff9a36788b6
7 files changed, 138 insertions, 29 deletions
diff --git a/tools/winscope/src/viewers/viewer_transactions/events.ts b/tools/winscope/src/viewers/viewer_transactions/events.ts index 3e108a5e7..913630e8b 100644 --- a/tools/winscope/src/viewers/viewer_transactions/events.ts +++ b/tools/winscope/src/viewers/viewer_transactions/events.ts @@ -19,9 +19,10 @@ class Events { static PidFilterChanged = 'ViewerTransactionsEvent_PidFilterChanged'; static UidFilterChanged = 'ViewerTransactionsEvent_UidFilterChanged'; static TypeFilterChanged = 'ViewerTransactionsEvent_TypeFilterChanged'; - static IdFilterChanged = 'ViewerTransactionsEvent_IdFilterChanged'; + static LayerIdFilterChanged = 'ViewerTransactionsEvent_LayerIdFilterChanged'; static WhatSearchStringChanged = 'ViewerTransactionsEvent_WhatSearchStringChanged'; static EntryClicked = 'ViewerTransactionsEvent_EntryClicked'; + static IdFilterChanges = 'ViewerTransactionsEvent_IdFilterChanged'; } export {Events}; diff --git a/tools/winscope/src/viewers/viewer_transactions/presenter.ts b/tools/winscope/src/viewers/viewer_transactions/presenter.ts index 4ffae6a19..d4a091086 100644 --- a/tools/winscope/src/viewers/viewer_transactions/presenter.ts +++ b/tools/winscope/src/viewers/viewer_transactions/presenter.ts @@ -38,7 +38,8 @@ export class Presenter { private pidFilter: string[] = []; private uidFilter: string[] = []; private typeFilter: string[] = []; - private idFilter: string[] = []; + private layerIdFilter: string[] = []; + private idFilter: string | undefined = undefined; private whatSearchString = ''; constructor(traces: Traces, notifyUiDataCallback: (data: UiData) => void) { @@ -88,8 +89,18 @@ export class Presenter { this.notifyUiDataCallback(this.uiData); } - onIdFilterChanged(ids: string[]) { - this.idFilter = ids; + onLayerIdFilterChanged(ids: string[]) { + this.layerIdFilter = ids; + this.computeUiData(); + this.notifyUiDataCallback(this.uiData); + } + + onIdFilterChanged(id: string) { + if (id === '') { + this.idFilter = undefined; + } else { + this.idFilter = id; + } this.computeUiData(); this.notifyUiDataCallback(this.uiData); } @@ -127,7 +138,14 @@ export class Presenter { const allPids = this.getUniqueUiDataEntryValues(entries, (entry: UiDataEntry) => entry.pid); const allUids = this.getUniqueUiDataEntryValues(entries, (entry: UiDataEntry) => entry.uid); const allTypes = this.getUniqueUiDataEntryValues(entries, (entry: UiDataEntry) => entry.type); - const allIds = this.getUniqueUiDataEntryValues(entries, (entry: UiDataEntry) => entry.id); + const allLayerAndDisplayIds = this.getUniqueUiDataEntryValues( + entries, + (entry: UiDataEntry) => entry.layerOrDisplayId + ); + const allTransactionIds = this.getUniqueUiDataEntryValues( + entries, + (entry: UiDataEntry) => entry.transactionId + ); let filteredEntries = entries; @@ -149,8 +167,15 @@ export class Presenter { filteredEntries = filteredEntries.filter((entry) => this.typeFilter.includes(entry.type)); } - if (this.idFilter.length > 0) { - filteredEntries = filteredEntries.filter((entry) => this.idFilter.includes(entry.id)); + if (this.layerIdFilter.length > 0) { + filteredEntries = filteredEntries.filter((entry) => + this.layerIdFilter.includes(entry.layerOrDisplayId) + ); + } + if (this.idFilter !== undefined) { + filteredEntries = filteredEntries.filter( + (entry) => entry.transactionId.toString() === this.idFilter + ); } filteredEntries = filteredEntries.filter((entry) => entry.what.includes(this.whatSearchString)); @@ -172,7 +197,8 @@ export class Presenter { allPids, allUids, allTypes, - allIds, + allLayerAndDisplayIds, + allTransactionIds, filteredEntries, currentEntryIndex, selectedEntryIndex, @@ -234,6 +260,7 @@ export class Presenter { transactionStateProto.uid.toString(), UiDataEntryType.LAYER_CHANGED, layerStateProto.layerId.toString(), + transactionStateProto.transactionId.toString(), layerStateProto.what, treeGenerator.generate('LayerState', ObjectFormatter.format(layerStateProto)) ) @@ -250,11 +277,32 @@ export class Presenter { transactionStateProto.uid.toString(), UiDataEntryType.DISPLAY_CHANGED, displayStateProto.id.toString(), + transactionStateProto.transactionId.toString(), displayStateProto.what, treeGenerator.generate('DisplayState', ObjectFormatter.format(displayStateProto)) ) ); } + + if ( + transactionStateProto.layerChanges.length === 0 && + transactionStateProto.displayChanges.length === 0 + ) { + entries.push( + new UiDataEntry( + originalIndex, + TimeUtils.format(entry.getTimestamp()), + Number(entryProto.vsyncId), + transactionStateProto.pid.toString(), + transactionStateProto.uid.toString(), + UiDataEntryType.NO_OP, + '', + transactionStateProto.transactionId.toString(), + '', + {} + ) + ); + } } for (const layerCreationArgsProto of entryProto.addedLayers) { @@ -268,6 +316,7 @@ export class Presenter { UiDataEntryType.LAYER_ADDED, layerCreationArgsProto.layerId.toString(), '', + '', treeGenerator.generate( 'LayerCreationArgs', ObjectFormatter.format(layerCreationArgsProto) @@ -287,6 +336,7 @@ export class Presenter { UiDataEntryType.LAYER_DESTROYED, destroyedLayerId.toString(), '', + '', treeGenerator.generate('DestroyedLayerId', ObjectFormatter.format(destroyedLayerId)) ) ); @@ -302,6 +352,7 @@ export class Presenter { Presenter.VALUE_NA, UiDataEntryType.DISPLAY_ADDED, displayStateProto.id.toString(), + '', displayStateProto.what, treeGenerator.generate('DisplayState', ObjectFormatter.format(displayStateProto)) ) @@ -319,6 +370,7 @@ export class Presenter { UiDataEntryType.DISPLAY_REMOVED, removedDisplayId.toString(), '', + '', treeGenerator.generate('RemovedDisplayId', ObjectFormatter.format(removedDisplayId)) ) ); @@ -335,6 +387,7 @@ export class Presenter { UiDataEntryType.LAYER_HANDLE_DESTROYED, destroyedLayerHandleId.toString(), '', + '', treeGenerator.generate( 'DestroyedLayerHandleId', ObjectFormatter.format(destroyedLayerHandleId) diff --git a/tools/winscope/src/viewers/viewer_transactions/presenter_test.ts b/tools/winscope/src/viewers/viewer_transactions/presenter_test.ts index 2559f9be4..7ea260ef3 100644 --- a/tools/winscope/src/viewers/viewer_transactions/presenter_test.ts +++ b/tools/winscope/src/viewers/viewer_transactions/presenter_test.ts @@ -32,7 +32,7 @@ describe('PresenterTransactions', () => { let traces: Traces; let presenter: Presenter; let outputUiData: undefined | UiData; - const TOTAL_OUTPUT_ENTRIES = 1504; + const TOTAL_OUTPUT_ENTRIES = 1647; beforeAll(async () => { parser = await UnitTestUtils.getParser('traces/elapsed_and_real_timestamp/Transactions.pb'); @@ -75,8 +75,11 @@ describe('PresenterTransactions', () => { 'LAYER_CHANGED', 'LAYER_DESTROYED', 'LAYER_HANDLE_DESTROYED', + 'NO_OP', ]); - expect(outputUiData?.allIds.length).toEqual(116); + + expect(outputUiData?.allTransactionIds.length).toEqual(1295); + expect(outputUiData?.allLayerAndDisplayIds.length).toEqual(117); expect(outputUiData?.entries.length).toEqual(TOTAL_OUTPUT_ENTRIES); @@ -96,6 +99,16 @@ describe('PresenterTransactions', () => { expect(outputUiData!.scrollToIndex).toEqual(13); }); + it('filters entries according to transaction ID filter', () => { + presenter.onIdFilterChanged(''); + expect(outputUiData!.entries.length).toEqual(TOTAL_OUTPUT_ENTRIES); + + presenter.onIdFilterChanged('2211908157465'); + expect(new Set(outputUiData!.entries.map((entry) => entry.transactionId))).toEqual( + new Set(['2211908157465']) + ); + }); + it('filters entries according to VSYNC ID filter', () => { presenter.onVSyncIdFilterChanged([]); expect(outputUiData!.entries.length).toEqual(TOTAL_OUTPUT_ENTRIES); @@ -146,6 +159,7 @@ describe('PresenterTransactions', () => { UiDataEntryType.LAYER_CHANGED, UiDataEntryType.LAYER_DESTROYED, UiDataEntryType.LAYER_HANDLE_DESTROYED, + UiDataEntryType.NO_OP, ]) ); @@ -160,15 +174,34 @@ describe('PresenterTransactions', () => { ); }); - it('filters entries according to ID filter', () => { - presenter.onIdFilterChanged([]); - expect(new Set(outputUiData!.entries.map((entry) => entry.id)).size).toBeGreaterThan(20); + it('filters entries according to layer or display ID filter', () => { + presenter.onLayerIdFilterChanged([]); + expect( + new Set(outputUiData!.entries.map((entry) => entry.layerOrDisplayId)).size + ).toBeGreaterThan(20); - presenter.onIdFilterChanged(['1']); - expect(new Set(outputUiData!.entries.map((entry) => entry.id))).toEqual(new Set(['1'])); + presenter.onLayerIdFilterChanged(['1']); + expect(new Set(outputUiData!.entries.map((entry) => entry.layerOrDisplayId))).toEqual( + new Set(['1']) + ); + + presenter.onLayerIdFilterChanged(['1', '3']); + expect(new Set(outputUiData!.entries.map((entry) => entry.layerOrDisplayId))).toEqual( + new Set(['1', '3']) + ); + }); + + it('includes no op transitions', () => { + presenter.onTypeFilterChanged([UiDataEntryType.NO_OP]); + expect(new Set(outputUiData!.entries.map((entry) => entry.type))).toEqual( + new Set([UiDataEntryType.NO_OP]) + ); - presenter.onIdFilterChanged(['1', '3']); - expect(new Set(outputUiData!.entries.map((entry) => entry.id))).toEqual(new Set(['1', '3'])); + for (const entry of outputUiData!.entries) { + expect(entry.layerOrDisplayId).toEqual(''); + expect(entry.what).toEqual(''); + expect(entry.propertiesTree).toEqual({}); + } }); it('filters entries according to "what" search string', () => { diff --git a/tools/winscope/src/viewers/viewer_transactions/ui_data.ts b/tools/winscope/src/viewers/viewer_transactions/ui_data.ts index 7652b06b0..f61d86cdb 100644 --- a/tools/winscope/src/viewers/viewer_transactions/ui_data.ts +++ b/tools/winscope/src/viewers/viewer_transactions/ui_data.ts @@ -21,7 +21,8 @@ class UiData { public allPids: string[], public allUids: string[], public allTypes: string[], - public allIds: string[], + public allLayerAndDisplayIds: string[], + public allTransactionIds: string[], public entries: UiDataEntry[], public currentEntryIndex: undefined | number, public selectedEntryIndex: undefined | number, @@ -29,7 +30,7 @@ class UiData { public currentPropertiesTree: undefined | PropertiesTreeNode ) {} - static EMPTY = new UiData([], [], [], [], [], [], undefined, undefined, undefined, undefined); + static EMPTY = new UiData([], [], [], [], [], [], [], undefined, undefined, undefined, undefined); } class UiDataEntry { @@ -40,7 +41,8 @@ class UiDataEntry { public pid: string, public uid: string, public type: string, - public id: string, + public layerOrDisplayId: string, + public transactionId: string, public what: string, public propertiesTree?: PropertiesTreeNode ) {} @@ -54,6 +56,7 @@ class UiDataEntryType { static LAYER_DESTROYED = 'LAYER_DESTROYED'; static LAYER_CHANGED = 'LAYER_CHANGED'; static LAYER_HANDLE_DESTROYED = 'LAYER_HANDLE_DESTROYED'; + static NO_OP = 'NO_OP'; } export {UiData, UiDataEntry, UiDataEntryType}; diff --git a/tools/winscope/src/viewers/viewer_transactions/viewer_transactions.ts b/tools/winscope/src/viewers/viewer_transactions/viewer_transactions.ts index 2c83bc6f9..7548f29ac 100644 --- a/tools/winscope/src/viewers/viewer_transactions/viewer_transactions.ts +++ b/tools/winscope/src/viewers/viewer_transactions/viewer_transactions.ts @@ -46,14 +46,18 @@ class ViewerTransactions implements Viewer { this.presenter.onTypeFilterChanged((event as CustomEvent).detail); }); - this.htmlElement.addEventListener(Events.IdFilterChanged, (event) => { - this.presenter.onIdFilterChanged((event as CustomEvent).detail); + this.htmlElement.addEventListener(Events.LayerIdFilterChanged, (event) => { + this.presenter.onLayerIdFilterChanged((event as CustomEvent).detail); }); this.htmlElement.addEventListener(Events.WhatSearchStringChanged, (event) => { this.presenter.onWhatSearchStringChanged((event as CustomEvent).detail); }); + this.htmlElement.addEventListener(Events.IdFilterChanges, (event) => { + this.presenter.onIdFilterChanged((event as CustomEvent).detail); + }); + this.htmlElement.addEventListener(Events.EntryClicked, (event) => { this.presenter.onEntryClicked((event as CustomEvent).detail); }); diff --git a/tools/winscope/src/viewers/viewer_transactions/viewer_transactions_component.ts b/tools/winscope/src/viewers/viewer_transactions/viewer_transactions_component.ts index 5a2a9f11f..0158bd0bf 100644 --- a/tools/winscope/src/viewers/viewer_transactions/viewer_transactions_component.ts +++ b/tools/winscope/src/viewers/viewer_transactions/viewer_transactions_component.ts @@ -26,6 +26,12 @@ import {UiData} from './ui_data'; <div class="entries"> <div class="filters"> <div class="time"></div> + <div class="id"> + <mat-form-field appearance="fill"> + <mat-label>TX ID</mat-label> + <input matInput [(ngModel)]="idString" (input)="onIdSearchStringChanged()" /> + </mat-form-field> + </div> <div class="vsyncid"> <mat-form-field appearance="fill"> <mat-label>VSYNC ID</mat-label> @@ -69,8 +75,8 @@ import {UiData} from './ui_data'; <div class="id"> <mat-form-field appearance="fill"> <mat-label>LAYER/DISP ID</mat-label> - <mat-select (selectionChange)="onIdFilterChanged($event)" multiple> - <mat-option *ngFor="let id of uiData.allIds" [value]="id"> + <mat-select (selectionChange)="onLayerIdFilterChanged($event)" multiple> + <mat-option *ngFor="let id of uiData.allLayerAndDisplayIds" [value]="id"> {{ id }} </mat-option> </mat-select> @@ -94,6 +100,9 @@ import {UiData} from './ui_data'; <div class="time"> <span class="mat-body-1">{{ entry.time }}</span> </div> + <div class="id"> + <span class="mat-body-1">{{ entry.transactionId }}</span> + </div> <div class="vsyncid"> <span class="mat-body-1">{{ entry.vsyncId }}</span> </div> @@ -107,7 +116,7 @@ import {UiData} from './ui_data'; <span class="mat-body-1">{{ entry.type }}</span> </div> <div class="id"> - <span class="mat-body-1">{{ entry.id }}</span> + <span class="mat-body-1">{{ entry.layerOrDisplayId }}</span> </div> <div class="what"> <span class="mat-body-1">{{ entry.what }}</span> @@ -222,6 +231,7 @@ import {UiData} from './ui_data'; }) class ViewerTransactionsComponent { uiData: UiData = UiData.EMPTY; + idString = ''; whatSearchString = ''; @ViewChild(CdkVirtualScrollViewport) private scrollComponent?: CdkVirtualScrollViewport; @@ -255,14 +265,18 @@ class ViewerTransactionsComponent { this.emitEvent(Events.TypeFilterChanged, event.value); } - onIdFilterChanged(event: MatSelectChange) { - this.emitEvent(Events.IdFilterChanged, event.value); + onLayerIdFilterChanged(event: MatSelectChange) { + this.emitEvent(Events.LayerIdFilterChanged, event.value); } onWhatSearchStringChange() { this.emitEvent(Events.WhatSearchStringChanged, this.whatSearchString); } + onIdSearchStringChanged() { + this.emitEvent(Events.IdFilterChanges, this.idString); + } + onEntryClicked(index: number) { this.emitEvent(Events.EntryClicked, index); } diff --git a/tools/winscope/src/viewers/viewer_transactions/viewer_transactions_component_test.ts b/tools/winscope/src/viewers/viewer_transactions/viewer_transactions_component_test.ts index 86e432776..ba2dd6d86 100644 --- a/tools/winscope/src/viewers/viewer_transactions/viewer_transactions_component_test.ts +++ b/tools/winscope/src/viewers/viewer_transactions/viewer_transactions_component_test.ts @@ -82,10 +82,11 @@ async function makeUiData(): Promise<UiData> { 'PID_VALUE', 'UID_VALUE', 'TYPE_VALUE', - 'ID_VALUE', + 'LAYER_OR_DISPLAY_ID_VALUE', + 'TRANSACTION_ID_VALUE', 'flag1 | flag2 | ...', propertiesTree ); - return new UiData([], [], [], [], [], [entry], 0, 0, 0, propertiesTree); + return new UiData([], [], [], [], [], [], [entry], 0, 0, 0, propertiesTree); } |