preserve detailFiles entry in TaskResult JSON (#70668)

* preserve detailFiles entry in TaskResult JSON
diff --git a/dev/devicelab/lib/framework/task_result.dart b/dev/devicelab/lib/framework/task_result.dart
index 6485363..1129d12 100644
--- a/dev/devicelab/lib/framework/task_result.dart
+++ b/dev/devicelab/lib/framework/task_result.dart
@@ -10,7 +10,7 @@
   /// Constructs a successful result.
   TaskResult.success(this.data, {
     this.benchmarkScoreKeys = const <String>[],
-    this.detailFiles,
+    this.detailFiles = const <String>[],
   })
       : succeeded = true,
         message = 'success' {
@@ -29,11 +29,14 @@
   }
 
   /// Constructs a successful result using JSON data stored in a file.
-  factory TaskResult.successFromFile(File file,
-      {List<String> benchmarkScoreKeys}) {
+  factory TaskResult.successFromFile(File file, {
+    List<String> benchmarkScoreKeys = const <String>[],
+    List<String> detailFiles = const <String>[],
+  }) {
     return TaskResult.success(
       json.decode(file.readAsStringSync()) as Map<String, dynamic>,
       benchmarkScoreKeys: benchmarkScoreKeys,
+      detailFiles: detailFiles,
     );
   }
 
@@ -42,8 +45,11 @@
     final bool success = json['success'] as bool;
     if (success) {
       final List<String> benchmarkScoreKeys = (json['benchmarkScoreKeys'] as List<dynamic> ?? <String>[]).cast<String>();
+      final List<String> detailFiles = (json['detailFiles'] as List<dynamic> ?? <String>[]).cast<String>();
       return TaskResult.success(json['data'] as Map<String, dynamic>,
-          benchmarkScoreKeys: benchmarkScoreKeys);
+        benchmarkScoreKeys: benchmarkScoreKeys,
+        detailFiles: detailFiles,
+      );
     }
 
     return TaskResult.failure(json['reason'] as String);
@@ -54,7 +60,7 @@
       : succeeded = false,
         data = null,
         detailFiles = null,
-        benchmarkScoreKeys = const <String>[];
+        benchmarkScoreKeys = null;
 
   /// Whether the task succeeded.
   final bool succeeded;
@@ -98,8 +104,7 @@
 
     if (succeeded) {
       json['data'] = data;
-      if (detailFiles != null)
-        json['detailFiles'] = detailFiles;
+      json['detailFiles'] = detailFiles;
       json['benchmarkScoreKeys'] = benchmarkScoreKeys;
     } else {
       json['reason'] = message;
diff --git a/dev/devicelab/lib/tasks/gallery.dart b/dev/devicelab/lib/tasks/gallery.dart
index 66b4ae0..a6994fb 100644
--- a/dev/devicelab/lib/tasks/gallery.dart
+++ b/dev/devicelab/lib/tasks/gallery.dart
@@ -119,15 +119,14 @@
       summary['transitions'] = transitions;
       summary['missed_transition_count'] = _countMissedTransitions(transitions);
     }
-    final List<String> detailFiles = <String>[
-      if (transitionDurationFile != null)
-        '${galleryDirectory.path}/build/$transitionDurationFile.json',
-      if (timelineTraceFile != null)
-        '${galleryDirectory.path}/build/$timelineTraceFile.json'
-    ];
 
     return TaskResult.success(summary,
-      detailFiles: detailFiles.isNotEmpty ? detailFiles : null,
+      detailFiles: <String>[
+        if (transitionDurationFile != null)
+          '${galleryDirectory.path}/build/$transitionDurationFile.json',
+        if (timelineTraceFile != null)
+          '${galleryDirectory.path}/build/$timelineTraceFile.json'
+      ],
       benchmarkScoreKeys: <String>[
         if (transitionDurationFile != null)
           'missed_transition_count',
diff --git a/dev/devicelab/lib/tasks/perf_tests.dart b/dev/devicelab/lib/tasks/perf_tests.dart
index 294fd19..5467766 100644
--- a/dev/devicelab/lib/tasks/perf_tests.dart
+++ b/dev/devicelab/lib/tasks/perf_tests.dart
@@ -640,10 +640,6 @@
       final Map<String, dynamic> data = json.decode(
         file('$testDirectory/build/$resultFilename.json').readAsStringSync(),
       ) as Map<String, dynamic>;
-      final List<String> detailFiles = <String>[
-        if (saveTraceFile)
-          '$testDirectory/build/$traceFilename.json',
-      ];
 
       if (data['frame_count'] as int < 5) {
         return TaskResult.failure(
@@ -657,7 +653,10 @@
       final bool isAndroid = deviceOperatingSystem == DeviceOperatingSystem.android;
       return TaskResult.success(
         data,
-        detailFiles: detailFiles.isNotEmpty ? detailFiles : null,
+        detailFiles: <String>[
+          if (saveTraceFile)
+            '$testDirectory/build/$traceFilename.json',
+        ],
         benchmarkScoreKeys: benchmarkScoreKeys ?? <String>[
           ..._kCommonScoreKeys,
           'average_vsync_transitions_missed',
diff --git a/dev/devicelab/test/task_result_test.dart b/dev/devicelab/test/task_result_test.dart
index e883486..0789d5b 100644
--- a/dev/devicelab/test/task_result_test.dart
+++ b/dev/devicelab/test/task_result_test.dart
@@ -17,6 +17,7 @@
           'not_a_metric': 'something',
         },
         'benchmarkScoreKeys': <String>['i', 'j'],
+        'detailFiles': <String>[],
       };
       final TaskResult result = TaskResult.fromJson(expectedJson);
       expect(result.toJson(), expectedJson);
@@ -30,6 +31,7 @@
         'success': true,
         'data': null,
         'benchmarkScoreKeys': <String>[],
+        'detailFiles': <String>[],
       };
       expect(result.toJson(), expectedJson);
     });