Merge "Fix "Display root layer not found""
diff --git a/libraries/flicker/src/com/android/server/wm/flicker/LayersTrace.java b/libraries/flicker/src/com/android/server/wm/flicker/LayersTrace.java
index 38b9004..b273e6b 100644
--- a/libraries/flicker/src/com/android/server/wm/flicker/LayersTrace.java
+++ b/libraries/flicker/src/com/android/server/wm/flicker/LayersTrace.java
@@ -140,7 +140,7 @@
             int numKeys = layerMap.size();
             for (int i = 0; i < numKeys; ++i) {
                 Layer currentLayer = layerMap.valueAt(i);
-                if (currentLayer.getName().contains("Display Root")) {
+                if (currentLayer.isRootLayer()) {
                     knownRoot = currentLayer;
                     break;
                 }
@@ -434,7 +434,7 @@
         }
 
         public boolean isRootLayer() {
-            return mParent == null || mParent.mProto == null;
+            return mParent != null && mParent.mProto == null;
         }
 
         public boolean isInvisible() {
diff --git a/libraries/flicker/test/assets/testdata/layers_trace_root.pb b/libraries/flicker/test/assets/testdata/layers_trace_root.pb
new file mode 100644
index 0000000..d961714
--- /dev/null
+++ b/libraries/flicker/test/assets/testdata/layers_trace_root.pb
Binary files differ
diff --git a/libraries/flicker/test/assets/testdata/layers_trace_root_aosp.pb b/libraries/flicker/test/assets/testdata/layers_trace_root_aosp.pb
new file mode 100644
index 0000000..666b328
--- /dev/null
+++ b/libraries/flicker/test/assets/testdata/layers_trace_root_aosp.pb
Binary files differ
diff --git a/libraries/flicker/test/src/com/android/server/wm/flicker/LayersTraceSubjectTest.java b/libraries/flicker/test/src/com/android/server/wm/flicker/LayersTraceSubjectTest.java
index 0415f81..2ccae42 100644
--- a/libraries/flicker/test/src/com/android/server/wm/flicker/LayersTraceSubjectTest.java
+++ b/libraries/flicker/test/src/com/android/server/wm/flicker/LayersTraceSubjectTest.java
@@ -33,6 +33,8 @@
 import org.junit.runners.MethodSorters;
 
 import java.nio.file.Paths;
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * Contains {@link LayersTraceSubject} tests. To run this test: {@code atest
@@ -89,7 +91,9 @@
             assertWithMessage("Contains path to trace")
                     .that(e.getMessage())
                     .contains("layers_trace_invalid_layer_visibility.pb");
-            assertWithMessage("Contains timestamp").that(e.getMessage()).contains("70h13m14s303ms");
+            assertWithMessage("Contains timestamp")
+                    .that(e.getMessage())
+                    .contains("2d22h13m14s303ms");
             assertWithMessage("Contains assertion function")
                     .that(e.getMessage())
                     .contains("!isVisible");
@@ -100,4 +104,37 @@
                                     + ".SimpleActivity#0 is visible");
         }
     }
+
+    private void detectRootLayer(String fileName) {
+        LayersTrace layersTrace = readLayerTraceFromFile(fileName);
+
+        for (LayersTrace.Entry entry : layersTrace.getEntries()) {
+            List<LayersTrace.Layer> flattened = entry.asFlattenedLayers();
+            List<LayersTrace.Layer> rootLayers =
+                    flattened
+                            .stream()
+                            .filter(LayersTrace.Layer::isRootLayer)
+                            .collect(Collectors.toList());
+
+            assertWithMessage("Does not have any root layer")
+                    .that(rootLayers.size())
+                    .isGreaterThan(0);
+
+            int firstParentId = rootLayers.get(0).getParentId();
+
+            assertWithMessage("Has multiple root layers")
+                    .that(rootLayers.stream().allMatch(p -> p.getParentId() == firstParentId))
+                    .isTrue();
+        }
+    }
+
+    @Test
+    public void testCanDetectRootLayer() {
+        detectRootLayer("layers_trace_root.pb");
+    }
+
+    @Test
+    public void testCanDetectRootLayerAOSP() {
+        detectRootLayer("layers_trace_root_aosp.pb");
+    }
 }