Move parameters and extras from Request.toString() to toStringVerbose()

The parameter and extra map are both too long to be printed out. Move
them to a new dedicated method, `toStringVerbose`, to allow developers
to utilize it if they need more verbose logging of their `Request`s.

Bug: 340353641
Test: CameraPipe test app and logcat
Change-Id: Ic3331cefe20257bcdede198df5c00eeb2e639f2d
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/Requests.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/Requests.kt
index 89467a3..215086b 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/Requests.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/Requests.kt
@@ -270,19 +270,27 @@
     @Suppress("UNCHECKED_CAST")
     private fun <T> getUnchecked(key: CaptureRequest.Key<T>): T? = this.parameters[key] as T?
 
-    override fun toString(): String {
+    override fun toString(): String = toStringInternal(verbose = false)
+
+    public fun toStringVerbose(): String = toStringInternal(verbose = true)
+
+    private fun toStringInternal(verbose: Boolean): String {
+        val templateString = if (template == null) "" else ", template=$template"
+        // Ignore listener count, always include stream list (required).
         val parametersString =
-            if (parameters.isEmpty()) {
-                ""
-            } else {
+            if (verbose && parameters.isNotEmpty()) {
                 ", parameters=${Debug.formatParameterMap(parameters, limit = 5)}"
+            } else {
+                ""
             }
         val extrasString =
-            if (extras.isEmpty()) "" else ", extras=${Debug.formatParameterMap(extras, limit = 5)}"
-        val templateString = if (template == null) "" else ", template=$template"
-        // Ignore listener count, always include stream list (required), and use super.toString to
-        // reference the class name.
-        return "Request(streams=$streams$templateString$parametersString$extrasString)"
+            if (verbose && extras.isNotEmpty()) {
+                ", extras=${Debug.formatParameterMap(extras, limit = 5)}"
+            } else {
+                ""
+            }
+        return "Request(streams=$streams$templateString$parametersString$extrasString)" +
+            "@${Integer.toHexString(hashCode())}"
     }
 }
 
diff --git a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/RequestTest.kt b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/RequestTest.kt
index 2fd75c1..3184042 100644
--- a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/RequestTest.kt
+++ b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/RequestTest.kt
@@ -63,9 +63,21 @@
         assertThat("$request1").contains("1")
         assertThat("$request1").contains("Request")
 
-        assertThat("$request").contains("42")
-        assertThat("$request").contains("parameters")
-        assertThat("$request").contains("extras")
+        val requestString = request.toStringVerbose()
+        assertThat(requestString).contains("42")
+        assertThat(requestString).contains("parameters")
+        assertThat(requestString).contains("extras")
+    }
+
+    @Test
+    fun requestHasNiceLoggingString_notEqual() {
+        val request1 = Request(listOf(StreamId(1)))
+        val request2 = Request(listOf(StreamId(1)))
+
+        assertThat(request1).isNotEqualTo(request2)
+
+        // The Request string should be different if the Requests themselves are different.
+        assertThat("$request1").isNotEqualTo("$request2")
     }
 
     @Test