From b9ce8e1c7d20aba2d6ac112c288bca2433e34101 Mon Sep 17 00:00:00 2001 From: Pablo Gamito Date: Mon, 12 Jun 2023 16:16:48 +0000 Subject: [PATCH] Ignore window manager dumps with no timestamp in timeline Fixes: 286466880 Test: npm run test:all Change-Id: Id518a362f1fe18e155ae472e16f046f5cc427cd1 --- .../timeline/mini_timeline_component.ts | 8 +++++--- .../components/timeline/timeline_component.ts | 6 ++++++ tools/winscope/src/app/timeline_data.ts | 18 +++++++++++++++++- tools/winscope/src/app/timeline_data_test.ts | 14 ++++++++++++++ 4 files changed, 42 insertions(+), 4 deletions(-) diff --git a/tools/winscope/src/app/components/timeline/mini_timeline_component.ts b/tools/winscope/src/app/components/timeline/mini_timeline_component.ts index 89230a3aa..2f11e1e1f 100644 --- a/tools/winscope/src/app/components/timeline/mini_timeline_component.ts +++ b/tools/winscope/src/app/components/timeline/mini_timeline_component.ts @@ -107,9 +107,11 @@ export class MiniTimelineComponent { private getTracesToShow(): Traces { const traces = new Traces(); - this.selectedTraces.forEach((type) => { - traces.setTrace(type, assertDefined(this.timelineData.getTraces().getTrace(type))); - }); + this.selectedTraces + .filter((type) => this.timelineData.getTraces().getTrace(type) !== undefined) + .forEach((type) => { + traces.setTrace(type, assertDefined(this.timelineData.getTraces().getTrace(type))); + }); return traces; } diff --git a/tools/winscope/src/app/components/timeline/timeline_component.ts b/tools/winscope/src/app/components/timeline/timeline_component.ts index 7d2f4301e..f6cbcbf00 100644 --- a/tools/winscope/src/app/components/timeline/timeline_component.ts +++ b/tools/winscope/src/app/components/timeline/timeline_component.ts @@ -476,6 +476,9 @@ export class TimelineComponent implements TracePositionUpdateListener { if (!this.internalActiveTrace) { return false; } + if (this.timelineData.getTraces().getTrace(this.internalActiveTrace) === undefined) { + return false; + } return this.timelineData.getPreviousEntryFor(this.internalActiveTrace) !== undefined; } @@ -483,6 +486,9 @@ export class TimelineComponent implements TracePositionUpdateListener { if (!this.internalActiveTrace) { return false; } + if (this.timelineData.getTraces().getTrace(this.internalActiveTrace) === undefined) { + return false; + } return this.timelineData.getNextEntryFor(this.internalActiveTrace) !== undefined; } diff --git a/tools/winscope/src/app/timeline_data.ts b/tools/winscope/src/app/timeline_data.ts index ab9082b47..43699c3cf 100644 --- a/tools/winscope/src/app/timeline_data.ts +++ b/tools/winscope/src/app/timeline_data.ts @@ -30,6 +30,7 @@ export interface TimeRange { from: Timestamp; to: Timestamp; } +const INVALID_TIMESTAMP = 0n export class TimelineData { private traces = new Traces(); @@ -45,7 +46,21 @@ export class TimelineData { initialize(traces: Traces, screenRecordingVideo: Blob | undefined) { this.clear(); - this.traces = traces; + this.traces = new Traces(); + traces.forEachTrace((trace, type) => { + if (type === TraceType.WINDOW_MANAGER) { + // Filter out WindowManager dumps with no timestamp from timeline + if ( + trace.lengthEntries === 1 && + trace.getEntry(0).getTimestamp().getValueNs() === INVALID_TIMESTAMP + ) { + return; + } + } + + this.traces.setTrace(type, trace); + }); + this.screenRecordingVideo = screenRecordingVideo; this.firstEntry = this.findFirstEntry(); this.lastEntry = this.findLastEntry(); @@ -265,6 +280,7 @@ export class TimelineData { private getFirstEntryOfActiveViewTraces(): TraceEntry<{}> | undefined { const activeEntries = this.activeViewTraceTypes + .filter((it) => this.traces.getTrace(it) !== undefined) .map((traceType) => assertDefined(this.traces.getTrace(traceType))) .filter((trace) => trace.lengthEntries > 0) .map((trace) => trace.getEntry(0)) diff --git a/tools/winscope/src/app/timeline_data_test.ts b/tools/winscope/src/app/timeline_data_test.ts index 09ce03180..f752ddea1 100644 --- a/tools/winscope/src/app/timeline_data_test.ts +++ b/tools/winscope/src/app/timeline_data_test.ts @@ -59,6 +59,20 @@ describe('TimelineData', () => { expect(timelineData.getCurrentPosition()).toBeDefined(); }); + it('ignores dumps with no timestamp', () => { + expect(timelineData.getCurrentPosition()).toBeUndefined(); + + const traces = new TracesBuilder() + .setTimestamps(TraceType.SURFACE_FLINGER, [timestamp10, timestamp11]) + .setTimestamps(TraceType.WINDOW_MANAGER, [new Timestamp(TimestampType.REAL, 0n)]) + .build(); + + timelineData.initialize(traces, undefined); + expect(timelineData.getTraces().getTrace(TraceType.WINDOW_MANAGER)).toBeUndefined(); + expect(timelineData.getFullTimeRange().from).toBe(timestamp10); + expect(timelineData.getFullTimeRange().to).toBe(timestamp11); + }); + it('uses first entry by default', () => { timelineData.initialize(traces, undefined); expect(timelineData.getCurrentPosition()).toEqual(position10);