Add displays to layers trace

Displays were added to the SF trace. Display the display information on Winscope

Bug: 188792659
Test: check winscope works
Change-Id: Ice1f526c4f370ca5a489063e22206101bdbd48eb
diff --git a/tools/winscope/src/decode.js b/tools/winscope/src/decode.js
index a665fe1..577993f 100644
--- a/tools/winscope/src/decode.js
+++ b/tools/winscope/src/decode.js
@@ -306,7 +306,7 @@
     decoder: protoDecoder,
     decoderParams: {
       type: FILE_TYPES.ACCESSIBILITY_TRACE,
-      protoType: AccessibilityTraceMessage,
+      objTypeProto: AccessibilityTraceMessage,
       transform: transform_accessibility_trace,
       timeline: true,
     },
@@ -316,7 +316,7 @@
     decoder: protoDecoder,
     decoderParams: {
       type: FILE_TYPES.WINDOW_MANAGER_TRACE,
-      protoType: WmTraceMessage,
+      objTypeProto: WmTraceMessage,
       transform: WindowManagerTrace.fromProto,
       timeline: true,
     },
@@ -327,7 +327,7 @@
     decoderParams: {
       type: FILE_TYPES.SURFACE_FLINGER_TRACE,
       mime: 'application/octet-stream',
-      protoType: SfTraceMessage,
+      objTypeProto: SfTraceMessage,
       transform: SurfaceFlingerTrace.fromProto,
       timeline: true,
     },
@@ -338,7 +338,7 @@
     decoderParams: {
       type: FILE_TYPES.WAYLAND_TRACE,
       mime: 'application/octet-stream',
-      protoType: WaylandTraceMessage,
+      objTypeProto: WaylandTraceMessage,
       transform: transform_wayland_trace,
       timeline: true,
     },
@@ -349,8 +349,8 @@
     decoderParams: {
       type: FILE_TYPES.SURFACE_FLINGER_DUMP,
       mime: 'application/octet-stream',
-      protoType: SfDumpMessage,
-      transform: SurfaceFlingerDump.fromProto,
+      objTypeProto: [SfDumpMessage, SfTraceMessage],
+      transform: [SurfaceFlingerDump.fromProto, SurfaceFlingerTrace.fromProto],
       timeline: true,
     },
   },
@@ -360,7 +360,7 @@
     decoderParams: {
       type: FILE_TYPES.WINDOW_MANAGER_DUMP,
       mime: 'application/octet-stream',
-      protoType: WmDumpMessage,
+      objTypeProto: WmDumpMessage,
       transform: WindowManagerDump.fromProto,
       timeline: true,
     },
@@ -371,7 +371,7 @@
     decoderParams: {
       type: FILE_TYPES.WAYLAND_DUMP,
       mime: 'application/octet-stream',
-      protoType: WaylandDumpMessage,
+      objTypeProto: WaylandDumpMessage,
       transform: transform_wl_outputstate,
       timeline: true,
     },
@@ -391,7 +391,7 @@
     decoderParams: {
       type: FILE_TYPES.TRANSACTIONS_TRACE,
       mime: 'application/octet-stream',
-      protoType: SfTransactionTraceMessage,
+      objTypeProto: SfTransactionTraceMessage,
       transform: transform_transaction_trace,
       timeline: true,
     },
@@ -402,7 +402,7 @@
     decoderParams: {
       type: FILE_TYPES.PROTO_LOG,
       mime: 'application/octet-stream',
-      protoType: ProtoLogMessage,
+      objTypeProto: ProtoLogMessage,
       transform: transformProtolog,
       timeline: true,
     },
@@ -413,7 +413,7 @@
     decoderParams: {
       type: FILE_TYPES.SYSTEM_UI,
       mime: 'application/octet-stream',
-      protoType: SystemUiTraceMessage,
+      objTypeProto: SystemUiTraceMessage,
       transform: transform_sysui_trace,
       timeline: true,
     },
@@ -424,7 +424,7 @@
     decoderParams: {
       type: FILE_TYPES.LAUNCHER,
       mime: 'application/octet-stream',
-      protoType: LauncherTraceMessage,
+      objTypeProto: LauncherTraceMessage,
       transform: transform_launcher_trace,
       timeline: true,
     },
@@ -435,7 +435,7 @@
     decoderParams: {
       type: FILE_TYPES.IME_TRACE_CLIENTS,
       mime: 'application/octet-stream',
-      protoType: InputMethodClientsTraceMessage,
+      objTypeProto: InputMethodClientsTraceMessage,
       transform: transform_ime_trace_clients,
       timeline: true,
     },
@@ -446,7 +446,7 @@
     decoderParams: {
       type: FILE_TYPES.IME_TRACE_SERVICE,
       mime: 'application/octet-stream',
-      protoType: InputMethodServiceTraceMessage,
+      objTypeProto: InputMethodServiceTraceMessage,
       transform: transform_ime_trace_service,
       timeline: true,
     },
@@ -457,7 +457,7 @@
     decoderParams: {
       type: FILE_TYPES.IME_TRACE_MANAGERSERVICE,
       mime: 'application/octet-stream',
-      protoType: InputMethodManagerServiceTraceMessage,
+      objTypeProto: InputMethodManagerServiceTraceMessage,
       transform: transform_ime_trace_managerservice,
       timeline: true,
     },
@@ -467,7 +467,7 @@
     decoder: protoDecoder,
     decoderParams: {
       type: FILE_TYPES.TAG_TRACE,
-      protoType: TagTraceMessage,
+      objTypeProto: TagTraceMessage,
       transform: TagTrace.fromProto,
       timeline: true,
     },
