From e3b81f38d812e3c3e699691a71f27f9b5886721a Mon Sep 17 00:00:00 2001 From: Wenli Cai Date: Mon, 21 Jul 2025 16:40:11 -0400 Subject: [PATCH 01/33] Complete reset when changing trace files --- .../com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt index 102c0276e..daf499d33 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt @@ -53,9 +53,10 @@ internal fun RenderTrace( ) { var isLoading by remember(traceSource) { mutableStateOf(true) } var error by remember(traceSource) { mutableStateOf(null) } - val frames = remember { mutableStateListOf() } - val fullTree = remember { mutableStateListOf() } - val affectedNodes = remember { mutableStateListOf>() } + + val frames = remember(traceSource) { mutableStateListOf() } + val fullTree = remember(traceSource) { mutableStateListOf() } + val affectedNodes = remember(traceSource) { mutableStateListOf>() } // Updates current state with the new data from trace source. fun addToStates(frame: List, tree: List, affected: List>) { From cbcea202d025495535ae39b66ec4180853921851 Mon Sep 17 00:00:00 2001 From: Wenli Cai Date: Tue, 22 Jul 2025 10:15:17 -0400 Subject: [PATCH 02/33] Fix naming for node current and past state --- .../workflow1/traceviewer/ui/WorkflowTree.kt | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt index daf499d33..3f94fa905 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt @@ -124,7 +124,7 @@ internal fun RenderTrace( val previousFrame = if (frameInd > 0) fullTree[frameInd - 1] else null DrawTree( node = fullTree[frameInd], - previousNode = previousFrame, + previousFrameNode = previousFrame, affectedNodes = affectedNodes[frameInd], expandedNodes = remember(frameInd) { mutableStateMapOf() }, onNodeSelect = onNodeSelect, @@ -142,7 +142,7 @@ internal fun RenderTrace( @Composable private fun DrawTree( node: Node, - previousNode: Node?, + previousFrameNode: Node?, affectedNodes: Set, expandedNodes: MutableMap, onNodeSelect: (Node, Node?) -> Unit, @@ -163,11 +163,11 @@ private fun DrawTree( val isExpanded = expandedNodes[node.id] == true DrawNode( - node, - previousNode, - isAffected, - isExpanded, - onNodeSelect, + node = node, + nodePast = previousFrameNode, + isAffected = isAffected, + isExpanded = isExpanded, + onNodeSelect = onNodeSelect, onExpandToggle = { expandedNodes[node.id] = !expandedNodes[node.id]!! } ) @@ -182,11 +182,11 @@ private fun DrawTree( In the edge case that the current frame has additional children compared to the previous frame, we replace with null and will check before next recursive call. */ - node.children.forEach { (index, childNode) -> - val prevChildNode = previousNode?.children?.get(index) + node.children.forEach { (id, childNode) -> + val prevFrameChildNode = previousFrameNode?.children?.get(id) DrawTree( node = childNode, - previousNode = prevChildNode, + previousFrameNode = prevFrameChildNode, affectedNodes = affectedNodes, expandedNodes = expandedNodes, onNodeSelect = onNodeSelect @@ -204,7 +204,7 @@ private fun DrawTree( @Composable private fun DrawNode( node: Node, - previousNode: Node?, + nodePast: Node?, isAffected: Boolean, isExpanded: Boolean, onNodeSelect: (Node, Node?) -> Unit, @@ -215,7 +215,7 @@ private fun DrawNode( .background(if (isAffected) Color.Green else Color.Transparent) .onPointerEvent(PointerEventType.Press) { if (it.buttons.isPrimaryPressed) { - onNodeSelect(node, previousNode) + onNodeSelect(node, nodePast) } else if (it.buttons.isSecondaryPressed) { onExpandToggle(node) } From 9c1fc6acceb1ddcfdecd8f95c7127f3b20e13635 Mon Sep 17 00:00:00 2001 From: Wenli Cai Date: Tue, 22 Jul 2025 11:30:07 -0400 Subject: [PATCH 03/33] Enumerate the specific changes for each node and color them accordingly --- .../com/squareup/workflow1/traceviewer/App.kt | 4 +-- .../workflow1/traceviewer/model/NodeUpdate.kt | 36 ++++++++++++++++--- .../traceviewer/ui/WorkflowInfoPanel.kt | 2 +- .../workflow1/traceviewer/ui/WorkflowTree.kt | 17 ++++++--- 4 files changed, 45 insertions(+), 14 deletions(-) diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt index a24693fbd..26a46580d 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt @@ -78,9 +78,7 @@ internal fun App( traceSource = traceMode, frameInd = frameIndex, onFileParse = { workflowFrames.addAll(it) }, - onNodeSelect = { node, prevNode -> - selectedNode = NodeUpdate(node, prevNode) - }, + onNodeSelect = { selectedNode = it }, onNewFrame = { frameIndex += 1 } ) } diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/model/NodeUpdate.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/model/NodeUpdate.kt index c97557757..ce49860d3 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/model/NodeUpdate.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/model/NodeUpdate.kt @@ -1,12 +1,38 @@ package com.squareup.workflow1.traceviewer.model +import androidx.compose.ui.graphics.Color + /** * Represents the difference between the current and previous state of a node in the workflow trace. - * This will be what is passed as a state between UI to display the diff. + * This will be what is passed as a state between UI to display the diff. The states all have an + * associated color * - * If it's the first node in the frame, [previous] will be null and there is no difference to show. + * If it's the first node in the frame, [past] will be null and there is no difference to show. */ -internal class NodeUpdate( +internal data class NodeUpdate( val current: Node, - val previous: Node?, -) + val past: Node?, + val state: NodeState +) { + companion object { + fun create(current: Node, past: Node?, isAffected: Boolean): NodeUpdate { + val state = when { + !isAffected -> NodeState.UNCHANGED + past == null -> NodeState.NEW + current.props != past.props -> NodeState.PROPS_CHANGED + current.state != past.state -> NodeState.STATE_CHANGED + else -> NodeState.CHILDREN_CHANGED + } + + return NodeUpdate(current, past, state) + } + } +} + +enum class NodeState(val color: Color) { + NEW(Color(0x804CAF50)), // green + STATE_CHANGED(Color(0xFFE57373)), // red + PROPS_CHANGED(Color(0xFFFF8A65)), // orange + CHILDREN_CHANGED(Color(0x802196F3)), // blue + UNCHANGED(Color.Transparent), +} diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowInfoPanel.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowInfoPanel.kt index bcf09fddc..42576f347 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowInfoPanel.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowInfoPanel.kt @@ -107,7 +107,7 @@ private fun NodePanelDetails( val fields = Node::class.memberProperties for (field in fields) { val currVal = field.get(node.current).toString() - val pastVal = if (node.previous != null) field.get(node.previous).toString() else null + val pastVal = if (node.past != null) field.get(node.past).toString() else null item { DetailCard( label = field.name, diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt index 3f94fa905..38548aed9 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt @@ -29,6 +29,7 @@ import androidx.compose.ui.unit.dp import com.squareup.moshi.JsonAdapter import com.squareup.workflow1.traceviewer.TraceMode import com.squareup.workflow1.traceviewer.model.Node +import com.squareup.workflow1.traceviewer.model.NodeUpdate import com.squareup.workflow1.traceviewer.util.ParseResult import com.squareup.workflow1.traceviewer.util.createMoshiAdapter import com.squareup.workflow1.traceviewer.util.parseFileTrace @@ -47,7 +48,7 @@ internal fun RenderTrace( traceSource: TraceMode, frameInd: Int, onFileParse: (List) -> Unit, - onNodeSelect: (Node, Node?) -> Unit, + onNodeSelect: (NodeUpdate) -> Unit, onNewFrame: () -> Unit, modifier: Modifier = Modifier ) { @@ -145,7 +146,7 @@ private fun DrawTree( previousFrameNode: Node?, affectedNodes: Set, expandedNodes: MutableMap, - onNodeSelect: (Node, Node?) -> Unit, + onNodeSelect: (NodeUpdate) -> Unit, modifier: Modifier = Modifier, ) { Column( @@ -207,15 +208,21 @@ private fun DrawNode( nodePast: Node?, isAffected: Boolean, isExpanded: Boolean, - onNodeSelect: (Node, Node?) -> Unit, + onNodeSelect: (NodeUpdate) -> Unit, onExpandToggle: (Node) -> Unit, ) { + val nodeUpdate = NodeUpdate.create( + current = node, + past = nodePast, + isAffected = isAffected + ) + Box( modifier = Modifier - .background(if (isAffected) Color.Green else Color.Transparent) + .background(nodeUpdate.state.color) .onPointerEvent(PointerEventType.Press) { if (it.buttons.isPrimaryPressed) { - onNodeSelect(node, nodePast) + onNodeSelect(nodeUpdate) } else if (it.buttons.isSecondaryPressed) { onExpandToggle(node) } From 25d04a429cffe19ae01e635c0d3cc1841ef8f798 Mon Sep 17 00:00:00 2001 From: Wenli Cai Date: Tue, 22 Jul 2025 12:06:57 -0400 Subject: [PATCH 04/33] Move away from using reflection for accessing node fields Using reflection gives us the declared fields of a class only in alphabetical order, and some information is unnecessarily inside, so we instead just manually give back a list and the data associated with them through companion methods. --- .../workflow1/traceviewer/model/Node.kt | 18 ++++++++++++++++++ .../traceviewer/ui/WorkflowInfoPanel.kt | 15 ++++++++------- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/model/Node.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/model/Node.kt index 30f000e28..ea3a172fb 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/model/Node.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/model/Node.kt @@ -31,6 +31,24 @@ internal data class Node( override fun hashCode(): Int { return id.hashCode() } + + companion object { + fun getNodeFields(): List { + return listOf("id", "parent", "parentId", "props", "state", "rendering") + } + + fun getNodeData(node: Node, field: String): String { + return when (field.lowercase()) { + "id" -> node.id + "parent" -> node.parent + "parentid" -> node.parentId + "props" -> node.props + "state" -> node.state + "rendering" -> node.rendering + else -> throw IllegalArgumentException("Unknown field: $field") + } + } + } } internal fun Node.addChild(child: Node): Node { diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowInfoPanel.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowInfoPanel.kt index 42576f347..a2ecb23f0 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowInfoPanel.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowInfoPanel.kt @@ -31,10 +31,10 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import com.squareup.workflow1.traceviewer.model.Node import com.squareup.workflow1.traceviewer.model.NodeUpdate -import kotlin.reflect.full.memberProperties /** * A panel that displays information about the selected workflow node. @@ -98,19 +98,20 @@ private fun NodePanelDetails( } item { Text( - text = "Workflow Details", + text = node.current.name, style = MaterialTheme.typography.h6, - modifier = Modifier.padding(top = 8.dp, bottom = 8.dp) + modifier = Modifier.padding(top = 8.dp, bottom = 8.dp), + textAlign = TextAlign.Center ) } - val fields = Node::class.memberProperties + val fields = Node.getNodeFields() for (field in fields) { - val currVal = field.get(node.current).toString() - val pastVal = if (node.past != null) field.get(node.past).toString() else null + val currVal = Node.getNodeData(node.current, field) + val pastVal = if (node.past != null) Node.getNodeData(node.past, field) else null item { DetailCard( - label = field.name, + label = field, currValue = currVal, pastValue = pastVal ) From 1ce99434503a2aec689f8e7d598f5ae67b7c0183 Mon Sep 17 00:00:00 2001 From: Wenli Cai Date: Tue, 22 Jul 2025 12:18:25 -0400 Subject: [PATCH 05/33] Change node data being visualized The only important fields of a node is its state, props, and rendering. Its and the parent node's ID's are less significant, and have been moved out of their own detailed cards to avoid cluttering up the info panel --- .../workflow1/traceviewer/model/Node.kt | 5 +---- .../traceviewer/ui/WorkflowInfoPanel.kt | 19 ++++++++++++++++--- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/model/Node.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/model/Node.kt index ea3a172fb..d01132d3e 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/model/Node.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/model/Node.kt @@ -34,14 +34,11 @@ internal data class Node( companion object { fun getNodeFields(): List { - return listOf("id", "parent", "parentId", "props", "state", "rendering") + return listOf("props", "state", "rendering") } fun getNodeData(node: Node, field: String): String { return when (field.lowercase()) { - "id" -> node.id - "parent" -> node.parent - "parentid" -> node.parentId "props" -> node.props "state" -> node.state "rendering" -> node.rendering diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowInfoPanel.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowInfoPanel.kt index a2ecb23f0..520c674e1 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowInfoPanel.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowInfoPanel.kt @@ -98,9 +98,22 @@ private fun NodePanelDetails( } item { Text( - text = node.current.name, - style = MaterialTheme.typography.h6, - modifier = Modifier.padding(top = 8.dp, bottom = 8.dp), + text = "${node.current.parent} (ID: ${node.current.parentId})", + style = MaterialTheme.typography.subtitle2, + color = Color.Gray, + modifier = Modifier.padding(top = 8.dp) + ) + Text( + text = "↳", + style = MaterialTheme.typography.subtitle1, + color = Color.Gray, + modifier = Modifier.padding(start = 8.dp) + ) + Text( + text = "${node.current.name} (ID: ${node.current.id})", + style = MaterialTheme.typography.h5, + fontWeight = FontWeight.SemiBold, + modifier = Modifier.padding(8.dp), textAlign = TextAlign.Center ) } From b5d3b16d5f4190e9750ed99fce084fc7abcf8a70 Mon Sep 17 00:00:00 2001 From: Wenli Cai Date: Tue, 22 Jul 2025 12:40:43 -0400 Subject: [PATCH 06/33] Remove unnecessary frame tracking in main composable --- .../kotlin/com/squareup/workflow1/traceviewer/App.kt | 8 ++++---- .../squareup/workflow1/traceviewer/ui/FrameSelectTab.kt | 6 +++--- .../com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt index 26a46580d..450d93f72 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt @@ -33,7 +33,7 @@ internal fun App( modifier: Modifier = Modifier ) { var selectedNode by remember { mutableStateOf(null) } - val workflowFrames = remember { mutableStateListOf() } + var frameSize by remember { mutableIntStateOf(0) } var frameIndex by remember { mutableIntStateOf(0) } val sandboxState = remember { SandboxState() } @@ -62,7 +62,7 @@ internal fun App( selectedTraceFile = null selectedNode = null frameIndex = 0 - workflowFrames.clear() + frameSize = 0 } // Main content @@ -77,7 +77,7 @@ internal fun App( RenderTrace( traceSource = traceMode, frameInd = frameIndex, - onFileParse = { workflowFrames.addAll(it) }, + onFileParse = { frameSize += it }, onNodeSelect = { selectedNode = it }, onNewFrame = { frameIndex += 1 } ) @@ -85,7 +85,7 @@ internal fun App( } FrameSelectTab( - frames = workflowFrames, + size = frameSize, currentIndex = frameIndex, onIndexChange = { frameIndex = it }, modifier = Modifier.align(Alignment.TopCenter) diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/FrameSelectTab.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/FrameSelectTab.kt index b78b4c4da..823455298 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/FrameSelectTab.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/FrameSelectTab.kt @@ -26,7 +26,7 @@ import kotlinx.coroutines.launch */ @Composable internal fun FrameSelectTab( - frames: List, + size: Int, currentIndex: Int, onIndexChange: (Int) -> Unit, modifier: Modifier = Modifier @@ -36,7 +36,7 @@ internal fun FrameSelectTab( if (currentIndex < 0) return@LaunchedEffect lazyListState.animateScrollToItem(currentIndex) } - + Surface( modifier = modifier, color = Color.White, @@ -61,7 +61,7 @@ internal fun FrameSelectTab( } }, ) { - items(frames.size) { index -> + items(size) { index -> Text( text = "Frame ${index + 1}", color = if (index == currentIndex) Color.Black else Color.LightGray, diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt index 38548aed9..99a896488 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt @@ -47,7 +47,7 @@ import kotlinx.coroutines.withContext internal fun RenderTrace( traceSource: TraceMode, frameInd: Int, - onFileParse: (List) -> Unit, + onFileParse: (Int) -> Unit, onNodeSelect: (NodeUpdate) -> Unit, onNewFrame: () -> Unit, modifier: Modifier = Modifier @@ -65,7 +65,7 @@ internal fun RenderTrace( fullTree.addAll(tree) affectedNodes.addAll(affected) isLoading = false - onFileParse(frame) + onFileParse(frame.size) } // Handles the result of parsing a trace, either from file or live. Live mode includes callback From 6dddf943a790f17ecb21880a4b615fb95680910e Mon Sep 17 00:00:00 2001 From: Wenli Cai Date: Tue, 22 Jul 2025 14:10:42 -0400 Subject: [PATCH 07/33] Add legend for the colors used in the frame --- .../com/squareup/workflow1/traceviewer/App.kt | 23 ++++--- .../workflow1/traceviewer/ui/ColorLegend.kt | 62 +++++++++++++++++++ .../traceviewer/ui/FrameSelectTab.kt | 1 - 3 files changed, 77 insertions(+), 9 deletions(-) create mode 100644 workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/ColorLegend.kt diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt index 450d93f72..63f448dac 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt @@ -6,7 +6,6 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableFloatStateOf import androidx.compose.runtime.mutableIntStateOf -import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue @@ -14,8 +13,8 @@ import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Offset -import com.squareup.workflow1.traceviewer.model.Node import com.squareup.workflow1.traceviewer.model.NodeUpdate +import com.squareup.workflow1.traceviewer.ui.ColorLegend import com.squareup.workflow1.traceviewer.ui.FrameSelectTab import com.squareup.workflow1.traceviewer.ui.RenderTrace import com.squareup.workflow1.traceviewer.ui.RightInfoPanel @@ -40,6 +39,7 @@ internal fun App( // Default to File mode, and can be toggled to be in Live mode. var traceMode by remember { mutableStateOf(TraceMode.File(null)) } var selectedTraceFile by remember { mutableStateOf(null) } + var active by remember(traceMode) { mutableStateOf(false) } val socket = remember { SocketClient() } Runtime.getRuntime().addShutdownHook( @@ -74,6 +74,7 @@ internal fun App( val readyForLiveTrace = traceMode is TraceMode.Live if (readyForFileTrace || readyForLiveTrace) { + active = true RenderTrace( traceSource = traceMode, frameInd = frameIndex, @@ -91,12 +92,6 @@ internal fun App( modifier = Modifier.align(Alignment.TopCenter) ) - RightInfoPanel( - selectedNode = selectedNode, - modifier = Modifier - .align(Alignment.TopEnd) - ) - TraceModeToggleSwitch( onToggle = { resetStates() @@ -129,6 +124,18 @@ internal fun App( modifier = Modifier.align(Alignment.BottomStart) ) } + + if (active) { + ColorLegend( + modifier = Modifier.align(Alignment.BottomEnd) + ) + } + + RightInfoPanel( + selectedNode = selectedNode, + modifier = Modifier + .align(Alignment.TopEnd) + ) } } diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/ColorLegend.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/ColorLegend.kt new file mode 100644 index 000000000..f42ebdadd --- /dev/null +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/ColorLegend.kt @@ -0,0 +1,62 @@ +package com.squareup.workflow1.traceviewer.ui + +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.font.FontStyle +import androidx.compose.ui.unit.dp +import com.squareup.workflow1.traceviewer.model.NodeState + +/** + * Simple UI displaying the color legend for the different node states in the trace + */ +@Composable +fun ColorLegend( + modifier: Modifier = Modifier +) { + Box( + modifier = modifier + ) { + Column( + verticalArrangement = Arrangement.spacedBy(4.dp), + modifier = Modifier.padding(8.dp) + ) { + NodeState.entries.forEach { state -> + Row( + horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.padding(vertical = 2.dp) + ) { + Box( + modifier = Modifier + .size(16.dp) + .background( + color = state.color, + ) + .then( + if (state.color == Color.Transparent) { + modifier.border(1.dp, Color.Gray) + } else { + modifier + } + ) + ) + Text( + text = state.name, + fontStyle = FontStyle.Italic, + ) + } + } + } + } +} diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/FrameSelectTab.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/FrameSelectTab.kt index 823455298..f0d34fe82 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/FrameSelectTab.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/FrameSelectTab.kt @@ -17,7 +17,6 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.input.pointer.PointerEventType import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.unit.dp -import com.squareup.workflow1.traceviewer.model.Node import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.launch From 6d2d31bee137bb2179ff45f98d48d1f3ad9a3a44 Mon Sep 17 00:00:00 2001 From: Wenli Cai Date: Thu, 24 Jul 2025 12:18:15 -0400 Subject: [PATCH 08/33] Group unaffected and affected children separately --- .../workflow1/traceviewer/ui/WorkflowTree.kt | 103 ++++++++++++++---- 1 file changed, 82 insertions(+), 21 deletions(-) diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt index 99a896488..546ad96ba 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt @@ -7,7 +7,9 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -26,6 +28,7 @@ import androidx.compose.ui.input.pointer.isPrimaryPressed import androidx.compose.ui.input.pointer.isSecondaryPressed import androidx.compose.ui.input.pointer.onPointerEvent import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp import com.squareup.moshi.JsonAdapter import com.squareup.workflow1.traceviewer.TraceMode import com.squareup.workflow1.traceviewer.model.Node @@ -140,6 +143,7 @@ internal fun RenderTrace( * A mutable map is used to persist the expansion state of the nodes, allowing them to be open and * closed from user clicks. */ +@OptIn(ExperimentalComposeUiApi::class) @Composable private fun DrawTree( node: Node, @@ -151,17 +155,20 @@ private fun DrawTree( ) { Column( modifier - .padding(5.dp) - .border(1.dp, Color.Black) + .padding(6.dp) + .border(3.dp, Color.Black) .fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, ) { + val groupKey = "${node.id}-unaffected" val isAffected = affectedNodes.contains(node) // By default, nodes that relevant to this specific frame are expanded. All others are closed. LaunchedEffect(expandedNodes) { expandedNodes[node.id] = isAffected + expandedNodes[groupKey] = false } val isExpanded = expandedNodes[node.id] == true + val unaffectedChildrenExpanded = expandedNodes[groupKey] == true DrawNode( node = node, @@ -174,26 +181,80 @@ private fun DrawTree( // Draws the node's children recursively. if (isExpanded) { - Row( - horizontalArrangement = Arrangement.Center, - verticalAlignment = Alignment.Top - ) { - /* - We pair up the current node's children with previous frame's children. - In the edge case that the current frame has additional children compared to the previous - frame, we replace with null and will check before next recursive call. - */ - node.children.forEach { (id, childNode) -> - val prevFrameChildNode = previousFrameNode?.children?.get(id) - DrawTree( - node = childNode, - previousFrameNode = prevFrameChildNode, - affectedNodes = affectedNodes, - expandedNodes = expandedNodes, - onNodeSelect = onNodeSelect - ) + // Draw the affected children, and only draw the unaffected children it is clicked annd expanded. + val (affectedChildren, unaffectedChildren) = node.children.values + .partition { affectedNodes.contains(it) } + + + if (unaffectedChildren.isNotEmpty()) { + Box ( + modifier = Modifier + .onPointerEvent(PointerEventType.Press) { + if (it.buttons.isSecondaryPressed) { + // The open/close state for this group is always set when this node is first composed. + expandedNodes[groupKey] = !expandedNodes[groupKey]!! + } + } + ) { + if (!unaffectedChildrenExpanded) { + Column( + modifier = Modifier + .background(Color.LightGray.copy(alpha = 0.3f), shape = RoundedCornerShape(4.dp)) + .border(1.dp, Color.Gray) + .padding(8.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + Text(text = "${node.name}'s", color = Color.DarkGray) + Text(text = "${unaffectedChildren.size} unaffected children", color = Color.DarkGray, fontSize = 12.sp) + } + } else { + DrawChildren( + children = unaffectedChildren, + previousFrameNode = previousFrameNode, + affectedNodes = affectedNodes, + expandedNodes = expandedNodes, + onNodeSelect = onNodeSelect + ) + } } } + + if (affectedChildren.isNotEmpty()) { + DrawChildren( + children = affectedChildren, + previousFrameNode = previousFrameNode, + affectedNodes = affectedNodes, + expandedNodes = expandedNodes, + onNodeSelect = onNodeSelect + ) + } + } + } +} + +@Composable +private fun DrawChildren( + children: List, + previousFrameNode: Node?, + affectedNodes: Set, + expandedNodes: MutableMap, + onNodeSelect: (NodeUpdate) -> Unit, +) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(8.dp), + horizontalArrangement = Arrangement.SpaceEvenly, + verticalAlignment = Alignment.Top + ) { + children.forEach { childNode -> + DrawTree( + node = childNode, + previousFrameNode = previousFrameNode?.children?.get(childNode.id), + affectedNodes = affectedNodes, + expandedNodes = expandedNodes, + onNodeSelect = onNodeSelect + ) } } } @@ -227,7 +288,7 @@ private fun DrawNode( onExpandToggle(node) } } - .padding(10.dp) + .padding(16.dp) ) { Column(horizontalAlignment = Alignment.CenterHorizontally) { Row( From e71a87060eccf6c00fbe64fb495ba1656e04fa3d Mon Sep 17 00:00:00 2001 From: Wenli Cai Date: Thu, 24 Jul 2025 13:06:56 -0400 Subject: [PATCH 09/33] Separate composable components and change workflow UI pattern All simple nodes (with no children) are shown at the top and nested nodes (with children) are shown at the bottom. This makes it the nesting more clear. --- .../workflow1/traceviewer/ui/WorkflowTree.kt | 216 +++++++++++++----- 1 file changed, 160 insertions(+), 56 deletions(-) diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt index 546ad96ba..977e3d118 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt @@ -63,7 +63,11 @@ internal fun RenderTrace( val affectedNodes = remember(traceSource) { mutableStateListOf>() } // Updates current state with the new data from trace source. - fun addToStates(frame: List, tree: List, affected: List>) { + fun addToStates( + frame: List, + tree: List, + affected: List> + ) { frames.addAll(frame) fullTree.addAll(tree) affectedNodes.addAll(affected) @@ -82,6 +86,7 @@ internal fun RenderTrace( error = parseResult.error false } + is ParseResult.Success -> { addToStates( frame = parseResult.trace, @@ -160,15 +165,12 @@ private fun DrawTree( .fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, ) { - val groupKey = "${node.id}-unaffected" val isAffected = affectedNodes.contains(node) // By default, nodes that relevant to this specific frame are expanded. All others are closed. LaunchedEffect(expandedNodes) { expandedNodes[node.id] = isAffected - expandedNodes[groupKey] = false } val isExpanded = expandedNodes[node.id] == true - val unaffectedChildrenExpanded = expandedNodes[groupKey] == true DrawNode( node = node, @@ -179,49 +181,88 @@ private fun DrawTree( onExpandToggle = { expandedNodes[node.id] = !expandedNodes[node.id]!! } ) - // Draws the node's children recursively. if (isExpanded) { - // Draw the affected children, and only draw the unaffected children it is clicked annd expanded. val (affectedChildren, unaffectedChildren) = node.children.values .partition { affectedNodes.contains(it) } + UnaffectedChildrenGroup( + node = node, + children = unaffectedChildren, + previousFrameNode = previousFrameNode, + affectedNodes = affectedNodes, + expandedNodes = expandedNodes, + onNodeSelect = onNodeSelect + ) - if (unaffectedChildren.isNotEmpty()) { - Box ( - modifier = Modifier - .onPointerEvent(PointerEventType.Press) { - if (it.buttons.isSecondaryPressed) { - // The open/close state for this group is always set when this node is first composed. - expandedNodes[groupKey] = !expandedNodes[groupKey]!! - } - } - ) { - if (!unaffectedChildrenExpanded) { - Column( - modifier = Modifier - .background(Color.LightGray.copy(alpha = 0.3f), shape = RoundedCornerShape(4.dp)) - .border(1.dp, Color.Gray) - .padding(8.dp), - horizontalAlignment = Alignment.CenterHorizontally - ) { - Text(text = "${node.name}'s", color = Color.DarkGray) - Text(text = "${unaffectedChildren.size} unaffected children", color = Color.DarkGray, fontSize = 12.sp) - } - } else { - DrawChildren( - children = unaffectedChildren, - previousFrameNode = previousFrameNode, - affectedNodes = affectedNodes, - expandedNodes = expandedNodes, - onNodeSelect = onNodeSelect - ) - } + AffectedChildrenGroup( + children = affectedChildren, + previousFrameNode = previousFrameNode, + affectedNodes = affectedNodes, + expandedNodes = expandedNodes, + onNodeSelect = onNodeSelect + ) + } + } +} + +/** + * Draws the group of unaffected children, which can be open and closed to expand/collapse them. + * + * If an unaffected children also has other children, it cannot be opened, since the this group + * treats all nodes as one entity, so the onClick for the whole group overrides the onClick for the + * individual nodes. + */ +@OptIn(ExperimentalComposeUiApi::class) +@Composable +private fun UnaffectedChildrenGroup( + node: Node, + children: List, + previousFrameNode: Node?, + affectedNodes: Set, + expandedNodes: MutableMap, + onNodeSelect: (NodeUpdate) -> Unit +) { + if (children.isEmpty()) return + + val groupKey = "${node.id}_unaffected_group" + LaunchedEffect(Unit) { + expandedNodes[groupKey] = false + } + val isGroupExpanded = expandedNodes[groupKey] == true + + Box( + modifier = Modifier + .onPointerEvent(PointerEventType.Press) { + if (it.buttons.isSecondaryPressed) { + expandedNodes[groupKey] = !isGroupExpanded } } - - if (affectedChildren.isNotEmpty()) { - DrawChildren( - children = affectedChildren, + ) { + if (!isGroupExpanded) { + Column( + modifier = Modifier + .background(Color.LightGray.copy(alpha = 0.3f), shape = RoundedCornerShape(4.dp)) + .border(1.dp, Color.Gray) + .padding(8.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + Text(text = "${node.name}'s", color = Color.DarkGray) + Text( + text = "${children.size} unaffected children", + color = Color.DarkGray, + fontSize = 12.sp + ) + } + } else { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(6.dp) + .border(3.dp, Color.Black), + horizontalAlignment = Alignment.CenterHorizontally, + ) { + DrawChildrenInGroups( + children = children, previousFrameNode = previousFrameNode, affectedNodes = affectedNodes, expandedNodes = expandedNodes, @@ -232,29 +273,92 @@ private fun DrawTree( } } +/** + * Draws the group of affected children + */ @Composable -private fun DrawChildren( +private fun AffectedChildrenGroup( children: List, previousFrameNode: Node?, affectedNodes: Set, expandedNodes: MutableMap, - onNodeSelect: (NodeUpdate) -> Unit, + onNodeSelect: (NodeUpdate) -> Unit ) { - Row( - modifier = Modifier - .fillMaxWidth() - .padding(8.dp), - horizontalArrangement = Arrangement.SpaceEvenly, - verticalAlignment = Alignment.Top + if (children.isEmpty()) return + + DrawChildrenInGroups( + children = children, + previousFrameNode = previousFrameNode, + affectedNodes = affectedNodes, + expandedNodes = expandedNodes, + onNodeSelect = onNodeSelect + ) +} + +/** + * Draws the children in a grid manner, to avoid horizontal clutter and make better use of space. + */ +@Composable +private fun DrawChildrenInGroups( + children: List, + previousFrameNode: Node?, + affectedNodes: Set, + expandedNodes: MutableMap, + onNodeSelect: (NodeUpdate) -> Unit +) { + // Split children into those with children (nested) and those without + val (nestedChildren, simpleChildren) = children.partition { it.children.isNotEmpty() } + + Column( + verticalArrangement = Arrangement.spacedBy(16.dp), // Increased spacing between sections ) { - children.forEach { childNode -> - DrawTree( - node = childNode, - previousFrameNode = previousFrameNode?.children?.get(childNode.id), - affectedNodes = affectedNodes, - expandedNodes = expandedNodes, - onNodeSelect = onNodeSelect - ) + // Draw simple children in a grid at the top + if (simpleChildren.isNotEmpty()) { + val groupedSimpleChildren = simpleChildren.chunked(5) + + groupedSimpleChildren.forEach { group -> + Row( + modifier = Modifier + .fillMaxWidth() + .padding(8.dp) + .align(Alignment.CenterHorizontally), + horizontalArrangement = Arrangement.SpaceEvenly, + verticalAlignment = Alignment.Top + ) { + group.forEach { childNode -> + DrawTree( + node = childNode, + previousFrameNode = previousFrameNode?.children?.get(childNode.id), + affectedNodes = affectedNodes, + expandedNodes = expandedNodes, + onNodeSelect = onNodeSelect + ) + } + } + + } + } + + // Draw nested children in a single row at the bottom + if (nestedChildren.isNotEmpty()) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 8.dp) + .align(Alignment.CenterHorizontally), + horizontalArrangement = Arrangement.SpaceEvenly, + verticalAlignment = Alignment.Top + ) { + nestedChildren.forEach { childNode -> + DrawTree( + node = childNode, + previousFrameNode = previousFrameNode?.children?.get(childNode.id), + affectedNodes = affectedNodes, + expandedNodes = expandedNodes, + onNodeSelect = onNodeSelect + ) + } + } } } } From 18c3b6ffae22fb764295f24c005f579de978ab83 Mon Sep 17 00:00:00 2001 From: Wenli Cai Date: Thu, 24 Jul 2025 14:46:51 -0400 Subject: [PATCH 10/33] Don't apply simple/nested pattern for unaffected children group --- .../workflow1/traceviewer/ui/WorkflowTree.kt | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt index 977e3d118..32710285c 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt @@ -208,8 +208,8 @@ private fun DrawTree( /** * Draws the group of unaffected children, which can be open and closed to expand/collapse them. * - * If an unaffected children also has other children, it cannot be opened, since the this group - * treats all nodes as one entity, so the onClick for the whole group overrides the onClick for the + * If an unaffected children also has other children, it cannot be opened since the this group + * treats all nodes as one entity. The onClick for the whole group overrides the onClick for the * individual nodes. */ @OptIn(ExperimentalComposeUiApi::class) @@ -266,6 +266,7 @@ private fun UnaffectedChildrenGroup( previousFrameNode = previousFrameNode, affectedNodes = affectedNodes, expandedNodes = expandedNodes, + unaffected = true, onNodeSelect = onNodeSelect ) } @@ -297,6 +298,9 @@ private fun AffectedChildrenGroup( /** * Draws the children in a grid manner, to avoid horizontal clutter and make better use of space. + * + * Unaffected children group would call this with `unaffected = true`, which means that simple/nested + * nodes don't matter since we can't open nested ones, so we just simply group in 5's */ @Composable private fun DrawChildrenInGroups( @@ -304,10 +308,17 @@ private fun DrawChildrenInGroups( previousFrameNode: Node?, affectedNodes: Set, expandedNodes: MutableMap, + unaffected: Boolean = false, onNodeSelect: (NodeUpdate) -> Unit ) { // Split children into those with children (nested) and those without - val (nestedChildren, simpleChildren) = children.partition { it.children.isNotEmpty() } + var (nestedChildren, simpleChildren) = children.partition { it.children.isNotEmpty() } + + // Just reset the lists so we chunk everything in the unaffected group + if (unaffected) { + nestedChildren = emptyList() + simpleChildren = children + } Column( verticalArrangement = Arrangement.spacedBy(16.dp), // Increased spacing between sections From 5646d100c76d3e8f68cef81c699ae5b1dba8e6eb Mon Sep 17 00:00:00 2001 From: Wenli Cai Date: Fri, 25 Jul 2025 10:04:04 -0400 Subject: [PATCH 11/33] Add file dump functionality from live tracing mode --- .../com/squareup/workflow1/traceviewer/App.kt | 12 +++- .../workflow1/traceviewer/ui/WorkflowTree.kt | 7 ++- .../workflow1/traceviewer/util/FileDump.kt | 62 +++++++++++++++++++ 3 files changed, 78 insertions(+), 3 deletions(-) create mode 100644 workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/FileDump.kt diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt index 63f448dac..8ac5bc0f2 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt @@ -19,6 +19,7 @@ import com.squareup.workflow1.traceviewer.ui.FrameSelectTab import com.squareup.workflow1.traceviewer.ui.RenderTrace import com.squareup.workflow1.traceviewer.ui.RightInfoPanel import com.squareup.workflow1.traceviewer.ui.TraceModeToggleSwitch +import com.squareup.workflow1.traceviewer.util.FileDump import com.squareup.workflow1.traceviewer.util.SandboxBackground import com.squareup.workflow1.traceviewer.util.SocketClient import com.squareup.workflow1.traceviewer.util.UploadFile @@ -33,6 +34,7 @@ internal fun App( ) { var selectedNode by remember { mutableStateOf(null) } var frameSize by remember { mutableIntStateOf(0) } + var rawRenderPass by remember { mutableStateOf("")} var frameIndex by remember { mutableIntStateOf(0) } val sandboxState = remember { SandboxState() } @@ -80,7 +82,8 @@ internal fun App( frameInd = frameIndex, onFileParse = { frameSize += it }, onNodeSelect = { selectedNode = it }, - onNewFrame = { frameIndex += 1 } + onNewFrame = { frameIndex += 1 }, + onNewData = { rawRenderPass += "$it," }, ) } } @@ -125,6 +128,13 @@ internal fun App( ) } + if (traceMode is TraceMode.Live) { + FileDump( + trace = rawRenderPass, + modifier = Modifier.align(Alignment.BottomStart) + ) + } + if (active) { ColorLegend( modifier = Modifier.align(Alignment.BottomEnd) diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt index 32710285c..512b783bb 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt @@ -53,6 +53,7 @@ internal fun RenderTrace( onFileParse: (Int) -> Unit, onNodeSelect: (NodeUpdate) -> Unit, onNewFrame: () -> Unit, + onNewData: (String) -> Unit, modifier: Modifier = Modifier ) { var isLoading by remember(traceSource) { mutableStateOf(true) } @@ -79,6 +80,7 @@ internal fun RenderTrace( // for when a new frame is received. fun handleParseResult( parseResult: ParseResult, + rawRenderPass: String? = null, onNewFrame: (() -> Unit)? = null ): Boolean { return when (parseResult) { @@ -93,7 +95,9 @@ internal fun RenderTrace( tree = parseResult.trees, affected = parseResult.affectedNodes ) + // Only increment the frame index and add the raw data during Live tracing mode onNewFrame?.invoke() + rawRenderPass?.let { onNewData(it) } true } } @@ -117,7 +121,7 @@ internal fun RenderTrace( for (renderPass in socket.renderPassChannel) { val currentTree = if (fullTree.isEmpty()) null else fullTree.last() val parseResult = parseLiveTrace(renderPass, adapter, currentTree) - handleParseResult(parseResult, onNewFrame) + handleParseResult(parseResult, renderPass, onNewFrame) } } } @@ -148,7 +152,6 @@ internal fun RenderTrace( * A mutable map is used to persist the expansion state of the nodes, allowing them to be open and * closed from user clicks. */ -@OptIn(ExperimentalComposeUiApi::class) @Composable private fun DrawTree( node: Node, diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/FileDump.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/FileDump.kt new file mode 100644 index 000000000..bc1556c64 --- /dev/null +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/FileDump.kt @@ -0,0 +1,62 @@ +package com.squareup.workflow1.traceviewer.util + +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material.Button +import androidx.compose.material.ButtonDefaults.buttonColors +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp +import okio.FileSystem +import okio.Path.Companion.toPath +import okio.buffer +import java.time.LocalDateTime +import java.time.format.DateTimeFormatter + +@Composable +internal fun FileDump( + trace: String, + modifier: Modifier +) { + var clicked by remember { mutableStateOf(false) } + Button ( + modifier = modifier.padding(16.dp), + shape = CircleShape, + colors = buttonColors(Color.Black), + onClick = { + clicked = true + writeToFile(trace) + } + ) { + val text = if (clicked) { + "Trace saved to Downloads" + } else { + "Save trace to file" + } + Text( + text = text, + color = Color.White + ) + } +} + +private fun writeToFile(trace: String) { + val timestamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss")) + val home = System.getProperty("user.home") + val path = "$home/Downloads/workflow-trace_$timestamp.json".toPath() + + FileSystem.SYSTEM.sink(path).use { sink -> + sink.buffer().use { bufferedSink -> + bufferedSink.writeUtf8("[") + bufferedSink.writeUtf8(trace.dropLast(1)) // Fenceposting final comma + bufferedSink.writeUtf8("]") + } + } +} + From 18f82cd0f9276f39119974edc85e7646db26bf3b Mon Sep 17 00:00:00 2001 From: Jacob Applin Date: Thu, 24 Jul 2025 15:38:00 -0400 Subject: [PATCH 12/33] Fix NPE when enabling live view without a connected device --- .../com/squareup/workflow1/traceviewer/util/SocketClient.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/SocketClient.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/SocketClient.kt index 30bb66e37..6f7b08c01 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/SocketClient.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/SocketClient.kt @@ -58,8 +58,7 @@ internal class SocketClient { val reader = socket.getInputStream().bufferedReader() try { while (true) { - val input = reader.readLine() - renderPassChannel.trySend(input) + reader.readLine()?.let(renderPassChannel::trySend) } } catch (e: SocketException) { println("Exiting socket listener due to: ${e.message}") From 07ab5fd191911f1d60790b5279f40419e163ec99 Mon Sep 17 00:00:00 2001 From: Jacob Applin Date: Fri, 25 Jul 2025 11:59:30 -0400 Subject: [PATCH 13/33] Enable compose hot reload --- build-logic/settings.gradle.kts | 2 +- gradle/libs.versions.toml | 13 +++++++------ gradle/wrapper/gradle-wrapper.properties | 2 +- workflow-trace-viewer/build.gradle.kts | 9 ++++++++- 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/build-logic/settings.gradle.kts b/build-logic/settings.gradle.kts index 2c7dfa00c..b6d0f9311 100644 --- a/build-logic/settings.gradle.kts +++ b/build-logic/settings.gradle.kts @@ -1,6 +1,6 @@ plugins { // Hardcoded as this is upstream of the version catalog. Keep this in sync with that. - kotlin("jvm") version "2.0.21" apply false + kotlin("jvm") version "2.2.0" apply false } dependencyResolutionManagement { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 03264b2c8..bc0659340 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,12 +1,12 @@ [versions] -agpVersion = "8.8.0" +agpVersion = "8.11.0" compileSdk = "34" minSdk = "24" targetSdk = "33" -jdk-target = "1.8" +jdk-target = "11" jdk-toolchain = "17" androidx-activity = "1.8.2" @@ -46,19 +46,19 @@ filekit-dialogs-compose = "0.10.0-beta03" google-accompanist = "0.18.0" google-dagger = "2.40.5" -google-ksp = "2.0.21-1.0.26" +google-ksp = "2.2.0-2.0.2" google-material = "1.4.0" groovy = "3.0.9" jUnit = "4.13.2" java-diff-utils = "4.12" javaParser = "3.24.0" -jetbrains-compose-plugin = "1.7.3" +jetbrains-compose-plugin = "1.8.2" kgx = "0.1.12" kotest = "5.1.0" # Keep this in sync with what is hard-coded in build-logic/settings.gradle.kts as that is upstream # of loading the library versions from this file but should be the same. -kotlin = "2.0.21" +kotlin = "2.2.0" kotlinx-binary-compatibility = "0.17.0" kotlinx-coroutines = "1.7.3" @@ -95,9 +95,10 @@ timber = "5.0.1" truth = "1.4.4" turbine = "1.0.0" vanniktech-publish = "0.32.0" +compose-hot-reload = "1.0.0-beta02" [plugins] - +compose-hot-reload = { id = "org.jetbrains.compose.hot-reload", version.ref = "compose-hot-reload" } kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index bbb57cf06..f407850a5 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.11-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/workflow-trace-viewer/build.gradle.kts b/workflow-trace-viewer/build.gradle.kts index cee4e4e65..16b41085a 100644 --- a/workflow-trace-viewer/build.gradle.kts +++ b/workflow-trace-viewer/build.gradle.kts @@ -1,9 +1,11 @@ import org.jetbrains.compose.desktop.application.dsl.TargetFormat +import org.jetbrains.compose.reload.gradle.ComposeHotRun plugins { id("kotlin-multiplatform") alias(libs.plugins.jetbrains.compose) alias(libs.plugins.compose.compiler) + alias(libs.plugins.compose.hot.reload) } kotlin { @@ -35,7 +37,12 @@ kotlin { } } } - +tasks.withType().configureEach { + mainClass.set("com.squareup.workflow1.traceviewer.MainKt") + jvmArgs( + "-Dapple.awt.application.appearance=system" + ) +} compose { desktop { application { From 58c58a91213f536cc1e071513b302ba5d9165784 Mon Sep 17 00:00:00 2001 From: Wenli Cai Date: Fri, 25 Jul 2025 12:35:47 -0400 Subject: [PATCH 14/33] Change sample/tutorial module's agp version --- samples/tutorial/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/tutorial/build.gradle b/samples/tutorial/build.gradle index 818d9bccd..d2ecce24d 100644 --- a/samples/tutorial/build.gradle +++ b/samples/tutorial/build.gradle @@ -8,7 +8,7 @@ buildscript { deps = [ activityktx: 'androidx.activity:activity-ktx:1.3.0', - agp: "com.android.tools.build:gradle:8.8.0", + agp: "com.android.tools.build:gradle:8.11.0", appcompat: 'androidx.appcompat:appcompat:1.3.1', constraintlayout: 'androidx.constraintlayout:constraintlayout:2.0.1', kotlin: [ From 2aaa12002ba1138c380236c2d9cff25815c05bad Mon Sep 17 00:00:00 2001 From: Wenli Cai Date: Fri, 25 Jul 2025 17:55:13 -0400 Subject: [PATCH 15/33] WIP text diff --- workflow-trace-viewer/build.gradle.kts | 1 + .../traceviewer/ui/WorkflowInfoPanel.kt | 40 +++++-- .../workflow1/traceviewer/util/DiffUtils.kt | 112 ++++++++++++++++++ 3 files changed, 143 insertions(+), 10 deletions(-) create mode 100644 workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/DiffUtils.kt diff --git a/workflow-trace-viewer/build.gradle.kts b/workflow-trace-viewer/build.gradle.kts index 16b41085a..fdb9ba78c 100644 --- a/workflow-trace-viewer/build.gradle.kts +++ b/workflow-trace-viewer/build.gradle.kts @@ -27,6 +27,7 @@ kotlin { implementation(compose.materialIconsExtended) implementation(libs.squareup.moshi.kotlin) implementation(libs.filekit.dialogs.compose) + implementation(libs.java.diff.utils) } } jvmTest { diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowInfoPanel.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowInfoPanel.kt index 520c674e1..68296c29c 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowInfoPanel.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowInfoPanel.kt @@ -28,13 +28,13 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.text.TextStyle -import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import com.squareup.workflow1.traceviewer.model.Node import com.squareup.workflow1.traceviewer.model.NodeUpdate +import com.squareup.workflow1.traceviewer.util.computeAnnotatedDiff /** * A panel that displays information about the selected workflow node. @@ -163,7 +163,7 @@ private fun DetailCard( text = label, style = MaterialTheme.typography.h6, color = Color.Black, - fontWeight = FontWeight.Medium + fontWeight = FontWeight.Bold ) if (!open) { return@Card @@ -173,9 +173,27 @@ private fun DetailCard( if (pastValue != null) { Column { Text( - text = "Before:", - style = TextStyle(fontStyle = FontStyle.Italic), - color = Color.Black, + text = "Changes", + style = MaterialTheme.typography.subtitle1, + color = Color.Gray, + fontWeight = FontWeight.Medium + ) + Text( + text = computeAnnotatedDiff(pastValue, currValue), + style = MaterialTheme.typography.body2 + ) + + Spacer(modifier = Modifier.height(16.dp)) + Text( + text = "━━━━━━━━━━━━━━━━━━━━━━━━━━━━", + maxLines = 1, + overflow = TextOverflow.Clip + ) + + Text( + text = "Before", + style = MaterialTheme.typography.subtitle1, + color = Color.Gray, fontWeight = FontWeight.Medium ) Text( @@ -183,11 +201,13 @@ private fun DetailCard( style = MaterialTheme.typography.body2, color = Color.Black ) - Spacer(modifier = Modifier.height(8.dp)) + + Spacer(modifier = Modifier.height(16.dp)) + Text( - text = "After:", - style = TextStyle(fontStyle = FontStyle.Italic), - color = Color.Black, + text = "After", + style = MaterialTheme.typography.subtitle1, + color = Color.Gray, fontWeight = FontWeight.Medium ) Text( diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/DiffUtils.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/DiffUtils.kt new file mode 100644 index 000000000..b0dcf0e86 --- /dev/null +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/DiffUtils.kt @@ -0,0 +1,112 @@ +package com.squareup.workflow1.traceviewer.util + +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.buildAnnotatedString +import com.github.difflib.text.DiffRow +import com.github.difflib.text.DiffRowGenerator + +/** + * Utility class to generate colored diff between two texts + */ + +fun computeAnnotatedDiff( + past: String, + current: String +): AnnotatedString { + + + val diffGenerator = DiffRowGenerator.create() + .showInlineDiffs(true) + .inlineDiffByWord(true) + // .replaceOriginalLinefeedInChangesWithSpaces(true) + .oldTag { f -> "--" } + .newTag { f -> "++" } + .build() + + val pastName = extractTypeName(past) + val pastFields = getFieldsAsList(past) + val currentName = extractTypeName(current) + val currentFields = getFieldsAsList(current) + print(past + "\n\n") + println(pastFields) + // println(diffGenerator.generateDiffRows(pastFields, currentFields)) + var existsDiff = false + return buildAnnotatedString { + if (pastName != currentName) { + append("\n") + pushStyle(SpanStyle(background = Color.Red.copy(alpha = 0.3f))) + append("$pastName(...)") + pop() + append(" → ") + pushStyle(SpanStyle(background = Color.Green.copy(alpha = 0.3f))) + append("$currentName(...)") + pop() + } + + /* + zip shortens both to the shortest one, so + a) if past > current, then we pushStyle(delete) for the rest of past + b) if current > past, then we pushStyle(add) for the rest of current + */ + // pastFields.zip(currentFields).forEach { (pastField, currentField) -> + // val diff = diffGenerator.generateDiffRows(pastField, currentField) + // val tag = diff[0] + // if (tag == DiffRow.Tag.CHANGE) { + // + // } + // } + } +} + +/** + * Pull out each "key=value" pair within the field data by looking for a comma. Since plenty of data + * include nesting, doing .split or simple regex won't suffice. + * + * Manually iterates through the fields and changes the depth of the current comma accordingly + */ +private fun getFieldsAsList(field: String): List { + val fields = mutableListOf() + val currentField = StringBuilder() + var depth = 0 + // We skip past the field's Type's name + var i = field.indexOf('(') + 1 + + while (i < field.length) { + val char = field[i] + when (char) { + '(', '[', '{' -> { + depth++ + currentField.append(char) + } + + ')', ']', '}' -> { + depth-- + currentField.append(char) + } + + ',' -> { + if (depth == 0) { // end of key=value pair + fields += currentField.toString().trim() + currentField.clear() + i++ // skip space, e.g. "key=value, key2=value2, etc..." + } else { // nested list + currentField.append(char) + } + } + else -> currentField.append(char) + } + i++ + } + + // Just append whatever is left, since there are no trailing commas + if (currentField.isNotBlank()) fields += currentField.toString().trim() + return fields +} + +private fun extractTypeName(field: String): String { + val stateRegex = Regex("""^(\w+)\(""") + // If regex doesn't match, that means it's likely "kotlin.Unit" or "0" + return stateRegex.find(field)?.groupValues?.get(1) ?: field +} From 5ec8a183ce9e15cf202929168e046670c1183a1b Mon Sep 17 00:00:00 2001 From: Wenli Cai Date: Sat, 26 Jul 2025 14:03:29 -0400 Subject: [PATCH 16/33] Add text-diff functionality --- .../workflow1/traceviewer/model/Node.kt | 2 +- .../traceviewer/ui/WorkflowInfoPanel.kt | 8 +- .../workflow1/traceviewer/util/DiffUtils.kt | 170 +++++++++++++++--- 3 files changed, 147 insertions(+), 33 deletions(-) diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/model/Node.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/model/Node.kt index d01132d3e..82a84c418 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/model/Node.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/model/Node.kt @@ -34,7 +34,7 @@ internal data class Node( companion object { fun getNodeFields(): List { - return listOf("props", "state", "rendering") + return listOf("Props", "State", "Rendering") } fun getNodeData(node: Node, field: String): String { diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowInfoPanel.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowInfoPanel.kt index 68296c29c..f19369082 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowInfoPanel.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowInfoPanel.kt @@ -163,13 +163,12 @@ private fun DetailCard( text = label, style = MaterialTheme.typography.h6, color = Color.Black, - fontWeight = FontWeight.Bold + fontWeight = FontWeight.Bold, ) if (!open) { return@Card } - Spacer(modifier = Modifier.height(4.dp)) if (pastValue != null) { Column { Text( @@ -180,7 +179,10 @@ private fun DetailCard( ) Text( text = computeAnnotatedDiff(pastValue, currValue), - style = MaterialTheme.typography.body2 + style = MaterialTheme.typography.body2, + modifier = Modifier + .padding(top = 8.dp) + .align(Alignment.CenterHorizontally) ) Spacer(modifier = Modifier.height(16.dp)) diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/DiffUtils.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/DiffUtils.kt index b0dcf0e86..284f16e27 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/DiffUtils.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/DiffUtils.kt @@ -4,60 +4,171 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.buildAnnotatedString -import com.github.difflib.text.DiffRow +import com.github.difflib.text.DiffRow.Tag import com.github.difflib.text.DiffRowGenerator /** - * Utility class to generate colored diff between two texts + * Generates a field-level word-diff for each node's states. + * */ - fun computeAnnotatedDiff( past: String, current: String ): AnnotatedString { - - val diffGenerator = DiffRowGenerator.create() .showInlineDiffs(true) .inlineDiffByWord(true) - // .replaceOriginalLinefeedInChangesWithSpaces(true) + .mergeOriginalRevised(true) .oldTag { f -> "--" } .newTag { f -> "++" } .build() val pastName = extractTypeName(past) - val pastFields = getFieldsAsList(past) val currentName = extractTypeName(current) + val pastFields = getFieldsAsList(past) val currentFields = getFieldsAsList(current) - print(past + "\n\n") - println(pastFields) - // println(diffGenerator.generateDiffRows(pastFields, currentFields)) + val diffRows = diffGenerator.generateDiffRows(pastFields, currentFields) + var existsDiff = false return buildAnnotatedString { + // A full change in the type means all internal data will be changed, so it's easier to just + //generalize and show the diff in the type's name if (pastName != currentName) { - append("\n") - pushStyle(SpanStyle(background = Color.Red.copy(alpha = 0.3f))) - append("$pastName(...)") - pop() + buildString( + style = DiffStyles.DELETE, + text = "$pastName(...)", + builder = this + ) + // pushStyle(DiffStyles.DELETE) + // append("$pastName(...)") + // pop() append(" → ") - pushStyle(SpanStyle(background = Color.Green.copy(alpha = 0.3f))) - append("$currentName(...)") - pop() + buildString( + style = DiffStyles.INSERT, + text = "$currentName(...)", + builder = this + ) + return@buildAnnotatedString + } + + diffRows.forEach { row -> + val tag = row.tag!! + // The 'mergeOriginalRevised' flag changes the semantics of the data, but the API still returns + // the same components + val fullDiff = row.oldLine + + /* + Tag.INSERT and Tag.DELETE only happens when there is a difference in number of rows, i.e.: + Tag(["a"],["a","b"]) == INSERT + and + Tag(["a","b"],["a"]) == DELETE + but + Tag([""],["a"]) == CHANGE + */ + when (tag) { + Tag.CHANGE -> { + existsDiff = true + parseChangedDiff(fullDiff).forEach { (style, text) -> + buildString( + style = style, + text = text, + builder = this + ) + } + append("\n\n") + } + + Tag.INSERT -> { + existsDiff = true + buildString( + text = fullDiff.replace("++", ""), + style = DiffStyles.INSERT, + builder = this + ) + append("\n\n") + } + + Tag.DELETE -> { + existsDiff = true + buildString( + text = fullDiff.replace("--", ""), + style = DiffStyles.DELETE, + builder = this + ) + append("\n\n") + } + + Tag.EQUAL -> { + // NoOp + } + } + } + + if (!existsDiff) { + buildString( + style = DiffStyles.NO_CHANGE, + text = "No Diff", + builder = this + ) } + } +} + +/** + * Parses the full diff within Tag.CHANGED to give back a list of operations to perform + */ +private fun parseChangedDiff(fullDiff: String): List> { + val operations: MutableList> = mutableListOf() + var i = 0 + while (i < fullDiff.length) { + when { + fullDiff.startsWith("--", i) -> { + val end = fullDiff.indexOf("--", i + 2) + if (end != -1) { + val removed = fullDiff.substring(i + 2, end) + operations.add(DiffStyles.DELETE to removed) + i = end + 2 + } + } - /* - zip shortens both to the shortest one, so - a) if past > current, then we pushStyle(delete) for the rest of past - b) if current > past, then we pushStyle(add) for the rest of current - */ - // pastFields.zip(currentFields).forEach { (pastField, currentField) -> - // val diff = diffGenerator.generateDiffRows(pastField, currentField) - // val tag = diff[0] - // if (tag == DiffRow.Tag.CHANGE) { - // - // } - // } + fullDiff.startsWith("++", i) -> { + val end = fullDiff.indexOf("++", i + 2) + if (end != -1) { + val added = fullDiff.substring(i + 2, end) + operations.add(DiffStyles.INSERT to added) + i = end + 2 + } + } + + else -> { + val nextTagStart = listOf( + fullDiff.indexOf("--", i), + fullDiff.indexOf("++", i) + ).filter { it >= 0 }.minOrNull() ?: fullDiff.length + operations.add(DiffStyles.UNCHANGED to fullDiff.substring(i, nextTagStart)) + i = nextTagStart + } + } } + + return operations +} + +object DiffStyles { + val DELETE = SpanStyle(background = Color.Red.copy(alpha = 0.3f)) + val INSERT = SpanStyle(background = Color.Green.copy(alpha = 0.3f)) + val NO_CHANGE = SpanStyle(background = Color.LightGray) + val UNCHANGED = SpanStyle() +} + +internal fun buildString( + style: SpanStyle, + text: String, + builder: AnnotatedString.Builder +) { + builder.pushStyle(style) + builder.append(text) + builder.pop() } /** @@ -95,6 +206,7 @@ private fun getFieldsAsList(field: String): List { currentField.append(char) } } + else -> currentField.append(char) } i++ From 82eae8b60ba55ae25dfc998f79c6f68d79a30b1e Mon Sep 17 00:00:00 2001 From: Wenli Cai Date: Sat, 26 Jul 2025 14:11:24 -0400 Subject: [PATCH 17/33] Fix compose violations --- .../com/squareup/workflow1/traceviewer/App.kt | 2 +- .../workflow1/traceviewer/ui/WorkflowTree.kt | 3 +- .../workflow1/traceviewer/util/DiffUtils.kt | 33 ++++++++++--------- .../workflow1/traceviewer/util/FileDump.kt | 5 ++- 4 files changed, 21 insertions(+), 22 deletions(-) diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt index 8ac5bc0f2..855d701fb 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt @@ -34,7 +34,7 @@ internal fun App( ) { var selectedNode by remember { mutableStateOf(null) } var frameSize by remember { mutableIntStateOf(0) } - var rawRenderPass by remember { mutableStateOf("")} + var rawRenderPass by remember { mutableStateOf("") } var frameIndex by remember { mutableIntStateOf(0) } val sandboxState = remember { SandboxState() } diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt index 512b783bb..59f263da4 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt @@ -324,7 +324,7 @@ private fun DrawChildrenInGroups( } Column( - verticalArrangement = Arrangement.spacedBy(16.dp), // Increased spacing between sections + verticalArrangement = Arrangement.spacedBy(16.dp) ) { // Draw simple children in a grid at the top if (simpleChildren.isNotEmpty()) { @@ -349,7 +349,6 @@ private fun DrawChildrenInGroups( ) } } - } } diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/DiffUtils.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/DiffUtils.kt index 284f16e27..833d96ed9 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/DiffUtils.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/DiffUtils.kt @@ -6,6 +6,7 @@ import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.buildAnnotatedString import com.github.difflib.text.DiffRow.Tag import com.github.difflib.text.DiffRowGenerator +import com.squareup.workflow1.traceviewer.util.DiffStyles.buildStringWithStyle /** * Generates a field-level word-diff for each node's states. @@ -32,9 +33,9 @@ fun computeAnnotatedDiff( var existsDiff = false return buildAnnotatedString { // A full change in the type means all internal data will be changed, so it's easier to just - //generalize and show the diff in the type's name + // generalize and show the diff in the type's name if (pastName != currentName) { - buildString( + buildStringWithStyle( style = DiffStyles.DELETE, text = "$pastName(...)", builder = this @@ -43,7 +44,7 @@ fun computeAnnotatedDiff( // append("$pastName(...)") // pop() append(" → ") - buildString( + buildStringWithStyle( style = DiffStyles.INSERT, text = "$currentName(...)", builder = this @@ -69,7 +70,7 @@ fun computeAnnotatedDiff( Tag.CHANGE -> { existsDiff = true parseChangedDiff(fullDiff).forEach { (style, text) -> - buildString( + buildStringWithStyle( style = style, text = text, builder = this @@ -80,7 +81,7 @@ fun computeAnnotatedDiff( Tag.INSERT -> { existsDiff = true - buildString( + buildStringWithStyle( text = fullDiff.replace("++", ""), style = DiffStyles.INSERT, builder = this @@ -90,7 +91,7 @@ fun computeAnnotatedDiff( Tag.DELETE -> { existsDiff = true - buildString( + buildStringWithStyle( text = fullDiff.replace("--", ""), style = DiffStyles.DELETE, builder = this @@ -105,7 +106,7 @@ fun computeAnnotatedDiff( } if (!existsDiff) { - buildString( + buildStringWithStyle( style = DiffStyles.NO_CHANGE, text = "No Diff", builder = this @@ -159,16 +160,16 @@ object DiffStyles { val INSERT = SpanStyle(background = Color.Green.copy(alpha = 0.3f)) val NO_CHANGE = SpanStyle(background = Color.LightGray) val UNCHANGED = SpanStyle() -} -internal fun buildString( - style: SpanStyle, - text: String, - builder: AnnotatedString.Builder -) { - builder.pushStyle(style) - builder.append(text) - builder.pop() + fun buildStringWithStyle( + style: SpanStyle, + text: String, + builder: AnnotatedString.Builder + ) { + builder.pushStyle(style) + builder.append(text) + builder.pop() + } } /** diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/FileDump.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/FileDump.kt index bc1556c64..49f5e3432 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/FileDump.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/FileDump.kt @@ -22,10 +22,10 @@ import java.time.format.DateTimeFormatter @Composable internal fun FileDump( trace: String, - modifier: Modifier + modifier: Modifier = Modifier ) { var clicked by remember { mutableStateOf(false) } - Button ( + Button( modifier = modifier.padding(16.dp), shape = CircleShape, colors = buttonColors(Color.Black), @@ -59,4 +59,3 @@ private fun writeToFile(trace: String) { } } } - From 1e1da90359d9760ca1fbab0938455e8ce1252877 Mon Sep 17 00:00:00 2001 From: wenli-cai <213805610+wenli-cai@users.noreply.github.com> Date: Sat, 26 Jul 2025 18:33:39 +0000 Subject: [PATCH 18/33] Apply changes from dependencyGuardBaseline --refresh-dependencies Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- dependencies/classpath.txt | 229 +++++++++--------- .../dependencies/runtimeClasspath.txt | 10 +- .../dependencies/releaseRuntimeClasspath.txt | 10 +- .../dependencies/runtimeClasspath.txt | 10 +- .../dependencies/jsRuntimeClasspath.txt | 8 +- .../dependencies/jvmMainRuntimeClasspath.txt | 16 +- .../dependencies/jvmRuntimeClasspath.txt | 8 +- .../dependencies/runtimeClasspath.txt | 10 +- .../dependencies/releaseRuntimeClasspath.txt | 10 +- .../dependencies/jsRuntimeClasspath.txt | 8 +- .../dependencies/jvmMainRuntimeClasspath.txt | 31 ++- .../dependencies/jvmRuntimeClasspath.txt | 8 +- .../dependencies/runtimeClasspath.txt | 10 +- .../dependencies/runtimeClasspath.txt | 12 +- .../dependencies/runtimeClasspath.txt | 10 +- .../dependencies/releaseRuntimeClasspath.txt | 10 +- .../dependencies/releaseRuntimeClasspath.txt | 10 +- .../dependencies/releaseRuntimeClasspath.txt | 10 +- .../dependencies/runtimeClasspath.txt | 10 +- .../dependencies/releaseRuntimeClasspath.txt | 10 +- 20 files changed, 226 insertions(+), 214 deletions(-) diff --git a/dependencies/classpath.txt b/dependencies/classpath.txt index e3a47bd6a..dfa48113d 100644 --- a/dependencies/classpath.txt +++ b/dependencies/classpath.txt @@ -1,51 +1,50 @@ -androidx.databinding:databinding-common:8.8.0 -androidx.databinding:databinding-compiler-common:8.8.0 +androidx.databinding:databinding-common:8.11.0 +androidx.databinding:databinding-compiler-common:8.11.0 app.cash.burst:burst-gradle-plugin:2.1.0 app.cash.burst:burst-jvm:2.1.0 app.cash.burst:burst-kotlin-plugin:2.1.0 app.cash.burst:burst:2.1.0 -com.android.databinding:baseLibrary:8.8.0 -com.android.tools.analytics-library:crash:31.8.0 -com.android.tools.analytics-library:protos:31.8.0 -com.android.tools.analytics-library:shared:31.8.0 -com.android.tools.analytics-library:tracker:31.8.0 +com.android.databinding:baseLibrary:8.11.0 +com.android.tools.analytics-library:crash:31.11.0 +com.android.tools.analytics-library:protos:31.11.0 +com.android.tools.analytics-library:shared:31.11.0 +com.android.tools.analytics-library:tracker:31.11.0 com.android.tools.build.jetifier:jetifier-core:1.0.0-beta10 com.android.tools.build.jetifier:jetifier-processor:1.0.0-beta10 -com.android.tools.build:aapt2-proto:8.8.0-12006047 -com.android.tools.build:aaptcompiler:8.8.0 -com.android.tools.build:apksig:8.8.0 -com.android.tools.build:apkzlib:8.8.0 -com.android.tools.build:builder-model:8.8.0 -com.android.tools.build:builder-test-api:8.8.0 -com.android.tools.build:builder:8.8.0 -com.android.tools.build:bundletool:1.17.2 -com.android.tools.build:gradle-api:8.8.0 -com.android.tools.build:gradle-settings-api:8.8.0 -com.android.tools.build:gradle:8.8.0 -com.android.tools.build:manifest-merger:31.8.0 +com.android.tools.build:aapt2-proto:8.11.0-12782657 +com.android.tools.build:aaptcompiler:8.11.0 +com.android.tools.build:apksig:8.11.0 +com.android.tools.build:apkzlib:8.11.0 +com.android.tools.build:builder-model:8.11.0 +com.android.tools.build:builder-test-api:8.11.0 +com.android.tools.build:builder:8.11.0 +com.android.tools.build:bundletool:1.18.1 +com.android.tools.build:gradle-api:8.11.0 +com.android.tools.build:gradle-settings-api:8.11.0 +com.android.tools.build:gradle:8.11.0 +com.android.tools.build:manifest-merger:31.11.0 com.android.tools.build:transform-api:2.0.0-deprecated-use-gradle-api -com.android.tools.ddms:ddmlib:31.8.0 -com.android.tools.layoutlib:layoutlib-api:31.8.0 -com.android.tools.lint:lint-model:31.8.0 -com.android.tools.lint:lint-typedef-remover:31.8.0 -com.android.tools.utp:android-device-provider-ddmlib-proto:31.8.0 -com.android.tools.utp:android-device-provider-gradle-proto:31.8.0 -com.android.tools.utp:android-device-provider-profile-proto:31.8.0 -com.android.tools.utp:android-test-plugin-host-additional-test-output-proto:31.8.0 -com.android.tools.utp:android-test-plugin-host-apk-installer-proto:31.8.0 -com.android.tools.utp:android-test-plugin-host-coverage-proto:31.8.0 -com.android.tools.utp:android-test-plugin-host-emulator-control-proto:31.8.0 -com.android.tools.utp:android-test-plugin-host-logcat-proto:31.8.0 -com.android.tools.utp:android-test-plugin-host-retention-proto:31.8.0 -com.android.tools.utp:android-test-plugin-result-listener-gradle-proto:31.8.0 -com.android.tools:annotations:31.8.0 -com.android.tools:common:31.8.0 -com.android.tools:dvlib:31.8.0 -com.android.tools:repository:31.8.0 -com.android.tools:sdk-common:31.8.0 -com.android.tools:sdklib:31.8.0 -com.android:signflinger:8.8.0 -com.android:zipflinger:8.8.0 +com.android.tools.ddms:ddmlib:31.11.0 +com.android.tools.layoutlib:layoutlib-api:31.11.0 +com.android.tools.lint:lint-model:31.11.0 +com.android.tools.lint:lint-typedef-remover:31.11.0 +com.android.tools.utp:android-device-provider-ddmlib-proto:31.11.0 +com.android.tools.utp:android-device-provider-gradle-proto:31.11.0 +com.android.tools.utp:android-device-provider-profile-proto:31.11.0 +com.android.tools.utp:android-test-plugin-host-additional-test-output-proto:31.11.0 +com.android.tools.utp:android-test-plugin-host-apk-installer-proto:31.11.0 +com.android.tools.utp:android-test-plugin-host-coverage-proto:31.11.0 +com.android.tools.utp:android-test-plugin-host-emulator-control-proto:31.11.0 +com.android.tools.utp:android-test-plugin-host-logcat-proto:31.11.0 +com.android.tools.utp:android-test-plugin-result-listener-gradle-proto:31.11.0 +com.android.tools:annotations:31.11.0 +com.android.tools:common:31.11.0 +com.android.tools:dvlib:31.11.0 +com.android.tools:repository:31.11.0 +com.android.tools:sdk-common:31.11.0 +com.android.tools:sdklib:31.11.0 +com.android:signflinger:8.11.0 +com.android:zipflinger:8.11.0 com.dropbox.dependency-guard:dependency-guard:0.5.0 com.fasterxml.jackson.core:jackson-annotations:2.12.7 com.fasterxml.jackson.core:jackson-core:2.12.7 @@ -56,25 +55,25 @@ com.fasterxml.jackson.module:jackson-module-kotlin:2.12.7 com.fasterxml.jackson:jackson-bom:2.12.7 com.fasterxml.woodstox:woodstox-core:6.2.4 com.google.android:annotations:4.1.1.4 -com.google.api.grpc:proto-google-common-protos:2.17.0 +com.google.api.grpc:proto-google-common-protos:2.48.0 com.google.auto.value:auto-value-annotations:1.6.2 com.google.code.findbugs:jsr305:3.0.2 -com.google.code.gson:gson:2.10.1 +com.google.code.gson:gson:2.11.0 com.google.crypto.tink:tink:1.7.0 com.google.dagger:dagger:2.28.3 -com.google.devtools.ksp:symbol-processing-api:2.0.21-1.0.26 -com.google.devtools.ksp:symbol-processing-common-deps:2.0.21-1.0.26 -com.google.devtools.ksp:symbol-processing-gradle-plugin:2.0.21-1.0.26 -com.google.errorprone:error_prone_annotations:2.18.0 +com.google.devtools.ksp:symbol-processing-api:2.2.0-2.0.2 +com.google.devtools.ksp:symbol-processing-common-deps:2.2.0-2.0.2 +com.google.devtools.ksp:symbol-processing-gradle-plugin:2.2.0-2.0.2 +com.google.errorprone:error_prone_annotations:2.30.0 com.google.flatbuffers:flatbuffers-java:1.12.0 -com.google.guava:failureaccess:1.0.1 -com.google.guava:guava:32.0.1-jre +com.google.guava:failureaccess:1.0.2 +com.google.guava:guava:33.3.1-jre com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava -com.google.j2objc:j2objc-annotations:2.8 +com.google.j2objc:j2objc-annotations:3.0.0 com.google.jimfs:jimfs:1.1 -com.google.protobuf:protobuf-java-util:3.22.3 -com.google.protobuf:protobuf-java:3.22.3 -com.google.testing.platform:core-proto:0.0.9-alpha02 +com.google.protobuf:protobuf-java-util:3.25.5 +com.google.protobuf:protobuf-java:3.25.5 +com.google.testing.platform:core-proto:0.0.9-alpha03 com.googlecode.juniversalchardet:juniversalchardet:1.0.3 com.rickbusarow.kgx:kotlin-gradle-extensions:0.1.12 com.rickbusarow.kgx:names:0.1.12 @@ -97,28 +96,30 @@ com.vanniktech:central-portal:0.32.0 com.vanniktech:gradle-maven-publish-plugin:0.32.0 com.vanniktech:nexus:0.32.0 commons-codec:commons-codec:1.11 -commons-io:commons-io:2.13.0 +commons-io:commons-io:2.16.1 commons-logging:commons-logging:1.2 io.github.java-diff-utils:java-diff-utils:4.12 -io.grpc:grpc-api:1.57.0 -io.grpc:grpc-context:1.57.0 -io.grpc:grpc-core:1.57.0 -io.grpc:grpc-netty:1.57.0 -io.grpc:grpc-protobuf-lite:1.57.0 -io.grpc:grpc-protobuf:1.57.0 -io.grpc:grpc-stub:1.57.0 -io.netty:netty-buffer:4.1.93.Final -io.netty:netty-codec-http2:4.1.93.Final -io.netty:netty-codec-http:4.1.93.Final -io.netty:netty-codec-socks:4.1.93.Final -io.netty:netty-codec:4.1.93.Final -io.netty:netty-common:4.1.93.Final -io.netty:netty-handler-proxy:4.1.93.Final -io.netty:netty-handler:4.1.93.Final -io.netty:netty-resolver:4.1.93.Final -io.netty:netty-transport-native-unix-common:4.1.93.Final -io.netty:netty-transport:4.1.93.Final -io.perfmark:perfmark-api:0.26.0 +io.grpc:grpc-api:1.69.1 +io.grpc:grpc-context:1.69.1 +io.grpc:grpc-core:1.69.1 +io.grpc:grpc-inprocess:1.69.1 +io.grpc:grpc-netty:1.69.1 +io.grpc:grpc-protobuf-lite:1.69.1 +io.grpc:grpc-protobuf:1.69.1 +io.grpc:grpc-stub:1.69.1 +io.grpc:grpc-util:1.69.1 +io.netty:netty-buffer:4.1.110.Final +io.netty:netty-codec-http2:4.1.110.Final +io.netty:netty-codec-http:4.1.110.Final +io.netty:netty-codec-socks:4.1.110.Final +io.netty:netty-codec:4.1.110.Final +io.netty:netty-common:4.1.110.Final +io.netty:netty-handler-proxy:4.1.110.Final +io.netty:netty-handler:4.1.110.Final +io.netty:netty-resolver:4.1.110.Final +io.netty:netty-transport-native-unix-common:4.1.110.Final +io.netty:netty-transport:4.1.110.Final +io.perfmark:perfmark-api:0.27.0 jakarta.activation:jakarta.activation-api:1.2.1 jakarta.xml.bind:jakarta.xml.bind-api:2.3.2 javax.annotation:javax.annotation-api:1.3.2 @@ -132,11 +133,11 @@ org.apache.httpcomponents:httpclient:4.5.14 org.apache.httpcomponents:httpcore:4.4.16 org.apache.httpcomponents:httpmime:4.5.6 org.bitbucket.b_c:jose4j:0.9.5 -org.bouncycastle:bcpkix-jdk18on:1.77 -org.bouncycastle:bcprov-jdk18on:1.77 -org.bouncycastle:bcutil-jdk18on:1.77 -org.checkerframework:checker-qual:3.33.0 -org.codehaus.mojo:animal-sniffer-annotations:1.23 +org.bouncycastle:bcpkix-jdk18on:1.79 +org.bouncycastle:bcprov-jdk18on:1.79 +org.bouncycastle:bcutil-jdk18on:1.79 +org.checkerframework:checker-qual:3.43.0 +org.codehaus.mojo:animal-sniffer-annotations:1.24 org.codehaus.woodstox:stax2-api:4.2.1 org.glassfish.jaxb:jaxb-runtime:2.3.2 org.glassfish.jaxb:txw2:2.3.2 @@ -144,37 +145,37 @@ org.jdom:jdom2:2.0.6 org.jetbrains.dokka:dokka-core:2.0.0 org.jetbrains.dokka:dokka-gradle-plugin:2.0.0 org.jetbrains.dokka:org.jetbrains.dokka.gradle.plugin:2.0.0 -org.jetbrains.intellij.deps:trove4j:1.0.20200330 -org.jetbrains.kotlin.plugin.compose:org.jetbrains.kotlin.plugin.compose.gradle.plugin:2.0.21 -org.jetbrains.kotlin:compose-compiler-gradle-plugin:2.0.21 -org.jetbrains.kotlin:kotlin-bom:2.0.21 -org.jetbrains.kotlin:kotlin-build-statistics:2.0.21 -org.jetbrains.kotlin:kotlin-build-tools-api:2.0.21 -org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -org.jetbrains.kotlin:kotlin-compiler-runner:2.0.21 -org.jetbrains.kotlin:kotlin-daemon-client:2.0.21 -org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -org.jetbrains.kotlin:kotlin-gradle-plugin-annotations:2.0.21 -org.jetbrains.kotlin:kotlin-gradle-plugin-api:2.0.21 -org.jetbrains.kotlin:kotlin-gradle-plugin-idea-proto:2.0.21 -org.jetbrains.kotlin:kotlin-gradle-plugin-idea:2.0.21 -org.jetbrains.kotlin:kotlin-gradle-plugin-model:2.0.21 -org.jetbrains.kotlin:kotlin-gradle-plugin:2.0.21 -org.jetbrains.kotlin:kotlin-gradle-plugins-bom:2.0.21 -org.jetbrains.kotlin:kotlin-klib-commonizer-api:2.0.21 -org.jetbrains.kotlin:kotlin-native-utils:2.0.21 -org.jetbrains.kotlin:kotlin-reflect:2.0.20 -org.jetbrains.kotlin:kotlin-serialization:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib:2.0.20 -org.jetbrains.kotlin:kotlin-tooling-core:2.0.21 -org.jetbrains.kotlin:kotlin-util-io:2.0.21 -org.jetbrains.kotlin:kotlin-util-klib:2.0.21 +org.jetbrains.kotlin.plugin.compose:org.jetbrains.kotlin.plugin.compose.gradle.plugin:2.2.0 +org.jetbrains.kotlin:abi-tools-api:2.2.0 +org.jetbrains.kotlin:compose-compiler-gradle-plugin:2.2.0 +org.jetbrains.kotlin:fus-statistics-gradle-plugin:2.2.0 +org.jetbrains.kotlin:kotlin-bom:2.2.0 +org.jetbrains.kotlin:kotlin-build-statistics:2.2.0 +org.jetbrains.kotlin:kotlin-build-tools-api:2.2.0 +org.jetbrains.kotlin:kotlin-compiler-runner:2.2.0 +org.jetbrains.kotlin:kotlin-daemon-client:2.2.0 +org.jetbrains.kotlin:kotlin-gradle-plugin-annotations:2.2.0 +org.jetbrains.kotlin:kotlin-gradle-plugin-api:2.2.0 +org.jetbrains.kotlin:kotlin-gradle-plugin-idea-proto:2.2.0 +org.jetbrains.kotlin:kotlin-gradle-plugin-idea:2.2.0 +org.jetbrains.kotlin:kotlin-gradle-plugin-model:2.2.0 +org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.0 +org.jetbrains.kotlin:kotlin-gradle-plugins-bom:2.2.0 +org.jetbrains.kotlin:kotlin-klib-commonizer-api:2.2.0 +org.jetbrains.kotlin:kotlin-native-utils:2.2.0 +org.jetbrains.kotlin:kotlin-reflect:2.0.21 +org.jetbrains.kotlin:kotlin-serialization:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib:2.0.21 +org.jetbrains.kotlin:kotlin-tooling-core:2.2.0 +org.jetbrains.kotlin:kotlin-util-io:2.2.0 +org.jetbrains.kotlin:kotlin-util-klib-metadata:2.2.0 +org.jetbrains.kotlin:kotlin-util-klib:2.2.0 org.jetbrains.kotlinx:binary-compatibility-validator:0.17.0 -org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.7.3 -org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.7.3 -org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 +org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.8.0 +org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0 +org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0 org.jetbrains.kotlinx:kotlinx-serialization-bom:1.6.0 org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.6.0 org.jetbrains.kotlinx:kotlinx-serialization-core:1.6.0 @@ -182,10 +183,10 @@ org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.6.0 org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0 org.jetbrains:annotations:13.0 org.jvnet.staxex:stax-ex:1.8.1 -org.ow2.asm:asm-analysis:9.7 -org.ow2.asm:asm-commons:9.7 -org.ow2.asm:asm-tree:9.7 -org.ow2.asm:asm-util:9.7 -org.ow2.asm:asm:9.7 +org.ow2.asm:asm-analysis:9.7.1 +org.ow2.asm:asm-commons:9.7.1 +org.ow2.asm:asm-tree:9.7.1 +org.ow2.asm:asm-util:9.7.1 +org.ow2.asm:asm:9.7.1 org.slf4j:slf4j-api:1.7.30 -org.tensorflow:tensorflow-lite-metadata:0.1.0-rc2 +org.tensorflow:tensorflow-lite-metadata:0.2.0 diff --git a/trace-encoder/dependencies/runtimeClasspath.txt b/trace-encoder/dependencies/runtimeClasspath.txt index 2130c203c..01a327751 100644 --- a/trace-encoder/dependencies/runtimeClasspath.txt +++ b/trace-encoder/dependencies/runtimeClasspath.txt @@ -2,11 +2,11 @@ com.squareup.moshi:moshi-adapters:1.15.0 com.squareup.moshi:moshi:1.15.0 com.squareup.okio:okio-jvm:3.3.0 com.squareup.okio:okio:3.3.0 -org.jetbrains.kotlin:kotlin-bom:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-common:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib:2.0.21 +org.jetbrains.kotlin:kotlin-bom:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-common:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib:2.2.0 org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 diff --git a/workflow-config/config-android/dependencies/releaseRuntimeClasspath.txt b/workflow-config/config-android/dependencies/releaseRuntimeClasspath.txt index 7a1d19195..c6198373d 100644 --- a/workflow-config/config-android/dependencies/releaseRuntimeClasspath.txt +++ b/workflow-config/config-android/dependencies/releaseRuntimeClasspath.txt @@ -1,10 +1,10 @@ com.squareup.okio:okio-jvm:3.3.0 com.squareup.okio:okio:3.3.0 -org.jetbrains.kotlin:kotlin-bom:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-common:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib:2.0.21 +org.jetbrains.kotlin:kotlin-bom:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-common:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib:2.2.0 org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 diff --git a/workflow-config/config-jvm/dependencies/runtimeClasspath.txt b/workflow-config/config-jvm/dependencies/runtimeClasspath.txt index 7a1d19195..c6198373d 100644 --- a/workflow-config/config-jvm/dependencies/runtimeClasspath.txt +++ b/workflow-config/config-jvm/dependencies/runtimeClasspath.txt @@ -1,10 +1,10 @@ com.squareup.okio:okio-jvm:3.3.0 com.squareup.okio:okio:3.3.0 -org.jetbrains.kotlin:kotlin-bom:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-common:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib:2.0.21 +org.jetbrains.kotlin:kotlin-bom:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-common:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib:2.2.0 org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 diff --git a/workflow-core/dependencies/jsRuntimeClasspath.txt b/workflow-core/dependencies/jsRuntimeClasspath.txt index c2926679d..5bfd9d274 100644 --- a/workflow-core/dependencies/jsRuntimeClasspath.txt +++ b/workflow-core/dependencies/jsRuntimeClasspath.txt @@ -1,9 +1,9 @@ com.squareup.okio:okio-js:3.3.0 com.squareup.okio:okio:3.3.0 -org.jetbrains.kotlin:kotlin-bom:2.0.21 -org.jetbrains.kotlin:kotlin-dom-api-compat:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-js:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib:2.0.21 +org.jetbrains.kotlin:kotlin-bom:2.2.0 +org.jetbrains.kotlin:kotlin-dom-api-compat:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-js:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib:2.2.0 org.jetbrains.kotlin:kotlinx-atomicfu-runtime:2.0.0 org.jetbrains.kotlinx:atomicfu-js:0.25.0 org.jetbrains.kotlinx:kotlinx-coroutines-core-js:1.9.0 diff --git a/workflow-core/dependencies/jvmMainRuntimeClasspath.txt b/workflow-core/dependencies/jvmMainRuntimeClasspath.txt index 16c625fdd..c6198373d 100644 --- a/workflow-core/dependencies/jvmMainRuntimeClasspath.txt +++ b/workflow-core/dependencies/jvmMainRuntimeClasspath.txt @@ -1,11 +1,11 @@ com.squareup.okio:okio-jvm:3.3.0 com.squareup.okio:okio:3.3.0 -org.jetbrains.kotlin:kotlin-bom:2.1.21 -org.jetbrains.kotlin:kotlin-stdlib-common:2.1.21 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.1.21 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.1.21 -org.jetbrains.kotlin:kotlin-stdlib:2.1.21 -org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.7.3 -org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.7.3 -org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 +org.jetbrains.kotlin:kotlin-bom:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-common:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib:2.2.0 +org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0 +org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0 +org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 org.jetbrains:annotations:23.0.0 diff --git a/workflow-core/dependencies/jvmRuntimeClasspath.txt b/workflow-core/dependencies/jvmRuntimeClasspath.txt index 01b1b013e..a5879029f 100644 --- a/workflow-core/dependencies/jvmRuntimeClasspath.txt +++ b/workflow-core/dependencies/jvmRuntimeClasspath.txt @@ -1,9 +1,9 @@ com.squareup.okio:okio-jvm:3.3.0 com.squareup.okio:okio:3.3.0 -org.jetbrains.kotlin:kotlin-bom:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib:2.0.21 +org.jetbrains.kotlin:kotlin-bom:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib:2.2.0 org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 diff --git a/workflow-core/dependencies/runtimeClasspath.txt b/workflow-core/dependencies/runtimeClasspath.txt index 7a1d19195..c6198373d 100644 --- a/workflow-core/dependencies/runtimeClasspath.txt +++ b/workflow-core/dependencies/runtimeClasspath.txt @@ -1,10 +1,10 @@ com.squareup.okio:okio-jvm:3.3.0 com.squareup.okio:okio:3.3.0 -org.jetbrains.kotlin:kotlin-bom:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-common:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib:2.0.21 +org.jetbrains.kotlin:kotlin-bom:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-common:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib:2.2.0 org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 diff --git a/workflow-runtime-android/dependencies/releaseRuntimeClasspath.txt b/workflow-runtime-android/dependencies/releaseRuntimeClasspath.txt index 5cd2a49ba..68b6d507b 100644 --- a/workflow-runtime-android/dependencies/releaseRuntimeClasspath.txt +++ b/workflow-runtime-android/dependencies/releaseRuntimeClasspath.txt @@ -22,11 +22,11 @@ androidx.versionedparcelable:versionedparcelable:1.1.0 com.google.guava:listenablefuture:1.0 com.squareup.okio:okio-jvm:3.3.0 com.squareup.okio:okio:3.3.0 -org.jetbrains.kotlin:kotlin-bom:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-common:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib:2.0.21 +org.jetbrains.kotlin:kotlin-bom:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-common:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib:2.2.0 org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0 diff --git a/workflow-runtime/dependencies/jsRuntimeClasspath.txt b/workflow-runtime/dependencies/jsRuntimeClasspath.txt index c2926679d..5bfd9d274 100644 --- a/workflow-runtime/dependencies/jsRuntimeClasspath.txt +++ b/workflow-runtime/dependencies/jsRuntimeClasspath.txt @@ -1,9 +1,9 @@ com.squareup.okio:okio-js:3.3.0 com.squareup.okio:okio:3.3.0 -org.jetbrains.kotlin:kotlin-bom:2.0.21 -org.jetbrains.kotlin:kotlin-dom-api-compat:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-js:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib:2.0.21 +org.jetbrains.kotlin:kotlin-bom:2.2.0 +org.jetbrains.kotlin:kotlin-dom-api-compat:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-js:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib:2.2.0 org.jetbrains.kotlin:kotlinx-atomicfu-runtime:2.0.0 org.jetbrains.kotlinx:atomicfu-js:0.25.0 org.jetbrains.kotlinx:kotlinx-coroutines-core-js:1.9.0 diff --git a/workflow-runtime/dependencies/jvmMainRuntimeClasspath.txt b/workflow-runtime/dependencies/jvmMainRuntimeClasspath.txt index 16c625fdd..4edfcd59d 100644 --- a/workflow-runtime/dependencies/jvmMainRuntimeClasspath.txt +++ b/workflow-runtime/dependencies/jvmMainRuntimeClasspath.txt @@ -1,11 +1,22 @@ -com.squareup.okio:okio-jvm:3.3.0 -com.squareup.okio:okio:3.3.0 -org.jetbrains.kotlin:kotlin-bom:2.1.21 -org.jetbrains.kotlin:kotlin-stdlib-common:2.1.21 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.1.21 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.1.21 -org.jetbrains.kotlin:kotlin-stdlib:2.1.21 -org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.7.3 -org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.7.3 -org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 +com.fasterxml.jackson.core:jackson-annotations:2.12.7 +com.fasterxml.jackson.core:jackson-core:2.12.7 +com.fasterxml.jackson.core:jackson-databind:2.12.7.1 +com.fasterxml.jackson.module:jackson-module-kotlin:2.12.7 +com.fasterxml.jackson:jackson-bom:2.12.7 +org.freemarker:freemarker:2.3.32 +org.jetbrains.dokka:all-modules-page-plugin:2.0.0 +org.jetbrains.dokka:analysis-markdown:2.0.0 +org.jetbrains.dokka:dokka-base:2.0.0 +org.jetbrains.dokka:templating-plugin:2.0.0 +org.jetbrains.kotlin:kotlin-bom:2.2.0 +org.jetbrains.kotlin:kotlin-reflect:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-common:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib:2.2.0 +org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0 +org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0 +org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 +org.jetbrains.kotlinx:kotlinx-html-jvm:0.9.1 org.jetbrains:annotations:23.0.0 +org.jetbrains:markdown-jvm:0.7.3 +org.jetbrains:markdown:0.7.3 +org.jsoup:jsoup:1.16.1 diff --git a/workflow-runtime/dependencies/jvmRuntimeClasspath.txt b/workflow-runtime/dependencies/jvmRuntimeClasspath.txt index 01b1b013e..a5879029f 100644 --- a/workflow-runtime/dependencies/jvmRuntimeClasspath.txt +++ b/workflow-runtime/dependencies/jvmRuntimeClasspath.txt @@ -1,9 +1,9 @@ com.squareup.okio:okio-jvm:3.3.0 com.squareup.okio:okio:3.3.0 -org.jetbrains.kotlin:kotlin-bom:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib:2.0.21 +org.jetbrains.kotlin:kotlin-bom:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib:2.2.0 org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 diff --git a/workflow-rx2/dependencies/runtimeClasspath.txt b/workflow-rx2/dependencies/runtimeClasspath.txt index afea7c6d1..1991351fa 100644 --- a/workflow-rx2/dependencies/runtimeClasspath.txt +++ b/workflow-rx2/dependencies/runtimeClasspath.txt @@ -1,11 +1,11 @@ com.squareup.okio:okio-jvm:3.3.0 com.squareup.okio:okio:3.3.0 io.reactivex.rxjava2:rxjava:2.2.21 -org.jetbrains.kotlin:kotlin-bom:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-common:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib:2.0.21 +org.jetbrains.kotlin:kotlin-bom:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-common:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib:2.2.0 org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 diff --git a/workflow-testing/dependencies/runtimeClasspath.txt b/workflow-testing/dependencies/runtimeClasspath.txt index 8f7fe8560..8e8df0440 100644 --- a/workflow-testing/dependencies/runtimeClasspath.txt +++ b/workflow-testing/dependencies/runtimeClasspath.txt @@ -2,12 +2,12 @@ app.cash.turbine:turbine-jvm:1.0.0 app.cash.turbine:turbine:1.0.0 com.squareup.okio:okio-jvm:3.3.0 com.squareup.okio:okio:3.3.0 -org.jetbrains.kotlin:kotlin-bom:2.0.21 -org.jetbrains.kotlin:kotlin-reflect:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-common:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib:2.0.21 +org.jetbrains.kotlin:kotlin-bom:2.2.0 +org.jetbrains.kotlin:kotlin-reflect:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-common:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib:2.2.0 org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 diff --git a/workflow-tracing/dependencies/runtimeClasspath.txt b/workflow-tracing/dependencies/runtimeClasspath.txt index 2130c203c..01a327751 100644 --- a/workflow-tracing/dependencies/runtimeClasspath.txt +++ b/workflow-tracing/dependencies/runtimeClasspath.txt @@ -2,11 +2,11 @@ com.squareup.moshi:moshi-adapters:1.15.0 com.squareup.moshi:moshi:1.15.0 com.squareup.okio:okio-jvm:3.3.0 com.squareup.okio:okio:3.3.0 -org.jetbrains.kotlin:kotlin-bom:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-common:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib:2.0.21 +org.jetbrains.kotlin:kotlin-bom:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-common:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib:2.2.0 org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 diff --git a/workflow-ui/compose-tooling/dependencies/releaseRuntimeClasspath.txt b/workflow-ui/compose-tooling/dependencies/releaseRuntimeClasspath.txt index 89513b485..b9e6239b9 100644 --- a/workflow-ui/compose-tooling/dependencies/releaseRuntimeClasspath.txt +++ b/workflow-ui/compose-tooling/dependencies/releaseRuntimeClasspath.txt @@ -76,11 +76,11 @@ androidx.versionedparcelable:versionedparcelable:1.1.1 com.google.guava:listenablefuture:1.0 com.squareup.okio:okio-jvm:3.3.0 com.squareup.okio:okio:3.3.0 -org.jetbrains.kotlin:kotlin-bom:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-common:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib:2.0.21 +org.jetbrains.kotlin:kotlin-bom:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-common:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib:2.2.0 org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0 diff --git a/workflow-ui/compose/dependencies/releaseRuntimeClasspath.txt b/workflow-ui/compose/dependencies/releaseRuntimeClasspath.txt index ea346c60c..7dc9e7a5c 100644 --- a/workflow-ui/compose/dependencies/releaseRuntimeClasspath.txt +++ b/workflow-ui/compose/dependencies/releaseRuntimeClasspath.txt @@ -70,11 +70,11 @@ androidx.versionedparcelable:versionedparcelable:1.1.1 com.google.guava:listenablefuture:1.0 com.squareup.okio:okio-jvm:3.3.0 com.squareup.okio:okio:3.3.0 -org.jetbrains.kotlin:kotlin-bom:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-common:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib:2.0.21 +org.jetbrains.kotlin:kotlin-bom:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-common:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib:2.2.0 org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0 diff --git a/workflow-ui/core-android/dependencies/releaseRuntimeClasspath.txt b/workflow-ui/core-android/dependencies/releaseRuntimeClasspath.txt index 6d35207fe..080ebf17f 100644 --- a/workflow-ui/core-android/dependencies/releaseRuntimeClasspath.txt +++ b/workflow-ui/core-android/dependencies/releaseRuntimeClasspath.txt @@ -36,11 +36,11 @@ androidx.versionedparcelable:versionedparcelable:1.1.1 com.google.guava:listenablefuture:1.0 com.squareup.okio:okio-jvm:3.3.0 com.squareup.okio:okio:3.3.0 -org.jetbrains.kotlin:kotlin-bom:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-common:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib:2.0.21 +org.jetbrains.kotlin:kotlin-bom:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-common:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib:2.2.0 org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0 diff --git a/workflow-ui/core-common/dependencies/runtimeClasspath.txt b/workflow-ui/core-common/dependencies/runtimeClasspath.txt index 7a1d19195..c6198373d 100644 --- a/workflow-ui/core-common/dependencies/runtimeClasspath.txt +++ b/workflow-ui/core-common/dependencies/runtimeClasspath.txt @@ -1,10 +1,10 @@ com.squareup.okio:okio-jvm:3.3.0 com.squareup.okio:okio:3.3.0 -org.jetbrains.kotlin:kotlin-bom:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-common:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib:2.0.21 +org.jetbrains.kotlin:kotlin-bom:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-common:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib:2.2.0 org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 diff --git a/workflow-ui/radiography/dependencies/releaseRuntimeClasspath.txt b/workflow-ui/radiography/dependencies/releaseRuntimeClasspath.txt index be930540d..375491ff8 100644 --- a/workflow-ui/radiography/dependencies/releaseRuntimeClasspath.txt +++ b/workflow-ui/radiography/dependencies/releaseRuntimeClasspath.txt @@ -38,11 +38,11 @@ com.squareup.curtains:curtains:1.2.2 com.squareup.okio:okio-jvm:3.3.0 com.squareup.okio:okio:3.3.0 com.squareup.radiography:radiography:2.4.1 -org.jetbrains.kotlin:kotlin-bom:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-common:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -org.jetbrains.kotlin:kotlin-stdlib:2.0.21 +org.jetbrains.kotlin:kotlin-bom:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-common:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.0 +org.jetbrains.kotlin:kotlin-stdlib:2.2.0 org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0 From 8fbeab448a4f50e9cdc17ef4712199063b1a2a1f Mon Sep 17 00:00:00 2001 From: "workflow-pr-fixer[bot]" <216782701+workflow-pr-fixer[bot]@users.noreply.github.com> Date: Sat, 26 Jul 2025 18:38:10 +0000 Subject: [PATCH 19/33] Apply changes from artifactsDump Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- artifacts.json | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/artifacts.json b/artifacts.json index 438a6826a..1bbf3abdc 100644 --- a/artifacts.json +++ b/artifacts.json @@ -5,7 +5,7 @@ "artifactId": "trace-encoder", "description": "Trace Encoder", "packaging": "jar", - "javaVersion": 8, + "javaVersion": 11, "publicationName": "maven" }, { @@ -14,7 +14,7 @@ "artifactId": "workflow-core-iosarm64", "description": "Workflow Core", "packaging": "klib", - "javaVersion": 8, + "javaVersion": 11, "publicationName": "iosArm64" }, { @@ -23,7 +23,7 @@ "artifactId": "workflow-core-iossimulatorarm64", "description": "Workflow Core", "packaging": "klib", - "javaVersion": 8, + "javaVersion": 11, "publicationName": "iosSimulatorArm64" }, { @@ -32,7 +32,7 @@ "artifactId": "workflow-core-iosx64", "description": "Workflow Core", "packaging": "klib", - "javaVersion": 8, + "javaVersion": 11, "publicationName": "iosX64" }, { @@ -41,7 +41,7 @@ "artifactId": "workflow-core-js", "description": "Workflow Core", "packaging": "klib", - "javaVersion": 8, + "javaVersion": 11, "publicationName": "js" }, { @@ -50,7 +50,7 @@ "artifactId": "workflow-core-jvm", "description": "Workflow Core", "packaging": "jar", - "javaVersion": 8, + "javaVersion": 11, "publicationName": "jvm" }, { @@ -59,7 +59,7 @@ "artifactId": "workflow-core", "description": "Workflow Core", "packaging": "jar", - "javaVersion": 8, + "javaVersion": 11, "publicationName": "kotlinMultiplatform" }, { @@ -68,7 +68,7 @@ "artifactId": "workflow-runtime-iosarm64", "description": "Workflow Runtime", "packaging": "klib", - "javaVersion": 8, + "javaVersion": 11, "publicationName": "iosArm64" }, { @@ -77,7 +77,7 @@ "artifactId": "workflow-runtime-iossimulatorarm64", "description": "Workflow Runtime", "packaging": "klib", - "javaVersion": 8, + "javaVersion": 11, "publicationName": "iosSimulatorArm64" }, { @@ -86,7 +86,7 @@ "artifactId": "workflow-runtime-iosx64", "description": "Workflow Runtime", "packaging": "klib", - "javaVersion": 8, + "javaVersion": 11, "publicationName": "iosX64" }, { @@ -95,7 +95,7 @@ "artifactId": "workflow-runtime-js", "description": "Workflow Runtime", "packaging": "klib", - "javaVersion": 8, + "javaVersion": 11, "publicationName": "js" }, { @@ -104,7 +104,7 @@ "artifactId": "workflow-runtime-jvm", "description": "Workflow Runtime", "packaging": "jar", - "javaVersion": 8, + "javaVersion": 11, "publicationName": "jvm" }, { @@ -113,7 +113,7 @@ "artifactId": "workflow-runtime", "description": "Workflow Runtime", "packaging": "jar", - "javaVersion": 8, + "javaVersion": 11, "publicationName": "kotlinMultiplatform" }, { @@ -122,7 +122,7 @@ "artifactId": "workflow-runtime-android", "description": "Workflow Runtime Android", "packaging": "aar", - "javaVersion": 8, + "javaVersion": 11, "publicationName": "maven" }, { @@ -131,7 +131,7 @@ "artifactId": "workflow-rx2", "description": "Workflow RxJava2", "packaging": "jar", - "javaVersion": 8, + "javaVersion": 11, "publicationName": "maven" }, { @@ -140,7 +140,7 @@ "artifactId": "workflow-testing-jvm", "description": "Workflow Testing", "packaging": "jar", - "javaVersion": 8, + "javaVersion": 11, "publicationName": "maven" }, { @@ -149,7 +149,7 @@ "artifactId": "workflow-tracing", "description": "Workflow Tracing", "packaging": "jar", - "javaVersion": 8, + "javaVersion": 11, "publicationName": "maven" }, { @@ -158,7 +158,7 @@ "artifactId": "workflow-config-android", "description": "Workflow Runtime Android Configuration", "packaging": "aar", - "javaVersion": 8, + "javaVersion": 11, "publicationName": "maven" }, { @@ -167,7 +167,7 @@ "artifactId": "workflow-config-jvm", "description": "Workflow Runtime JVM Configuration", "packaging": "jar", - "javaVersion": 8, + "javaVersion": 11, "publicationName": "maven" }, { @@ -176,7 +176,7 @@ "artifactId": "workflow-ui-compose", "description": "Workflow UI Compose", "packaging": "aar", - "javaVersion": 8, + "javaVersion": 11, "publicationName": "maven" }, { @@ -185,7 +185,7 @@ "artifactId": "workflow-ui-compose-tooling", "description": "Workflow UI Compose Tooling", "packaging": "aar", - "javaVersion": 8, + "javaVersion": 11, "publicationName": "maven" }, { @@ -194,7 +194,7 @@ "artifactId": "workflow-ui-core-android", "description": "Workflow UI Android", "packaging": "aar", - "javaVersion": 8, + "javaVersion": 11, "publicationName": "maven" }, { @@ -203,7 +203,7 @@ "artifactId": "workflow-ui-core-common-jvm", "description": "Workflow UI Core", "packaging": "jar", - "javaVersion": 8, + "javaVersion": 11, "publicationName": "maven" }, { @@ -212,7 +212,7 @@ "artifactId": "workflow-ui-radiography", "description": "Workflow UI Radiography Support", "packaging": "aar", - "javaVersion": 8, + "javaVersion": 11, "publicationName": "maven" } ] \ No newline at end of file From a50f9a5f94ae3a92b435989c6561b1c2b4045cd8 Mon Sep 17 00:00:00 2001 From: Wenli Cai Date: Sat, 26 Jul 2025 14:41:10 -0400 Subject: [PATCH 20/33] Fix merge bugs --- .../com/squareup/workflow1/traceviewer/App.kt | 1 + .../workflow1/traceviewer/ui/WorkflowTree.kt | 2 ++ .../workflow1/traceviewer/util/TraceParser.kt | 21 ++++++++++++------- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt index 7c35f3da5..816c388a6 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt @@ -38,6 +38,7 @@ internal fun App( val sandboxState = remember { SandboxState() } // Default to File mode, and can be toggled to be in Live mode. + var active by remember { mutableStateOf(false) } var traceMode by remember { mutableStateOf(TraceMode.File(null)) } var selectedTraceFile by remember { mutableStateOf(null) } diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt index c6f37eacd..ac1c675f0 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt @@ -22,7 +22,9 @@ import androidx.compose.ui.input.pointer.isPrimaryPressed import androidx.compose.ui.input.pointer.isSecondaryPressed import androidx.compose.ui.input.pointer.onPointerEvent import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp import com.squareup.workflow1.traceviewer.model.Node +import com.squareup.workflow1.traceviewer.model.NodeUpdate /** * Since the workflow nodes present a tree structure, we utilize a recursive function to draw the tree diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/TraceParser.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/TraceParser.kt index 55d5d00c5..5ddff3629 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/TraceParser.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/TraceParser.kt @@ -13,6 +13,7 @@ import androidx.compose.ui.Modifier import com.squareup.moshi.JsonAdapter import com.squareup.workflow1.traceviewer.TraceMode import com.squareup.workflow1.traceviewer.model.Node +import com.squareup.workflow1.traceviewer.model.NodeUpdate import com.squareup.workflow1.traceviewer.ui.DrawTree /** @@ -25,16 +26,17 @@ import com.squareup.workflow1.traceviewer.ui.DrawTree internal fun RenderTrace( traceSource: TraceMode, frameInd: Int, - onFileParse: (List) -> Unit, - onNodeSelect: (Node, Node?) -> Unit, + onFileParse: (Int) -> Unit, + onNodeSelect: (NodeUpdate) -> Unit, onNewFrame: () -> Unit, + onNewData: (String) -> Unit, modifier: Modifier = Modifier ) { var isLoading by remember(traceSource) { mutableStateOf(true) } var error by remember(traceSource) { mutableStateOf(null) } - val frames = remember { mutableStateListOf() } - val fullTree = remember { mutableStateListOf() } - val affectedNodes = remember { mutableStateListOf>() } + val frames = remember (traceSource){ mutableStateListOf() } + val fullTree = remember (traceSource){ mutableStateListOf() } + val affectedNodes = remember (traceSource){ mutableStateListOf>() } // Updates current state with the new data from trace source. fun addToStates(frame: List, tree: List, affected: List>) { @@ -42,13 +44,14 @@ internal fun RenderTrace( fullTree.addAll(tree) affectedNodes.addAll(affected) isLoading = false - onFileParse(frame) + onFileParse(frame.size) } // Handles the result of parsing a trace, either from file or live. Live mode includes callback // for when a new frame is received. fun handleParseResult( parseResult: ParseResult, + rawRenderPass: String? = null, onNewFrame: (() -> Unit)? = null ) { when (parseResult) { @@ -62,7 +65,9 @@ internal fun RenderTrace( tree = parseResult.trees, affected = parseResult.affectedNodes ) + // Only increment the frame index and add the raw data during Live tracing mode onNewFrame?.invoke() + rawRenderPass?.let { onNewData(it) } } } } @@ -82,7 +87,7 @@ internal fun RenderTrace( streamRenderPassesFromDevice { renderPass -> val currentTree = fullTree.lastOrNull() val parseResult = parseLiveTrace(renderPass, adapter, currentTree) - handleParseResult(parseResult, onNewFrame) + handleParseResult(parseResult, renderPass, onNewFrame) } error = "Socket has already been closed or is not available." } @@ -98,7 +103,7 @@ internal fun RenderTrace( val previousFrame = if (frameInd > 0) fullTree[frameInd - 1] else null DrawTree( node = fullTree[frameInd], - previousNode = previousFrame, + previousFrameNode = previousFrame, affectedNodes = affectedNodes[frameInd], expandedNodes = remember(frameInd) { mutableStateMapOf() }, onNodeSelect = onNodeSelect, From c4fe05ee2f21016ef9ac2435ab620ec6b1f083a0 Mon Sep 17 00:00:00 2001 From: Wenli Cai Date: Sat, 26 Jul 2025 15:25:03 -0400 Subject: [PATCH 21/33] Allow device selection --- .../com/squareup/workflow1/traceviewer/App.kt | 39 ++++++++++-- .../traceviewer/ui/DisplayDevices.kt | 60 +++++++++++++++++++ .../traceviewer/util/SocketClient.kt | 13 ++-- .../workflow1/traceviewer/util/TraceParser.kt | 11 ++-- 4 files changed, 107 insertions(+), 16 deletions(-) create mode 100644 workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/DisplayDevices.kt diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt index 816c388a6..26587f2a0 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt @@ -15,6 +15,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Offset import com.squareup.workflow1.traceviewer.model.NodeUpdate import com.squareup.workflow1.traceviewer.ui.ColorLegend +import com.squareup.workflow1.traceviewer.ui.DisplayDevices import com.squareup.workflow1.traceviewer.ui.FrameSelectTab import com.squareup.workflow1.traceviewer.ui.RightInfoPanel import com.squareup.workflow1.traceviewer.ui.TraceModeToggleSwitch @@ -63,8 +64,9 @@ internal fun App( sandboxState = sandboxState, ) { // if there is not a file selected and trace mode is live, then don't render anything. - val readyForFileTrace = traceMode is TraceMode.File && selectedTraceFile != null - val readyForLiveTrace = traceMode is TraceMode.Live + val readyForFileTrace = validateFileMode(traceMode) + val readyForLiveTrace = validateLiveMode(traceMode) + if (readyForFileTrace || readyForLiveTrace) { active = true RenderTrace( @@ -92,13 +94,12 @@ internal fun App( frameIndex = 0 TraceMode.File(null) } else { - // TODO: TraceRecorder needs to be able to take in multiple clients if this is the case /* We set the frame to -1 here since we always increment it during Live mode as the list of frames get populated, so we avoid off by one when indexing into the frames. */ frameIndex = -1 - TraceMode.Live + TraceMode.Live() } }, traceMode = traceMode, @@ -118,6 +119,16 @@ internal fun App( } if (traceMode is TraceMode.Live) { + if ((traceMode as TraceMode.Live).device == null) { + DisplayDevices( + onDeviceSelected = { selectedDevice -> + traceMode = TraceMode.Live(selectedDevice) + }, + devices = listDevices(), + modifier = Modifier.align(Alignment.Center) + ) + } + FileDump( trace = rawRenderPass, modifier = Modifier.align(Alignment.BottomStart) @@ -149,5 +160,23 @@ internal class SandboxState { internal sealed interface TraceMode { data class File(val file: PlatformFile?) : TraceMode - data object Live : TraceMode + data class Live(val device: String? = null) : TraceMode +} + +/** + * Allows users to select from multiple devices that are currently running. + */ +internal fun listDevices(): List { + val process = ProcessBuilder("adb", "devices", "-l").start() + process.waitFor() + // We drop the header "List of devices attached" + return process.inputStream.bufferedReader().readLines().drop(1).dropLast(1) +} + +internal fun validateLiveMode(traceMode: TraceMode): Boolean { + return traceMode is TraceMode.Live && traceMode.device != null +} + +internal fun validateFileMode(traceMode: TraceMode): Boolean { + return traceMode is TraceMode.File && traceMode.file != null } diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/DisplayDevices.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/DisplayDevices.kt new file mode 100644 index 000000000..2183eeec7 --- /dev/null +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/DisplayDevices.kt @@ -0,0 +1,60 @@ +package com.squareup.workflow1.traceviewer.ui + +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.Card +import androidx.compose.material.ExperimentalMaterialApi +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp + +@OptIn(ExperimentalMaterialApi::class) +@Composable +internal fun DisplayDevices( + onDeviceSelected: (String) -> Unit, + devices: List, + modifier: Modifier = Modifier, +) { + Box( + modifier = modifier + .fillMaxWidth(), + contentAlignment = Alignment.Center + ) { + if (devices.isEmpty()) { + Text( + text = "No device available", + modifier = Modifier.align(Alignment.Center) + ) + return@Box + } + + val emulatorRegex = Regex("""\bemulator-\d+\b""") + Column { + devices.forEach { device -> + Card( + onClick = { + emulatorRegex.find(device)?.value?.let { emulator -> + onDeviceSelected(emulator) + } + }, + shape = RoundedCornerShape(16.dp), + border = BorderStroke(1.dp, Color.Gray), + modifier = Modifier.padding(4.dp), + elevation = 2.dp + ) { + Text( + text = device, + modifier = Modifier.padding(horizontal = 16.dp, vertical = 8.dp) + ) + } + } + } + } +} diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/SocketClient.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/SocketClient.kt index a20cd0cb7..a5755764a 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/SocketClient.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/SocketClient.kt @@ -11,12 +11,12 @@ import kotlinx.coroutines.withContext import okio.IOException import java.net.Socket -internal suspend fun streamRenderPassesFromDevice(parseOnNewRenderPass: (String) -> Unit) { +internal suspend fun streamRenderPassesFromDevice(device: String, parseOnNewRenderPass: (String) -> Unit) { val renderPassChannel: Channel = Channel(Channel.BUFFERED) coroutineScope { launch { try { - pollSocket(onNewRenderPass = renderPassChannel::send) + pollSocket(device = device, onNewRenderPass = renderPassChannel::send) } finally { renderPassChannel.close() } @@ -39,10 +39,10 @@ internal suspend fun streamRenderPassesFromDevice(parseOnNewRenderPass: (String) * @param onNewRenderPass is called from an arbitrary thread, so it is important to ensure that the * caller is thread safe */ -private suspend fun pollSocket(onNewRenderPass: suspend (String) -> Unit) { +private suspend fun pollSocket(device: String, onNewRenderPass: suspend (String) -> Unit) { withContext(Dispatchers.IO) { try { - runForwardingPortThroughAdb { port -> + runForwardingPortThroughAdb(device) { port -> Socket("localhost", port).useWithCancellation { socket -> val reader = socket.getInputStream().bufferedReader() do { @@ -60,7 +60,6 @@ private suspend fun pollSocket(onNewRenderPass: suspend (String) -> Unit) { } } - /** * Force [pollSocket] to exit with exception if the coroutine is cancelled. See comment below. */ @@ -89,9 +88,9 @@ private suspend fun Socket.useWithCancellation(block: suspend (Socket) -> Unit) * If block throws or returns on finish, the port forwarding is removed via adb (best effort). */ @Suppress("BlockingMethodInNonBlockingContext") -private suspend inline fun runForwardingPortThroughAdb(block: (port: Int) -> Unit) { +private suspend inline fun runForwardingPortThroughAdb(device: String, block: (port: Int) -> Unit) { val process = ProcessBuilder( - "adb", "forward", "tcp:0", "localabstract:workflow-trace" + "adb", "-s", device, "forward", "tcp:0", "localabstract:workflow-trace" ).start() // The adb forward command will output the port number it picks to connect. diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/TraceParser.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/TraceParser.kt index 5ddff3629..ec9041fb3 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/TraceParser.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/TraceParser.kt @@ -34,9 +34,9 @@ internal fun RenderTrace( ) { var isLoading by remember(traceSource) { mutableStateOf(true) } var error by remember(traceSource) { mutableStateOf(null) } - val frames = remember (traceSource){ mutableStateListOf() } - val fullTree = remember (traceSource){ mutableStateListOf() } - val affectedNodes = remember (traceSource){ mutableStateListOf>() } + val frames = remember(traceSource) { mutableStateListOf() } + val fullTree = remember(traceSource) { mutableStateListOf() } + val affectedNodes = remember(traceSource) { mutableStateListOf>() } // Updates current state with the new data from trace source. fun addToStates(frame: List, tree: List, affected: List>) { @@ -83,8 +83,11 @@ internal fun RenderTrace( } is TraceMode.Live -> { + checkNotNull(traceSource.device) { + "TraceMode.Live requires a selected device" + } val adapter: JsonAdapter> = createMoshiAdapter() - streamRenderPassesFromDevice { renderPass -> + streamRenderPassesFromDevice(traceSource.device) { renderPass -> val currentTree = fullTree.lastOrNull() val parseResult = parseLiveTrace(renderPass, adapter, currentTree) handleParseResult(parseResult, renderPass, onNewFrame) From 6687f049e649520adb3cd398c5ee1d7710fcab9b Mon Sep 17 00:00:00 2001 From: Wenli Cai Date: Sat, 26 Jul 2025 15:37:18 -0400 Subject: [PATCH 22/33] Manual api dump --- .../api/workflow-trace-viewer.api | 41 +++++++++++++++---- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/workflow-trace-viewer/api/workflow-trace-viewer.api b/workflow-trace-viewer/api/workflow-trace-viewer.api index 377827f5c..b11c100d5 100644 --- a/workflow-trace-viewer/api/workflow-trace-viewer.api +++ b/workflow-trace-viewer/api/workflow-trace-viewer.api @@ -1,8 +1,7 @@ public final class com/squareup/workflow1/traceviewer/ComposableSingletons$MainKt { public static final field INSTANCE Lcom/squareup/workflow1/traceviewer/ComposableSingletons$MainKt; - public static field lambda-1 Lkotlin/jvm/functions/Function3; public fun ()V - public final fun getLambda-1$wf1_workflow_trace_viewer ()Lkotlin/jvm/functions/Function3; + public final fun getLambda$468449326$wf1_workflow_trace_viewer ()Lkotlin/jvm/functions/Function3; } public final class com/squareup/workflow1/traceviewer/MainKt { @@ -10,20 +9,46 @@ public final class com/squareup/workflow1/traceviewer/MainKt { public static synthetic fun main ([Ljava/lang/String;)V } +public final class com/squareup/workflow1/traceviewer/model/NodeState : java/lang/Enum { + public static final field CHILDREN_CHANGED Lcom/squareup/workflow1/traceviewer/model/NodeState; + public static final field NEW Lcom/squareup/workflow1/traceviewer/model/NodeState; + public static final field PROPS_CHANGED Lcom/squareup/workflow1/traceviewer/model/NodeState; + public static final field STATE_CHANGED Lcom/squareup/workflow1/traceviewer/model/NodeState; + public static final field UNCHANGED Lcom/squareup/workflow1/traceviewer/model/NodeState; + public final fun getColor-0d7_KjU ()J + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public static fun valueOf (Ljava/lang/String;)Lcom/squareup/workflow1/traceviewer/model/NodeState; + public static fun values ()[Lcom/squareup/workflow1/traceviewer/model/NodeState; +} + +public final class com/squareup/workflow1/traceviewer/ui/ColorLegendKt { + public static final fun ColorLegend (Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;II)V +} + public final class com/squareup/workflow1/traceviewer/ui/ComposableSingletons$WorkflowInfoPanelKt { public static final field INSTANCE Lcom/squareup/workflow1/traceviewer/ui/ComposableSingletons$WorkflowInfoPanelKt; - public static field lambda-1 Lkotlin/jvm/functions/Function3; - public static field lambda-2 Lkotlin/jvm/functions/Function3; public fun ()V - public final fun getLambda-1$wf1_workflow_trace_viewer ()Lkotlin/jvm/functions/Function3; - public final fun getLambda-2$wf1_workflow_trace_viewer ()Lkotlin/jvm/functions/Function3; + public final fun getLambda$-1925612255$wf1_workflow_trace_viewer ()Lkotlin/jvm/functions/Function3; } public final class com/squareup/workflow1/traceviewer/util/ComposableSingletons$UploadFileKt { public static final field INSTANCE Lcom/squareup/workflow1/traceviewer/util/ComposableSingletons$UploadFileKt; - public static field lambda-1 Lkotlin/jvm/functions/Function3; public fun ()V - public final fun getLambda-1$wf1_workflow_trace_viewer ()Lkotlin/jvm/functions/Function3; + public final fun getLambda$-1046372460$wf1_workflow_trace_viewer ()Lkotlin/jvm/functions/Function3; +} + +public final class com/squareup/workflow1/traceviewer/util/DiffStyles { + public static final field $stable I + public static final field INSTANCE Lcom/squareup/workflow1/traceviewer/util/DiffStyles; + public final fun buildStringWithStyle (Landroidx/compose/ui/text/SpanStyle;Ljava/lang/String;Landroidx/compose/ui/text/AnnotatedString$Builder;)V + public final fun getDELETE ()Landroidx/compose/ui/text/SpanStyle; + public final fun getINSERT ()Landroidx/compose/ui/text/SpanStyle; + public final fun getNO_CHANGE ()Landroidx/compose/ui/text/SpanStyle; + public final fun getUNCHANGED ()Landroidx/compose/ui/text/SpanStyle; +} + +public final class com/squareup/workflow1/traceviewer/util/DiffUtilsKt { + public static final fun computeAnnotatedDiff (Ljava/lang/String;Ljava/lang/String;)Landroidx/compose/ui/text/AnnotatedString; } public final class com/squareup/workflow1/traceviewer/util/JsonParserKt { From cdfbc8277b5a2588cf95f2c1607873d9d443a895 Mon Sep 17 00:00:00 2001 From: Wenli Cai Date: Mon, 28 Jul 2025 10:59:00 -0400 Subject: [PATCH 23/33] Remove compose hot reload changes --- build-logic/settings.gradle.kts | 2 +- gradle/libs.versions.toml | 12 +++++------- gradle/wrapper/gradle-wrapper.properties | 2 +- samples/tutorial/build.gradle | 2 +- workflow-rx2/dependencies/runtimeClasspath.txt | 10 +++++----- workflow-trace-viewer/build.gradle.kts | 9 +-------- 6 files changed, 14 insertions(+), 23 deletions(-) diff --git a/build-logic/settings.gradle.kts b/build-logic/settings.gradle.kts index b6d0f9311..2c7dfa00c 100644 --- a/build-logic/settings.gradle.kts +++ b/build-logic/settings.gradle.kts @@ -1,6 +1,6 @@ plugins { // Hardcoded as this is upstream of the version catalog. Keep this in sync with that. - kotlin("jvm") version "2.2.0" apply false + kotlin("jvm") version "2.0.21" apply false } dependencyResolutionManagement { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 697abbae0..08667b88e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,12 +1,12 @@ [versions] -agpVersion = "8.11.0" +agpVersion = "8.8.0" compileSdk = "34" minSdk = "24" targetSdk = "33" -jdk-target = "11" +jdk-target = "1.8" jdk-toolchain = "17" androidx-activity = "1.8.2" @@ -46,19 +46,19 @@ filekit-dialogs-compose = "0.10.0-beta03" google-accompanist = "0.18.0" google-dagger = "2.40.5" -google-ksp = "2.2.0-2.0.2" +google-ksp = "2.0.21-1.0.26" google-material = "1.4.0" groovy = "3.0.9" jUnit = "4.13.2" java-diff-utils = "4.12" javaParser = "3.24.0" -jetbrains-compose-plugin = "1.8.2" +jetbrains-compose-plugin = "1.7.3" kgx = "0.1.12" kotest = "5.1.0" # Keep this in sync with what is hard-coded in build-logic/settings.gradle.kts as that is upstream # of loading the library versions from this file but should be the same. -kotlin = "2.2.0" +kotlin = "2.0.21" kotlinx-binary-compatibility = "0.17.0" kotlinx-coroutines = "1.9.0" @@ -95,10 +95,8 @@ timber = "5.0.1" truth = "1.4.4" turbine = "1.0.0" vanniktech-publish = "0.32.0" -compose-hot-reload = "1.0.0-beta02" [plugins] -compose-hot-reload = { id = "org.jetbrains.compose.hot-reload", version.ref = "compose-hot-reload" } kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index f407850a5..2733ed5dc 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/samples/tutorial/build.gradle b/samples/tutorial/build.gradle index d2ecce24d..818d9bccd 100644 --- a/samples/tutorial/build.gradle +++ b/samples/tutorial/build.gradle @@ -8,7 +8,7 @@ buildscript { deps = [ activityktx: 'androidx.activity:activity-ktx:1.3.0', - agp: "com.android.tools.build:gradle:8.11.0", + agp: "com.android.tools.build:gradle:8.8.0", appcompat: 'androidx.appcompat:appcompat:1.3.1', constraintlayout: 'androidx.constraintlayout:constraintlayout:2.0.1', kotlin: [ diff --git a/workflow-rx2/dependencies/runtimeClasspath.txt b/workflow-rx2/dependencies/runtimeClasspath.txt index 1991351fa..afea7c6d1 100644 --- a/workflow-rx2/dependencies/runtimeClasspath.txt +++ b/workflow-rx2/dependencies/runtimeClasspath.txt @@ -1,11 +1,11 @@ com.squareup.okio:okio-jvm:3.3.0 com.squareup.okio:okio:3.3.0 io.reactivex.rxjava2:rxjava:2.2.21 -org.jetbrains.kotlin:kotlin-bom:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-common:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib:2.2.0 +org.jetbrains.kotlin:kotlin-bom:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-common:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib:2.0.21 org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 diff --git a/workflow-trace-viewer/build.gradle.kts b/workflow-trace-viewer/build.gradle.kts index fdb9ba78c..a7cb627d6 100644 --- a/workflow-trace-viewer/build.gradle.kts +++ b/workflow-trace-viewer/build.gradle.kts @@ -1,11 +1,9 @@ import org.jetbrains.compose.desktop.application.dsl.TargetFormat -import org.jetbrains.compose.reload.gradle.ComposeHotRun plugins { id("kotlin-multiplatform") alias(libs.plugins.jetbrains.compose) alias(libs.plugins.compose.compiler) - alias(libs.plugins.compose.hot.reload) } kotlin { @@ -38,12 +36,7 @@ kotlin { } } } -tasks.withType().configureEach { - mainClass.set("com.squareup.workflow1.traceviewer.MainKt") - jvmArgs( - "-Dapple.awt.application.appearance=system" - ) -} + compose { desktop { application { From 5d3e3f42dab19ec0a6d7102cf6d36a9e9a0d194f Mon Sep 17 00:00:00 2001 From: wenli-cai <213805610+wenli-cai@users.noreply.github.com> Date: Mon, 28 Jul 2025 15:34:08 +0000 Subject: [PATCH 24/33] Apply changes from dependencyGuardBaseline --refresh-dependencies Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- dependencies/classpath.txt | 225 +++++++++--------- .../dependencies/runtimeClasspath.txt | 10 +- .../dependencies/releaseRuntimeClasspath.txt | 10 +- .../dependencies/runtimeClasspath.txt | 10 +- .../dependencies/jsRuntimeClasspath.txt | 8 +- .../dependencies/jvmRuntimeClasspath.txt | 8 +- .../dependencies/runtimeClasspath.txt | 10 +- .../dependencies/releaseRuntimeClasspath.txt | 10 +- .../dependencies/jsRuntimeClasspath.txt | 8 +- .../dependencies/jvmRuntimeClasspath.txt | 8 +- .../dependencies/runtimeClasspath.txt | 12 +- .../dependencies/runtimeClasspath.txt | 10 +- .../dependencies/releaseRuntimeClasspath.txt | 10 +- .../dependencies/releaseRuntimeClasspath.txt | 10 +- .../dependencies/releaseRuntimeClasspath.txt | 10 +- .../dependencies/runtimeClasspath.txt | 10 +- .../dependencies/releaseRuntimeClasspath.txt | 10 +- 17 files changed, 189 insertions(+), 190 deletions(-) diff --git a/dependencies/classpath.txt b/dependencies/classpath.txt index dfa48113d..27785a8e0 100644 --- a/dependencies/classpath.txt +++ b/dependencies/classpath.txt @@ -1,50 +1,51 @@ -androidx.databinding:databinding-common:8.11.0 -androidx.databinding:databinding-compiler-common:8.11.0 +androidx.databinding:databinding-common:8.8.0 +androidx.databinding:databinding-compiler-common:8.8.0 app.cash.burst:burst-gradle-plugin:2.1.0 app.cash.burst:burst-jvm:2.1.0 app.cash.burst:burst-kotlin-plugin:2.1.0 app.cash.burst:burst:2.1.0 -com.android.databinding:baseLibrary:8.11.0 -com.android.tools.analytics-library:crash:31.11.0 -com.android.tools.analytics-library:protos:31.11.0 -com.android.tools.analytics-library:shared:31.11.0 -com.android.tools.analytics-library:tracker:31.11.0 +com.android.databinding:baseLibrary:8.8.0 +com.android.tools.analytics-library:crash:31.8.0 +com.android.tools.analytics-library:protos:31.8.0 +com.android.tools.analytics-library:shared:31.8.0 +com.android.tools.analytics-library:tracker:31.8.0 com.android.tools.build.jetifier:jetifier-core:1.0.0-beta10 com.android.tools.build.jetifier:jetifier-processor:1.0.0-beta10 -com.android.tools.build:aapt2-proto:8.11.0-12782657 -com.android.tools.build:aaptcompiler:8.11.0 -com.android.tools.build:apksig:8.11.0 -com.android.tools.build:apkzlib:8.11.0 -com.android.tools.build:builder-model:8.11.0 -com.android.tools.build:builder-test-api:8.11.0 -com.android.tools.build:builder:8.11.0 -com.android.tools.build:bundletool:1.18.1 -com.android.tools.build:gradle-api:8.11.0 -com.android.tools.build:gradle-settings-api:8.11.0 -com.android.tools.build:gradle:8.11.0 -com.android.tools.build:manifest-merger:31.11.0 +com.android.tools.build:aapt2-proto:8.8.0-12006047 +com.android.tools.build:aaptcompiler:8.8.0 +com.android.tools.build:apksig:8.8.0 +com.android.tools.build:apkzlib:8.8.0 +com.android.tools.build:builder-model:8.8.0 +com.android.tools.build:builder-test-api:8.8.0 +com.android.tools.build:builder:8.8.0 +com.android.tools.build:bundletool:1.17.2 +com.android.tools.build:gradle-api:8.8.0 +com.android.tools.build:gradle-settings-api:8.8.0 +com.android.tools.build:gradle:8.8.0 +com.android.tools.build:manifest-merger:31.8.0 com.android.tools.build:transform-api:2.0.0-deprecated-use-gradle-api -com.android.tools.ddms:ddmlib:31.11.0 -com.android.tools.layoutlib:layoutlib-api:31.11.0 -com.android.tools.lint:lint-model:31.11.0 -com.android.tools.lint:lint-typedef-remover:31.11.0 -com.android.tools.utp:android-device-provider-ddmlib-proto:31.11.0 -com.android.tools.utp:android-device-provider-gradle-proto:31.11.0 -com.android.tools.utp:android-device-provider-profile-proto:31.11.0 -com.android.tools.utp:android-test-plugin-host-additional-test-output-proto:31.11.0 -com.android.tools.utp:android-test-plugin-host-apk-installer-proto:31.11.0 -com.android.tools.utp:android-test-plugin-host-coverage-proto:31.11.0 -com.android.tools.utp:android-test-plugin-host-emulator-control-proto:31.11.0 -com.android.tools.utp:android-test-plugin-host-logcat-proto:31.11.0 -com.android.tools.utp:android-test-plugin-result-listener-gradle-proto:31.11.0 -com.android.tools:annotations:31.11.0 -com.android.tools:common:31.11.0 -com.android.tools:dvlib:31.11.0 -com.android.tools:repository:31.11.0 -com.android.tools:sdk-common:31.11.0 -com.android.tools:sdklib:31.11.0 -com.android:signflinger:8.11.0 -com.android:zipflinger:8.11.0 +com.android.tools.ddms:ddmlib:31.8.0 +com.android.tools.layoutlib:layoutlib-api:31.8.0 +com.android.tools.lint:lint-model:31.8.0 +com.android.tools.lint:lint-typedef-remover:31.8.0 +com.android.tools.utp:android-device-provider-ddmlib-proto:31.8.0 +com.android.tools.utp:android-device-provider-gradle-proto:31.8.0 +com.android.tools.utp:android-device-provider-profile-proto:31.8.0 +com.android.tools.utp:android-test-plugin-host-additional-test-output-proto:31.8.0 +com.android.tools.utp:android-test-plugin-host-apk-installer-proto:31.8.0 +com.android.tools.utp:android-test-plugin-host-coverage-proto:31.8.0 +com.android.tools.utp:android-test-plugin-host-emulator-control-proto:31.8.0 +com.android.tools.utp:android-test-plugin-host-logcat-proto:31.8.0 +com.android.tools.utp:android-test-plugin-host-retention-proto:31.8.0 +com.android.tools.utp:android-test-plugin-result-listener-gradle-proto:31.8.0 +com.android.tools:annotations:31.8.0 +com.android.tools:common:31.8.0 +com.android.tools:dvlib:31.8.0 +com.android.tools:repository:31.8.0 +com.android.tools:sdk-common:31.8.0 +com.android.tools:sdklib:31.8.0 +com.android:signflinger:8.8.0 +com.android:zipflinger:8.8.0 com.dropbox.dependency-guard:dependency-guard:0.5.0 com.fasterxml.jackson.core:jackson-annotations:2.12.7 com.fasterxml.jackson.core:jackson-core:2.12.7 @@ -55,25 +56,25 @@ com.fasterxml.jackson.module:jackson-module-kotlin:2.12.7 com.fasterxml.jackson:jackson-bom:2.12.7 com.fasterxml.woodstox:woodstox-core:6.2.4 com.google.android:annotations:4.1.1.4 -com.google.api.grpc:proto-google-common-protos:2.48.0 +com.google.api.grpc:proto-google-common-protos:2.17.0 com.google.auto.value:auto-value-annotations:1.6.2 com.google.code.findbugs:jsr305:3.0.2 -com.google.code.gson:gson:2.11.0 +com.google.code.gson:gson:2.10.1 com.google.crypto.tink:tink:1.7.0 com.google.dagger:dagger:2.28.3 -com.google.devtools.ksp:symbol-processing-api:2.2.0-2.0.2 -com.google.devtools.ksp:symbol-processing-common-deps:2.2.0-2.0.2 -com.google.devtools.ksp:symbol-processing-gradle-plugin:2.2.0-2.0.2 -com.google.errorprone:error_prone_annotations:2.30.0 +com.google.devtools.ksp:symbol-processing-api:2.0.21-1.0.26 +com.google.devtools.ksp:symbol-processing-common-deps:2.0.21-1.0.26 +com.google.devtools.ksp:symbol-processing-gradle-plugin:2.0.21-1.0.26 +com.google.errorprone:error_prone_annotations:2.18.0 com.google.flatbuffers:flatbuffers-java:1.12.0 -com.google.guava:failureaccess:1.0.2 -com.google.guava:guava:33.3.1-jre +com.google.guava:failureaccess:1.0.1 +com.google.guava:guava:32.0.1-jre com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava -com.google.j2objc:j2objc-annotations:3.0.0 +com.google.j2objc:j2objc-annotations:2.8 com.google.jimfs:jimfs:1.1 -com.google.protobuf:protobuf-java-util:3.25.5 -com.google.protobuf:protobuf-java:3.25.5 -com.google.testing.platform:core-proto:0.0.9-alpha03 +com.google.protobuf:protobuf-java-util:3.22.3 +com.google.protobuf:protobuf-java:3.22.3 +com.google.testing.platform:core-proto:0.0.9-alpha02 com.googlecode.juniversalchardet:juniversalchardet:1.0.3 com.rickbusarow.kgx:kotlin-gradle-extensions:0.1.12 com.rickbusarow.kgx:names:0.1.12 @@ -96,30 +97,28 @@ com.vanniktech:central-portal:0.32.0 com.vanniktech:gradle-maven-publish-plugin:0.32.0 com.vanniktech:nexus:0.32.0 commons-codec:commons-codec:1.11 -commons-io:commons-io:2.16.1 +commons-io:commons-io:2.13.0 commons-logging:commons-logging:1.2 io.github.java-diff-utils:java-diff-utils:4.12 -io.grpc:grpc-api:1.69.1 -io.grpc:grpc-context:1.69.1 -io.grpc:grpc-core:1.69.1 -io.grpc:grpc-inprocess:1.69.1 -io.grpc:grpc-netty:1.69.1 -io.grpc:grpc-protobuf-lite:1.69.1 -io.grpc:grpc-protobuf:1.69.1 -io.grpc:grpc-stub:1.69.1 -io.grpc:grpc-util:1.69.1 -io.netty:netty-buffer:4.1.110.Final -io.netty:netty-codec-http2:4.1.110.Final -io.netty:netty-codec-http:4.1.110.Final -io.netty:netty-codec-socks:4.1.110.Final -io.netty:netty-codec:4.1.110.Final -io.netty:netty-common:4.1.110.Final -io.netty:netty-handler-proxy:4.1.110.Final -io.netty:netty-handler:4.1.110.Final -io.netty:netty-resolver:4.1.110.Final -io.netty:netty-transport-native-unix-common:4.1.110.Final -io.netty:netty-transport:4.1.110.Final -io.perfmark:perfmark-api:0.27.0 +io.grpc:grpc-api:1.57.0 +io.grpc:grpc-context:1.57.0 +io.grpc:grpc-core:1.57.0 +io.grpc:grpc-netty:1.57.0 +io.grpc:grpc-protobuf-lite:1.57.0 +io.grpc:grpc-protobuf:1.57.0 +io.grpc:grpc-stub:1.57.0 +io.netty:netty-buffer:4.1.93.Final +io.netty:netty-codec-http2:4.1.93.Final +io.netty:netty-codec-http:4.1.93.Final +io.netty:netty-codec-socks:4.1.93.Final +io.netty:netty-codec:4.1.93.Final +io.netty:netty-common:4.1.93.Final +io.netty:netty-handler-proxy:4.1.93.Final +io.netty:netty-handler:4.1.93.Final +io.netty:netty-resolver:4.1.93.Final +io.netty:netty-transport-native-unix-common:4.1.93.Final +io.netty:netty-transport:4.1.93.Final +io.perfmark:perfmark-api:0.26.0 jakarta.activation:jakarta.activation-api:1.2.1 jakarta.xml.bind:jakarta.xml.bind-api:2.3.2 javax.annotation:javax.annotation-api:1.3.2 @@ -133,11 +132,11 @@ org.apache.httpcomponents:httpclient:4.5.14 org.apache.httpcomponents:httpcore:4.4.16 org.apache.httpcomponents:httpmime:4.5.6 org.bitbucket.b_c:jose4j:0.9.5 -org.bouncycastle:bcpkix-jdk18on:1.79 -org.bouncycastle:bcprov-jdk18on:1.79 -org.bouncycastle:bcutil-jdk18on:1.79 -org.checkerframework:checker-qual:3.43.0 -org.codehaus.mojo:animal-sniffer-annotations:1.24 +org.bouncycastle:bcpkix-jdk18on:1.77 +org.bouncycastle:bcprov-jdk18on:1.77 +org.bouncycastle:bcutil-jdk18on:1.77 +org.checkerframework:checker-qual:3.33.0 +org.codehaus.mojo:animal-sniffer-annotations:1.23 org.codehaus.woodstox:stax2-api:4.2.1 org.glassfish.jaxb:jaxb-runtime:2.3.2 org.glassfish.jaxb:txw2:2.3.2 @@ -145,37 +144,37 @@ org.jdom:jdom2:2.0.6 org.jetbrains.dokka:dokka-core:2.0.0 org.jetbrains.dokka:dokka-gradle-plugin:2.0.0 org.jetbrains.dokka:org.jetbrains.dokka.gradle.plugin:2.0.0 -org.jetbrains.kotlin.plugin.compose:org.jetbrains.kotlin.plugin.compose.gradle.plugin:2.2.0 -org.jetbrains.kotlin:abi-tools-api:2.2.0 -org.jetbrains.kotlin:compose-compiler-gradle-plugin:2.2.0 -org.jetbrains.kotlin:fus-statistics-gradle-plugin:2.2.0 -org.jetbrains.kotlin:kotlin-bom:2.2.0 -org.jetbrains.kotlin:kotlin-build-statistics:2.2.0 -org.jetbrains.kotlin:kotlin-build-tools-api:2.2.0 -org.jetbrains.kotlin:kotlin-compiler-runner:2.2.0 -org.jetbrains.kotlin:kotlin-daemon-client:2.2.0 -org.jetbrains.kotlin:kotlin-gradle-plugin-annotations:2.2.0 -org.jetbrains.kotlin:kotlin-gradle-plugin-api:2.2.0 -org.jetbrains.kotlin:kotlin-gradle-plugin-idea-proto:2.2.0 -org.jetbrains.kotlin:kotlin-gradle-plugin-idea:2.2.0 -org.jetbrains.kotlin:kotlin-gradle-plugin-model:2.2.0 -org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.0 -org.jetbrains.kotlin:kotlin-gradle-plugins-bom:2.2.0 -org.jetbrains.kotlin:kotlin-klib-commonizer-api:2.2.0 -org.jetbrains.kotlin:kotlin-native-utils:2.2.0 +org.jetbrains.intellij.deps:trove4j:1.0.20200330 +org.jetbrains.kotlin.plugin.compose:org.jetbrains.kotlin.plugin.compose.gradle.plugin:2.0.21 +org.jetbrains.kotlin:compose-compiler-gradle-plugin:2.0.21 +org.jetbrains.kotlin:kotlin-bom:2.0.21 +org.jetbrains.kotlin:kotlin-build-statistics:2.0.21 +org.jetbrains.kotlin:kotlin-build-tools-api:2.0.21 +org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 +org.jetbrains.kotlin:kotlin-compiler-runner:2.0.21 +org.jetbrains.kotlin:kotlin-daemon-client:2.0.21 +org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 +org.jetbrains.kotlin:kotlin-gradle-plugin-annotations:2.0.21 +org.jetbrains.kotlin:kotlin-gradle-plugin-api:2.0.21 +org.jetbrains.kotlin:kotlin-gradle-plugin-idea-proto:2.0.21 +org.jetbrains.kotlin:kotlin-gradle-plugin-idea:2.0.21 +org.jetbrains.kotlin:kotlin-gradle-plugin-model:2.0.21 +org.jetbrains.kotlin:kotlin-gradle-plugin:2.0.21 +org.jetbrains.kotlin:kotlin-gradle-plugins-bom:2.0.21 +org.jetbrains.kotlin:kotlin-klib-commonizer-api:2.0.21 +org.jetbrains.kotlin:kotlin-native-utils:2.0.21 org.jetbrains.kotlin:kotlin-reflect:2.0.21 -org.jetbrains.kotlin:kotlin-serialization:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.0 +org.jetbrains.kotlin:kotlin-serialization:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 org.jetbrains.kotlin:kotlin-stdlib:2.0.21 -org.jetbrains.kotlin:kotlin-tooling-core:2.2.0 -org.jetbrains.kotlin:kotlin-util-io:2.2.0 -org.jetbrains.kotlin:kotlin-util-klib-metadata:2.2.0 -org.jetbrains.kotlin:kotlin-util-klib:2.2.0 +org.jetbrains.kotlin:kotlin-tooling-core:2.0.21 +org.jetbrains.kotlin:kotlin-util-io:2.0.21 +org.jetbrains.kotlin:kotlin-util-klib:2.0.21 org.jetbrains.kotlinx:binary-compatibility-validator:0.17.0 -org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.8.0 -org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0 -org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0 +org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.7.3 +org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.7.3 +org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 org.jetbrains.kotlinx:kotlinx-serialization-bom:1.6.0 org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.6.0 org.jetbrains.kotlinx:kotlinx-serialization-core:1.6.0 @@ -183,10 +182,10 @@ org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.6.0 org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0 org.jetbrains:annotations:13.0 org.jvnet.staxex:stax-ex:1.8.1 -org.ow2.asm:asm-analysis:9.7.1 -org.ow2.asm:asm-commons:9.7.1 -org.ow2.asm:asm-tree:9.7.1 -org.ow2.asm:asm-util:9.7.1 -org.ow2.asm:asm:9.7.1 +org.ow2.asm:asm-analysis:9.7 +org.ow2.asm:asm-commons:9.7 +org.ow2.asm:asm-tree:9.7 +org.ow2.asm:asm-util:9.7 +org.ow2.asm:asm:9.7 org.slf4j:slf4j-api:1.7.30 -org.tensorflow:tensorflow-lite-metadata:0.2.0 +org.tensorflow:tensorflow-lite-metadata:0.1.0-rc2 diff --git a/trace-encoder/dependencies/runtimeClasspath.txt b/trace-encoder/dependencies/runtimeClasspath.txt index 01a327751..2130c203c 100644 --- a/trace-encoder/dependencies/runtimeClasspath.txt +++ b/trace-encoder/dependencies/runtimeClasspath.txt @@ -2,11 +2,11 @@ com.squareup.moshi:moshi-adapters:1.15.0 com.squareup.moshi:moshi:1.15.0 com.squareup.okio:okio-jvm:3.3.0 com.squareup.okio:okio:3.3.0 -org.jetbrains.kotlin:kotlin-bom:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-common:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib:2.2.0 +org.jetbrains.kotlin:kotlin-bom:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-common:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib:2.0.21 org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 diff --git a/workflow-config/config-android/dependencies/releaseRuntimeClasspath.txt b/workflow-config/config-android/dependencies/releaseRuntimeClasspath.txt index c6198373d..7a1d19195 100644 --- a/workflow-config/config-android/dependencies/releaseRuntimeClasspath.txt +++ b/workflow-config/config-android/dependencies/releaseRuntimeClasspath.txt @@ -1,10 +1,10 @@ com.squareup.okio:okio-jvm:3.3.0 com.squareup.okio:okio:3.3.0 -org.jetbrains.kotlin:kotlin-bom:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-common:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib:2.2.0 +org.jetbrains.kotlin:kotlin-bom:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-common:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib:2.0.21 org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 diff --git a/workflow-config/config-jvm/dependencies/runtimeClasspath.txt b/workflow-config/config-jvm/dependencies/runtimeClasspath.txt index c6198373d..7a1d19195 100644 --- a/workflow-config/config-jvm/dependencies/runtimeClasspath.txt +++ b/workflow-config/config-jvm/dependencies/runtimeClasspath.txt @@ -1,10 +1,10 @@ com.squareup.okio:okio-jvm:3.3.0 com.squareup.okio:okio:3.3.0 -org.jetbrains.kotlin:kotlin-bom:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-common:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib:2.2.0 +org.jetbrains.kotlin:kotlin-bom:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-common:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib:2.0.21 org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 diff --git a/workflow-core/dependencies/jsRuntimeClasspath.txt b/workflow-core/dependencies/jsRuntimeClasspath.txt index 5bfd9d274..c2926679d 100644 --- a/workflow-core/dependencies/jsRuntimeClasspath.txt +++ b/workflow-core/dependencies/jsRuntimeClasspath.txt @@ -1,9 +1,9 @@ com.squareup.okio:okio-js:3.3.0 com.squareup.okio:okio:3.3.0 -org.jetbrains.kotlin:kotlin-bom:2.2.0 -org.jetbrains.kotlin:kotlin-dom-api-compat:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-js:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib:2.2.0 +org.jetbrains.kotlin:kotlin-bom:2.0.21 +org.jetbrains.kotlin:kotlin-dom-api-compat:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-js:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib:2.0.21 org.jetbrains.kotlin:kotlinx-atomicfu-runtime:2.0.0 org.jetbrains.kotlinx:atomicfu-js:0.25.0 org.jetbrains.kotlinx:kotlinx-coroutines-core-js:1.9.0 diff --git a/workflow-core/dependencies/jvmRuntimeClasspath.txt b/workflow-core/dependencies/jvmRuntimeClasspath.txt index a5879029f..01b1b013e 100644 --- a/workflow-core/dependencies/jvmRuntimeClasspath.txt +++ b/workflow-core/dependencies/jvmRuntimeClasspath.txt @@ -1,9 +1,9 @@ com.squareup.okio:okio-jvm:3.3.0 com.squareup.okio:okio:3.3.0 -org.jetbrains.kotlin:kotlin-bom:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib:2.2.0 +org.jetbrains.kotlin:kotlin-bom:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib:2.0.21 org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 diff --git a/workflow-core/dependencies/runtimeClasspath.txt b/workflow-core/dependencies/runtimeClasspath.txt index c6198373d..7a1d19195 100644 --- a/workflow-core/dependencies/runtimeClasspath.txt +++ b/workflow-core/dependencies/runtimeClasspath.txt @@ -1,10 +1,10 @@ com.squareup.okio:okio-jvm:3.3.0 com.squareup.okio:okio:3.3.0 -org.jetbrains.kotlin:kotlin-bom:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-common:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib:2.2.0 +org.jetbrains.kotlin:kotlin-bom:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-common:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib:2.0.21 org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 diff --git a/workflow-runtime-android/dependencies/releaseRuntimeClasspath.txt b/workflow-runtime-android/dependencies/releaseRuntimeClasspath.txt index 68b6d507b..5cd2a49ba 100644 --- a/workflow-runtime-android/dependencies/releaseRuntimeClasspath.txt +++ b/workflow-runtime-android/dependencies/releaseRuntimeClasspath.txt @@ -22,11 +22,11 @@ androidx.versionedparcelable:versionedparcelable:1.1.0 com.google.guava:listenablefuture:1.0 com.squareup.okio:okio-jvm:3.3.0 com.squareup.okio:okio:3.3.0 -org.jetbrains.kotlin:kotlin-bom:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-common:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib:2.2.0 +org.jetbrains.kotlin:kotlin-bom:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-common:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib:2.0.21 org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0 diff --git a/workflow-runtime/dependencies/jsRuntimeClasspath.txt b/workflow-runtime/dependencies/jsRuntimeClasspath.txt index 5bfd9d274..c2926679d 100644 --- a/workflow-runtime/dependencies/jsRuntimeClasspath.txt +++ b/workflow-runtime/dependencies/jsRuntimeClasspath.txt @@ -1,9 +1,9 @@ com.squareup.okio:okio-js:3.3.0 com.squareup.okio:okio:3.3.0 -org.jetbrains.kotlin:kotlin-bom:2.2.0 -org.jetbrains.kotlin:kotlin-dom-api-compat:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-js:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib:2.2.0 +org.jetbrains.kotlin:kotlin-bom:2.0.21 +org.jetbrains.kotlin:kotlin-dom-api-compat:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-js:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib:2.0.21 org.jetbrains.kotlin:kotlinx-atomicfu-runtime:2.0.0 org.jetbrains.kotlinx:atomicfu-js:0.25.0 org.jetbrains.kotlinx:kotlinx-coroutines-core-js:1.9.0 diff --git a/workflow-runtime/dependencies/jvmRuntimeClasspath.txt b/workflow-runtime/dependencies/jvmRuntimeClasspath.txt index a5879029f..01b1b013e 100644 --- a/workflow-runtime/dependencies/jvmRuntimeClasspath.txt +++ b/workflow-runtime/dependencies/jvmRuntimeClasspath.txt @@ -1,9 +1,9 @@ com.squareup.okio:okio-jvm:3.3.0 com.squareup.okio:okio:3.3.0 -org.jetbrains.kotlin:kotlin-bom:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib:2.2.0 +org.jetbrains.kotlin:kotlin-bom:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib:2.0.21 org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 diff --git a/workflow-testing/dependencies/runtimeClasspath.txt b/workflow-testing/dependencies/runtimeClasspath.txt index 8e8df0440..8f7fe8560 100644 --- a/workflow-testing/dependencies/runtimeClasspath.txt +++ b/workflow-testing/dependencies/runtimeClasspath.txt @@ -2,12 +2,12 @@ app.cash.turbine:turbine-jvm:1.0.0 app.cash.turbine:turbine:1.0.0 com.squareup.okio:okio-jvm:3.3.0 com.squareup.okio:okio:3.3.0 -org.jetbrains.kotlin:kotlin-bom:2.2.0 -org.jetbrains.kotlin:kotlin-reflect:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-common:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib:2.2.0 +org.jetbrains.kotlin:kotlin-bom:2.0.21 +org.jetbrains.kotlin:kotlin-reflect:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-common:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib:2.0.21 org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 diff --git a/workflow-tracing/dependencies/runtimeClasspath.txt b/workflow-tracing/dependencies/runtimeClasspath.txt index 01a327751..2130c203c 100644 --- a/workflow-tracing/dependencies/runtimeClasspath.txt +++ b/workflow-tracing/dependencies/runtimeClasspath.txt @@ -2,11 +2,11 @@ com.squareup.moshi:moshi-adapters:1.15.0 com.squareup.moshi:moshi:1.15.0 com.squareup.okio:okio-jvm:3.3.0 com.squareup.okio:okio:3.3.0 -org.jetbrains.kotlin:kotlin-bom:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-common:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib:2.2.0 +org.jetbrains.kotlin:kotlin-bom:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-common:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib:2.0.21 org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 diff --git a/workflow-ui/compose-tooling/dependencies/releaseRuntimeClasspath.txt b/workflow-ui/compose-tooling/dependencies/releaseRuntimeClasspath.txt index b9e6239b9..89513b485 100644 --- a/workflow-ui/compose-tooling/dependencies/releaseRuntimeClasspath.txt +++ b/workflow-ui/compose-tooling/dependencies/releaseRuntimeClasspath.txt @@ -76,11 +76,11 @@ androidx.versionedparcelable:versionedparcelable:1.1.1 com.google.guava:listenablefuture:1.0 com.squareup.okio:okio-jvm:3.3.0 com.squareup.okio:okio:3.3.0 -org.jetbrains.kotlin:kotlin-bom:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-common:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib:2.2.0 +org.jetbrains.kotlin:kotlin-bom:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-common:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib:2.0.21 org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0 diff --git a/workflow-ui/compose/dependencies/releaseRuntimeClasspath.txt b/workflow-ui/compose/dependencies/releaseRuntimeClasspath.txt index 7dc9e7a5c..ea346c60c 100644 --- a/workflow-ui/compose/dependencies/releaseRuntimeClasspath.txt +++ b/workflow-ui/compose/dependencies/releaseRuntimeClasspath.txt @@ -70,11 +70,11 @@ androidx.versionedparcelable:versionedparcelable:1.1.1 com.google.guava:listenablefuture:1.0 com.squareup.okio:okio-jvm:3.3.0 com.squareup.okio:okio:3.3.0 -org.jetbrains.kotlin:kotlin-bom:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-common:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib:2.2.0 +org.jetbrains.kotlin:kotlin-bom:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-common:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib:2.0.21 org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0 diff --git a/workflow-ui/core-android/dependencies/releaseRuntimeClasspath.txt b/workflow-ui/core-android/dependencies/releaseRuntimeClasspath.txt index 080ebf17f..6d35207fe 100644 --- a/workflow-ui/core-android/dependencies/releaseRuntimeClasspath.txt +++ b/workflow-ui/core-android/dependencies/releaseRuntimeClasspath.txt @@ -36,11 +36,11 @@ androidx.versionedparcelable:versionedparcelable:1.1.1 com.google.guava:listenablefuture:1.0 com.squareup.okio:okio-jvm:3.3.0 com.squareup.okio:okio:3.3.0 -org.jetbrains.kotlin:kotlin-bom:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-common:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib:2.2.0 +org.jetbrains.kotlin:kotlin-bom:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-common:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib:2.0.21 org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0 diff --git a/workflow-ui/core-common/dependencies/runtimeClasspath.txt b/workflow-ui/core-common/dependencies/runtimeClasspath.txt index c6198373d..7a1d19195 100644 --- a/workflow-ui/core-common/dependencies/runtimeClasspath.txt +++ b/workflow-ui/core-common/dependencies/runtimeClasspath.txt @@ -1,10 +1,10 @@ com.squareup.okio:okio-jvm:3.3.0 com.squareup.okio:okio:3.3.0 -org.jetbrains.kotlin:kotlin-bom:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-common:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib:2.2.0 +org.jetbrains.kotlin:kotlin-bom:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-common:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib:2.0.21 org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 diff --git a/workflow-ui/radiography/dependencies/releaseRuntimeClasspath.txt b/workflow-ui/radiography/dependencies/releaseRuntimeClasspath.txt index 375491ff8..be930540d 100644 --- a/workflow-ui/radiography/dependencies/releaseRuntimeClasspath.txt +++ b/workflow-ui/radiography/dependencies/releaseRuntimeClasspath.txt @@ -38,11 +38,11 @@ com.squareup.curtains:curtains:1.2.2 com.squareup.okio:okio-jvm:3.3.0 com.squareup.okio:okio:3.3.0 com.squareup.radiography:radiography:2.4.1 -org.jetbrains.kotlin:kotlin-bom:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-common:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.0 -org.jetbrains.kotlin:kotlin-stdlib:2.2.0 +org.jetbrains.kotlin:kotlin-bom:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-common:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 +org.jetbrains.kotlin:kotlin-stdlib:2.0.21 org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0 org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0 From fdf2253c49c5bfe6baa2d2aff7573d8337402ad4 Mon Sep 17 00:00:00 2001 From: "workflow-pr-fixer[bot]" <216782701+workflow-pr-fixer[bot]@users.noreply.github.com> Date: Mon, 28 Jul 2025 15:39:00 +0000 Subject: [PATCH 25/33] Apply changes from apiDump Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- workflow-trace-viewer/api/workflow-trace-viewer.api | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/workflow-trace-viewer/api/workflow-trace-viewer.api b/workflow-trace-viewer/api/workflow-trace-viewer.api index b11c100d5..0f7504f36 100644 --- a/workflow-trace-viewer/api/workflow-trace-viewer.api +++ b/workflow-trace-viewer/api/workflow-trace-viewer.api @@ -1,7 +1,8 @@ public final class com/squareup/workflow1/traceviewer/ComposableSingletons$MainKt { public static final field INSTANCE Lcom/squareup/workflow1/traceviewer/ComposableSingletons$MainKt; + public static field lambda-1 Lkotlin/jvm/functions/Function3; public fun ()V - public final fun getLambda$468449326$wf1_workflow_trace_viewer ()Lkotlin/jvm/functions/Function3; + public final fun getLambda-1$wf1_workflow_trace_viewer ()Lkotlin/jvm/functions/Function3; } public final class com/squareup/workflow1/traceviewer/MainKt { @@ -27,14 +28,16 @@ public final class com/squareup/workflow1/traceviewer/ui/ColorLegendKt { public final class com/squareup/workflow1/traceviewer/ui/ComposableSingletons$WorkflowInfoPanelKt { public static final field INSTANCE Lcom/squareup/workflow1/traceviewer/ui/ComposableSingletons$WorkflowInfoPanelKt; + public static field lambda-1 Lkotlin/jvm/functions/Function3; public fun ()V - public final fun getLambda$-1925612255$wf1_workflow_trace_viewer ()Lkotlin/jvm/functions/Function3; + public final fun getLambda-1$wf1_workflow_trace_viewer ()Lkotlin/jvm/functions/Function3; } public final class com/squareup/workflow1/traceviewer/util/ComposableSingletons$UploadFileKt { public static final field INSTANCE Lcom/squareup/workflow1/traceviewer/util/ComposableSingletons$UploadFileKt; + public static field lambda-1 Lkotlin/jvm/functions/Function3; public fun ()V - public final fun getLambda$-1046372460$wf1_workflow_trace_viewer ()Lkotlin/jvm/functions/Function3; + public final fun getLambda-1$wf1_workflow_trace_viewer ()Lkotlin/jvm/functions/Function3; } public final class com/squareup/workflow1/traceviewer/util/DiffStyles { From 5280f84bbe7410e6d2694b8e95287aafdd55eaac Mon Sep 17 00:00:00 2001 From: "workflow-pr-fixer[bot]" <216782701+workflow-pr-fixer[bot]@users.noreply.github.com> Date: Mon, 28 Jul 2025 15:44:07 +0000 Subject: [PATCH 26/33] Apply changes from artifactsDump Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- artifacts.json | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/artifacts.json b/artifacts.json index 1bbf3abdc..438a6826a 100644 --- a/artifacts.json +++ b/artifacts.json @@ -5,7 +5,7 @@ "artifactId": "trace-encoder", "description": "Trace Encoder", "packaging": "jar", - "javaVersion": 11, + "javaVersion": 8, "publicationName": "maven" }, { @@ -14,7 +14,7 @@ "artifactId": "workflow-core-iosarm64", "description": "Workflow Core", "packaging": "klib", - "javaVersion": 11, + "javaVersion": 8, "publicationName": "iosArm64" }, { @@ -23,7 +23,7 @@ "artifactId": "workflow-core-iossimulatorarm64", "description": "Workflow Core", "packaging": "klib", - "javaVersion": 11, + "javaVersion": 8, "publicationName": "iosSimulatorArm64" }, { @@ -32,7 +32,7 @@ "artifactId": "workflow-core-iosx64", "description": "Workflow Core", "packaging": "klib", - "javaVersion": 11, + "javaVersion": 8, "publicationName": "iosX64" }, { @@ -41,7 +41,7 @@ "artifactId": "workflow-core-js", "description": "Workflow Core", "packaging": "klib", - "javaVersion": 11, + "javaVersion": 8, "publicationName": "js" }, { @@ -50,7 +50,7 @@ "artifactId": "workflow-core-jvm", "description": "Workflow Core", "packaging": "jar", - "javaVersion": 11, + "javaVersion": 8, "publicationName": "jvm" }, { @@ -59,7 +59,7 @@ "artifactId": "workflow-core", "description": "Workflow Core", "packaging": "jar", - "javaVersion": 11, + "javaVersion": 8, "publicationName": "kotlinMultiplatform" }, { @@ -68,7 +68,7 @@ "artifactId": "workflow-runtime-iosarm64", "description": "Workflow Runtime", "packaging": "klib", - "javaVersion": 11, + "javaVersion": 8, "publicationName": "iosArm64" }, { @@ -77,7 +77,7 @@ "artifactId": "workflow-runtime-iossimulatorarm64", "description": "Workflow Runtime", "packaging": "klib", - "javaVersion": 11, + "javaVersion": 8, "publicationName": "iosSimulatorArm64" }, { @@ -86,7 +86,7 @@ "artifactId": "workflow-runtime-iosx64", "description": "Workflow Runtime", "packaging": "klib", - "javaVersion": 11, + "javaVersion": 8, "publicationName": "iosX64" }, { @@ -95,7 +95,7 @@ "artifactId": "workflow-runtime-js", "description": "Workflow Runtime", "packaging": "klib", - "javaVersion": 11, + "javaVersion": 8, "publicationName": "js" }, { @@ -104,7 +104,7 @@ "artifactId": "workflow-runtime-jvm", "description": "Workflow Runtime", "packaging": "jar", - "javaVersion": 11, + "javaVersion": 8, "publicationName": "jvm" }, { @@ -113,7 +113,7 @@ "artifactId": "workflow-runtime", "description": "Workflow Runtime", "packaging": "jar", - "javaVersion": 11, + "javaVersion": 8, "publicationName": "kotlinMultiplatform" }, { @@ -122,7 +122,7 @@ "artifactId": "workflow-runtime-android", "description": "Workflow Runtime Android", "packaging": "aar", - "javaVersion": 11, + "javaVersion": 8, "publicationName": "maven" }, { @@ -131,7 +131,7 @@ "artifactId": "workflow-rx2", "description": "Workflow RxJava2", "packaging": "jar", - "javaVersion": 11, + "javaVersion": 8, "publicationName": "maven" }, { @@ -140,7 +140,7 @@ "artifactId": "workflow-testing-jvm", "description": "Workflow Testing", "packaging": "jar", - "javaVersion": 11, + "javaVersion": 8, "publicationName": "maven" }, { @@ -149,7 +149,7 @@ "artifactId": "workflow-tracing", "description": "Workflow Tracing", "packaging": "jar", - "javaVersion": 11, + "javaVersion": 8, "publicationName": "maven" }, { @@ -158,7 +158,7 @@ "artifactId": "workflow-config-android", "description": "Workflow Runtime Android Configuration", "packaging": "aar", - "javaVersion": 11, + "javaVersion": 8, "publicationName": "maven" }, { @@ -167,7 +167,7 @@ "artifactId": "workflow-config-jvm", "description": "Workflow Runtime JVM Configuration", "packaging": "jar", - "javaVersion": 11, + "javaVersion": 8, "publicationName": "maven" }, { @@ -176,7 +176,7 @@ "artifactId": "workflow-ui-compose", "description": "Workflow UI Compose", "packaging": "aar", - "javaVersion": 11, + "javaVersion": 8, "publicationName": "maven" }, { @@ -185,7 +185,7 @@ "artifactId": "workflow-ui-compose-tooling", "description": "Workflow UI Compose Tooling", "packaging": "aar", - "javaVersion": 11, + "javaVersion": 8, "publicationName": "maven" }, { @@ -194,7 +194,7 @@ "artifactId": "workflow-ui-core-android", "description": "Workflow UI Android", "packaging": "aar", - "javaVersion": 11, + "javaVersion": 8, "publicationName": "maven" }, { @@ -203,7 +203,7 @@ "artifactId": "workflow-ui-core-common-jvm", "description": "Workflow UI Core", "packaging": "jar", - "javaVersion": 11, + "javaVersion": 8, "publicationName": "maven" }, { @@ -212,7 +212,7 @@ "artifactId": "workflow-ui-radiography", "description": "Workflow UI Radiography Support", "packaging": "aar", - "javaVersion": 11, + "javaVersion": 8, "publicationName": "maven" } ] \ No newline at end of file From a2c98aec9318140e584d88008a01a0aad306586a Mon Sep 17 00:00:00 2001 From: Wenli Cai Date: Mon, 28 Jul 2025 12:28:35 -0400 Subject: [PATCH 27/33] Clean up Improve UI and clean up code --- .../com/squareup/workflow1/traceviewer/App.kt | 24 ++++++++++--------- .../workflow1/traceviewer/model/NodeUpdate.kt | 2 +- .../traceviewer/ui/DisplayDevices.kt | 7 +++--- .../workflow1/traceviewer/ui/WorkflowTree.kt | 22 +++++++++-------- 4 files changed, 30 insertions(+), 25 deletions(-) diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt index 26587f2a0..61b300a6b 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt @@ -64,8 +64,8 @@ internal fun App( sandboxState = sandboxState, ) { // if there is not a file selected and trace mode is live, then don't render anything. - val readyForFileTrace = validateFileMode(traceMode) - val readyForLiveTrace = validateLiveMode(traceMode) + val readyForFileTrace = TraceMode.validateFileMode(traceMode) + val readyForLiveTrace = TraceMode.validateLiveMode(traceMode) if (readyForFileTrace || readyForLiveTrace) { active = true @@ -121,7 +121,7 @@ internal fun App( if (traceMode is TraceMode.Live) { if ((traceMode as TraceMode.Live).device == null) { DisplayDevices( - onDeviceSelected = { selectedDevice -> + onDeviceSelect = { selectedDevice -> traceMode = TraceMode.Live(selectedDevice) }, devices = listDevices(), @@ -161,6 +161,16 @@ internal class SandboxState { internal sealed interface TraceMode { data class File(val file: PlatformFile?) : TraceMode data class Live(val device: String? = null) : TraceMode + + companion object { + fun validateLiveMode(traceMode: TraceMode): Boolean { + return traceMode is Live && traceMode.device != null + } + + fun validateFileMode(traceMode: TraceMode): Boolean { + return traceMode is File && traceMode.file != null + } + } } /** @@ -172,11 +182,3 @@ internal fun listDevices(): List { // We drop the header "List of devices attached" return process.inputStream.bufferedReader().readLines().drop(1).dropLast(1) } - -internal fun validateLiveMode(traceMode: TraceMode): Boolean { - return traceMode is TraceMode.Live && traceMode.device != null -} - -internal fun validateFileMode(traceMode: TraceMode): Boolean { - return traceMode is TraceMode.File && traceMode.file != null -} diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/model/NodeUpdate.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/model/NodeUpdate.kt index ce49860d3..87c562e6c 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/model/NodeUpdate.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/model/NodeUpdate.kt @@ -34,5 +34,5 @@ enum class NodeState(val color: Color) { STATE_CHANGED(Color(0xFFE57373)), // red PROPS_CHANGED(Color(0xFFFF8A65)), // orange CHILDREN_CHANGED(Color(0x802196F3)), // blue - UNCHANGED(Color.Transparent), + UNCHANGED(Color.LightGray.copy(alpha = 0.3f)), } diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/DisplayDevices.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/DisplayDevices.kt index 2183eeec7..9729c135c 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/DisplayDevices.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/DisplayDevices.kt @@ -18,7 +18,7 @@ import androidx.compose.ui.unit.dp @OptIn(ExperimentalMaterialApi::class) @Composable internal fun DisplayDevices( - onDeviceSelected: (String) -> Unit, + onDeviceSelect: (String) -> Unit, devices: List, modifier: Modifier = Modifier, ) { @@ -29,7 +29,7 @@ internal fun DisplayDevices( ) { if (devices.isEmpty()) { Text( - text = "No device available", + text = "No device available. Boot up a new device and restart the visualizer", modifier = Modifier.align(Alignment.Center) ) return@Box @@ -40,8 +40,9 @@ internal fun DisplayDevices( devices.forEach { device -> Card( onClick = { + // Only give back the specific emulator device, i.e. "emulator-5554" emulatorRegex.find(device)?.value?.let { emulator -> - onDeviceSelected(emulator) + onDeviceSelect(emulator) } }, shape = RoundedCornerShape(16.dp), diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt index ac1c675f0..3d26e2137 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt @@ -2,6 +2,7 @@ package com.squareup.workflow1.traceviewer.ui import androidx.compose.foundation.background import androidx.compose.foundation.border +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -18,7 +19,6 @@ import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.input.pointer.PointerEventType -import androidx.compose.ui.input.pointer.isPrimaryPressed import androidx.compose.ui.input.pointer.isSecondaryPressed import androidx.compose.ui.input.pointer.onPointerEvent import androidx.compose.ui.unit.dp @@ -45,8 +45,10 @@ internal fun DrawTree( Column( modifier .padding(6.dp) - .border(3.dp, Color.Black) - .fillMaxSize(), + .fillMaxSize() + .then( + if (node.children.isNotEmpty()) Modifier.border(3.dp, Color.Black) else Modifier + ), horizontalAlignment = Alignment.CenterHorizontally, ) { val isAffected = affectedNodes.contains(node) @@ -93,8 +95,8 @@ internal fun DrawTree( * Draws the group of unaffected children, which can be open and closed to expand/collapse them. * * If an unaffected children also has other children, it cannot be opened since the this group - * treats all nodes as one entity. The onClick for the whole group overrides the onClick for the - * individual nodes. + * treats all nodes as one entity. The right click for the whole group overrides the right click for + * the individual nodes. */ @OptIn(ExperimentalComposeUiApi::class) @Composable @@ -141,8 +143,7 @@ private fun UnaffectedChildrenGroup( Column( modifier = Modifier .fillMaxWidth() - .padding(6.dp) - .border(3.dp, Color.Black), + .padding(6.dp), horizontalAlignment = Alignment.CenterHorizontally, ) { DrawChildrenInGroups( @@ -279,10 +280,11 @@ private fun DrawNode( Box( modifier = Modifier .background(nodeUpdate.state.color) + .clickable { + onNodeSelect(nodeUpdate) + } .onPointerEvent(PointerEventType.Press) { - if (it.buttons.isPrimaryPressed) { - onNodeSelect(nodeUpdate) - } else if (it.buttons.isSecondaryPressed) { + if (it.buttons.isSecondaryPressed) { onExpandToggle(node) } } From 325b2393865009bdef7e4787b54100de5c12e344 Mon Sep 17 00:00:00 2001 From: Wenli Cai Date: Tue, 29 Jul 2025 13:14:22 -0400 Subject: [PATCH 28/33] Add search box for available nodes in the specified frame The goal is to have the viewport snap to the node when it's being searched for, but current use of Offset seems to give some positional errors. --- workflow-trace-viewer/build.gradle.kts | 1 + .../com/squareup/workflow1/traceviewer/App.kt | 44 +++++++++-- .../workflow1/traceviewer/ui/SearchBox.kt | 78 +++++++++++++++++++ .../workflow1/traceviewer/ui/WorkflowTree.kt | 39 +++++++--- .../workflow1/traceviewer/util/TraceParser.kt | 3 + 5 files changed, 150 insertions(+), 15 deletions(-) create mode 100644 workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/SearchBox.kt diff --git a/workflow-trace-viewer/build.gradle.kts b/workflow-trace-viewer/build.gradle.kts index a7cb627d6..6bfd41a3e 100644 --- a/workflow-trace-viewer/build.gradle.kts +++ b/workflow-trace-viewer/build.gradle.kts @@ -15,6 +15,7 @@ kotlin { implementation(compose.runtime) implementation(compose.foundation) implementation(compose.material) + implementation(compose.material3) implementation(compose.ui) implementation(compose.components.resources) implementation(compose.components.uiToolingPreview) diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt index 61b300a6b..10ef907e8 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt @@ -1,23 +1,28 @@ package com.squareup.workflow1.traceviewer import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableFloatStateOf import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.mutableStateMapOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.runtime.snapshotFlow +import androidx.compose.runtime.snapshots.SnapshotStateMap import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Offset +import com.squareup.workflow1.traceviewer.model.Node import com.squareup.workflow1.traceviewer.model.NodeUpdate import com.squareup.workflow1.traceviewer.ui.ColorLegend import com.squareup.workflow1.traceviewer.ui.DisplayDevices import com.squareup.workflow1.traceviewer.ui.FrameSelectTab import com.squareup.workflow1.traceviewer.ui.RightInfoPanel +import com.squareup.workflow1.traceviewer.ui.SearchBox import com.squareup.workflow1.traceviewer.ui.TraceModeToggleSwitch import com.squareup.workflow1.traceviewer.util.FileDump import com.squareup.workflow1.traceviewer.util.RenderTrace @@ -37,11 +42,14 @@ internal fun App( var rawRenderPass by remember { mutableStateOf("") } var frameIndex by remember { mutableIntStateOf(0) } val sandboxState = remember { SandboxState() } + val nodeLocations = remember { mutableListOf>() } // Default to File mode, and can be toggled to be in Live mode. var active by remember { mutableStateOf(false) } var traceMode by remember { mutableStateOf(TraceMode.File(null)) } var selectedTraceFile by remember { mutableStateOf(null) } + // frameIndex is set to -1 when app is in Live Mode, so we increment it by one to avoid off-by-one errors + val frameInd = if (traceMode is TraceMode.Live) frameIndex + 1 else frameIndex LaunchedEffect(sandboxState) { snapshotFlow { frameIndex }.collect { @@ -57,6 +65,8 @@ internal fun App( selectedNode = null frameIndex = 0 frameSize = 0 + active = false + nodeLocations.clear() } // Main content @@ -76,16 +86,40 @@ internal fun App( onNodeSelect = { selectedNode = it }, onNewFrame = { frameIndex += 1 }, onNewData = { rawRenderPass += "$it," }, + storeNodeLocation = { node, loc -> nodeLocations[frameInd] += (node to loc) } ) } } - FrameSelectTab( - size = frameSize, - currentIndex = frameIndex, - onIndexChange = { frameIndex = it }, + Column( modifier = Modifier.align(Alignment.TopCenter) - ) + ) { + if (active) { + FrameSelectTab( + size = frameSize, + currentIndex = frameIndex, + onIndexChange = { frameIndex = it }, + ) + + // Since we can jump from frame to frame, we fill in the map during each recomposition + if (nodeLocations.getOrNull(frameInd) == null) { + // frameSize has not been updated yet, so on the first frame, frameSize = nodeLocations.size = 0, + // and it will append a new map + while (nodeLocations.size <= frameSize) { + nodeLocations.add(mutableStateMapOf()) + } + } + + SearchBox( + nodes = nodeLocations[frameInd].keys.toList(), + onSearch = { name -> + val node = nodeLocations[frameInd].keys.firstOrNull { it.name == name } + sandboxState.offset = nodeLocations[frameInd][node] ?: sandboxState.offset + }, + modifier = Modifier.align(Alignment.CenterHorizontally) + ) + } + } TraceModeToggleSwitch( onToggle = { diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/SearchBox.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/SearchBox.kt new file mode 100644 index 000000000..57962d796 --- /dev/null +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/SearchBox.kt @@ -0,0 +1,78 @@ +package com.squareup.workflow1.traceviewer.ui + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Column +import androidx.compose.material.Icon +import androidx.compose.material.IconButton +import androidx.compose.material.Text +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Close +import androidx.compose.material3.DockedSearchBar +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.ListItem +import androidx.compose.material3.SearchBarColors +import androidx.compose.material3.SearchBarDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import com.squareup.workflow1.traceviewer.model.Node + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +internal fun SearchBox( + nodes: List, + onSearch: (String) -> Unit, + modifier: Modifier = Modifier +) { + var searchText by remember { mutableStateOf("") } + var expanded by remember { mutableStateOf(false) } + + DockedSearchBar( + modifier = modifier, + inputField = { + SearchBarDefaults.InputField( + query = searchText, + onQueryChange = { searchText = it }, + onSearch = { + expanded = false + }, + expanded = expanded, + onExpandedChange = { expanded = it }, + placeholder = { Text("search for a node...") }, + trailingIcon = { + IconButton( + onClick = { + expanded = false + } + ) { + Icon( + imageVector = Icons.Default.Close, + contentDescription = "Clear search" + ) + } + } + ) + }, + colors = SearchBarColors(Color.White, Color.Black), + expanded = expanded, + onExpandedChange = { expanded = it }, + ) { + val relevantNodes = nodes.filter { it.name.contains(searchText, ignoreCase = true) } + Column { + relevantNodes.take(5).forEach { node -> + ListItem( + headlineContent = { Text(node.name) }, + modifier = Modifier + .clickable { + onSearch(node.name) + expanded = false + } + ) + } + } + } +} diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt index 3d26e2137..719c8bd37 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt @@ -17,10 +17,13 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Alignment import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier +import androidx.compose.ui.geometry.Offset import androidx.compose.ui.graphics.Color import androidx.compose.ui.input.pointer.PointerEventType import androidx.compose.ui.input.pointer.isSecondaryPressed import androidx.compose.ui.input.pointer.onPointerEvent +import androidx.compose.ui.layout.onGloballyPositioned +import androidx.compose.ui.layout.positionInParent import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.squareup.workflow1.traceviewer.model.Node @@ -40,6 +43,7 @@ internal fun DrawTree( affectedNodes: Set, expandedNodes: MutableMap, onNodeSelect: (NodeUpdate) -> Unit, + storeNodeLocation: (Node, Offset) -> Unit, modifier: Modifier = Modifier, ) { Column( @@ -64,7 +68,8 @@ internal fun DrawTree( isAffected = isAffected, isExpanded = isExpanded, onNodeSelect = onNodeSelect, - onExpandToggle = { expandedNodes[node.id] = !expandedNodes[node.id]!! } + onExpandToggle = { expandedNodes[node.id] = !expandedNodes[node.id]!! }, + storeNodeLocation = storeNodeLocation ) if (isExpanded) { @@ -77,7 +82,8 @@ internal fun DrawTree( previousFrameNode = previousFrameNode, affectedNodes = affectedNodes, expandedNodes = expandedNodes, - onNodeSelect = onNodeSelect + onNodeSelect = onNodeSelect, + storeNodeLocation = storeNodeLocation ) AffectedChildrenGroup( @@ -85,7 +91,8 @@ internal fun DrawTree( previousFrameNode = previousFrameNode, affectedNodes = affectedNodes, expandedNodes = expandedNodes, - onNodeSelect = onNodeSelect + onNodeSelect = onNodeSelect, + storeNodeLocation = storeNodeLocation ) } } @@ -106,7 +113,8 @@ private fun UnaffectedChildrenGroup( previousFrameNode: Node?, affectedNodes: Set, expandedNodes: MutableMap, - onNodeSelect: (NodeUpdate) -> Unit + onNodeSelect: (NodeUpdate) -> Unit, + storeNodeLocation: (Node, Offset) -> Unit ) { if (children.isEmpty()) return @@ -152,7 +160,8 @@ private fun UnaffectedChildrenGroup( affectedNodes = affectedNodes, expandedNodes = expandedNodes, unaffected = true, - onNodeSelect = onNodeSelect + onNodeSelect = onNodeSelect, + storeNodeLocation = storeNodeLocation ) } } @@ -168,7 +177,8 @@ private fun AffectedChildrenGroup( previousFrameNode: Node?, affectedNodes: Set, expandedNodes: MutableMap, - onNodeSelect: (NodeUpdate) -> Unit + onNodeSelect: (NodeUpdate) -> Unit, + storeNodeLocation: (Node, Offset) -> Unit ) { if (children.isEmpty()) return @@ -177,7 +187,8 @@ private fun AffectedChildrenGroup( previousFrameNode = previousFrameNode, affectedNodes = affectedNodes, expandedNodes = expandedNodes, - onNodeSelect = onNodeSelect + onNodeSelect = onNodeSelect, + storeNodeLocation = storeNodeLocation ) } @@ -193,8 +204,9 @@ private fun DrawChildrenInGroups( previousFrameNode: Node?, affectedNodes: Set, expandedNodes: MutableMap, + onNodeSelect: (NodeUpdate) -> Unit, + storeNodeLocation: (Node, Offset) -> Unit, unaffected: Boolean = false, - onNodeSelect: (NodeUpdate) -> Unit ) { // Split children into those with children (nested) and those without var (nestedChildren, simpleChildren) = children.partition { it.children.isNotEmpty() } @@ -227,7 +239,8 @@ private fun DrawChildrenInGroups( previousFrameNode = previousFrameNode?.children?.get(childNode.id), affectedNodes = affectedNodes, expandedNodes = expandedNodes, - onNodeSelect = onNodeSelect + onNodeSelect = onNodeSelect, + storeNodeLocation = storeNodeLocation ) } } @@ -250,7 +263,8 @@ private fun DrawChildrenInGroups( previousFrameNode = previousFrameNode?.children?.get(childNode.id), affectedNodes = affectedNodes, expandedNodes = expandedNodes, - onNodeSelect = onNodeSelect + onNodeSelect = onNodeSelect, + storeNodeLocation = storeNodeLocation ) } } @@ -270,6 +284,7 @@ private fun DrawNode( isExpanded: Boolean, onNodeSelect: (NodeUpdate) -> Unit, onExpandToggle: (Node) -> Unit, + storeNodeLocation: (Node, Offset) -> Unit ) { val nodeUpdate = NodeUpdate.create( current = node, @@ -289,6 +304,10 @@ private fun DrawNode( } } .padding(16.dp) + .onGloballyPositioned { coords -> + val offset = coords.positionInParent() + storeNodeLocation(node, offset) + } ) { Column(horizontalAlignment = Alignment.CenterHorizontally) { Row( diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/TraceParser.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/TraceParser.kt index ec9041fb3..2dbb6c90c 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/TraceParser.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/TraceParser.kt @@ -10,6 +10,7 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier +import androidx.compose.ui.geometry.Offset import com.squareup.moshi.JsonAdapter import com.squareup.workflow1.traceviewer.TraceMode import com.squareup.workflow1.traceviewer.model.Node @@ -30,6 +31,7 @@ internal fun RenderTrace( onNodeSelect: (NodeUpdate) -> Unit, onNewFrame: () -> Unit, onNewData: (String) -> Unit, + storeNodeLocation: (Node, Offset) -> Unit, modifier: Modifier = Modifier ) { var isLoading by remember(traceSource) { mutableStateOf(true) } @@ -110,6 +112,7 @@ internal fun RenderTrace( affectedNodes = affectedNodes[frameInd], expandedNodes = remember(frameInd) { mutableStateMapOf() }, onNodeSelect = onNodeSelect, + storeNodeLocation = storeNodeLocation ) } } From 688688e379ee552c0f8aa0e4d42905fadb934761 Mon Sep 17 00:00:00 2001 From: Wenli Cai Date: Tue, 29 Jul 2025 13:19:23 -0400 Subject: [PATCH 29/33] Refactor directories --- .../com/squareup/workflow1/traceviewer/App.kt | 26 ++++++++++--------- .../traceviewer/ui/WorkflowInfoPanel.kt | 2 +- .../ui/{ => control}/DisplayDevices.kt | 2 +- .../{util => ui/control}/FileDump.kt | 2 +- .../ui/{ => control}/FrameSelectTab.kt | 2 +- .../traceviewer/ui/{ => control}/SearchBox.kt | 2 +- .../ui/{ => control}/TraceModeToggleSwitch.kt | 2 +- .../{util => ui/control}/UploadFile.kt | 2 +- .../util/{ => parser}/DiffUtils.kt | 4 +-- .../util/{ => parser}/JsonParser.kt | 19 ++++++++------ .../util/{ => parser}/TraceParser.kt | 3 ++- .../traceviewer/util/JsonParserTest.kt | 1 + 12 files changed, 37 insertions(+), 30 deletions(-) rename workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/{ => control}/DisplayDevices.kt (97%) rename workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/{util => ui/control}/FileDump.kt (96%) rename workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/{ => control}/FrameSelectTab.kt (97%) rename workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/{ => control}/SearchBox.kt (97%) rename workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/{ => control}/TraceModeToggleSwitch.kt (95%) rename workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/{util => ui/control}/UploadFile.kt (96%) rename workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/{ => parser}/DiffUtils.kt (97%) rename workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/{ => parser}/JsonParser.kt (91%) rename workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/{ => parser}/TraceParser.kt (96%) diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt index 10ef907e8..696809f5a 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt @@ -16,18 +16,20 @@ import androidx.compose.runtime.snapshots.SnapshotStateMap import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Offset +import com.squareup.workflow1.traceviewer.TraceMode.File +import com.squareup.workflow1.traceviewer.TraceMode.Live import com.squareup.workflow1.traceviewer.model.Node import com.squareup.workflow1.traceviewer.model.NodeUpdate import com.squareup.workflow1.traceviewer.ui.ColorLegend -import com.squareup.workflow1.traceviewer.ui.DisplayDevices -import com.squareup.workflow1.traceviewer.ui.FrameSelectTab import com.squareup.workflow1.traceviewer.ui.RightInfoPanel -import com.squareup.workflow1.traceviewer.ui.SearchBox -import com.squareup.workflow1.traceviewer.ui.TraceModeToggleSwitch -import com.squareup.workflow1.traceviewer.util.FileDump -import com.squareup.workflow1.traceviewer.util.RenderTrace +import com.squareup.workflow1.traceviewer.ui.control.DisplayDevices +import com.squareup.workflow1.traceviewer.ui.control.FileDump +import com.squareup.workflow1.traceviewer.ui.control.FrameSelectTab +import com.squareup.workflow1.traceviewer.ui.control.SearchBox +import com.squareup.workflow1.traceviewer.ui.control.TraceModeToggleSwitch +import com.squareup.workflow1.traceviewer.ui.control.UploadFile import com.squareup.workflow1.traceviewer.util.SandboxBackground -import com.squareup.workflow1.traceviewer.util.UploadFile +import com.squareup.workflow1.traceviewer.util.parser.RenderTrace import io.github.vinceglb.filekit.PlatformFile /** @@ -124,16 +126,16 @@ internal fun App( TraceModeToggleSwitch( onToggle = { resetStates() - traceMode = if (traceMode is TraceMode.Live) { + traceMode = if (traceMode is Live) { frameIndex = 0 - TraceMode.File(null) + File(null) } else { /* We set the frame to -1 here since we always increment it during Live mode as the list of frames get populated, so we avoid off by one when indexing into the frames. */ frameIndex = -1 - TraceMode.Live() + Live() } }, traceMode = traceMode, @@ -146,7 +148,7 @@ internal fun App( resetOnFileSelect = { resetStates() selectedTraceFile = it - traceMode = TraceMode.File(it) + traceMode = File(it) }, modifier = Modifier.align(Alignment.BottomStart) ) @@ -156,7 +158,7 @@ internal fun App( if ((traceMode as TraceMode.Live).device == null) { DisplayDevices( onDeviceSelect = { selectedDevice -> - traceMode = TraceMode.Live(selectedDevice) + traceMode = Live(selectedDevice) }, devices = listDevices(), modifier = Modifier.align(Alignment.Center) diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowInfoPanel.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowInfoPanel.kt index f19369082..95d47d6b0 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowInfoPanel.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowInfoPanel.kt @@ -34,7 +34,7 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import com.squareup.workflow1.traceviewer.model.Node import com.squareup.workflow1.traceviewer.model.NodeUpdate -import com.squareup.workflow1.traceviewer.util.computeAnnotatedDiff +import com.squareup.workflow1.traceviewer.util.parser.computeAnnotatedDiff /** * A panel that displays information about the selected workflow node. diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/DisplayDevices.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/control/DisplayDevices.kt similarity index 97% rename from workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/DisplayDevices.kt rename to workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/control/DisplayDevices.kt index 9729c135c..f487a8d55 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/DisplayDevices.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/control/DisplayDevices.kt @@ -1,4 +1,4 @@ -package com.squareup.workflow1.traceviewer.ui +package com.squareup.workflow1.traceviewer.ui.control import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.layout.Box diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/FileDump.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/control/FileDump.kt similarity index 96% rename from workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/FileDump.kt rename to workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/control/FileDump.kt index 49f5e3432..73c30a174 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/FileDump.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/control/FileDump.kt @@ -1,4 +1,4 @@ -package com.squareup.workflow1.traceviewer.util +package com.squareup.workflow1.traceviewer.ui.control import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.CircleShape diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/FrameSelectTab.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/control/FrameSelectTab.kt similarity index 97% rename from workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/FrameSelectTab.kt rename to workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/control/FrameSelectTab.kt index 1d8f8171e..b595d8417 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/FrameSelectTab.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/control/FrameSelectTab.kt @@ -1,4 +1,4 @@ -package com.squareup.workflow1.traceviewer.ui +package com.squareup.workflow1.traceviewer.ui.control import androidx.compose.foundation.MutatePriority import androidx.compose.foundation.clickable diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/SearchBox.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/control/SearchBox.kt similarity index 97% rename from workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/SearchBox.kt rename to workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/control/SearchBox.kt index 57962d796..8a1796561 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/SearchBox.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/control/SearchBox.kt @@ -1,4 +1,4 @@ -package com.squareup.workflow1.traceviewer.ui +package com.squareup.workflow1.traceviewer.ui.control import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/TraceModeToggleSwitch.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/control/TraceModeToggleSwitch.kt similarity index 95% rename from workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/TraceModeToggleSwitch.kt rename to workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/control/TraceModeToggleSwitch.kt index 0c88df899..e2e101294 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/TraceModeToggleSwitch.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/control/TraceModeToggleSwitch.kt @@ -1,4 +1,4 @@ -package com.squareup.workflow1.traceviewer.ui +package com.squareup.workflow1.traceviewer.ui.control import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.padding diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/UploadFile.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/control/UploadFile.kt similarity index 96% rename from workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/UploadFile.kt rename to workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/control/UploadFile.kt index 6daae3691..7f08c33bf 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/UploadFile.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/control/UploadFile.kt @@ -1,4 +1,4 @@ -package com.squareup.workflow1.traceviewer.util +package com.squareup.workflow1.traceviewer.ui.control import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.CircleShape diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/DiffUtils.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/parser/DiffUtils.kt similarity index 97% rename from workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/DiffUtils.kt rename to workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/parser/DiffUtils.kt index 833d96ed9..2cf07df51 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/DiffUtils.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/parser/DiffUtils.kt @@ -1,4 +1,4 @@ -package com.squareup.workflow1.traceviewer.util +package com.squareup.workflow1.traceviewer.util.parser import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.AnnotatedString @@ -6,7 +6,7 @@ import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.buildAnnotatedString import com.github.difflib.text.DiffRow.Tag import com.github.difflib.text.DiffRowGenerator -import com.squareup.workflow1.traceviewer.util.DiffStyles.buildStringWithStyle +import com.squareup.workflow1.traceviewer.util.parser.DiffStyles.buildStringWithStyle /** * Generates a field-level word-diff for each node's states. diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/JsonParser.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/parser/JsonParser.kt similarity index 91% rename from workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/JsonParser.kt rename to workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/parser/JsonParser.kt index abe6acaf0..3403c404f 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/JsonParser.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/parser/JsonParser.kt @@ -1,4 +1,4 @@ -package com.squareup.workflow1.traceviewer.util +package com.squareup.workflow1.traceviewer.util.parser import com.squareup.moshi.JsonAdapter import com.squareup.moshi.Moshi @@ -7,6 +7,8 @@ import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory import com.squareup.workflow1.traceviewer.model.Node import com.squareup.workflow1.traceviewer.model.addChild import com.squareup.workflow1.traceviewer.model.replaceChild +import com.squareup.workflow1.traceviewer.util.parser.ParseResult.Failure +import com.squareup.workflow1.traceviewer.util.parser.ParseResult.Success import io.github.vinceglb.filekit.PlatformFile import io.github.vinceglb.filekit.readString import kotlin.reflect.jvm.javaType @@ -31,11 +33,11 @@ internal suspend fun parseFileTrace( val jsonString = file.readString() val workflowAdapter = createMoshiAdapter>() val parsedRenderPasses = try { - workflowAdapter.fromJson(jsonString) ?: return ParseResult.Failure( + workflowAdapter.fromJson(jsonString) ?: return Failure( IllegalArgumentException("Provided trace file is empty or malformed.") ) } catch (e: Exception) { - return ParseResult.Failure(e) + return Failure(e) } val parsedFrames = parsedRenderPasses.map { renderPass -> getFrameFromRenderPass(renderPass) } @@ -45,7 +47,7 @@ internal suspend fun parseFileTrace( frameTrees.add(mergedTree) mergedTree } - return ParseResult.Success( + return Success( trace = parsedFrames, trees = frameTrees, affectedNodes = parsedRenderPasses @@ -64,11 +66,11 @@ internal fun parseLiveTrace( currentTree: Node? = null ): ParseResult { val parsedRenderPass = try { - adapter.fromJson(renderPass) ?: return ParseResult.Failure( + adapter.fromJson(renderPass) ?: return Failure( IllegalArgumentException("Provided trace data is empty or malformed.") ) } catch (e: Exception) { - return ParseResult.Failure(e) + return Failure(e) } val parsedFrame = getFrameFromRenderPass(parsedRenderPass) @@ -81,7 +83,7 @@ internal fun parseLiveTrace( } // Since live tracing handles one frame at a time, we generalize and return listOf for each. - return ParseResult.Success( + return Success( trace = listOf(parsedFrame), trees = listOf(mergedTree), affectedNodes = listOf(parsedRenderPass) @@ -153,7 +155,8 @@ internal fun mergeFrameIntoMainTree( } internal sealed interface ParseResult { - class Success(val trace: List, val trees: List, affectedNodes: List>) : ParseResult { + class Success(val trace: List, val trees: List, affectedNodes: List>) : + ParseResult { val affectedNodes = affectedNodes.map { it.toSet() } } class Failure(val error: Throwable) : ParseResult diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/TraceParser.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/parser/TraceParser.kt similarity index 96% rename from workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/TraceParser.kt rename to workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/parser/TraceParser.kt index 2dbb6c90c..147f0a6fe 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/TraceParser.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/parser/TraceParser.kt @@ -1,4 +1,4 @@ -package com.squareup.workflow1.traceviewer.util +package com.squareup.workflow1.traceviewer.util.parser import androidx.compose.material.Text import androidx.compose.runtime.Composable @@ -16,6 +16,7 @@ import com.squareup.workflow1.traceviewer.TraceMode import com.squareup.workflow1.traceviewer.model.Node import com.squareup.workflow1.traceviewer.model.NodeUpdate import com.squareup.workflow1.traceviewer.ui.DrawTree +import com.squareup.workflow1.traceviewer.util.streamRenderPassesFromDevice /** * Handles parsing the trace's after JsonParser has turned all render passes into frames. Also calls diff --git a/workflow-trace-viewer/src/jvmTest/kotlin/com/squareup/workflow1/traceviewer/util/JsonParserTest.kt b/workflow-trace-viewer/src/jvmTest/kotlin/com/squareup/workflow1/traceviewer/util/JsonParserTest.kt index 434aac6ba..0d7c890a5 100644 --- a/workflow-trace-viewer/src/jvmTest/kotlin/com/squareup/workflow1/traceviewer/util/JsonParserTest.kt +++ b/workflow-trace-viewer/src/jvmTest/kotlin/com/squareup/workflow1/traceviewer/util/JsonParserTest.kt @@ -1,6 +1,7 @@ package com.squareup.workflow1.traceviewer.util import com.squareup.workflow1.traceviewer.model.Node +import com.squareup.workflow1.traceviewer.util.parser.mergeFrameIntoMainTree import java.util.LinkedHashMap import kotlin.test.Test import kotlin.test.assertEquals From 24fae613d026ac4daceff186510b1fdb8f9b06a2 Mon Sep 17 00:00:00 2001 From: Wenli Cai Date: Tue, 29 Jul 2025 15:38:18 -0400 Subject: [PATCH 30/33] Improve error handling --- .../traceviewer/util/parser/TraceParser.kt | 31 +++++++++++++++++-- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/parser/TraceParser.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/parser/TraceParser.kt index 147f0a6fe..4095df0c9 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/parser/TraceParser.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/parser/TraceParser.kt @@ -1,5 +1,7 @@ package com.squareup.workflow1.traceviewer.util.parser +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.padding import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -11,6 +13,9 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp import com.squareup.moshi.JsonAdapter import com.squareup.workflow1.traceviewer.TraceMode import com.squareup.workflow1.traceviewer.model.Node @@ -46,7 +51,6 @@ internal fun RenderTrace( frames.addAll(frame) fullTree.addAll(tree) affectedNodes.addAll(affected) - isLoading = false onFileParse(frame.size) } @@ -73,6 +77,7 @@ internal fun RenderTrace( rawRenderPass?.let { onNewData(it) } } } + isLoading = false } LaunchedEffect(traceSource) { @@ -100,8 +105,18 @@ internal fun RenderTrace( } } - if (error != null) { - Text("Error parsing: $error") + // This will only happen in the initial switch to Live Mode, where a socket error bubbled up and + // the lambda call to parse the data was immediately cancelled, meaning handleParseResult was never + // called to set isLoading to false + if (isLoading && error != null) { + Text("Socket Error: $error") + return + } + + // This meant that there was an exception, but it was stored in ParseResult and read in + // handleParseResult. Since there is no parsed data, this likely means there was a moshi parsing error + if (error != null && frames.isEmpty()) { + Text("Malformed File: $error") return } @@ -115,5 +130,15 @@ internal fun RenderTrace( onNodeSelect = onNodeSelect, storeNodeLocation = storeNodeLocation ) + + // This error happens when there has already been previous data parsed, but some exception bubbled + // up again, meaning it has to be a socket closure in Live mode. + error?.let { + Text( + text = "Socket closed: $error", + fontSize = 20.sp, + modifier = modifier.background(Color.White).padding(20.dp) + ) + } } } From cc401201ca5bd1eb56bc005548fb0da623556579 Mon Sep 17 00:00:00 2001 From: Wenli Cai Date: Wed, 30 Jul 2025 12:40:46 -0400 Subject: [PATCH 31/33] Make app window snap to the specific node when it is being searched. --- .../com/squareup/workflow1/traceviewer/App.kt | 24 ++++++++++++------- .../workflow1/traceviewer/ui/WorkflowTree.kt | 10 +++++--- .../traceviewer/ui/control/SearchBox.kt | 7 +++++- 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt index 696809f5a..85b999bee 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt @@ -16,8 +16,8 @@ import androidx.compose.runtime.snapshots.SnapshotStateMap import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Offset -import com.squareup.workflow1.traceviewer.TraceMode.File -import com.squareup.workflow1.traceviewer.TraceMode.Live +import androidx.compose.ui.layout.onGloballyPositioned +import androidx.compose.ui.unit.IntSize import com.squareup.workflow1.traceviewer.model.Node import com.squareup.workflow1.traceviewer.model.NodeUpdate import com.squareup.workflow1.traceviewer.ui.ColorLegend @@ -39,6 +39,7 @@ import io.github.vinceglb.filekit.PlatformFile internal fun App( modifier: Modifier = Modifier ) { + var appWindowSize by remember { mutableStateOf(IntSize(0,0)) } var selectedNode by remember { mutableStateOf(null) } var frameSize by remember { mutableIntStateOf(0) } var rawRenderPass by remember { mutableStateOf("") } @@ -60,7 +61,9 @@ internal fun App( } Box( - modifier = modifier + modifier = modifier.onGloballyPositioned { + appWindowSize = it.size + } ) { fun resetStates() { selectedTraceFile = null @@ -115,8 +118,11 @@ internal fun App( SearchBox( nodes = nodeLocations[frameInd].keys.toList(), onSearch = { name -> + sandboxState.scale = 1f val node = nodeLocations[frameInd].keys.firstOrNull { it.name == name } - sandboxState.offset = nodeLocations[frameInd][node] ?: sandboxState.offset + val newX = sandboxState.offset.x - nodeLocations[frameInd][node]!!.x + appWindowSize.width / 2 + val newY = sandboxState.offset.y - nodeLocations[frameInd][node]!!.y + appWindowSize.height / 2 + sandboxState.offset = Offset(x = newX, y = newY) }, modifier = Modifier.align(Alignment.CenterHorizontally) ) @@ -126,16 +132,16 @@ internal fun App( TraceModeToggleSwitch( onToggle = { resetStates() - traceMode = if (traceMode is Live) { + traceMode = if (traceMode is TraceMode.Live) { frameIndex = 0 - File(null) + TraceMode.File(null) } else { /* We set the frame to -1 here since we always increment it during Live mode as the list of frames get populated, so we avoid off by one when indexing into the frames. */ frameIndex = -1 - Live() + TraceMode.Live() } }, traceMode = traceMode, @@ -148,7 +154,7 @@ internal fun App( resetOnFileSelect = { resetStates() selectedTraceFile = it - traceMode = File(it) + traceMode = TraceMode.File(it) }, modifier = Modifier.align(Alignment.BottomStart) ) @@ -158,7 +164,7 @@ internal fun App( if ((traceMode as TraceMode.Live).device == null) { DisplayDevices( onDeviceSelect = { selectedDevice -> - traceMode = Live(selectedDevice) + traceMode = TraceMode.Live(selectedDevice) }, devices = listDevices(), modifier = Modifier.align(Alignment.Center) diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt index 719c8bd37..ad9bfef5c 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt @@ -23,7 +23,7 @@ import androidx.compose.ui.input.pointer.PointerEventType import androidx.compose.ui.input.pointer.isSecondaryPressed import androidx.compose.ui.input.pointer.onPointerEvent import androidx.compose.ui.layout.onGloballyPositioned -import androidx.compose.ui.layout.positionInParent +import androidx.compose.ui.layout.positionInRoot import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.squareup.workflow1.traceviewer.model.Node @@ -305,8 +305,12 @@ private fun DrawNode( } .padding(16.dp) .onGloballyPositioned { coords -> - val offset = coords.positionInParent() - storeNodeLocation(node, offset) + val offsetToTopLeft = coords.positionInRoot() + val offsetToCenter = Offset( + x = offsetToTopLeft.x + coords.size.width / 2, + y = offsetToTopLeft.y + coords.size.height / 2 + ) + storeNodeLocation(node, offsetToCenter) } ) { Column(horizontalAlignment = Alignment.CenterHorizontally) { diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/control/SearchBox.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/control/SearchBox.kt index 8a1796561..8709e2138 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/control/SearchBox.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/control/SearchBox.kt @@ -10,6 +10,7 @@ import androidx.compose.material.icons.filled.Close import androidx.compose.material3.DockedSearchBar import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ListItem +import androidx.compose.material3.ListItemDefaults import androidx.compose.material3.SearchBarColors import androidx.compose.material3.SearchBarDefaults import androidx.compose.runtime.Composable @@ -70,7 +71,11 @@ internal fun SearchBox( .clickable { onSearch(node.name) expanded = false - } + }, + colors = ListItemDefaults.colors( + containerColor = Color.White, + headlineColor = Color.Black + ) ) } } From a9a44e98a74cf4b85a94f939177f39b1c707f1af Mon Sep 17 00:00:00 2001 From: Wenli Cai Date: Wed, 30 Jul 2025 13:08:03 -0400 Subject: [PATCH 32/33] Fix zooming for sandbox --- .../com/squareup/workflow1/traceviewer/App.kt | 1 + .../traceviewer/util/SandboxBackground.kt | 25 ++++++++++++++++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt index 85b999bee..7abf86d9c 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt @@ -76,6 +76,7 @@ internal fun App( // Main content SandboxBackground( + appWindowSize = appWindowSize, sandboxState = sandboxState, ) { // if there is not a file selected and trace mode is live, then don't render anything. diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/SandboxBackground.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/SandboxBackground.kt index a0534a342..bb058746b 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/SandboxBackground.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/SandboxBackground.kt @@ -8,9 +8,12 @@ import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.graphics.TransformOrigin import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.input.pointer.PointerEventType import androidx.compose.ui.input.pointer.pointerInput +import androidx.compose.ui.unit.IntSize import com.squareup.workflow1.traceviewer.SandboxState /** @@ -22,6 +25,7 @@ import com.squareup.workflow1.traceviewer.SandboxState */ @Composable internal fun SandboxBackground( + appWindowSize: IntSize, sandboxState: SandboxState, modifier: Modifier = Modifier, content: @Composable () -> Unit, @@ -41,14 +45,29 @@ internal fun SandboxBackground( awaitEachGesture { val event = awaitPointerEvent() if (event.type == PointerEventType.Scroll) { - val scrollDelta = event.changes.first().scrollDelta.y + val pointerInput = event.changes.first() + val pointerOffsetToCenter = Offset( + // For some reason using 1.5 made zooming more natural than 2 + x = pointerInput.position.x - appWindowSize.width / (3/2), + y = pointerInput.position.y - appWindowSize.height / 2 + ) + val scrollDelta = pointerInput.scrollDelta.y // Applies zoom factor based on the actual delta change rather than just the act of scrolling // This helps to normalize mouse scrolling and touchpad scrolling, since touchpad will // fire a lot more scroll events. val factor = 1f + (-scrollDelta * 0.1f) val minWindowSize = 0.1f - val maxWindowSize = 10f - sandboxState.scale = (sandboxState.scale * factor).coerceIn(minWindowSize, maxWindowSize) + val maxWindowSize = 2f + val oldScale = sandboxState.scale + val newScale = (oldScale * factor).coerceIn(minWindowSize, maxWindowSize) + val scaleRatio = newScale / oldScale + + val newOrigin = sandboxState.offset - pointerOffsetToCenter + val scaledView = newOrigin * scaleRatio + val resetViewOffset = scaledView + pointerOffsetToCenter + sandboxState.offset = resetViewOffset + sandboxState.scale = newScale + event.changes.forEach { it.consume() } } } From 4f9f92b833069e10f8d75ec1e0fd964b1523633a Mon Sep 17 00:00:00 2001 From: Wenli Cai Date: Fri, 1 Aug 2025 17:19:26 -0400 Subject: [PATCH 33/33] Replace color legend with tooltip display on node hover --- .../com/squareup/workflow1/traceviewer/App.kt | 9 +- .../workflow1/traceviewer/ui/ColorLegend.kt | 62 ----------- .../workflow1/traceviewer/ui/WorkflowTree.kt | 102 +++++++++++++----- .../traceviewer/util/SandboxBackground.kt | 3 +- 4 files changed, 75 insertions(+), 101 deletions(-) delete mode 100644 workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/ColorLegend.kt diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt index 7abf86d9c..447b630ee 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt @@ -20,7 +20,6 @@ import androidx.compose.ui.layout.onGloballyPositioned import androidx.compose.ui.unit.IntSize import com.squareup.workflow1.traceviewer.model.Node import com.squareup.workflow1.traceviewer.model.NodeUpdate -import com.squareup.workflow1.traceviewer.ui.ColorLegend import com.squareup.workflow1.traceviewer.ui.RightInfoPanel import com.squareup.workflow1.traceviewer.ui.control.DisplayDevices import com.squareup.workflow1.traceviewer.ui.control.FileDump @@ -39,7 +38,7 @@ import io.github.vinceglb.filekit.PlatformFile internal fun App( modifier: Modifier = Modifier ) { - var appWindowSize by remember { mutableStateOf(IntSize(0,0)) } + var appWindowSize by remember { mutableStateOf(IntSize(0, 0)) } var selectedNode by remember { mutableStateOf(null) } var frameSize by remember { mutableIntStateOf(0) } var rawRenderPass by remember { mutableStateOf("") } @@ -178,12 +177,6 @@ internal fun App( ) } - if (active) { - ColorLegend( - modifier = Modifier.align(Alignment.BottomEnd) - ) - } - RightInfoPanel( selectedNode = selectedNode, modifier = Modifier diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/ColorLegend.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/ColorLegend.kt deleted file mode 100644 index f42ebdadd..000000000 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/ColorLegend.kt +++ /dev/null @@ -1,62 +0,0 @@ -package com.squareup.workflow1.traceviewer.ui - -import androidx.compose.foundation.background -import androidx.compose.foundation.border -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.material.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.text.font.FontStyle -import androidx.compose.ui.unit.dp -import com.squareup.workflow1.traceviewer.model.NodeState - -/** - * Simple UI displaying the color legend for the different node states in the trace - */ -@Composable -fun ColorLegend( - modifier: Modifier = Modifier -) { - Box( - modifier = modifier - ) { - Column( - verticalArrangement = Arrangement.spacedBy(4.dp), - modifier = Modifier.padding(8.dp) - ) { - NodeState.entries.forEach { state -> - Row( - horizontalArrangement = Arrangement.spacedBy(8.dp), - verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.padding(vertical = 2.dp) - ) { - Box( - modifier = Modifier - .size(16.dp) - .background( - color = state.color, - ) - .then( - if (state.color == Color.Transparent) { - modifier.border(1.dp, Color.Gray) - } else { - modifier - } - ) - ) - Text( - text = state.name, - fontStyle = FontStyle.Italic, - ) - } - } - } - } -} diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt index ad9bfef5c..645a3bf54 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt @@ -3,6 +3,9 @@ package com.squareup.workflow1.traceviewer.ui import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.clickable +import androidx.compose.foundation.hoverable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.interaction.collectIsHoveredAsState import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -14,9 +17,12 @@ import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip import androidx.compose.ui.geometry.Offset import androidx.compose.ui.graphics.Color import androidx.compose.ui.input.pointer.PointerEventType @@ -27,6 +33,7 @@ import androidx.compose.ui.layout.positionInRoot import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.squareup.workflow1.traceviewer.model.Node +import com.squareup.workflow1.traceviewer.model.NodeState import com.squareup.workflow1.traceviewer.model.NodeUpdate /** @@ -286,44 +293,81 @@ private fun DrawNode( onExpandToggle: (Node) -> Unit, storeNodeLocation: (Node, Offset) -> Unit ) { + val interactionSource = remember { MutableInteractionSource() } + val isHovered by interactionSource.collectIsHoveredAsState() + val nodeUpdate = NodeUpdate.create( current = node, past = nodePast, isAffected = isAffected ) - Box( - modifier = Modifier - .background(nodeUpdate.state.color) - .clickable { - onNodeSelect(nodeUpdate) - } - .onPointerEvent(PointerEventType.Press) { - if (it.buttons.isSecondaryPressed) { - onExpandToggle(node) + Box { + Box( + modifier = Modifier + .hoverable(interactionSource) + .background(nodeUpdate.state.color) + .clickable { + onNodeSelect(nodeUpdate) } - } - .padding(16.dp) - .onGloballyPositioned { coords -> - val offsetToTopLeft = coords.positionInRoot() - val offsetToCenter = Offset( - x = offsetToTopLeft.x + coords.size.width / 2, - y = offsetToTopLeft.y + coords.size.height / 2 - ) - storeNodeLocation(node, offsetToCenter) - } - ) { - Column(horizontalAlignment = Alignment.CenterHorizontally) { - Row( - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy(4.dp) - ) { - if (node.children.isNotEmpty()) { - Text(text = if (isExpanded) "▼" else "▶") + .onPointerEvent(PointerEventType.Press) { + if (it.buttons.isSecondaryPressed) { + onExpandToggle(node) + } } - Text(text = node.name) + .padding(16.dp) + .onGloballyPositioned { coords -> + val offsetToTopLeft = coords.positionInRoot() + val offsetToCenter = Offset( + x = offsetToTopLeft.x + coords.size.width / 2, + y = offsetToTopLeft.y + coords.size.height / 2 + ) + storeNodeLocation(node, offsetToCenter) + } + ) { + Column(horizontalAlignment = Alignment.CenterHorizontally) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(4.dp) + ) { + if (node.children.isNotEmpty()) { + Text(text = if (isExpanded) "▼" else "▶") + } + Text(text = node.name) + } + Text(text = "ID: ${node.id}") } - Text(text = "ID: ${node.id}") } + + if (isHovered) { + NodeTooltip( + nodeState = nodeUpdate.state, + modifier = Modifier + .align(Alignment.TopEnd) + .background(nodeUpdate.state.color) + ) + } + } +} + +/** + * A tooltip that appears on hover showing the node state type + */ +@Composable +private fun NodeTooltip( + nodeState: NodeState, + modifier: Modifier = Modifier +) { + Box( + modifier = modifier + .clip(RoundedCornerShape(4.dp)) + .background(Color.Black.copy(alpha = 0.3f)) + .padding(horizontal = 8.dp, vertical = 4.dp) + ) { + Text( + text = nodeState.name, + color = Color.White, + fontSize = 12.sp + ) } } diff --git a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/SandboxBackground.kt b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/SandboxBackground.kt index bb058746b..adc5d38b7 100644 --- a/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/SandboxBackground.kt +++ b/workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/SandboxBackground.kt @@ -9,7 +9,6 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Offset -import androidx.compose.ui.graphics.TransformOrigin import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.input.pointer.PointerEventType import androidx.compose.ui.input.pointer.pointerInput @@ -48,7 +47,7 @@ internal fun SandboxBackground( val pointerInput = event.changes.first() val pointerOffsetToCenter = Offset( // For some reason using 1.5 made zooming more natural than 2 - x = pointerInput.position.x - appWindowSize.width / (3/2), + x = pointerInput.position.x - appWindowSize.width / (3 / 2), y = pointerInput.position.y - appWindowSize.height / 2 ) val scrollDelta = pointerInput.scrollDelta.y