)]}'
{
  "commit": "347abd988e494f4b9734a22599d5ea215615b092",
  "tree": "4cd23715ceec7707944db84388a654bef58cd817",
  "parents": [
    "2c79027153dfc4458a62ba9d69a0f2d0984243c4"
  ],
  "author": {
    "name": "Zimuzo Ezeozue",
    "email": "zezeozue@google.com",
    "time": "Tue Jun 09 10:02:14 2026 +0000"
  },
  "committer": {
    "name": "Zimuzo Ezeozue",
    "email": "zezeozue@google.com",
    "time": "Tue Jun 09 18:52:53 2026 +0100"
  },
  "message": "ui: SurfaceFlinger layers viewer (com.android.SurfaceFlinger)\n\nAdds a SurfaceFlinger layers viewer for the android.surfaceflinger.layers data\nsource. Inspired by the Android Winscope tool.\n\ntrace_processor: the winscope importer plugin now reports the timestamp bounds of\nthe winscope snapshot tables (SurfaceFlinger layers + transactions,\nWindowManager, shell transitions, IME, ViewCapture, ProtoLog), mirroring the\nvideo/audio frame importers. Previously a trace captured with only the winscope\ndata sources had empty trace bounds and the UI treated it as empty; now it opens\ndirectly. Adds read access to those tables\u0027 `ts` column.\n\nSurfaced two ways onto one shared session:\n- A nested \"SurfaceFlinger\" timeline group with one track per display (real and\n  virtual, e.g. a video-encoder/screen-recorder display, which are part of what\n  SurfaceFlinger composited). Each track shows that display\u0027s snapshots as\n  frame-numbered, colorized slices; selecting one shows a compact summary plus an\n  inline layout preview and opens the page at that snapshot.\n- A full-screen page (sidebar \u003e SurfaceFlinger) with a display selector, snapshot\n  time-slider, prev/next, and a jump-to-timeline button that selects the snapshot\n  slice on that display\u0027s track. The snapshot index and timestamp are shown\n  consistently in the page and the details panel.\n\nThree panes:\n- Surface: a rotatable, stacked 3D view of the selected display\u0027s layer rects,\n  pure 2D-canvas projection (no WebGL). Camera angles follow the standalone\n  tool\u0027s mapper3d (pitch \u003d factor*PI/8, yaw \u003d 1.5*pitch); gradient / opacity /\n  wireframe shading; spacing slider; only-visible filter; per-rect hide + pin;\n  click-to-select; and leader-line labels in a side gutter that never overlap and\n  are themselves clickable.\n- Hierarchy: the full cross-display layer tree with chips (visible / GPU / HWC /\n  relative-Z / hidden / spy / duplicate), only-visible / flat / simplify-names /\n  diff filters and search, and per-node hide + pin toggles.\n- Properties: a header card (name + chips), a curated summary as a DataGrid (with\n  clickable layer references) and the full proto dump as a filterable DataGrid;\n  with diff on, layers are marked added/modified/deleted and the proto grid gains\n  a Previous column.\n\nA layer belongs to a display via its rect\u0027s group id, so the Surface scopes to\nthe selected display\u0027s composition while the hierarchy/properties span all\ndisplays. Built from native widgets (Section, Tree, Chip, DataGrid, Checkbox,\nTextInput, Select) and themed with the --pf-color-* variables, so it follows the\napp\u0027s light and dark mode. Enabled by default.\n\nChange-Id: I2222222222222222222222222222222222222222\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "98689e875401d19014be49a62e8b087a805c600f",
      "old_mode": 33188,
      "old_path": "src/trace_processor/plugins/winscope_importer/winscope_importer.cc",
      "new_id": "90939b8784cb2de4ca0ba98efb794466b8ed80f7",
      "new_mode": 33188,
      "new_path": "src/trace_processor/plugins/winscope_importer/winscope_importer.cc"
    },
    {
      "type": "modify",
      "old_id": "236c72fa09586b9e4ed7a204dad97264d3b0a451",
      "old_mode": 33188,
      "old_path": "src/trace_processor/tables/winscope_tables.py",
      "new_id": "9b8b3fb59b6612e28c711d1c887ba38896136533",
      "new_mode": 33188,
      "new_path": "src/trace_processor/tables/winscope_tables.py"
    },
    {
      "type": "modify",
      "old_id": "7421c7484700525f4838eb9a3579a8bb85299ab0",
      "old_mode": 33188,
      "old_path": "ui/src/core/embedder/default_plugins.ts",
      "new_id": "77a10d535de501c3e063b8f9a826ba8927948bae",
      "new_mode": 33188,
      "new_path": "ui/src/core/embedder/default_plugins.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "7c96c0f52f081d0c78efe85e691f241826e06245",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/com.android.SurfaceFlinger/index.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "bcaa993f7f15c5d2f170e6b79df1547555158666",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/com.android.SurfaceFlinger/surfaceflinger.scss"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "34980686da18fac1081162304b8ba41be7f414a2",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/com.android.SurfaceFlinger/surfaceflinger_controls.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "189afa22d209ebdb25a7a83c28a293b7ec439d39",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/com.android.SurfaceFlinger/surfaceflinger_curated.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "2567668174030d4a03b0844e99b89e03f10a0f32",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/com.android.SurfaceFlinger/surfaceflinger_data.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "7d2e0de415aec0e3ab4fc34197512d1a09533f36",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/com.android.SurfaceFlinger/surfaceflinger_page.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "88d237427a698cbe9e8f227c492d143b0cb6768c",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/com.android.SurfaceFlinger/surfaceflinger_rects.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "3e0896e4b76ea7fc77114150fadd6c2501d6c913",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/com.android.SurfaceFlinger/surfaceflinger_route.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "35ca27c39d15fa7745d60e9cae003b4326139671",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/com.android.SurfaceFlinger/surfaceflinger_session.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "3af8e83f1a781b74173eaf11b020c8d9cba0e14e",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/com.android.SurfaceFlinger/surfaceflinger_track.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "8df30d6f2db8c97660f6cab869f2878345c3c3c2",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/com.android.SurfaceFlinger/surfaceflinger_viewer.ts"
    }
  ]
}
