Add log level filter

Test: Try out log filter and make sure only selected level are visible.
Change-Id: I38aeb0c4b0247c84a30565176c98ff2d43946f0f
diff --git a/tools/winscope/src/LogEntry.vue b/tools/winscope/src/LogEntry.vue
index d4367a6..bfaf90c 100644
--- a/tools/winscope/src/LogEntry.vue
+++ b/tools/winscope/src/LogEntry.vue
@@ -31,6 +31,8 @@
 </template>
 
 <script>
+import { logLevel } from './utils/consts';
+
 export default {
   name: 'logentry',
   props: {
@@ -47,12 +49,12 @@
   data() {
     return {
       levelIcons: {
-        'info': 'info_outline',
-        'debug': 'help_outline',
-        'verbose': 'assignment',
-        'warn': 'warning',
-        'error': 'error',
-        'wtf': 'bolt',
+        [logLevel.INFO]: 'info_outline',
+        [logLevel.DEBUG]: 'help_outline',
+        [logLevel.VERBOSE]: 'assignment',
+        [logLevel.WARN]: 'warning',
+        [logLevel.ERROR]: 'error',
+        [logLevel.WTF]: 'bolt',
       }
     };
   },
diff --git a/tools/winscope/src/LogView.vue b/tools/winscope/src/LogView.vue
index 9c66fe6..0ac4ed6 100644
--- a/tools/winscope/src/LogView.vue
+++ b/tools/winscope/src/LogView.vue
@@ -37,6 +37,13 @@
 
     <div class="filters">
       <md-field>
+        <label>Log Levels</label>
+        <md-select v-model="selectedLogLevels" multiple>
+          <md-option v-for="level in logLevels" :value="level">{{ level }}</md-option>
+        </md-select>
+      </md-field>
+
+      <md-field>
         <label>Tags</label>
         <md-select v-model="selectedTags" multiple>
           <md-option v-for="tag in tags" :value="tag">{{ tag }}</md-option>
@@ -76,6 +83,7 @@
 </template>
 <script>
 import { findLastMatchingSorted } from './utils/utils.js';
+import { logLevel } from './utils/consts';
 import LogEntryComponent from './LogEntry.vue';
 import VirtualList from '../libs/virtualList/VirtualList';
 
@@ -93,18 +101,22 @@
 
     data.forEach((entry, index) => entry.index = index);
 
+    const logLevels = Object.values(logLevel);
+
     return {
       data,
       isSelected: false,
       prevLastOccuredIndex: -1,
       lastOccuredIndex: 0,
-      selectedTags: Array.from(tags),
+      selectedTags: [],
       selectedSourceFile: null,
       searchInput: null,
       sourceFiles: Object.freeze(Array.from(sourceFiles)),
       tags: Object.freeze(Array.from(tags)),
       pinnedToLatest: true,
       logEntryComponent: LogEntryComponent,
+      logLevels,
+      selectedLogLevels: [],
     }
   },
   methods: {
@@ -169,6 +181,11 @@
     },
     processedData() {
       const filteredData = this.data.filter(line => {
+        if (this.selectedLogLevels.length > 0 &&
+            !this.selectedLogLevels.includes(line.level.toLowerCase())) {
+          return false;
+        }
+
         if (this.sourceFiles.includes(this.selectedSourceFile)) {
           // Only filter once source file is fully inputed
           if (line.at != this.selectedSourceFile) {
@@ -176,7 +193,7 @@
           }
         }
 
-        if (!this.selectedTags.includes(line.tag)) {
+        if (this.selectedTags.length > 0 && !this.selectedTags.includes(line.tag)) {
           return false;
         }
 
diff --git a/tools/winscope/src/utils/consts.js b/tools/winscope/src/utils/consts.js
index e424dc2..37f219f 100644
--- a/tools/winscope/src/utils/consts.js
+++ b/tools/winscope/src/utils/consts.js
@@ -15,4 +15,13 @@
   TARGETED: 'Targeted',
 };
 
-export { WebContentScriptMessageType, NAVIGATION_STYLE };
+const logLevel = {
+  INFO: 'info',
+  DEBUG: 'debug',
+  VERBOSE: 'verbose',
+  WARN: 'warn',
+  ERROR: 'error',
+  WTF: 'wtf',
+}
+
+export { WebContentScriptMessageType, NAVIGATION_STYLE, logLevel };