diff --git a/tools/winscope/src/viewers/viewer_transactions/presenter.ts b/tools/winscope/src/viewers/viewer_transactions/presenter.ts index 7c0ef394e..d4a091086 100644 --- a/tools/winscope/src/viewers/viewer_transactions/presenter.ts +++ b/tools/winscope/src/viewers/viewer_transactions/presenter.ts @@ -283,6 +283,26 @@ export class Presenter { ) ); } + + 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) { diff --git a/tools/winscope/src/viewers/viewer_transactions/presenter_test.ts b/tools/winscope/src/viewers/viewer_transactions/presenter_test.ts index 1cd964ca6..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,10 +75,11 @@ describe('PresenterTransactions', () => { 'LAYER_CHANGED', 'LAYER_DESTROYED', 'LAYER_HANDLE_DESTROYED', + 'NO_OP', ]); - expect(outputUiData?.allTransactionIds.length).toEqual(1152); - expect(outputUiData?.allLayerAndDisplayIds.length).toEqual(116); + expect(outputUiData?.allTransactionIds.length).toEqual(1295); + expect(outputUiData?.allLayerAndDisplayIds.length).toEqual(117); expect(outputUiData?.entries.length).toEqual(TOTAL_OUTPUT_ENTRIES); @@ -158,6 +159,7 @@ describe('PresenterTransactions', () => { UiDataEntryType.LAYER_CHANGED, UiDataEntryType.LAYER_DESTROYED, UiDataEntryType.LAYER_HANDLE_DESTROYED, + UiDataEntryType.NO_OP, ]) ); @@ -189,6 +191,19 @@ describe('PresenterTransactions', () => { ); }); + 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]) + ); + + 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', () => { expect(outputUiData!.entries.length).toEqual(TOTAL_OUTPUT_ENTRIES); diff --git a/tools/winscope/src/viewers/viewer_transactions/ui_data.ts b/tools/winscope/src/viewers/viewer_transactions/ui_data.ts index 36f2f3e9f..f61d86cdb 100644 --- a/tools/winscope/src/viewers/viewer_transactions/ui_data.ts +++ b/tools/winscope/src/viewers/viewer_transactions/ui_data.ts @@ -56,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};