xref: /aosp_15_r20/development/tools/winscope/src/messaging/user_warnings.ts (revision 90c8c64db3049935a07c6143d7fd006e26f8ecca)
1*90c8c64dSAndroid Build Coastguard Worker/*
2*90c8c64dSAndroid Build Coastguard Worker * Copyright (C) 2023 The Android Open Source Project
3*90c8c64dSAndroid Build Coastguard Worker *
4*90c8c64dSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*90c8c64dSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*90c8c64dSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*90c8c64dSAndroid Build Coastguard Worker *
8*90c8c64dSAndroid Build Coastguard Worker *      http://www.apache.org/licenses/LICENSE-2.0
9*90c8c64dSAndroid Build Coastguard Worker *
10*90c8c64dSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*90c8c64dSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*90c8c64dSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*90c8c64dSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*90c8c64dSAndroid Build Coastguard Worker * limitations under the License.
15*90c8c64dSAndroid Build Coastguard Worker */
16*90c8c64dSAndroid Build Coastguard Worker
17*90c8c64dSAndroid Build Coastguard Workerimport {TimeRange} from 'common/time';
18*90c8c64dSAndroid Build Coastguard Workerimport {TimeDuration} from 'common/time_duration';
19*90c8c64dSAndroid Build Coastguard Workerimport {TRACE_INFO} from 'trace/trace_info';
20*90c8c64dSAndroid Build Coastguard Workerimport {TraceType} from 'trace/trace_type';
21*90c8c64dSAndroid Build Coastguard Workerimport {UserWarning} from './user_warning';
22*90c8c64dSAndroid Build Coastguard Worker
23*90c8c64dSAndroid Build Coastguard Workerexport class CorruptedArchive extends UserWarning {
24*90c8c64dSAndroid Build Coastguard Worker  constructor(private readonly file: File) {
25*90c8c64dSAndroid Build Coastguard Worker    super();
26*90c8c64dSAndroid Build Coastguard Worker  }
27*90c8c64dSAndroid Build Coastguard Worker
28*90c8c64dSAndroid Build Coastguard Worker  getDescriptor(): string {
29*90c8c64dSAndroid Build Coastguard Worker    return 'corrupted archive';
30*90c8c64dSAndroid Build Coastguard Worker  }
31*90c8c64dSAndroid Build Coastguard Worker
32*90c8c64dSAndroid Build Coastguard Worker  getMessage(): string {
33*90c8c64dSAndroid Build Coastguard Worker    return `${this.file.name}: corrupted archive`;
34*90c8c64dSAndroid Build Coastguard Worker  }
35*90c8c64dSAndroid Build Coastguard Worker}
36*90c8c64dSAndroid Build Coastguard Worker
37*90c8c64dSAndroid Build Coastguard Workerexport class NoValidFiles extends UserWarning {
38*90c8c64dSAndroid Build Coastguard Worker  constructor(private traces?: string[]) {
39*90c8c64dSAndroid Build Coastguard Worker    super();
40*90c8c64dSAndroid Build Coastguard Worker  }
41*90c8c64dSAndroid Build Coastguard Worker  getDescriptor(): string {
42*90c8c64dSAndroid Build Coastguard Worker    return 'no valid files';
43*90c8c64dSAndroid Build Coastguard Worker  }
44*90c8c64dSAndroid Build Coastguard Worker
45*90c8c64dSAndroid Build Coastguard Worker  getMessage(): string {
46*90c8c64dSAndroid Build Coastguard Worker    return (
47*90c8c64dSAndroid Build Coastguard Worker      'No valid trace files found' +
48*90c8c64dSAndroid Build Coastguard Worker      (this.traces ? ` for ${this.traces.join(', ')}` : '')
49*90c8c64dSAndroid Build Coastguard Worker    );
50*90c8c64dSAndroid Build Coastguard Worker  }
51*90c8c64dSAndroid Build Coastguard Worker}
52*90c8c64dSAndroid Build Coastguard Worker
53*90c8c64dSAndroid Build Coastguard Workerexport class TraceHasOldData extends UserWarning {
54*90c8c64dSAndroid Build Coastguard Worker  constructor(
55*90c8c64dSAndroid Build Coastguard Worker    private readonly descriptor: string,
56*90c8c64dSAndroid Build Coastguard Worker    private readonly timeGap?: TimeRange,
57*90c8c64dSAndroid Build Coastguard Worker  ) {
58*90c8c64dSAndroid Build Coastguard Worker    super();
59*90c8c64dSAndroid Build Coastguard Worker  }
60*90c8c64dSAndroid Build Coastguard Worker
61*90c8c64dSAndroid Build Coastguard Worker  getDescriptor(): string {
62*90c8c64dSAndroid Build Coastguard Worker    return 'old trace';
63*90c8c64dSAndroid Build Coastguard Worker  }
64*90c8c64dSAndroid Build Coastguard Worker
65*90c8c64dSAndroid Build Coastguard Worker  getMessage(): string {
66*90c8c64dSAndroid Build Coastguard Worker    const elapsedTime = this.timeGap
67*90c8c64dSAndroid Build Coastguard Worker      ? new TimeDuration(
68*90c8c64dSAndroid Build Coastguard Worker          this.timeGap.to.getValueNs() - this.timeGap.from.getValueNs(),
69*90c8c64dSAndroid Build Coastguard Worker        )
70*90c8c64dSAndroid Build Coastguard Worker      : undefined;
71*90c8c64dSAndroid Build Coastguard Worker    return (
72*90c8c64dSAndroid Build Coastguard Worker      `${this.descriptor}: discarded because data is old` +
73*90c8c64dSAndroid Build Coastguard Worker      (this.timeGap ? `er than ${elapsedTime?.format()}` : '')
74*90c8c64dSAndroid Build Coastguard Worker    );
75*90c8c64dSAndroid Build Coastguard Worker  }
76*90c8c64dSAndroid Build Coastguard Worker}
77*90c8c64dSAndroid Build Coastguard Worker
78*90c8c64dSAndroid Build Coastguard Workerexport class TraceOverridden extends UserWarning {
79*90c8c64dSAndroid Build Coastguard Worker  constructor(
80*90c8c64dSAndroid Build Coastguard Worker    private readonly descriptor: string,
81*90c8c64dSAndroid Build Coastguard Worker    private readonly overridingType?: TraceType,
82*90c8c64dSAndroid Build Coastguard Worker  ) {
83*90c8c64dSAndroid Build Coastguard Worker    super();
84*90c8c64dSAndroid Build Coastguard Worker  }
85*90c8c64dSAndroid Build Coastguard Worker
86*90c8c64dSAndroid Build Coastguard Worker  getDescriptor(): string {
87*90c8c64dSAndroid Build Coastguard Worker    return 'trace overridden';
88*90c8c64dSAndroid Build Coastguard Worker  }
89*90c8c64dSAndroid Build Coastguard Worker
90*90c8c64dSAndroid Build Coastguard Worker  getMessage(): string {
91*90c8c64dSAndroid Build Coastguard Worker    if (this.overridingType !== undefined) {
92*90c8c64dSAndroid Build Coastguard Worker      return `${this.descriptor}: overridden by another trace of type ${
93*90c8c64dSAndroid Build Coastguard Worker        TraceType[this.overridingType]
94*90c8c64dSAndroid Build Coastguard Worker      }`;
95*90c8c64dSAndroid Build Coastguard Worker    }
96*90c8c64dSAndroid Build Coastguard Worker    return `${this.descriptor}: overridden by another trace of same type`;
97*90c8c64dSAndroid Build Coastguard Worker  }
98*90c8c64dSAndroid Build Coastguard Worker}
99*90c8c64dSAndroid Build Coastguard Worker
100*90c8c64dSAndroid Build Coastguard Workerexport class UnsupportedFileFormat extends UserWarning {
101*90c8c64dSAndroid Build Coastguard Worker  constructor(private readonly descriptor: string) {
102*90c8c64dSAndroid Build Coastguard Worker    super();
103*90c8c64dSAndroid Build Coastguard Worker  }
104*90c8c64dSAndroid Build Coastguard Worker
105*90c8c64dSAndroid Build Coastguard Worker  getDescriptor(): string {
106*90c8c64dSAndroid Build Coastguard Worker    return 'unsupported format';
107*90c8c64dSAndroid Build Coastguard Worker  }
108*90c8c64dSAndroid Build Coastguard Worker
109*90c8c64dSAndroid Build Coastguard Worker  getMessage(): string {
110*90c8c64dSAndroid Build Coastguard Worker    return `${this.descriptor}: unsupported format`;
111*90c8c64dSAndroid Build Coastguard Worker  }
112*90c8c64dSAndroid Build Coastguard Worker}
113*90c8c64dSAndroid Build Coastguard Worker
114*90c8c64dSAndroid Build Coastguard Workerexport class InvalidLegacyTrace extends UserWarning {
115*90c8c64dSAndroid Build Coastguard Worker  constructor(
116*90c8c64dSAndroid Build Coastguard Worker    private readonly descriptor: string,
117*90c8c64dSAndroid Build Coastguard Worker    private readonly errorMessage: string,
118*90c8c64dSAndroid Build Coastguard Worker  ) {
119*90c8c64dSAndroid Build Coastguard Worker    super();
120*90c8c64dSAndroid Build Coastguard Worker  }
121*90c8c64dSAndroid Build Coastguard Worker
122*90c8c64dSAndroid Build Coastguard Worker  getDescriptor(): string {
123*90c8c64dSAndroid Build Coastguard Worker    return 'invalid legacy trace';
124*90c8c64dSAndroid Build Coastguard Worker  }
125*90c8c64dSAndroid Build Coastguard Worker
126*90c8c64dSAndroid Build Coastguard Worker  getMessage(): string {
127*90c8c64dSAndroid Build Coastguard Worker    return `${this.descriptor}: ${this.errorMessage}`;
128*90c8c64dSAndroid Build Coastguard Worker  }
129*90c8c64dSAndroid Build Coastguard Worker}
130*90c8c64dSAndroid Build Coastguard Worker
131*90c8c64dSAndroid Build Coastguard Workerexport class InvalidPerfettoTrace extends UserWarning {
132*90c8c64dSAndroid Build Coastguard Worker  constructor(
133*90c8c64dSAndroid Build Coastguard Worker    private readonly descriptor: string,
134*90c8c64dSAndroid Build Coastguard Worker    private readonly errorMessages: string[],
135*90c8c64dSAndroid Build Coastguard Worker  ) {
136*90c8c64dSAndroid Build Coastguard Worker    super();
137*90c8c64dSAndroid Build Coastguard Worker  }
138*90c8c64dSAndroid Build Coastguard Worker
139*90c8c64dSAndroid Build Coastguard Worker  getDescriptor(): string {
140*90c8c64dSAndroid Build Coastguard Worker    return 'invalid perfetto trace';
141*90c8c64dSAndroid Build Coastguard Worker  }
142*90c8c64dSAndroid Build Coastguard Worker
143*90c8c64dSAndroid Build Coastguard Worker  getMessage(): string {
144*90c8c64dSAndroid Build Coastguard Worker    return `${this.descriptor}: ${this.errorMessages.join(', ')}`;
145*90c8c64dSAndroid Build Coastguard Worker  }
146*90c8c64dSAndroid Build Coastguard Worker}
147*90c8c64dSAndroid Build Coastguard Worker
148*90c8c64dSAndroid Build Coastguard Workerexport class FailedToCreateTracesParser extends UserWarning {
149*90c8c64dSAndroid Build Coastguard Worker  constructor(
150*90c8c64dSAndroid Build Coastguard Worker    private readonly traceType: TraceType,
151*90c8c64dSAndroid Build Coastguard Worker    private readonly errorMessage: string,
152*90c8c64dSAndroid Build Coastguard Worker  ) {
153*90c8c64dSAndroid Build Coastguard Worker    super();
154*90c8c64dSAndroid Build Coastguard Worker  }
155*90c8c64dSAndroid Build Coastguard Worker
156*90c8c64dSAndroid Build Coastguard Worker  getDescriptor(): string {
157*90c8c64dSAndroid Build Coastguard Worker    return 'failed to create traces parser';
158*90c8c64dSAndroid Build Coastguard Worker  }
159*90c8c64dSAndroid Build Coastguard Worker
160*90c8c64dSAndroid Build Coastguard Worker  getMessage(): string {
161*90c8c64dSAndroid Build Coastguard Worker    return `Failed to create ${TRACE_INFO[this.traceType].name} parser: ${
162*90c8c64dSAndroid Build Coastguard Worker      this.errorMessage
163*90c8c64dSAndroid Build Coastguard Worker    }`;
164*90c8c64dSAndroid Build Coastguard Worker  }
165*90c8c64dSAndroid Build Coastguard Worker}
166*90c8c64dSAndroid Build Coastguard Worker
167*90c8c64dSAndroid Build Coastguard Workerexport class CannotVisualizeTraceEntry extends UserWarning {
168*90c8c64dSAndroid Build Coastguard Worker  constructor(private readonly errorMessage: string) {
169*90c8c64dSAndroid Build Coastguard Worker    super();
170*90c8c64dSAndroid Build Coastguard Worker  }
171*90c8c64dSAndroid Build Coastguard Worker
172*90c8c64dSAndroid Build Coastguard Worker  getDescriptor(): string {
173*90c8c64dSAndroid Build Coastguard Worker    return 'cannot visualize trace entry';
174*90c8c64dSAndroid Build Coastguard Worker  }
175*90c8c64dSAndroid Build Coastguard Worker
176*90c8c64dSAndroid Build Coastguard Worker  getMessage(): string {
177*90c8c64dSAndroid Build Coastguard Worker    return this.errorMessage;
178*90c8c64dSAndroid Build Coastguard Worker  }
179*90c8c64dSAndroid Build Coastguard Worker}
180*90c8c64dSAndroid Build Coastguard Worker
181*90c8c64dSAndroid Build Coastguard Workerexport class FailedToInitializeTimelineData extends UserWarning {
182*90c8c64dSAndroid Build Coastguard Worker  getDescriptor(): string {
183*90c8c64dSAndroid Build Coastguard Worker    return 'failed to initialize timeline data';
184*90c8c64dSAndroid Build Coastguard Worker  }
185*90c8c64dSAndroid Build Coastguard Worker
186*90c8c64dSAndroid Build Coastguard Worker  getMessage(): string {
187*90c8c64dSAndroid Build Coastguard Worker    return 'Cannot visualize all traces: Failed to initialize timeline data.\nTry removing some traces.';
188*90c8c64dSAndroid Build Coastguard Worker  }
189*90c8c64dSAndroid Build Coastguard Worker}
190*90c8c64dSAndroid Build Coastguard Worker
191*90c8c64dSAndroid Build Coastguard Workerexport class IncompleteFrameMapping extends UserWarning {
192*90c8c64dSAndroid Build Coastguard Worker  constructor(private readonly errorMessage: string) {
193*90c8c64dSAndroid Build Coastguard Worker    super();
194*90c8c64dSAndroid Build Coastguard Worker  }
195*90c8c64dSAndroid Build Coastguard Worker
196*90c8c64dSAndroid Build Coastguard Worker  getDescriptor(): string {
197*90c8c64dSAndroid Build Coastguard Worker    return 'incomplete frame mapping';
198*90c8c64dSAndroid Build Coastguard Worker  }
199*90c8c64dSAndroid Build Coastguard Worker
200*90c8c64dSAndroid Build Coastguard Worker  getMessage(): string {
201*90c8c64dSAndroid Build Coastguard Worker    return `Error occurred in frame mapping: ${this.errorMessage}`;
202*90c8c64dSAndroid Build Coastguard Worker  }
203*90c8c64dSAndroid Build Coastguard Worker}
204*90c8c64dSAndroid Build Coastguard Worker
205*90c8c64dSAndroid Build Coastguard Workerexport class NoTraceTargetsSelected extends UserWarning {
206*90c8c64dSAndroid Build Coastguard Worker  getDescriptor(): string {
207*90c8c64dSAndroid Build Coastguard Worker    return 'No trace targets selected';
208*90c8c64dSAndroid Build Coastguard Worker  }
209*90c8c64dSAndroid Build Coastguard Worker
210*90c8c64dSAndroid Build Coastguard Worker  getMessage(): string {
211*90c8c64dSAndroid Build Coastguard Worker    return 'No trace targets selected.';
212*90c8c64dSAndroid Build Coastguard Worker  }
213*90c8c64dSAndroid Build Coastguard Worker}
214*90c8c64dSAndroid Build Coastguard Worker
215*90c8c64dSAndroid Build Coastguard Workerexport class MissingVsyncId extends UserWarning {
216*90c8c64dSAndroid Build Coastguard Worker  constructor(private readonly tableName: string) {
217*90c8c64dSAndroid Build Coastguard Worker    super();
218*90c8c64dSAndroid Build Coastguard Worker  }
219*90c8c64dSAndroid Build Coastguard Worker
220*90c8c64dSAndroid Build Coastguard Worker  getDescriptor(): string {
221*90c8c64dSAndroid Build Coastguard Worker    return 'missing vsync id';
222*90c8c64dSAndroid Build Coastguard Worker  }
223*90c8c64dSAndroid Build Coastguard Worker
224*90c8c64dSAndroid Build Coastguard Worker  getMessage(): string {
225*90c8c64dSAndroid Build Coastguard Worker    return `missing vsync_id value for one or more entries in ${this.tableName}`;
226*90c8c64dSAndroid Build Coastguard Worker  }
227*90c8c64dSAndroid Build Coastguard Worker}
228*90c8c64dSAndroid Build Coastguard Worker
229*90c8c64dSAndroid Build Coastguard Workerexport class ProxyTraceTimeout extends UserWarning {
230*90c8c64dSAndroid Build Coastguard Worker  getDescriptor(): string {
231*90c8c64dSAndroid Build Coastguard Worker    return 'proxy trace timeout';
232*90c8c64dSAndroid Build Coastguard Worker  }
233*90c8c64dSAndroid Build Coastguard Worker
234*90c8c64dSAndroid Build Coastguard Worker  getMessage(): string {
235*90c8c64dSAndroid Build Coastguard Worker    return 'Errors occurred during tracing: trace timed out';
236*90c8c64dSAndroid Build Coastguard Worker  }
237*90c8c64dSAndroid Build Coastguard Worker}
238*90c8c64dSAndroid Build Coastguard Worker
239*90c8c64dSAndroid Build Coastguard Workerexport class ProxyTracingWarnings extends UserWarning {
240*90c8c64dSAndroid Build Coastguard Worker  constructor(private readonly warnings: string[]) {
241*90c8c64dSAndroid Build Coastguard Worker    super();
242*90c8c64dSAndroid Build Coastguard Worker  }
243*90c8c64dSAndroid Build Coastguard Worker
244*90c8c64dSAndroid Build Coastguard Worker  getDescriptor(): string {
245*90c8c64dSAndroid Build Coastguard Worker    return 'proxy tracing warnings';
246*90c8c64dSAndroid Build Coastguard Worker  }
247*90c8c64dSAndroid Build Coastguard Worker
248*90c8c64dSAndroid Build Coastguard Worker  getMessage(): string {
249*90c8c64dSAndroid Build Coastguard Worker    return `Trace collection warning: ${this.warnings.join(', ')}`;
250*90c8c64dSAndroid Build Coastguard Worker  }
251*90c8c64dSAndroid Build Coastguard Worker}
252*90c8c64dSAndroid Build Coastguard Worker
253*90c8c64dSAndroid Build Coastguard Workerexport class ProxyTracingErrors extends UserWarning {
254*90c8c64dSAndroid Build Coastguard Worker  constructor(private readonly errorMessages: string[]) {
255*90c8c64dSAndroid Build Coastguard Worker    super();
256*90c8c64dSAndroid Build Coastguard Worker  }
257*90c8c64dSAndroid Build Coastguard Worker
258*90c8c64dSAndroid Build Coastguard Worker  getDescriptor(): string {
259*90c8c64dSAndroid Build Coastguard Worker    return 'proxy tracing errors';
260*90c8c64dSAndroid Build Coastguard Worker  }
261*90c8c64dSAndroid Build Coastguard Worker
262*90c8c64dSAndroid Build Coastguard Worker  getMessage(): string {
263*90c8c64dSAndroid Build Coastguard Worker    return `Trace collection errors: ${this.errorMessages.join(', ')}`;
264*90c8c64dSAndroid Build Coastguard Worker  }
265*90c8c64dSAndroid Build Coastguard Worker}
266*90c8c64dSAndroid Build Coastguard Worker
267*90c8c64dSAndroid Build Coastguard Workerexport class MissingLayerIds extends UserWarning {
268*90c8c64dSAndroid Build Coastguard Worker  getDescriptor(): string {
269*90c8c64dSAndroid Build Coastguard Worker    return 'missing layer ids';
270*90c8c64dSAndroid Build Coastguard Worker  }
271*90c8c64dSAndroid Build Coastguard Worker
272*90c8c64dSAndroid Build Coastguard Worker  getMessage(): string {
273*90c8c64dSAndroid Build Coastguard Worker    return 'Cannot parse some layers due to null or undefined layer id';
274*90c8c64dSAndroid Build Coastguard Worker  }
275*90c8c64dSAndroid Build Coastguard Worker}
276*90c8c64dSAndroid Build Coastguard Worker
277*90c8c64dSAndroid Build Coastguard Workerexport class DuplicateLayerIds extends UserWarning {
278*90c8c64dSAndroid Build Coastguard Worker  constructor(private readonly layerIds: number[]) {
279*90c8c64dSAndroid Build Coastguard Worker    super();
280*90c8c64dSAndroid Build Coastguard Worker  }
281*90c8c64dSAndroid Build Coastguard Worker
282*90c8c64dSAndroid Build Coastguard Worker  getDescriptor(): string {
283*90c8c64dSAndroid Build Coastguard Worker    return 'duplicate layer id';
284*90c8c64dSAndroid Build Coastguard Worker  }
285*90c8c64dSAndroid Build Coastguard Worker
286*90c8c64dSAndroid Build Coastguard Worker  getMessage(): string {
287*90c8c64dSAndroid Build Coastguard Worker    const optionalPlural = this.layerIds.length > 1 ? 's' : '';
288*90c8c64dSAndroid Build Coastguard Worker    const layerIds = this.layerIds.join(', ');
289*90c8c64dSAndroid Build Coastguard Worker    return `Duplicate SF layer id${optionalPlural} ${layerIds} found - adding as "Duplicate" to the hierarchy`;
290*90c8c64dSAndroid Build Coastguard Worker  }
291*90c8c64dSAndroid Build Coastguard Worker}
292*90c8c64dSAndroid Build Coastguard Worker
293*90c8c64dSAndroid Build Coastguard Workerexport class MonotonicScreenRecording extends UserWarning {
294*90c8c64dSAndroid Build Coastguard Worker  getDescriptor(): string {
295*90c8c64dSAndroid Build Coastguard Worker    return 'monotonic screen recording';
296*90c8c64dSAndroid Build Coastguard Worker  }
297*90c8c64dSAndroid Build Coastguard Worker
298*90c8c64dSAndroid Build Coastguard Worker  getMessage(): string {
299*90c8c64dSAndroid Build Coastguard Worker    return `Screen recording may not be synchronized with the
300*90c8c64dSAndroid Build Coastguard Worker      other traces. Metadata contains monotonic time instead of elapsed.`;
301*90c8c64dSAndroid Build Coastguard Worker  }
302*90c8c64dSAndroid Build Coastguard Worker}
303*90c8c64dSAndroid Build Coastguard Worker
304*90c8c64dSAndroid Build Coastguard Workerexport class CannotParseAllTransitions extends UserWarning {
305*90c8c64dSAndroid Build Coastguard Worker  getDescriptor(): string {
306*90c8c64dSAndroid Build Coastguard Worker    return 'cannot parse all transitions';
307*90c8c64dSAndroid Build Coastguard Worker  }
308*90c8c64dSAndroid Build Coastguard Worker
309*90c8c64dSAndroid Build Coastguard Worker  getMessage(): string {
310*90c8c64dSAndroid Build Coastguard Worker    return 'Cannot parse all transitions. Some may be missing in Transitions viewer.';
311*90c8c64dSAndroid Build Coastguard Worker  }
312*90c8c64dSAndroid Build Coastguard Worker}
313*90c8c64dSAndroid Build Coastguard Worker
314*90c8c64dSAndroid Build Coastguard Workerexport class TraceSearchQueryFailed extends UserWarning {
315*90c8c64dSAndroid Build Coastguard Worker  constructor(private readonly errorMessage: string) {
316*90c8c64dSAndroid Build Coastguard Worker    super();
317*90c8c64dSAndroid Build Coastguard Worker  }
318*90c8c64dSAndroid Build Coastguard Worker
319*90c8c64dSAndroid Build Coastguard Worker  getDescriptor(): string {
320*90c8c64dSAndroid Build Coastguard Worker    return 'trace search query failed';
321*90c8c64dSAndroid Build Coastguard Worker  }
322*90c8c64dSAndroid Build Coastguard Worker
323*90c8c64dSAndroid Build Coastguard Worker  getMessage(): string {
324*90c8c64dSAndroid Build Coastguard Worker    return `Search query failed: ${this.errorMessage}`;
325*90c8c64dSAndroid Build Coastguard Worker  }
326*90c8c64dSAndroid Build Coastguard Worker}
327