瀏覽代碼

ui: wizard: Quick and dirty JSON pretty-printer

Peter Cai 1 年之前
父節點
當前提交
74d7da35dc

+ 10 - 1
app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardDiagnosticsFragment.kt

@@ -6,6 +6,7 @@ import android.view.View
 import android.view.ViewGroup
 import android.widget.TextView
 import im.angry.openeuicc.common.R
+import im.angry.openeuicc.util.*
 
 class DownloadWizardDiagnosticsFragment : DownloadWizardActivity.DownloadWizardStepFragment() {
     override val hasNext: Boolean
@@ -59,7 +60,15 @@ class DownloadWizardDiagnosticsFragment : DownloadWizardActivity.DownloadWizardS
 
             ret.appendLine(getString(R.string.download_wizard_diagnostics_last_http_response))
             ret.appendLine()
-            ret.appendLine(resp.data.decodeToString(throwOnInvalidSequence = false))
+
+            val str = resp.data.decodeToString(throwOnInvalidSequence = false)
+            ret.appendLine(
+                if (str.startsWith('{')) {
+                    str.prettyPrintJson()
+                } else {
+                    str
+                }
+            )
         }
 
         ret.toString()

+ 66 - 1
app-common/src/main/java/im/angry/openeuicc/util/StringUtils.kt

@@ -27,4 +27,69 @@ fun formatFreeSpace(size: Int): String =
         "%.2f KiB".format(size.toDouble() / 1024)
     } else {
         "$size B"
-    }
+    }
+
+fun String.prettyPrintJson(): String {
+    val ret = StringBuilder()
+    var inQuotes = false
+    var escaped = false
+    val indentSymbolStack = ArrayDeque<Char>()
+
+    val addNewLine = {
+        ret.append('\n')
+        repeat(indentSymbolStack.size) {
+            ret.append('\t')
+        }
+    }
+
+    var lastChar = ' '
+
+    for (c in this) {
+        when {
+            !inQuotes && (c == '{' || c == '[') -> {
+                ret.append(c)
+                indentSymbolStack.addLast(c)
+                addNewLine()
+            }
+
+            !inQuotes && (c == '}' || c == ']') -> {
+                indentSymbolStack.removeLast()
+                if (lastChar != ',') {
+                    addNewLine()
+                }
+                ret.append(c)
+            }
+
+            !inQuotes && c == ',' -> {
+                ret.append(c)
+                addNewLine()
+            }
+
+            !inQuotes && c == ':' -> {
+                ret.append(c)
+                ret.append(' ')
+            }
+
+            inQuotes && c == '\\' -> {
+                ret.append(c)
+                escaped = true
+                continue
+            }
+
+            !escaped && c == '"' -> {
+                ret.append(c)
+                inQuotes = !inQuotes
+            }
+
+            else -> ret.append(c)
+        }
+
+        if (escaped) {
+            escaped = false
+        }
+
+        lastChar = c
+    }
+
+    return ret.toString()
+}