1*6dbdd20aSAndroid Build Coastguard Worker// Copyright (C) 2023 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 {createStore, Store} from '../../base/store'; 16*6dbdd20aSAndroid Build Coastguard Workerimport {exists} from '../../base/utils'; 17*6dbdd20aSAndroid Build Coastguard Workerimport {Trace} from '../../public/trace'; 18*6dbdd20aSAndroid Build Coastguard Workerimport {PerfettoPlugin} from '../../public/plugin'; 19*6dbdd20aSAndroid Build Coastguard Workerimport {addQueryResultsTab} from '../../components/query_table/query_result_tab'; 20*6dbdd20aSAndroid Build Coastguard Worker 21*6dbdd20aSAndroid Build Coastguard Workerinterface State { 22*6dbdd20aSAndroid Build Coastguard Worker counter: number; 23*6dbdd20aSAndroid Build Coastguard Worker} 24*6dbdd20aSAndroid Build Coastguard Worker 25*6dbdd20aSAndroid Build Coastguard Worker// This example plugin shows using state that is persisted in the 26*6dbdd20aSAndroid Build Coastguard Worker// permalink. 27*6dbdd20aSAndroid Build Coastguard Workerexport default class implements PerfettoPlugin { 28*6dbdd20aSAndroid Build Coastguard Worker static readonly id = 'com.example.ExampleState'; 29*6dbdd20aSAndroid Build Coastguard Worker private store: Store<State> = createStore({counter: 0}); 30*6dbdd20aSAndroid Build Coastguard Worker 31*6dbdd20aSAndroid Build Coastguard Worker private migrate(initialState: unknown): State { 32*6dbdd20aSAndroid Build Coastguard Worker if ( 33*6dbdd20aSAndroid Build Coastguard Worker exists(initialState) && 34*6dbdd20aSAndroid Build Coastguard Worker typeof initialState === 'object' && 35*6dbdd20aSAndroid Build Coastguard Worker 'counter' in initialState && 36*6dbdd20aSAndroid Build Coastguard Worker typeof initialState.counter === 'number' 37*6dbdd20aSAndroid Build Coastguard Worker ) { 38*6dbdd20aSAndroid Build Coastguard Worker return {counter: initialState.counter}; 39*6dbdd20aSAndroid Build Coastguard Worker } else { 40*6dbdd20aSAndroid Build Coastguard Worker return {counter: 0}; 41*6dbdd20aSAndroid Build Coastguard Worker } 42*6dbdd20aSAndroid Build Coastguard Worker } 43*6dbdd20aSAndroid Build Coastguard Worker 44*6dbdd20aSAndroid Build Coastguard Worker async onTraceLoad(ctx: Trace): Promise<void> { 45*6dbdd20aSAndroid Build Coastguard Worker this.store = ctx.mountStore((init: unknown) => this.migrate(init)); 46*6dbdd20aSAndroid Build Coastguard Worker ctx.trash.use(this.store); 47*6dbdd20aSAndroid Build Coastguard Worker 48*6dbdd20aSAndroid Build Coastguard Worker ctx.commands.registerCommand({ 49*6dbdd20aSAndroid Build Coastguard Worker id: 'com.example.ExampleState#ShowCounter', 50*6dbdd20aSAndroid Build Coastguard Worker name: 'Show ExampleState counter', 51*6dbdd20aSAndroid Build Coastguard Worker callback: () => { 52*6dbdd20aSAndroid Build Coastguard Worker const counter = this.store.state.counter; 53*6dbdd20aSAndroid Build Coastguard Worker addQueryResultsTab(ctx, { 54*6dbdd20aSAndroid Build Coastguard Worker query: `SELECT ${counter} as counter;`, 55*6dbdd20aSAndroid Build Coastguard Worker title: `Show counter ${counter}`, 56*6dbdd20aSAndroid Build Coastguard Worker }); 57*6dbdd20aSAndroid Build Coastguard Worker this.store.edit((draft) => { 58*6dbdd20aSAndroid Build Coastguard Worker ++draft.counter; 59*6dbdd20aSAndroid Build Coastguard Worker }); 60*6dbdd20aSAndroid Build Coastguard Worker }, 61*6dbdd20aSAndroid Build Coastguard Worker }); 62*6dbdd20aSAndroid Build Coastguard Worker } 63*6dbdd20aSAndroid Build Coastguard Worker} 64