[current results ui] Add tab showing flaky tests

Change-Id: I1eb3598b104827a1fe24314e43c598ef0aad48b6
Reviewed-on: https://dart-review.googlesource.com/c/dart_ci/+/164922
Reviewed-by: Alexander Thomas <athom@google.com>
diff --git a/current_results_ui/lib/main.dart b/current_results_ui/lib/main.dart
index 4306d9b..6eaf2f3 100644
--- a/current_results_ui/lib/main.dart
+++ b/current_results_ui/lib/main.dart
@@ -51,7 +51,7 @@
               create: (context) => QueryResults(filter)..fetchCurrentResults()),
         ],
         child: const DefaultTabController(
-          length: 2,
+          length: 3,
           child: const CurrentResultsApp(),
         ));
   }
@@ -78,6 +78,7 @@
             tabs: [
               Tab(text: 'ALL'),
               Tab(text: 'FAILURES'),
+              Tab(text: 'FLAKY'),
             ],
             indicatorColor: Color.fromARGB(255, 63, 81, 181),
             labelColor: Color.fromARGB(255, 63, 81, 181),
@@ -108,7 +109,8 @@
                     builder: (context, results, child) => TabBarView(
                       children: [
                         ResultsPanel(results, showAll: true),
-                        ResultsPanel(results, showAll: false)
+                        ResultsPanel(results, showAll: false),
+                        ResultsPanel(results, flaky: true),
                       ],
                     ),
                   ),
diff --git a/current_results_ui/lib/results.dart b/current_results_ui/lib/results.dart
index 902f371..423f5df 100644
--- a/current_results_ui/lib/results.dart
+++ b/current_results_ui/lib/results.dart
@@ -23,19 +23,23 @@
 class ResultsPanel extends StatelessWidget {
   final QueryResults queryResults;
   final bool showAll;
+  final bool flaky;
 
-  ResultsPanel(this.queryResults, {this.showAll = true});
+  ResultsPanel(this.queryResults, {this.showAll = false, this.flaky = false});
 
   @override
   Widget build(BuildContext context) {
     if (queryResults.noQuery) {
       return Align(child: QuerySuggestionsPage());
     }
-    bool hasFailedResult(String name) =>
-        queryResults.grouped[name].keys.any((change) => !change.matches);
-    final filteredNames = showAll
-        ? queryResults.names
-        : queryResults.names.where(hasFailedResult).toList();
+    bool isFailed(String name) => queryResults.counts[name].countFailing > 0;
+    bool isFlaky(String name) => queryResults.counts[name].countFlaky > 0;
+    final filter = flaky
+        ? isFlaky
+        : showAll
+            ? (name) => true
+            : isFailed;
+    final filteredNames = queryResults.names.where(filter).toList();
     return ListView.builder(
       itemCount: filteredNames.length,
       itemBuilder: (BuildContext context, int index) {