[atf] Add metric for hierarchy creation

Adding a metric inbetween ATF scanning process to better understand
where most times are spent.

Bug: 170136315
Test: Manually tested
Change-Id: I9c499a1e200ca9d04abba15f88daf03111c94708
diff --git a/bridge/tests/src/com/android/tools/idea/validator/ValidatorResultTests.java b/bridge/tests/src/com/android/tools/idea/validator/ValidatorResultTests.java
index cd63854..c96ce70 100644
--- a/bridge/tests/src/com/android/tools/idea/validator/ValidatorResultTests.java
+++ b/bridge/tests/src/com/android/tools/idea/validator/ValidatorResultTests.java
@@ -88,6 +88,28 @@
     }
 
     @Test
+    public void testMetricRecordHierarchyCreationTime() {
+        long expectedElapsed = 100;
+        Metric metric = new Builder().mMetric;
+
+        metric.startTimer();
+        try {
+            Thread.sleep(expectedElapsed);
+        } catch (Exception e) {
+            String msg = "Unexpected exception. ";
+            if (e.getMessage() == null) {
+                msg += e.getMessage();
+            }
+            fail(msg);
+        }
+        metric.recordHierarchyCreationTime();
+
+        long diff = Math.abs(expectedElapsed - metric.mHierarchyCreationMs);
+        System.out.println(diff);
+        assertTrue(diff < EPSILON);
+    }
+
+    @Test
     public void testMetricToString() {
         Metric metric = new Builder().mMetric;
 
@@ -95,7 +117,7 @@
         metric.mImageMemoryBytes = Long.MAX_VALUE;
 
         assertEquals(
-                "Validation result metric: { elapsed=0ms, image memory=9223372036gb }",
+                "Validation result metric: { elapsed=0ms, hierarchy creation=0ms, image memory=9223372036gb }",
                 metric.toString());
     }
 
diff --git a/validator/src/com/android/tools/idea/validator/ValidatorResult.java b/validator/src/com/android/tools/idea/validator/ValidatorResult.java
index 8cc5c3d..76035f7 100644
--- a/validator/src/com/android/tools/idea/validator/ValidatorResult.java
+++ b/validator/src/com/android/tools/idea/validator/ValidatorResult.java
@@ -107,6 +107,9 @@
         /** Records how long validation took */
         public long mElapsedMs = 0;
 
+        /** Record how long hierarchy creation took */
+        public long mHierarchyCreationMs = 0;
+
         /** How many new memories (bytes) validator creates for images. */
         public long mImageMemoryBytes = 0;
 
@@ -118,6 +121,10 @@
             mStart = System.currentTimeMillis();
         }
 
+        public void recordHierarchyCreationTime() {
+            mHierarchyCreationMs = System.currentTimeMillis() - mStart;
+        }
+
         public void endTimer() {
             mElapsedMs = System.currentTimeMillis() - mStart;
         }
@@ -125,7 +132,8 @@
         @Override
         public String toString() {
             return "Validation result metric: { elapsed=" + mElapsedMs +
-                    "ms, image memory=" + readableBytes() + " }";
+                    "ms, hierarchy creation=" + mHierarchyCreationMs
+                    +"ms, image memory=" + readableBytes() + " }";
         }
 
         private String readableBytes() {
diff --git a/validator/src/com/android/tools/idea/validator/accessibility/AccessibilityValidator.java b/validator/src/com/android/tools/idea/validator/accessibility/AccessibilityValidator.java
index 640e531..b5a0157 100644
--- a/validator/src/com/android/tools/idea/validator/accessibility/AccessibilityValidator.java
+++ b/validator/src/com/android/tools/idea/validator/accessibility/AccessibilityValidator.java
@@ -192,6 +192,7 @@
                 .setViewOriginMap(originMap)
                 .build();
         ArrayList<AccessibilityHierarchyCheckResult> a11yResults = new ArrayList();
+        metric.recordHierarchyCreationTime();
 
         Parameters parameters = null;
         if (image != null) {