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 {createQuerySliceTrack} from '../../components/tracks/query_slice_track'; 16*6dbdd20aSAndroid Build Coastguard Workerimport {PerfettoPlugin} from '../../public/plugin'; 17*6dbdd20aSAndroid Build Coastguard Workerimport {Trace} from '../../public/trace'; 18*6dbdd20aSAndroid Build Coastguard Workerimport {TrackNode} from '../../public/workspace'; 19*6dbdd20aSAndroid Build Coastguard Worker 20*6dbdd20aSAndroid Build Coastguard Workerconst INCLUDE_DESKTOP_MODULE_QUERY = `INCLUDE PERFETTO MODULE android.desktop_mode`; 21*6dbdd20aSAndroid Build Coastguard Worker 22*6dbdd20aSAndroid Build Coastguard Workerconst QUERY = ` 23*6dbdd20aSAndroid Build Coastguard WorkerSELECT 24*6dbdd20aSAndroid Build Coastguard Worker ROW_NUMBER() OVER (ORDER BY ts) AS id, 25*6dbdd20aSAndroid Build Coastguard Worker ts, 26*6dbdd20aSAndroid Build Coastguard Worker dur, 27*6dbdd20aSAndroid Build Coastguard Worker ifnull(p.package_name, 'uid=' || dw.uid) AS name 28*6dbdd20aSAndroid Build Coastguard WorkerFROM android_desktop_mode_windows dw 29*6dbdd20aSAndroid Build Coastguard WorkerLEFT JOIN package_list p ON CAST (dw.uid AS INT) % 100000 = p.uid AND p.uid != 1000 30*6dbdd20aSAndroid Build Coastguard Worker`; 31*6dbdd20aSAndroid Build Coastguard Worker 32*6dbdd20aSAndroid Build Coastguard Workerconst COLUMNS = ['id', 'ts', 'dur', 'name']; 33*6dbdd20aSAndroid Build Coastguard Workerconst TRACK_NAME = 'Desktop Mode Windows'; 34*6dbdd20aSAndroid Build Coastguard Workerconst TRACK_URI = '/desktop_windows'; 35*6dbdd20aSAndroid Build Coastguard Worker 36*6dbdd20aSAndroid Build Coastguard Workerexport default class implements PerfettoPlugin { 37*6dbdd20aSAndroid Build Coastguard Worker static readonly id = 'dev.perfetto.AndroidDesktopMode'; 38*6dbdd20aSAndroid Build Coastguard Worker 39*6dbdd20aSAndroid Build Coastguard Worker async onTraceLoad(ctx: Trace): Promise<void> { 40*6dbdd20aSAndroid Build Coastguard Worker await ctx.engine.query(INCLUDE_DESKTOP_MODULE_QUERY); 41*6dbdd20aSAndroid Build Coastguard Worker await this.registerTrack(ctx, QUERY); 42*6dbdd20aSAndroid Build Coastguard Worker ctx.commands.registerCommand({ 43*6dbdd20aSAndroid Build Coastguard Worker id: 'dev.perfetto.DesktopMode#AddTrackDesktopWindowss', 44*6dbdd20aSAndroid Build Coastguard Worker name: 'Add Track: ' + TRACK_NAME, 45*6dbdd20aSAndroid Build Coastguard Worker callback: () => this.addSimpleTrack(ctx), 46*6dbdd20aSAndroid Build Coastguard Worker }); 47*6dbdd20aSAndroid Build Coastguard Worker } 48*6dbdd20aSAndroid Build Coastguard Worker 49*6dbdd20aSAndroid Build Coastguard Worker private async registerTrack(ctx: Trace, sql: string) { 50*6dbdd20aSAndroid Build Coastguard Worker const track = await createQuerySliceTrack({ 51*6dbdd20aSAndroid Build Coastguard Worker trace: ctx, 52*6dbdd20aSAndroid Build Coastguard Worker uri: TRACK_URI, 53*6dbdd20aSAndroid Build Coastguard Worker data: { 54*6dbdd20aSAndroid Build Coastguard Worker sqlSource: sql, 55*6dbdd20aSAndroid Build Coastguard Worker columns: COLUMNS, 56*6dbdd20aSAndroid Build Coastguard Worker }, 57*6dbdd20aSAndroid Build Coastguard Worker }); 58*6dbdd20aSAndroid Build Coastguard Worker ctx.tracks.registerTrack({ 59*6dbdd20aSAndroid Build Coastguard Worker uri: TRACK_URI, 60*6dbdd20aSAndroid Build Coastguard Worker title: TRACK_NAME, 61*6dbdd20aSAndroid Build Coastguard Worker track, 62*6dbdd20aSAndroid Build Coastguard Worker }); 63*6dbdd20aSAndroid Build Coastguard Worker } 64*6dbdd20aSAndroid Build Coastguard Worker 65*6dbdd20aSAndroid Build Coastguard Worker private addSimpleTrack(ctx: Trace) { 66*6dbdd20aSAndroid Build Coastguard Worker const trackNode = new TrackNode({uri: TRACK_URI, title: TRACK_NAME}); 67*6dbdd20aSAndroid Build Coastguard Worker ctx.workspace.addChildInOrder(trackNode); 68*6dbdd20aSAndroid Build Coastguard Worker trackNode.pin(); 69*6dbdd20aSAndroid Build Coastguard Worker } 70*6dbdd20aSAndroid Build Coastguard Worker} 71