1/* 2 * Copyright (C) 2022 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17import {WinscopeEvent} from 'messaging/winscope_event'; 18import {Trace} from 'trace/trace'; 19import {Traces} from 'trace/traces'; 20import {HierarchyTreeNode} from 'trace/tree_node/hierarchy_tree_node'; 21import {AbstractPresenterInputMethod} from 'viewers/common/abstract_presenter_input_method'; 22import {ImeUiData} from 'viewers/common/ime_ui_data'; 23import {ViewerEvents} from 'viewers/common/viewer_events'; 24import {View, Viewer} from 'viewers/viewer'; 25import {NotifyHierarchyViewCallbackType} from './abstract_hierarchy_viewer_presenter'; 26 27export abstract class AbstractViewerInputMethod implements Viewer { 28 private readonly trace: Trace<HierarchyTreeNode>; 29 protected readonly htmlElement: HTMLElement; 30 protected readonly presenter: AbstractPresenterInputMethod; 31 protected abstract readonly view: View; 32 33 protected imeUiCallback = ((uiData: ImeUiData) => { 34 (this.htmlElement as any).inputData = uiData; 35 }) as NotifyHierarchyViewCallbackType; 36 37 constructor( 38 trace: Trace<HierarchyTreeNode>, 39 traces: Traces, 40 storage: Storage, 41 ) { 42 this.trace = trace; 43 this.htmlElement = document.createElement('viewer-input-method'); 44 this.presenter = this.initializePresenter(trace, traces, storage); 45 this.addViewerEventListeners(); 46 } 47 48 async onWinscopeEvent(event: WinscopeEvent) { 49 await this.presenter.onAppEvent(event); 50 } 51 52 setEmitEvent() { 53 // do nothing 54 } 55 56 getViews(): View[] { 57 return [this.view]; 58 } 59 60 getTraces(): Array<Trace<HierarchyTreeNode>> { 61 return [this.trace]; 62 } 63 64 protected addViewerEventListeners() { 65 this.presenter.addEventListeners(this.htmlElement); 66 this.htmlElement.addEventListener( 67 ViewerEvents.AdditionalPropertySelected, 68 async (event) => 69 await this.presenter.onAdditionalPropertySelected( 70 (event as CustomEvent).detail.selectedItem, 71 ), 72 ); 73 } 74 75 protected abstract initializePresenter( 76 trace: Trace<HierarchyTreeNode>, 77 traces: Traces, 78 storage: Storage, 79 ): AbstractPresenterInputMethod; 80} 81