1fb726d48Sopenharmony_ci/*
2fb726d48Sopenharmony_ci * Copyright (C) 2022 Huawei Device Co., Ltd.
3fb726d48Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4fb726d48Sopenharmony_ci * you may not use this file except in compliance with the License.
5fb726d48Sopenharmony_ci * You may obtain a copy of the License at
6fb726d48Sopenharmony_ci *
7fb726d48Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8fb726d48Sopenharmony_ci *
9fb726d48Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10fb726d48Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11fb726d48Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12fb726d48Sopenharmony_ci * See the License for the specific language governing permissions and
13fb726d48Sopenharmony_ci * limitations under the License.
14fb726d48Sopenharmony_ci */
15fb726d48Sopenharmony_ci
16fb726d48Sopenharmony_ciimport { SpSystemTrace } from '../SpSystemTrace';
17fb726d48Sopenharmony_ciimport { TraceRow } from '../trace/base/TraceRow';
18fb726d48Sopenharmony_ci
19fb726d48Sopenharmony_ciimport { BaseStruct } from '../../bean/BaseStruct';
20fb726d48Sopenharmony_ciimport { CounterStruct, SdkCounterRender } from '../../database/ui-worker/ProduceWorkerSdkCounter';
21fb726d48Sopenharmony_ciimport { renders } from '../../database/ui-worker/ProcedureWorker';
22fb726d48Sopenharmony_ciimport { SdkSliceRender, SdkSliceStruct } from '../../database/ui-worker/ProduceWorkerSdkSlice';
23fb726d48Sopenharmony_ciimport { EmptyRender } from '../../database/ui-worker/cpu/ProcedureWorkerCPU';
24fb726d48Sopenharmony_ciimport { TabUtil } from '../trace/sheet/sdk/TabUtil';
25fb726d48Sopenharmony_ciimport { queryCounterMax, querySdkCount, querySdkCounterData, querySdkSliceData } from '../../database/sql/Sdk.sql';
26fb726d48Sopenharmony_ciimport { queryStartTime } from '../../database/sql/SqlLite.sql';
27fb726d48Sopenharmony_ciimport { NUM_7 } from '../../bean/NumBean';
28fb726d48Sopenharmony_ci
29fb726d48Sopenharmony_ciexport class SpSdkChart {
30fb726d48Sopenharmony_ci  trace: SpSystemTrace;
31fb726d48Sopenharmony_ci  private pluginName = 'dubai-plugin';
32fb726d48Sopenharmony_ci
33fb726d48Sopenharmony_ci  constructor(trace: SpSystemTrace) {
34fb726d48Sopenharmony_ci    this.trace = trace;
35fb726d48Sopenharmony_ci  }
36fb726d48Sopenharmony_ci
37fb726d48Sopenharmony_ci  private parseJsonByCounterType(startTime: number, showType: unknown, configObj: unknown, table: unknown): void {
38fb726d48Sopenharmony_ci    let chartSql = this.createSql(
39fb726d48Sopenharmony_ci      startTime, //@ts-ignore
40fb726d48Sopenharmony_ci      showType.tableName, //@ts-ignore
41fb726d48Sopenharmony_ci      showType.columns,
42fb726d48Sopenharmony_ci      'where counter_id' + ' = $counter_id'
43fb726d48Sopenharmony_ci    ); //@ts-ignore
44fb726d48Sopenharmony_ci    let maxValue = this.createMaxValueSql(showType.tableName, 'where counter_id = $counter_id'); //@ts-ignore
45fb726d48Sopenharmony_ci    let innerTable = showType.inner;
46fb726d48Sopenharmony_ci    let countSql = this.createSql(startTime, innerTable.tableName, innerTable.columns); //@ts-ignore
47fb726d48Sopenharmony_ci    table.push({
48fb726d48Sopenharmony_ci      countSql: countSql,
49fb726d48Sopenharmony_ci      chartSql: chartSql,
50fb726d48Sopenharmony_ci      maxSql: maxValue,
51fb726d48Sopenharmony_ci      type: 'counter', //@ts-ignore
52fb726d48Sopenharmony_ci      name: configObj.disPlayName, //@ts-ignore
53fb726d48Sopenharmony_ci      pluginName: configObj.pluginName,
54fb726d48Sopenharmony_ci    });
55fb726d48Sopenharmony_ci  }
56fb726d48Sopenharmony_ci
57fb726d48Sopenharmony_ci  private parseJsonBySliceType(startTime: number, showType: unknown, configObj: unknown, table: unknown[]): void {
58fb726d48Sopenharmony_ci    let chartSql = this.createSliceSql(
59fb726d48Sopenharmony_ci      startTime, //@ts-ignore
60fb726d48Sopenharmony_ci      showType.tableName, //@ts-ignore
61fb726d48Sopenharmony_ci      showType.columns,
62fb726d48Sopenharmony_ci      'where' + ` slice_id = $column_id and (start_ts - ${startTime}) between $startNS and $endNS;`
63fb726d48Sopenharmony_ci    ); //@ts-ignore
64fb726d48Sopenharmony_ci    let innerTable = showType.inner;
65fb726d48Sopenharmony_ci    let countSql;
66fb726d48Sopenharmony_ci    let countOtherSql = ''; //@ts-ignore
67fb726d48Sopenharmony_ci    if (configObj.pluginName === this.pluginName) {
68fb726d48Sopenharmony_ci      countSql = this.createSql(startTime, innerTable.tableName, innerTable.columns, 'where slice_name like $suffix');
69fb726d48Sopenharmony_ci      countOtherSql = this.createSql(
70fb726d48Sopenharmony_ci        startTime,
71fb726d48Sopenharmony_ci        innerTable.tableName,
72fb726d48Sopenharmony_ci        innerTable.columns,
73fb726d48Sopenharmony_ci        '' +
74fb726d48Sopenharmony_ci          "where slice_name not like '%_cpu' and slice_name not like '%_display' and " +
75fb726d48Sopenharmony_ci          "slice_name not like '%_gpu' and slice_name not like '%_System_idle' and " +
76fb726d48Sopenharmony_ci          "slice_name not like '%_wifi_data' and slice_name not like '%_sensor' and " +
77fb726d48Sopenharmony_ci          "slice_name not like '%_audio' "
78fb726d48Sopenharmony_ci      );
79fb726d48Sopenharmony_ci    } else {
80fb726d48Sopenharmony_ci      countSql = this.createSql(startTime, innerTable.tableName, innerTable.columns);
81fb726d48Sopenharmony_ci    }
82fb726d48Sopenharmony_ci    table.push({
83fb726d48Sopenharmony_ci      countSql: countSql,
84fb726d48Sopenharmony_ci      chartSql: chartSql,
85fb726d48Sopenharmony_ci      type: 'slice', //@ts-ignore
86fb726d48Sopenharmony_ci      name: configObj.disPlayName, //@ts-ignore
87fb726d48Sopenharmony_ci      pluginName: configObj.pluginName,
88fb726d48Sopenharmony_ci      countOtherSql: countOtherSql,
89fb726d48Sopenharmony_ci    });
90fb726d48Sopenharmony_ci  }
91fb726d48Sopenharmony_ci
92fb726d48Sopenharmony_ci  parseJson(startTime: number, map: Map<number, string>): Map<number, unknown> {
93fb726d48Sopenharmony_ci    let tablesMap = new Map();
94fb726d48Sopenharmony_ci    let keys = map.keys();
95fb726d48Sopenharmony_ci    for (let key of keys) {
96fb726d48Sopenharmony_ci      let table: unknown[] = [];
97fb726d48Sopenharmony_ci      let configObj: unknown = map.get(key);
98fb726d48Sopenharmony_ci      if (configObj !== undefined) {
99fb726d48Sopenharmony_ci        //@ts-ignore
100fb726d48Sopenharmony_ci        let configStr = configObj.jsonConfig;
101fb726d48Sopenharmony_ci        let json = JSON.parse(configStr);
102fb726d48Sopenharmony_ci        let tableConfig = json.tableConfig;
103fb726d48Sopenharmony_ci        if (tableConfig !== null) {
104fb726d48Sopenharmony_ci          let showTypes = tableConfig.showType;
105fb726d48Sopenharmony_ci          for (let i = 0; i < showTypes.length; i++) {
106fb726d48Sopenharmony_ci            let showType = showTypes[i];
107fb726d48Sopenharmony_ci            let type = TabUtil.getTableType(showType);
108fb726d48Sopenharmony_ci            if (type === 'counter') {
109fb726d48Sopenharmony_ci              this.parseJsonByCounterType(startTime, showType, configObj, table);
110fb726d48Sopenharmony_ci            } else if (type === 'slice') {
111fb726d48Sopenharmony_ci              this.parseJsonBySliceType(startTime, showType, configObj, table);
112fb726d48Sopenharmony_ci            }
113fb726d48Sopenharmony_ci          }
114fb726d48Sopenharmony_ci          tablesMap.set(key, table);
115fb726d48Sopenharmony_ci        }
116fb726d48Sopenharmony_ci      }
117fb726d48Sopenharmony_ci    }
118fb726d48Sopenharmony_ci    return tablesMap;
119fb726d48Sopenharmony_ci  }
120fb726d48Sopenharmony_ci
121fb726d48Sopenharmony_ci  private createSliceSql(startTime: number, tableName: string, columns: Array<unknown>, where?: string): string {
122fb726d48Sopenharmony_ci    let sliceSelectSql = 'select ';
123fb726d48Sopenharmony_ci    for (let i = 0; i < columns.length; i++) {
124fb726d48Sopenharmony_ci      let column = columns[i]; //@ts-ignore
125fb726d48Sopenharmony_ci      if (column.column === 'start_ts') {
126fb726d48Sopenharmony_ci        //@ts-ignore
127fb726d48Sopenharmony_ci        column.column = `(start_ts - ${startTime}) AS start_ts`;
128fb726d48Sopenharmony_ci      } //@ts-ignore
129fb726d48Sopenharmony_ci      if (column.column === 'end_ts') {
130fb726d48Sopenharmony_ci        //@ts-ignore
131fb726d48Sopenharmony_ci        column.column = `(end_ts - ${startTime}) AS end_ts`;
132fb726d48Sopenharmony_ci      }
133fb726d48Sopenharmony_ci      if (i === columns.length - 1) {
134fb726d48Sopenharmony_ci        //@ts-ignore
135fb726d48Sopenharmony_ci        sliceSelectSql = `${sliceSelectSql + column.column} `;
136fb726d48Sopenharmony_ci      } else {
137fb726d48Sopenharmony_ci        //@ts-ignore
138fb726d48Sopenharmony_ci        sliceSelectSql = `${sliceSelectSql + column.column}, `;
139fb726d48Sopenharmony_ci      }
140fb726d48Sopenharmony_ci    }
141fb726d48Sopenharmony_ci    sliceSelectSql = `${sliceSelectSql}from ${tableName}`;
142fb726d48Sopenharmony_ci    if (where !== undefined) {
143fb726d48Sopenharmony_ci      sliceSelectSql = `${sliceSelectSql} ${where}`;
144fb726d48Sopenharmony_ci    }
145fb726d48Sopenharmony_ci    return sliceSelectSql;
146fb726d48Sopenharmony_ci  }
147fb726d48Sopenharmony_ci
148fb726d48Sopenharmony_ci  private createMaxValueSql(tableName: string, where?: string): string {
149fb726d48Sopenharmony_ci    let selectSql = `select max(value) as max_value from ${tableName}`;
150fb726d48Sopenharmony_ci    if (where !== undefined) {
151fb726d48Sopenharmony_ci      selectSql = `${selectSql} ${where}`;
152fb726d48Sopenharmony_ci    }
153fb726d48Sopenharmony_ci    return selectSql;
154fb726d48Sopenharmony_ci  }
155fb726d48Sopenharmony_ci
156fb726d48Sopenharmony_ci  private createSql(startTime: number, tableName: string, columns: Array<unknown>, where?: string): string {
157fb726d48Sopenharmony_ci    let selectSql = 'select ';
158fb726d48Sopenharmony_ci    for (let i = 0; i < columns.length; i++) {
159fb726d48Sopenharmony_ci      let column = columns[i]; //@ts-ignore
160fb726d48Sopenharmony_ci      if (column.column === 'ts') {
161fb726d48Sopenharmony_ci        //@ts-ignore
162fb726d48Sopenharmony_ci        column.column = `ts - ${startTime} AS ts`;
163fb726d48Sopenharmony_ci      }
164fb726d48Sopenharmony_ci      if (i === columns.length - 1) {
165fb726d48Sopenharmony_ci        //@ts-ignore
166fb726d48Sopenharmony_ci        selectSql = `${selectSql + column.column} `;
167fb726d48Sopenharmony_ci      } else {
168fb726d48Sopenharmony_ci        //@ts-ignore
169fb726d48Sopenharmony_ci        selectSql = `${selectSql + column.column}, `;
170fb726d48Sopenharmony_ci      }
171fb726d48Sopenharmony_ci    }
172fb726d48Sopenharmony_ci    selectSql = `${selectSql}from ${tableName}`;
173fb726d48Sopenharmony_ci    if (where !== undefined) {
174fb726d48Sopenharmony_ci      selectSql = `${selectSql} ${where}`;
175fb726d48Sopenharmony_ci    }
176fb726d48Sopenharmony_ci    return selectSql;
177fb726d48Sopenharmony_ci  }
178fb726d48Sopenharmony_ci
179fb726d48Sopenharmony_ci  async init(): Promise<void> {
180fb726d48Sopenharmony_ci    let configMap = SpSystemTrace.SDK_CONFIG_MAP;
181fb726d48Sopenharmony_ci    if (configMap === undefined) {
182fb726d48Sopenharmony_ci      return;
183fb726d48Sopenharmony_ci    }
184fb726d48Sopenharmony_ci    let res = await queryStartTime();
185fb726d48Sopenharmony_ci    //@ts-ignore
186fb726d48Sopenharmony_ci    let startTime = res[0].start_ts;
187fb726d48Sopenharmony_ci    // @ts-ignore
188fb726d48Sopenharmony_ci    let tablesMap = this.parseJson(startTime, configMap);
189fb726d48Sopenharmony_ci    let tableKeys = tablesMap.keys();
190fb726d48Sopenharmony_ci    for (let componentId of tableKeys) {
191fb726d48Sopenharmony_ci      let table = tablesMap.get(componentId);
192fb726d48Sopenharmony_ci      if (table !== null) {
193fb726d48Sopenharmony_ci        //@ts-ignore
194fb726d48Sopenharmony_ci        let nodeRow = this.initNodeRow(componentId, table[0].name); //@ts-ignore
195fb726d48Sopenharmony_ci        for (let index = 0; index < table.length; index++) {
196fb726d48Sopenharmony_ci          //@ts-ignore
197fb726d48Sopenharmony_ci          let sqlMap = table[index];
198fb726d48Sopenharmony_ci          if (sqlMap.type === 'counter') {
199fb726d48Sopenharmony_ci            let result = await querySdkCount(sqlMap.countSql, componentId);
200fb726d48Sopenharmony_ci            for (let i = 0; i < result.length; i++) {
201fb726d48Sopenharmony_ci              await this.initCounter(nodeRow, i, result[i], sqlMap, componentId);
202fb726d48Sopenharmony_ci            }
203fb726d48Sopenharmony_ci          } else if (sqlMap.type === 'slice' && sqlMap.pluginName === this.pluginName) {
204fb726d48Sopenharmony_ci            let suffixList = ['cpu', 'display', 'gpu', 'System_idle', 'wifi_data', 'sensor', 'audio'];
205fb726d48Sopenharmony_ci            for (let i = 0; i < suffixList.length; i++) {
206fb726d48Sopenharmony_ci              let result = await querySdkCount(sqlMap.countSql, componentId, { $suffix: `%${suffixList[i]}` });
207fb726d48Sopenharmony_ci              if (result.length > 0) {
208fb726d48Sopenharmony_ci                let groupNodeRow = await this.initSecondaryRow(nodeRow, i, suffixList[i]);
209fb726d48Sopenharmony_ci                for (let i = 0; i < result.length; i++) {
210fb726d48Sopenharmony_ci                  await this.initSlice(groupNodeRow, i, result[i], sqlMap, componentId);
211fb726d48Sopenharmony_ci                }
212fb726d48Sopenharmony_ci              }
213fb726d48Sopenharmony_ci            }
214fb726d48Sopenharmony_ci            let result = await querySdkCount(sqlMap.countOtherSql, componentId);
215fb726d48Sopenharmony_ci            if (result.length > 0) {
216fb726d48Sopenharmony_ci              let groupNodeRow = await this.initSecondaryRow(nodeRow, NUM_7, 'other');
217fb726d48Sopenharmony_ci              for (let i = 0; i < result.length; i++) {
218fb726d48Sopenharmony_ci                await this.initSlice(groupNodeRow, i, result[i], sqlMap, componentId);
219fb726d48Sopenharmony_ci              }
220fb726d48Sopenharmony_ci            }
221fb726d48Sopenharmony_ci          } else if (sqlMap.type === 'slice') {
222fb726d48Sopenharmony_ci            let result = await querySdkCount(sqlMap.countSql, componentId, {});
223fb726d48Sopenharmony_ci            for (let i = 0; i < result.length; i++) {
224fb726d48Sopenharmony_ci              await this.initSlice(nodeRow, i, result[i], sqlMap, componentId);
225fb726d48Sopenharmony_ci            }
226fb726d48Sopenharmony_ci          }
227fb726d48Sopenharmony_ci        }
228fb726d48Sopenharmony_ci      }
229fb726d48Sopenharmony_ci    }
230fb726d48Sopenharmony_ci  }
231fb726d48Sopenharmony_ci
232fb726d48Sopenharmony_ci  private initCounterChartRow(
233fb726d48Sopenharmony_ci    componentId: number,
234fb726d48Sopenharmony_ci    expansion: boolean,
235fb726d48Sopenharmony_ci    counterId: string,
236fb726d48Sopenharmony_ci    counterName: string
237fb726d48Sopenharmony_ci  ): TraceRow<CounterStruct> {
238fb726d48Sopenharmony_ci    let traceRow = TraceRow.skeleton<CounterStruct>();
239fb726d48Sopenharmony_ci    traceRow.rowParentId = `Sdk-${componentId}`;
240fb726d48Sopenharmony_ci    traceRow.rowHidden = !expansion;
241fb726d48Sopenharmony_ci    traceRow.rowId = `${counterId}-${componentId}`;
242fb726d48Sopenharmony_ci    traceRow.rowType = TraceRow.ROW_TYPE_SDK_COUNTER;
243fb726d48Sopenharmony_ci    traceRow.folderPaddingLeft = 30;
244fb726d48Sopenharmony_ci    traceRow.favoriteChangeHandler = this.trace.favoriteChangeHandler;
245fb726d48Sopenharmony_ci    traceRow.selectChangeHandler = this.trace.selectChangeHandler;
246fb726d48Sopenharmony_ci    traceRow.style.height = '40px';
247fb726d48Sopenharmony_ci    traceRow.style.width = '100%';
248fb726d48Sopenharmony_ci    traceRow.setAttribute('children', '');
249fb726d48Sopenharmony_ci    traceRow.name = `${counterName}`;
250fb726d48Sopenharmony_ci    return traceRow;
251fb726d48Sopenharmony_ci  }
252fb726d48Sopenharmony_ci
253fb726d48Sopenharmony_ci  private initCounter = async (
254fb726d48Sopenharmony_ci    nodeRow: TraceRow<BaseStruct>,
255fb726d48Sopenharmony_ci    index: number,
256fb726d48Sopenharmony_ci    result: unknown,
257fb726d48Sopenharmony_ci    sqlMap: unknown,
258fb726d48Sopenharmony_ci    componentId: number
259fb726d48Sopenharmony_ci  ): Promise<void> => {
260fb726d48Sopenharmony_ci    //@ts-ignore
261fb726d48Sopenharmony_ci    let traceRow = this.initCounterChartRow(componentId, nodeRow.expansion, result.counter_id, result.counter_name);
262fb726d48Sopenharmony_ci    traceRow.supplier = async (): Promise<CounterStruct[]> => //@ts-ignore
263fb726d48Sopenharmony_ci      querySdkCounterData(sqlMap.chartSql, result.counter_id, componentId);
264fb726d48Sopenharmony_ci    traceRow.focusHandler = (): void => {
265fb726d48Sopenharmony_ci      this.trace?.displayTip(
266fb726d48Sopenharmony_ci        traceRow,
267fb726d48Sopenharmony_ci        CounterStruct.hoverCounterStruct,
268fb726d48Sopenharmony_ci        `<span>${CounterStruct.hoverCounterStruct?.value?.toFixed(2)}</span>`
269fb726d48Sopenharmony_ci      );
270fb726d48Sopenharmony_ci    };
271fb726d48Sopenharmony_ci    traceRow.findHoverStruct = (): void => {
272fb726d48Sopenharmony_ci      CounterStruct.hoverCounterStruct = traceRow.getHoverStruct();
273fb726d48Sopenharmony_ci    }; //@ts-ignore
274fb726d48Sopenharmony_ci    let maxList = await queryCounterMax(sqlMap.maxSql, result.counter_id, componentId);
275fb726d48Sopenharmony_ci    //@ts-ignore
276fb726d48Sopenharmony_ci    let maxCounter = maxList[0].max_value;
277fb726d48Sopenharmony_ci    traceRow.onThreadHandler = (useCache: boolean): void => {
278fb726d48Sopenharmony_ci      let context: CanvasRenderingContext2D;
279fb726d48Sopenharmony_ci      if (traceRow.currentContext) {
280fb726d48Sopenharmony_ci        context = traceRow.currentContext;
281fb726d48Sopenharmony_ci      } else {
282fb726d48Sopenharmony_ci        context = traceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!;
283fb726d48Sopenharmony_ci      }
284fb726d48Sopenharmony_ci      traceRow.canvasSave(context);
285fb726d48Sopenharmony_ci      //@ts-ignore
286fb726d48Sopenharmony_ci      (renders[TraceRow.ROW_TYPE_SDK_COUNTER] as SdkCounterRender).renderMainThread(
287fb726d48Sopenharmony_ci        {
288fb726d48Sopenharmony_ci          context: context,
289fb726d48Sopenharmony_ci          useCache: useCache,
290fb726d48Sopenharmony_ci          type: `sdk-counter-${index}`,
291fb726d48Sopenharmony_ci          maxName: `${maxCounter}`,
292fb726d48Sopenharmony_ci          maxValue: maxCounter,
293fb726d48Sopenharmony_ci        },
294fb726d48Sopenharmony_ci        traceRow
295fb726d48Sopenharmony_ci      );
296fb726d48Sopenharmony_ci      traceRow.canvasRestore(context, this.trace);
297fb726d48Sopenharmony_ci    };
298fb726d48Sopenharmony_ci    nodeRow.addChildTraceRow(traceRow);
299fb726d48Sopenharmony_ci  };
300fb726d48Sopenharmony_ci
301fb726d48Sopenharmony_ci  private initNodeRow = (index: number, name: string): TraceRow<BaseStruct> => {
302fb726d48Sopenharmony_ci    let sdkFolder = TraceRow.skeleton();
303fb726d48Sopenharmony_ci    sdkFolder.rowId = `Sdk-${index}`;
304fb726d48Sopenharmony_ci    sdkFolder.index = index;
305fb726d48Sopenharmony_ci    sdkFolder.rowType = TraceRow.ROW_TYPE_SDK;
306fb726d48Sopenharmony_ci    sdkFolder.rowParentId = '';
307fb726d48Sopenharmony_ci    sdkFolder.style.height = '40px';
308fb726d48Sopenharmony_ci    sdkFolder.folder = true;
309fb726d48Sopenharmony_ci    sdkFolder.name = `${name}`;
310fb726d48Sopenharmony_ci    sdkFolder.favoriteChangeHandler = this.trace.favoriteChangeHandler;
311fb726d48Sopenharmony_ci    sdkFolder.selectChangeHandler = this.trace.selectChangeHandler;
312fb726d48Sopenharmony_ci    sdkFolder.supplier = async (): Promise<BaseStruct[]> => new Promise<[]>((resolve) => resolve([]));
313fb726d48Sopenharmony_ci    sdkFolder.onThreadHandler = (useCache: boolean): void => {
314fb726d48Sopenharmony_ci      sdkFolder.canvasSave(this.trace.canvasPanelCtx!);
315fb726d48Sopenharmony_ci      if (sdkFolder.expansion) {
316fb726d48Sopenharmony_ci        // @ts-ignore
317fb726d48Sopenharmony_ci        this.trace.canvasPanelCtx?.clearRect(0, 0, sdkFolder.frame.width, sdkFolder.frame.height);
318fb726d48Sopenharmony_ci      } else {
319fb726d48Sopenharmony_ci        (renders.empty as EmptyRender).renderMainThread(
320fb726d48Sopenharmony_ci          {
321fb726d48Sopenharmony_ci            context: this.trace.canvasPanelCtx,
322fb726d48Sopenharmony_ci            useCache: useCache,
323fb726d48Sopenharmony_ci            type: '',
324fb726d48Sopenharmony_ci          },
325fb726d48Sopenharmony_ci          // @ts-ignore
326fb726d48Sopenharmony_ci          sdkFolder
327fb726d48Sopenharmony_ci        );
328fb726d48Sopenharmony_ci      }
329fb726d48Sopenharmony_ci      sdkFolder.canvasRestore(this.trace.canvasPanelCtx!, this.trace);
330fb726d48Sopenharmony_ci    };
331fb726d48Sopenharmony_ci    this.trace.rowsEL?.appendChild(sdkFolder);
332fb726d48Sopenharmony_ci    return sdkFolder;
333fb726d48Sopenharmony_ci  };
334fb726d48Sopenharmony_ci
335fb726d48Sopenharmony_ci  private initSecondaryRow = async (
336fb726d48Sopenharmony_ci    nodeRow: TraceRow<BaseStruct>,
337fb726d48Sopenharmony_ci    index: number,
338fb726d48Sopenharmony_ci    name: string
339fb726d48Sopenharmony_ci  ): Promise<TraceRow<BaseStruct>> => {
340fb726d48Sopenharmony_ci    let sdkSecondFolder = TraceRow.skeleton();
341fb726d48Sopenharmony_ci    sdkSecondFolder.rowId = `Sdk-${name}-${index}`;
342fb726d48Sopenharmony_ci    sdkSecondFolder.index = index;
343fb726d48Sopenharmony_ci    sdkSecondFolder.rowType = TraceRow.ROW_TYPE_SDK;
344fb726d48Sopenharmony_ci    sdkSecondFolder.rowParentId = nodeRow.rowId;
345fb726d48Sopenharmony_ci    sdkSecondFolder.rowHidden = !nodeRow.expansion;
346fb726d48Sopenharmony_ci    sdkSecondFolder.style.height = '40px';
347fb726d48Sopenharmony_ci    sdkSecondFolder.folder = true;
348fb726d48Sopenharmony_ci    sdkSecondFolder.folderPaddingLeft = 30;
349fb726d48Sopenharmony_ci    sdkSecondFolder.name = `${name}`;
350fb726d48Sopenharmony_ci    sdkSecondFolder.favoriteChangeHandler = this.trace.favoriteChangeHandler;
351fb726d48Sopenharmony_ci    sdkSecondFolder.selectChangeHandler = this.trace.selectChangeHandler;
352fb726d48Sopenharmony_ci    sdkSecondFolder.supplier = async (): Promise<BaseStruct[]> => new Promise<[]>((resolve) => resolve([]));
353fb726d48Sopenharmony_ci    sdkSecondFolder.onThreadHandler = (useCache: boolean): void => {
354fb726d48Sopenharmony_ci      sdkSecondFolder.canvasSave(this.trace.canvasPanelCtx!);
355fb726d48Sopenharmony_ci      if (sdkSecondFolder.expansion) {
356fb726d48Sopenharmony_ci        // @ts-ignore
357fb726d48Sopenharmony_ci        this.trace.canvasPanelCtx?.clearRect(0, 0, sdkSecondFolder.frame.width, sdkSecondFolder.frame.height);
358fb726d48Sopenharmony_ci      } else {
359fb726d48Sopenharmony_ci        (renders.empty as EmptyRender).renderMainThread(
360fb726d48Sopenharmony_ci          {
361fb726d48Sopenharmony_ci            context: this.trace.canvasPanelCtx,
362fb726d48Sopenharmony_ci            useCache: useCache,
363fb726d48Sopenharmony_ci            type: '',
364fb726d48Sopenharmony_ci          },
365fb726d48Sopenharmony_ci          // @ts-ignore
366fb726d48Sopenharmony_ci          sdkSecondFolder
367fb726d48Sopenharmony_ci        );
368fb726d48Sopenharmony_ci      }
369fb726d48Sopenharmony_ci      sdkSecondFolder.canvasRestore(this.trace.canvasPanelCtx!, this.trace);
370fb726d48Sopenharmony_ci    };
371fb726d48Sopenharmony_ci    this.trace.rowsEL?.appendChild(sdkSecondFolder);
372fb726d48Sopenharmony_ci    return sdkSecondFolder;
373fb726d48Sopenharmony_ci  };
374fb726d48Sopenharmony_ci
375fb726d48Sopenharmony_ci  private initSliceChartRow(
376fb726d48Sopenharmony_ci    expansion: boolean,
377fb726d48Sopenharmony_ci    rowId: string,
378fb726d48Sopenharmony_ci    sliceId: string,
379fb726d48Sopenharmony_ci    sliceName: string,
380fb726d48Sopenharmony_ci    componentId: number
381fb726d48Sopenharmony_ci  ): TraceRow<SdkSliceStruct> {
382fb726d48Sopenharmony_ci    let traceRow = TraceRow.skeleton<SdkSliceStruct>();
383fb726d48Sopenharmony_ci    traceRow.rowType = TraceRow.ROW_TYPE_SDK_SLICE;
384fb726d48Sopenharmony_ci    traceRow.rowHidden = !expansion;
385fb726d48Sopenharmony_ci    traceRow.rowParentId = rowId;
386fb726d48Sopenharmony_ci    traceRow.folderPaddingLeft = 30;
387fb726d48Sopenharmony_ci    traceRow.style.height = '40px';
388fb726d48Sopenharmony_ci    traceRow.style.width = '100%';
389fb726d48Sopenharmony_ci    traceRow.name = `${sliceName}`;
390fb726d48Sopenharmony_ci    traceRow.setAttribute('children', '');
391fb726d48Sopenharmony_ci    traceRow.favoriteChangeHandler = this.trace.favoriteChangeHandler;
392fb726d48Sopenharmony_ci    traceRow.selectChangeHandler = this.trace.selectChangeHandler;
393fb726d48Sopenharmony_ci    traceRow.rowId = `${sliceId}-${componentId}`;
394fb726d48Sopenharmony_ci    return traceRow;
395fb726d48Sopenharmony_ci  }
396fb726d48Sopenharmony_ci
397fb726d48Sopenharmony_ci  private initSlice = async (
398fb726d48Sopenharmony_ci    nodeRow: TraceRow<BaseStruct>,
399fb726d48Sopenharmony_ci    index: number,
400fb726d48Sopenharmony_ci    result: unknown,
401fb726d48Sopenharmony_ci    sqlMap: unknown,
402fb726d48Sopenharmony_ci    componentId: number
403fb726d48Sopenharmony_ci  ): Promise<void> => {
404fb726d48Sopenharmony_ci    let traceRow = this.initSliceChartRow(
405fb726d48Sopenharmony_ci      nodeRow.expansion,
406fb726d48Sopenharmony_ci      nodeRow.rowId!, //@ts-ignore
407fb726d48Sopenharmony_ci      result.slice_id, //@ts-ignore
408fb726d48Sopenharmony_ci      result.slice_name,
409fb726d48Sopenharmony_ci      componentId
410fb726d48Sopenharmony_ci    );
411fb726d48Sopenharmony_ci    traceRow.supplier = async (): Promise<SdkSliceStruct[]> =>
412fb726d48Sopenharmony_ci      querySdkSliceData(
413fb726d48Sopenharmony_ci        //@ts-ignore
414fb726d48Sopenharmony_ci        sqlMap.chartSql, //@ts-ignore
415fb726d48Sopenharmony_ci        result.slice_id,
416fb726d48Sopenharmony_ci        TraceRow.range?.startNS || 0,
417fb726d48Sopenharmony_ci        TraceRow.range?.endNS || 0,
418fb726d48Sopenharmony_ci        componentId
419fb726d48Sopenharmony_ci      );
420fb726d48Sopenharmony_ci    traceRow.focusHandler = (): void => {
421fb726d48Sopenharmony_ci      this.trace?.displayTip(
422fb726d48Sopenharmony_ci        traceRow,
423fb726d48Sopenharmony_ci        SdkSliceStruct.hoverSdkSliceStruct,
424fb726d48Sopenharmony_ci        `<span>${SdkSliceStruct.hoverSdkSliceStruct?.value}</span>`
425fb726d48Sopenharmony_ci      );
426fb726d48Sopenharmony_ci    };
427fb726d48Sopenharmony_ci    traceRow.findHoverStruct = (): void => {
428fb726d48Sopenharmony_ci      SdkSliceStruct.hoverSdkSliceStruct = traceRow.getHoverStruct();
429fb726d48Sopenharmony_ci    };
430fb726d48Sopenharmony_ci    traceRow.onThreadHandler = (useCache: boolean): void => {
431fb726d48Sopenharmony_ci      let context: CanvasRenderingContext2D;
432fb726d48Sopenharmony_ci      if (traceRow.currentContext) {
433fb726d48Sopenharmony_ci        context = traceRow.currentContext;
434fb726d48Sopenharmony_ci      } else {
435fb726d48Sopenharmony_ci        context = traceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!;
436fb726d48Sopenharmony_ci      }
437fb726d48Sopenharmony_ci      traceRow.canvasSave(context);
438fb726d48Sopenharmony_ci      //@ts-ignore
439fb726d48Sopenharmony_ci      (renders[TraceRow.ROW_TYPE_SDK_SLICE] as SdkSliceRender).renderMainThread(
440fb726d48Sopenharmony_ci        {
441fb726d48Sopenharmony_ci          context: context,
442fb726d48Sopenharmony_ci          useCache: useCache,
443fb726d48Sopenharmony_ci          type: `sdk-slice-${index}`,
444fb726d48Sopenharmony_ci          maxName: '',
445fb726d48Sopenharmony_ci          maxValue: 0,
446fb726d48Sopenharmony_ci        },
447fb726d48Sopenharmony_ci        traceRow
448fb726d48Sopenharmony_ci      );
449fb726d48Sopenharmony_ci      traceRow.canvasRestore(context, this.trace);
450fb726d48Sopenharmony_ci    };
451fb726d48Sopenharmony_ci    nodeRow.addChildTraceRow(traceRow);
452fb726d48Sopenharmony_ci  };
453fb726d48Sopenharmony_ci}
454