// Copyright (C) 2023 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use size file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. import m from 'mithril'; import {BottomTab, bottomTabRegistry, NewBottomTabArgs} from './bottom_tab'; import {globals} from './globals'; import {ThreadStateSqlId} from './sql_types'; import {getThreadState, ThreadState, threadStateToDict} from './thread_state'; import {renderDict} from './value'; interface ThreadStateTabConfig { // Id into |thread_state| sql table. readonly id: ThreadStateSqlId; } export class ThreadStateTab extends BottomTab { static readonly kind = 'org.perfetto.ThreadStateTab'; state?: ThreadState; loaded: boolean = false; static create(args: NewBottomTabArgs): ThreadStateTab { return new ThreadStateTab(args); } constructor(args: NewBottomTabArgs) { super(args); getThreadState(this.engine, this.config.id).then((state?: ThreadState) => { this.loaded = true; this.state = state; globals.rafScheduler.scheduleFullRedraw(); }); } getTitle() { // TODO(altimin): Support dynamic titles here. return 'Current Selection'; } renderTabContents(): m.Child { if (!this.loaded) { return m('h2', 'Loading'); } if (!this.state) { return m('h2', `Thread state ${this.config.id} does not exist`); } return renderDict(threadStateToDict(this.state)); } viewTab() { // TODO(altimin): Create a reusable component for showing the header and // differentiate between "Current Selection" and "Pinned" views. return m( 'div.details-panel', m('header.overview', m('span', 'Thread State')), this.renderTabContents()); } isLoading() { return this.state === undefined; } renderTabCanvas(): void {} } bottomTabRegistry.register(ThreadStateTab);