1*6dbdd20aSAndroid Build Coastguard Worker// Copyright (C) 2024 The Android Open Source Project 2*6dbdd20aSAndroid Build Coastguard Worker// 3*6dbdd20aSAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*6dbdd20aSAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*6dbdd20aSAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*6dbdd20aSAndroid Build Coastguard Worker// 7*6dbdd20aSAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*6dbdd20aSAndroid Build Coastguard Worker// 9*6dbdd20aSAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*6dbdd20aSAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*6dbdd20aSAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*6dbdd20aSAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*6dbdd20aSAndroid Build Coastguard Worker// limitations under the License. 14*6dbdd20aSAndroid Build Coastguard Worker 15*6dbdd20aSAndroid Build Coastguard Workerimport {Trace} from '../../public/trace'; 16*6dbdd20aSAndroid Build Coastguard Workerimport {PerfettoPlugin} from '../../public/plugin'; 17*6dbdd20aSAndroid Build Coastguard Workerimport {createQuerySliceTrack} from '../../components/tracks/query_slice_track'; 18*6dbdd20aSAndroid Build Coastguard Workerimport {TrackNode} from '../../public/workspace'; 19*6dbdd20aSAndroid Build Coastguard Worker 20*6dbdd20aSAndroid Build Coastguard Workerexport default class implements PerfettoPlugin { 21*6dbdd20aSAndroid Build Coastguard Worker static readonly id = 'com.example.ExampleNestedTracks'; 22*6dbdd20aSAndroid Build Coastguard Worker async onTraceLoad(ctx: Trace): Promise<void> { 23*6dbdd20aSAndroid Build Coastguard Worker const traceStartTime = ctx.traceInfo.start; 24*6dbdd20aSAndroid Build Coastguard Worker const traceDur = ctx.traceInfo.end - ctx.traceInfo.start; 25*6dbdd20aSAndroid Build Coastguard Worker await ctx.engine.query(` 26*6dbdd20aSAndroid Build Coastguard Worker create table example_events ( 27*6dbdd20aSAndroid Build Coastguard Worker id INTEGER PRIMARY KEY AUTOINCREMENT, 28*6dbdd20aSAndroid Build Coastguard Worker name TEXT, 29*6dbdd20aSAndroid Build Coastguard Worker ts INTEGER, 30*6dbdd20aSAndroid Build Coastguard Worker dur INTEGER, 31*6dbdd20aSAndroid Build Coastguard Worker arg INTEGER 32*6dbdd20aSAndroid Build Coastguard Worker ); 33*6dbdd20aSAndroid Build Coastguard Worker 34*6dbdd20aSAndroid Build Coastguard Worker insert into example_events (name, ts, dur, arg) 35*6dbdd20aSAndroid Build Coastguard Worker values 36*6dbdd20aSAndroid Build Coastguard Worker ('Foo', ${traceStartTime}, ${traceDur}, 'aaa'), 37*6dbdd20aSAndroid Build Coastguard Worker ('Bar', ${traceStartTime}, ${traceDur / 2n}, 'bbb'), 38*6dbdd20aSAndroid Build Coastguard Worker ('Baz', ${traceStartTime}, ${traceDur / 3n}, 'bbb'); 39*6dbdd20aSAndroid Build Coastguard Worker `); 40*6dbdd20aSAndroid Build Coastguard Worker 41*6dbdd20aSAndroid Build Coastguard Worker const title = 'Test Track'; 42*6dbdd20aSAndroid Build Coastguard Worker const uri = `com.example.ExampleNestedTracks#TestTrack`; 43*6dbdd20aSAndroid Build Coastguard Worker const track = await createQuerySliceTrack({ 44*6dbdd20aSAndroid Build Coastguard Worker trace: ctx, 45*6dbdd20aSAndroid Build Coastguard Worker uri, 46*6dbdd20aSAndroid Build Coastguard Worker data: { 47*6dbdd20aSAndroid Build Coastguard Worker sqlSource: 'select * from example_events', 48*6dbdd20aSAndroid Build Coastguard Worker }, 49*6dbdd20aSAndroid Build Coastguard Worker }); 50*6dbdd20aSAndroid Build Coastguard Worker ctx.tracks.registerTrack({ 51*6dbdd20aSAndroid Build Coastguard Worker uri, 52*6dbdd20aSAndroid Build Coastguard Worker title, 53*6dbdd20aSAndroid Build Coastguard Worker track, 54*6dbdd20aSAndroid Build Coastguard Worker }); 55*6dbdd20aSAndroid Build Coastguard Worker 56*6dbdd20aSAndroid Build Coastguard Worker this.addNestedTracks(ctx, uri); 57*6dbdd20aSAndroid Build Coastguard Worker } 58*6dbdd20aSAndroid Build Coastguard Worker 59*6dbdd20aSAndroid Build Coastguard Worker private addNestedTracks(ctx: Trace, uri: string): void { 60*6dbdd20aSAndroid Build Coastguard Worker const trackRoot = new TrackNode({uri, title: 'Root'}); 61*6dbdd20aSAndroid Build Coastguard Worker const track1 = new TrackNode({uri, title: '1'}); 62*6dbdd20aSAndroid Build Coastguard Worker const track2 = new TrackNode({uri, title: '2'}); 63*6dbdd20aSAndroid Build Coastguard Worker const track11 = new TrackNode({uri, title: '1.1'}); 64*6dbdd20aSAndroid Build Coastguard Worker const track12 = new TrackNode({uri, title: '1.2'}); 65*6dbdd20aSAndroid Build Coastguard Worker const track121 = new TrackNode({uri, title: '1.2.1'}); 66*6dbdd20aSAndroid Build Coastguard Worker const track21 = new TrackNode({uri, title: '2.1'}); 67*6dbdd20aSAndroid Build Coastguard Worker 68*6dbdd20aSAndroid Build Coastguard Worker ctx.workspace.addChildInOrder(trackRoot); 69*6dbdd20aSAndroid Build Coastguard Worker trackRoot.addChildLast(track1); 70*6dbdd20aSAndroid Build Coastguard Worker trackRoot.addChildLast(track2); 71*6dbdd20aSAndroid Build Coastguard Worker track1.addChildLast(track11); 72*6dbdd20aSAndroid Build Coastguard Worker track1.addChildLast(track12); 73*6dbdd20aSAndroid Build Coastguard Worker track12.addChildLast(track121); 74*6dbdd20aSAndroid Build Coastguard Worker track2.addChildLast(track21); 75*6dbdd20aSAndroid Build Coastguard Worker } 76*6dbdd20aSAndroid Build Coastguard Worker} 77