@@ -477,7 +477,7 @@
     decoder: protoDecoder,
     decoderParams: {
       type: FILE_TYPES.ERROR_TRACE,
-      protoType: ErrorTraceMessage,
+      objTypeProto: ErrorTraceMessage,
       transform: ErrorTrace.fromProto,
       timeline: true,
     },
@@ -523,11 +523,33 @@
 }
 
 function decodeAndTransformProto(buffer, params, displayDefaults) {
-  const decoded = params.protoType.decode(buffer);
-  modifyProtoFields(decoded, displayDefaults);
-  const transformed = params.transform(decoded);
-
-  return transformed;
+  var objTypesProto = [];
+  var transforms = [];
+  if (!Array.isArray(params.objTypeProto)) {
+    objTypesProto = [params.objTypeProto];
+    transforms = [params.transform];
+  } else {
+    objTypesProto = params.objTypeProto;
+    transforms = params.transform;
+  }
+  // each trace or dump may have different processors, for example, until S, SF dumps
+  // returne a list of layers and winscope built a [LayerTraceEntry] from them.
+  // From S onwards, returns a LayerTrace object, iterating over multiple items allows
+  // winscope to handle both the new and legacy formats
+  // TODO Refactor the decode.js code into a set of decoders to clean up the code
+  for (var x = 0; x < objTypesProto.length; x++) {
+    const objType = objTypesProto[x];
+    const transform = transforms[x];
+    try {
+      const decoded = objType.decode(buffer);
+      modifyProtoFields(decoded, displayDefaults);
+      const transformed = transform(decoded);
+      return transformed;
+    } catch (e) {
+      // check next parser
+    }
+  }
+  throw new UndetectableFileType('Unable to parse file');
 }
 
 function protoDecoder(buffer, params, fileName, store) {
diff --git a/tools/winscope/src/dumps/SurfaceFlinger.ts b/tools/winscope/src/dumps/SurfaceFlinger.ts
index 4694030..c3b6a88 100644
--- a/tools/winscope/src/dumps/SurfaceFlinger.ts
+++ b/tools/winscope/src/dumps/SurfaceFlinger.ts
@@ -36,7 +36,8 @@
   static fromProto(proto: any): LayersTrace {
     const source = null;
     const entry =  LayersTraceEntry.fromProto(
-      /*protos */ proto.layers,
+      /* protos */ proto.layers,
+      /* displays */ proto.displays,
       /* timestamp */ 0,
       /* hwcBlob */ ""
     );
diff --git a/tools/winscope/src/flickerlib/LayersTrace.ts b/tools/winscope/src/flickerlib/LayersTrace.ts
index 1c211c4..7160d60 100644
--- a/tools/winscope/src/flickerlib/LayersTrace.ts
+++ b/tools/winscope/src/flickerlib/LayersTrace.ts
@@ -22,6 +22,7 @@
     for (const entryProto of proto.entry) {
         const transformedEntry = LayerTraceEntry.fromProto(
             /* protos */ entryProto.layers.layers,
+            /* displays */ entryProto.displays,
             /* timestamp */ entryProto.elapsedRealtimeNanos,
             /* hwcBlob */ entryProto.hwcBlob);
 
diff --git a/tools/winscope/src/flickerlib/common.js b/tools/winscope/src/flickerlib/common.js
index db16f9d..d753a70 100644
--- a/tools/winscope/src/flickerlib/common.js
+++ b/tools/winscope/src/flickerlib/common.js
@@ -66,6 +66,8 @@
     Transform.Matrix;
 const Transform = require('flicker').com.android.server.wm.traces.common.
     layers.Transform;
+const Display = require('flicker').com.android.server.wm.traces.common.
+    layers.Display;
 
 // Common
 const Size = require('flicker').com.android.server.wm.traces.common.Size;
@@ -236,6 +238,7 @@
   LayersTrace,
   Transform,
   Matrix,
+  Display,
   // Tags
   Tag,
   TagState,
diff --git a/tools/winscope/src/flickerlib/layers/LayerTraceEntry.ts b/tools/winscope/src/flickerlib/layers/LayerTraceEntry.ts
index 1177e33..86e7836 100644
--- a/tools/winscope/src/flickerlib/layers/LayerTraceEntry.ts
+++ b/tools/winscope/src/flickerlib/layers/LayerTraceEntry.ts
@@ -14,13 +14,15 @@
  * limitations under the License.
  */
 
-import { LayerTraceEntry, LayerTraceEntryBuilder } from "../common"
+import { Display, LayerTraceEntry, LayerTraceEntryBuilder, toRect, toSize, toTransform } from "../common"
 import Layer from './Layer'
 import { VISIBLE_CHIP, RELATIVE_Z_PARENT_CHIP, MISSING_LAYER } from '../treeview/Chips'
 
-LayerTraceEntry.fromProto = function (protos: any[], timestamp: number, hwcBlob: string, where: string = ''): LayerTraceEntry {
+LayerTraceEntry.fromProto = function (protos: any[], displayProtos: any[],
+        timestamp: number, hwcBlob: string, where: string = ''): LayerTraceEntry {
     const layers = protos.map(it => Layer.fromProto(it));
-    const builder = new LayerTraceEntryBuilder(timestamp, layers, hwcBlob, where);
+    const displays = (displayProtos || []).map(it => newDisplay(it));
+    const builder = new LayerTraceEntryBuilder(timestamp, layers, displays, hwcBlob, where);
     const entry: LayerTraceEntry = builder.build();
 
     updateChildren(entry);
@@ -63,4 +65,15 @@
     });
 }
 
+function newDisplay(proto: any): Display {
+    return new Display(
+        proto.id,
+        proto.name,
+        proto.layerStack,
+        toSize(proto.size),
+        toRect(proto.layerStackSpaceRect),
+        toTransform(proto.transform)
+    )
+}
+
 export default LayerTraceEntry;