Split out monitor start validation logic

So we can easily disable and customize what validation needs to be done before starting a trace. For instance not checking that the trace is enabled for transactions tracing.

Bug: 270949117
Test: atest FlickerLibTest
Change-Id: Ie719fa44acffda54977c20721027a91bfd9295e1
diff --git a/libraries/flicker/src/android/tools/device/traces/monitors/ScreenRecorder.kt b/libraries/flicker/src/android/tools/device/traces/monitors/ScreenRecorder.kt
index 29b19ba..fddd9b0 100644
--- a/libraries/flicker/src/android/tools/device/traces/monitors/ScreenRecorder.kt
+++ b/libraries/flicker/src/android/tools/device/traces/monitors/ScreenRecorder.kt
@@ -53,7 +53,7 @@
                 else -> recordingRunnable?.isFrameRecorded ?: false
             }
 
-    override fun start() {
+    override fun doStart() {
         require(recordingThread == null) { "Screen recorder already running" }
 
         val recordingThread = newRecordingThread()
diff --git a/libraries/flicker/src/android/tools/device/traces/monitors/TraceMonitor.kt b/libraries/flicker/src/android/tools/device/traces/monitors/TraceMonitor.kt
index c1bbc8f..7c7d789 100644
--- a/libraries/flicker/src/android/tools/device/traces/monitors/TraceMonitor.kt
+++ b/libraries/flicker/src/android/tools/device/traces/monitors/TraceMonitor.kt
@@ -20,7 +20,6 @@
 import android.tools.common.io.TraceType
 import android.tools.device.traces.DEFAULT_TRACE_CONFIG
 import android.tools.device.traces.deleteIfExists
-import android.tools.device.traces.io.IResultData
 import android.tools.device.traces.io.IoUtils
 import android.tools.device.traces.io.ResultReader
 import android.tools.device.traces.io.ResultWriter
@@ -33,8 +32,22 @@
 abstract class TraceMonitor : ITransitionMonitor {
     abstract val isEnabled: Boolean
     abstract val traceType: TraceType
+    protected abstract fun doStart()
     protected abstract fun doStop(): File
 
+    final override fun start() {
+        validateStart()
+        doStart()
+    }
+
+    open fun validateStart() {
+        if (this.isEnabled) {
+            throw UnsupportedOperationException(
+                "Trace already running. " + "This is likely due to chained 'withTracing' calls."
+            )
+        }
+    }
+
     /** Stops monitor. */
     final override fun stop(writer: ResultWriter) {
         val artifact =
@@ -62,12 +75,6 @@
      * @throws UnsupportedOperationException If tracing is already activated
      */
     fun withTracing(writer: ResultWriter, predicate: () -> Unit) {
-        if (this.isEnabled) {
-            throw UnsupportedOperationException(
-                "Trace already running. " + "This is likely due to chained 'withTracing' calls."
-            )
-        }
-        val result: IResultData
         try {
             this.start()
             predicate()
diff --git a/libraries/flicker/src/android/tools/device/traces/monitors/events/EventLogMonitor.kt b/libraries/flicker/src/android/tools/device/traces/monitors/events/EventLogMonitor.kt
index 9307e27..178f20f 100644
--- a/libraries/flicker/src/android/tools/device/traces/monitors/events/EventLogMonitor.kt
+++ b/libraries/flicker/src/android/tools/device/traces/monitors/events/EventLogMonitor.kt
@@ -35,7 +35,7 @@
 
     private var traceStartTime: Timestamp? = null
 
-    override fun start() {
+    override fun doStart() {
         require(!isEnabled) { "Trace already running" }
         isEnabled = true
         traceStartTime = now()
diff --git a/libraries/flicker/src/android/tools/device/traces/monitors/surfaceflinger/LayersTraceMonitor.kt b/libraries/flicker/src/android/tools/device/traces/monitors/surfaceflinger/LayersTraceMonitor.kt
index 1c4e7ac..6458631 100644
--- a/libraries/flicker/src/android/tools/device/traces/monitors/surfaceflinger/LayersTraceMonitor.kt
+++ b/libraries/flicker/src/android/tools/device/traces/monitors/surfaceflinger/LayersTraceMonitor.kt
@@ -31,7 +31,7 @@
     override val isEnabled
         get() = windowManager.isLayerTracing
 
-    override fun start() {
+    override fun doStart() {
         windowManager.setLayerTracingFlags(traceFlags)
         windowManager.isLayerTracing = true
     }
diff --git a/libraries/flicker/src/android/tools/device/traces/monitors/surfaceflinger/TransactionsTraceMonitor.kt b/libraries/flicker/src/android/tools/device/traces/monitors/surfaceflinger/TransactionsTraceMonitor.kt
index e16c7e0..8914ebf 100644
--- a/libraries/flicker/src/android/tools/device/traces/monitors/surfaceflinger/TransactionsTraceMonitor.kt
+++ b/libraries/flicker/src/android/tools/device/traces/monitors/surfaceflinger/TransactionsTraceMonitor.kt
@@ -29,10 +29,14 @@
     override val isEnabled = true
     override val traceType = TraceType.TRANSACTION
 
-    override fun start() {
+    override fun doStart() {
         windowManager.setActiveTransactionTracing(true)
     }
 
+    override fun validateStart() {
+        // No validation required
+    }
+
     override fun doStop(): File {
         windowManager.setActiveTransactionTracing(false)
         return TRACE_DIR.resolve("transactions_trace$WINSCOPE_EXT")
diff --git a/libraries/flicker/src/android/tools/device/traces/monitors/wm/TransitionsTraceMonitor.kt b/libraries/flicker/src/android/tools/device/traces/monitors/wm/TransitionsTraceMonitor.kt
index 7e3aa8d..3dc76ee 100644
--- a/libraries/flicker/src/android/tools/device/traces/monitors/wm/TransitionsTraceMonitor.kt
+++ b/libraries/flicker/src/android/tools/device/traces/monitors/wm/TransitionsTraceMonitor.kt
@@ -30,7 +30,7 @@
     override val isEnabled
         get() = windowManager.isTransitionTraceEnabled
 
-    override fun start() {
+    override fun doStart() {
         windowManager.startTransitionTrace()
     }
 
diff --git a/libraries/flicker/src/android/tools/device/traces/monitors/wm/WindowManagerTraceMonitor.kt b/libraries/flicker/src/android/tools/device/traces/monitors/wm/WindowManagerTraceMonitor.kt
index 65d701b..8996600 100644
--- a/libraries/flicker/src/android/tools/device/traces/monitors/wm/WindowManagerTraceMonitor.kt
+++ b/libraries/flicker/src/android/tools/device/traces/monitors/wm/WindowManagerTraceMonitor.kt
@@ -29,7 +29,7 @@
     override val isEnabled
         get() = windowManager.isWindowTraceEnabled
 
-    override fun start() {
+    override fun doStart() {
         windowManager.startWindowTrace()
     }