1*90c8c64dSAndroid Build Coastguard Worker/* 2*90c8c64dSAndroid Build Coastguard Worker * Copyright (C) 2023 The Android Open Source Project 3*90c8c64dSAndroid Build Coastguard Worker * 4*90c8c64dSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*90c8c64dSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*90c8c64dSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*90c8c64dSAndroid Build Coastguard Worker * 8*90c8c64dSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*90c8c64dSAndroid Build Coastguard Worker * 10*90c8c64dSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*90c8c64dSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*90c8c64dSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*90c8c64dSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*90c8c64dSAndroid Build Coastguard Worker * limitations under the License. 15*90c8c64dSAndroid Build Coastguard Worker */ 16*90c8c64dSAndroid Build Coastguard Worker 17*90c8c64dSAndroid Build Coastguard Workerimport {RelativeEntryIndex, TraceEntryEager} from './trace'; 18*90c8c64dSAndroid Build Coastguard Worker 19*90c8c64dSAndroid Build Coastguard Workerexport enum CustomQueryType { 20*90c8c64dSAndroid Build Coastguard Worker SF_LAYERS_ID_AND_NAME, 21*90c8c64dSAndroid Build Coastguard Worker VIEW_CAPTURE_METADATA, 22*90c8c64dSAndroid Build Coastguard Worker VSYNCID, 23*90c8c64dSAndroid Build Coastguard Worker WM_WINDOWS_TOKEN_AND_TITLE, 24*90c8c64dSAndroid Build Coastguard Worker} 25*90c8c64dSAndroid Build Coastguard Worker 26*90c8c64dSAndroid Build Coastguard Workerexport class ProcessParserResult { 27*90c8c64dSAndroid Build Coastguard Worker static [CustomQueryType.SF_LAYERS_ID_AND_NAME]<T>( 28*90c8c64dSAndroid Build Coastguard Worker parserResult: CustomQueryParserResultTypeMap[CustomQueryType.SF_LAYERS_ID_AND_NAME], 29*90c8c64dSAndroid Build Coastguard Worker ): CustomQueryResultTypeMap<T>[CustomQueryType.SF_LAYERS_ID_AND_NAME] { 30*90c8c64dSAndroid Build Coastguard Worker return parserResult; 31*90c8c64dSAndroid Build Coastguard Worker } 32*90c8c64dSAndroid Build Coastguard Worker 33*90c8c64dSAndroid Build Coastguard Worker static [CustomQueryType.VIEW_CAPTURE_METADATA]<T>( 34*90c8c64dSAndroid Build Coastguard Worker parserResult: CustomQueryParserResultTypeMap[CustomQueryType.VIEW_CAPTURE_METADATA], 35*90c8c64dSAndroid Build Coastguard Worker ): CustomQueryResultTypeMap<T>[CustomQueryType.VIEW_CAPTURE_METADATA] { 36*90c8c64dSAndroid Build Coastguard Worker return parserResult; 37*90c8c64dSAndroid Build Coastguard Worker } 38*90c8c64dSAndroid Build Coastguard Worker 39*90c8c64dSAndroid Build Coastguard Worker static [CustomQueryType.VSYNCID]<T>( 40*90c8c64dSAndroid Build Coastguard Worker parserResult: CustomQueryParserResultTypeMap[CustomQueryType.VSYNCID], 41*90c8c64dSAndroid Build Coastguard Worker makeTraceEntry: ( 42*90c8c64dSAndroid Build Coastguard Worker index: RelativeEntryIndex, 43*90c8c64dSAndroid Build Coastguard Worker vsyncId: bigint, 44*90c8c64dSAndroid Build Coastguard Worker ) => TraceEntryEager<T, bigint>, 45*90c8c64dSAndroid Build Coastguard Worker ): CustomQueryResultTypeMap<T>[CustomQueryType.VSYNCID] { 46*90c8c64dSAndroid Build Coastguard Worker return parserResult.map((vsyncId, index) => { 47*90c8c64dSAndroid Build Coastguard Worker return makeTraceEntry(index, vsyncId); 48*90c8c64dSAndroid Build Coastguard Worker }); 49*90c8c64dSAndroid Build Coastguard Worker } 50*90c8c64dSAndroid Build Coastguard Worker 51*90c8c64dSAndroid Build Coastguard Worker static [CustomQueryType.WM_WINDOWS_TOKEN_AND_TITLE]<T>( 52*90c8c64dSAndroid Build Coastguard Worker parserResult: CustomQueryParserResultTypeMap[CustomQueryType.WM_WINDOWS_TOKEN_AND_TITLE], 53*90c8c64dSAndroid Build Coastguard Worker ): CustomQueryResultTypeMap<T>[CustomQueryType.WM_WINDOWS_TOKEN_AND_TITLE] { 54*90c8c64dSAndroid Build Coastguard Worker return parserResult; 55*90c8c64dSAndroid Build Coastguard Worker } 56*90c8c64dSAndroid Build Coastguard Worker} 57*90c8c64dSAndroid Build Coastguard Worker 58*90c8c64dSAndroid Build Coastguard Workerexport interface CustomQueryParamTypeMap { 59*90c8c64dSAndroid Build Coastguard Worker [CustomQueryType.SF_LAYERS_ID_AND_NAME]: never; 60*90c8c64dSAndroid Build Coastguard Worker [CustomQueryType.VIEW_CAPTURE_METADATA]: never; 61*90c8c64dSAndroid Build Coastguard Worker [CustomQueryType.VSYNCID]: never; 62*90c8c64dSAndroid Build Coastguard Worker [CustomQueryType.WM_WINDOWS_TOKEN_AND_TITLE]: never; 63*90c8c64dSAndroid Build Coastguard Worker} 64*90c8c64dSAndroid Build Coastguard Worker 65*90c8c64dSAndroid Build Coastguard Workerexport interface CustomQueryParserResultTypeMap { 66*90c8c64dSAndroid Build Coastguard Worker [CustomQueryType.SF_LAYERS_ID_AND_NAME]: Array<{id: number; name: string}>; 67*90c8c64dSAndroid Build Coastguard Worker [CustomQueryType.VIEW_CAPTURE_METADATA]: { 68*90c8c64dSAndroid Build Coastguard Worker packageName: string; 69*90c8c64dSAndroid Build Coastguard Worker windowName: string; 70*90c8c64dSAndroid Build Coastguard Worker }; 71*90c8c64dSAndroid Build Coastguard Worker [CustomQueryType.VSYNCID]: Array<bigint>; 72*90c8c64dSAndroid Build Coastguard Worker [CustomQueryType.WM_WINDOWS_TOKEN_AND_TITLE]: Array<{ 73*90c8c64dSAndroid Build Coastguard Worker token: string; 74*90c8c64dSAndroid Build Coastguard Worker title: string; 75*90c8c64dSAndroid Build Coastguard Worker }>; 76*90c8c64dSAndroid Build Coastguard Worker} 77*90c8c64dSAndroid Build Coastguard Worker 78*90c8c64dSAndroid Build Coastguard Workerexport interface CustomQueryResultTypeMap<T> { 79*90c8c64dSAndroid Build Coastguard Worker [CustomQueryType.SF_LAYERS_ID_AND_NAME]: Array<{id: number; name: string}>; 80*90c8c64dSAndroid Build Coastguard Worker [CustomQueryType.VIEW_CAPTURE_METADATA]: { 81*90c8c64dSAndroid Build Coastguard Worker packageName: string; 82*90c8c64dSAndroid Build Coastguard Worker windowName: string; 83*90c8c64dSAndroid Build Coastguard Worker }; 84*90c8c64dSAndroid Build Coastguard Worker [CustomQueryType.VSYNCID]: Array<TraceEntryEager<T, bigint>>; 85*90c8c64dSAndroid Build Coastguard Worker [CustomQueryType.WM_WINDOWS_TOKEN_AND_TITLE]: Array<{ 86*90c8c64dSAndroid Build Coastguard Worker token: string; 87*90c8c64dSAndroid Build Coastguard Worker title: string; 88*90c8c64dSAndroid Build Coastguard Worker }>; 89*90c8c64dSAndroid Build Coastguard Worker} 90*90c8c64dSAndroid Build Coastguard Worker 91*90c8c64dSAndroid Build Coastguard Workerexport class VisitableParserCustomQuery<Q extends CustomQueryType> { 92*90c8c64dSAndroid Build Coastguard Worker private readonly type: CustomQueryType; 93*90c8c64dSAndroid Build Coastguard Worker private result: Promise<CustomQueryParserResultTypeMap[Q]> | undefined; 94*90c8c64dSAndroid Build Coastguard Worker 95*90c8c64dSAndroid Build Coastguard Worker constructor(type: Q) { 96*90c8c64dSAndroid Build Coastguard Worker this.type = type; 97*90c8c64dSAndroid Build Coastguard Worker } 98*90c8c64dSAndroid Build Coastguard Worker 99*90c8c64dSAndroid Build Coastguard Worker visit<R extends CustomQueryType>( 100*90c8c64dSAndroid Build Coastguard Worker type: R, 101*90c8c64dSAndroid Build Coastguard Worker visitor: () => Promise<CustomQueryParserResultTypeMap[R]>, 102*90c8c64dSAndroid Build Coastguard Worker ): VisitableParserCustomQuery<Q> { 103*90c8c64dSAndroid Build Coastguard Worker if (type !== this.type) { 104*90c8c64dSAndroid Build Coastguard Worker return this; 105*90c8c64dSAndroid Build Coastguard Worker } 106*90c8c64dSAndroid Build Coastguard Worker this.result = visitor() as Promise<CustomQueryParserResultTypeMap[Q]>; 107*90c8c64dSAndroid Build Coastguard Worker return this; 108*90c8c64dSAndroid Build Coastguard Worker } 109*90c8c64dSAndroid Build Coastguard Worker 110*90c8c64dSAndroid Build Coastguard Worker getResult(): Promise<CustomQueryParserResultTypeMap[Q]> { 111*90c8c64dSAndroid Build Coastguard Worker if (this.result === undefined) { 112*90c8c64dSAndroid Build Coastguard Worker throw new Error( 113*90c8c64dSAndroid Build Coastguard Worker `No result available. Looks like custom query (type: ${this.type}) is not implemented!`, 114*90c8c64dSAndroid Build Coastguard Worker ); 115*90c8c64dSAndroid Build Coastguard Worker } 116*90c8c64dSAndroid Build Coastguard Worker return this.result; 117*90c8c64dSAndroid Build Coastguard Worker } 118*90c8c64dSAndroid Build Coastguard Worker} 119