/* * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this 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 {Component, ElementRef, Inject, Input} from '@angular/core'; import {TraceType} from 'trace/trace_type'; import {Transition} from 'trace/transition'; import {PropertyTreeNode} from 'trace/tree_node/property_tree_node'; import {CollapsibleSections} from 'viewers/common/collapsible_sections'; import {CollapsibleSectionType} from 'viewers/common/collapsible_section_type'; import {TimestampClickDetail, ViewerEvents} from 'viewers/common/viewer_events'; import {timeButtonStyle} from 'viewers/components/styles/clickable_property.styles'; import {selectedElementStyle} from 'viewers/components/styles/selected_element.styles'; import {viewerCardStyle} from 'viewers/components/styles/viewer_card.styles'; import {UiData} from './ui_data'; @Component({ selector: 'viewer-transitions', template: `
Id
Type
Send Time
Dispatch Time
Duration
Status
{{ transition.id }}
{{ transition.type }}
n/a
n/a
{{ transition.duration }} n/a
MERGED
ABORTED
PLAYED
`, styles: [ ` .container { display: flex; flex-grow: 1; flex-direction: row; } .entries { flex: 3; display: flex; flex-direction: column; padding: 16px; } .entries .scroll { height: 100%; } .entries .table-header { flex: 1; } .table-row { display: flex; flex-direction: row; cursor: pointer; border-bottom: solid 1px rgba(0, 0, 0, 0.12); } .table-header.table-row { font-weight: bold; border-bottom: solid 1px rgba(0, 0, 0, 0.5); } .table-row > div { padding: 16px; } .table-row .id { flex: 1; } .table-row .type { flex: 2; } .table-row .dispatch-time { flex: 4; } .table-row .send-time { flex: 4; } .table-row .duration { flex: 3; } .table-row .status { flex: 2; } .status > div { display: flex; justify-content: center; align-items: center; gap: 5px; } .transition-timeline .row svg rect { cursor: pointer; } .label { width: 300px; padding: 1rem; } .lines { flex-grow: 1; padding: 0.5rem; } .properties-view { flex: 1; } `, selectedElementStyle, timeButtonStyle, viewerCardStyle, ], }) export class ViewerTransitionsComponent { propertiesTitle = 'SELECTED TRANSITION'; CollapsibleSectionType = CollapsibleSectionType; sections = new CollapsibleSections([ { type: CollapsibleSectionType.PROPERTIES, label: this.propertiesTitle, isCollapsed: false, }, ]); constructor(@Inject(ElementRef) private elementRef: ElementRef) {} @Input() set inputData(data: UiData) { this.uiData = data; } onTransitionClicked(transition: Transition): void { this.emitEvent(ViewerEvents.TransitionSelected, transition.propertiesTree); } isSelectedTransition(transition: Transition): boolean { return ( transition.id === this.uiData.selectedTransition ?.getChildByName('wmData') ?.getChildByName('id') ?.getValue() || transition.id === this.uiData.selectedTransition ?.getChildByName('shellData') ?.getChildByName('id') ?.getValue() ); } onDispatchTimeClicked(transition: Transition) { this.emitEvent( ViewerEvents.TimestampClick, new TimestampClickDetail( transition.dispatchTime?.getValue(), transition.traceIndex, ), ); } onSendTimeClicked(transition: Transition) { this.emitEvent( ViewerEvents.TimestampClick, new TimestampClickDetail(transition.sendTime?.getValue(), undefined), ); } emitEvent(event: string, data: PropertyTreeNode | TimestampClickDetail) { const customEvent = new CustomEvent(event, { bubbles: true, detail: data, }); this.elementRef.nativeElement.dispatchEvent(customEvent); } uiData: UiData = UiData.EMPTY; }