Flexiglass: add SceneStack.toString

I'd like to print the back stack in a debug message in a future change,
but it didn't have a toString, so I'm implementing one.

Bug: 364076359
Test: builds
Flag: com.android.systemui.scene_container
Change-Id: I6d048a4fe8f79c3e11977a25dfa0b29074cf79cd
diff --git a/packages/SystemUI/src/com/android/systemui/scene/data/model/SceneStack.kt b/packages/SystemUI/src/com/android/systemui/scene/data/model/SceneStack.kt
index 323bb3d..6479e57 100644
--- a/packages/SystemUI/src/com/android/systemui/scene/data/model/SceneStack.kt
+++ b/packages/SystemUI/src/com/android/systemui/scene/data/model/SceneStack.kt
@@ -21,10 +21,6 @@
 /** An immutable stack of [SceneKey]s backed by a singly-linked list. */
 sealed interface SceneStack
 
-private data object EmptyStack : SceneStack
-
-private data class StackedNodes(val head: SceneKey, val tail: SceneStack) : SceneStack
-
 /** Returns the scene at the head of the stack, or `null` if empty. O(1) */
 fun SceneStack.peek(): SceneKey? =
     when (this) {
@@ -69,3 +65,14 @@
     }
     return result
 }
+
+private data object EmptyStack : SceneStack {
+    override fun toString() = sceneStackToString()
+}
+
+private data class StackedNodes(val head: SceneKey, val tail: SceneStack) : SceneStack {
+    override fun toString() = sceneStackToString()
+}
+
+private fun SceneStack.sceneStackToString(): String =
+    asIterable().joinToString { it.testTag }.let { "SceneStack([$it])" }
diff --git a/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneBackInteractor.kt b/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneBackInteractor.kt
index afb72f0..bebd398 100644
--- a/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneBackInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneBackInteractor.kt
@@ -19,7 +19,6 @@
 import com.android.compose.animation.scene.SceneKey
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.scene.data.model.SceneStack
-import com.android.systemui.scene.data.model.asIterable
 import com.android.systemui.scene.data.model.peek
 import com.android.systemui.scene.data.model.pop
 import com.android.systemui.scene.data.model.push
@@ -68,13 +67,13 @@
                     checkNotNull(stack.pop()) { "Cannot pop ${from.debugName} when stack is empty" }
             }
         }
-        logger.logSceneBackStack(backStack.value.asIterable())
+        logger.logSceneBackStack(backStack.value)
     }
 
     /** Applies the given [transform] to the back stack. */
     fun updateBackStack(transform: (SceneStack) -> SceneStack) {
         _backStack.update { stack -> transform(stack) }
-        logger.logSceneBackStack(backStack.value.asIterable())
+        logger.logSceneBackStack(backStack.value)
     }
 
     private fun stackOperation(from: SceneKey, to: SceneKey, stack: SceneStack): StackOperation? {
diff --git a/packages/SystemUI/src/com/android/systemui/scene/shared/logger/SceneLogger.kt b/packages/SystemUI/src/com/android/systemui/scene/shared/logger/SceneLogger.kt
index fb53ddb..16c2ef5 100644
--- a/packages/SystemUI/src/com/android/systemui/scene/shared/logger/SceneLogger.kt
+++ b/packages/SystemUI/src/com/android/systemui/scene/shared/logger/SceneLogger.kt
@@ -22,6 +22,7 @@
 import com.android.systemui.log.LogBuffer
 import com.android.systemui.log.core.LogLevel
 import com.android.systemui.log.dagger.SceneFrameworkLog
+import com.android.systemui.scene.data.model.SceneStack
 import javax.inject.Inject
 
 class SceneLogger @Inject constructor(@SceneFrameworkLog private val logBuffer: LogBuffer) {
@@ -40,16 +41,11 @@
             },
             messagePrinter = {
                 "Scene framework is ${asWord(bool1)}${if (str1 != null) " $str1" else ""}"
-            }
+            },
         )
     }
 
-    fun logSceneChanged(
-        from: SceneKey,
-        to: SceneKey,
-        reason: String,
-        isInstant: Boolean,
-    ) {
+    fun logSceneChanged(from: SceneKey, to: SceneKey, reason: String, isInstant: Boolean) {
         logBuffer.log(
             tag = TAG,
             level = LogLevel.INFO,
@@ -123,11 +119,7 @@
         )
     }
 
-    fun logVisibilityChange(
-        from: Boolean,
-        to: Boolean,
-        reason: String,
-    ) {
+    fun logVisibilityChange(from: Boolean, to: Boolean, reason: String) {
         fun asWord(isVisible: Boolean): String {
             return if (isVisible) "visible" else "invisible"
         }
@@ -144,9 +136,7 @@
         )
     }
 
-    fun logRemoteUserInputStarted(
-        reason: String,
-    ) {
+    fun logRemoteUserInputStarted(reason: String) {
         logBuffer.log(
             tag = TAG,
             level = LogLevel.INFO,
@@ -164,11 +154,11 @@
         )
     }
 
-    fun logSceneBackStack(backStack: Iterable<SceneKey>) {
+    fun logSceneBackStack(backStack: SceneStack) {
         logBuffer.log(
             tag = TAG,
             level = LogLevel.INFO,
-            messageInitializer = { str1 = backStack.joinToString(", ") { it.debugName } },
+            messageInitializer = { str1 = backStack.toString() },
             messagePrinter = { "back stack: $str1" },
         )
     }