Generate SSD log payloads from typed Jerboa

ober

8b79466ee5e4ba71bd7e4e9030d0cc8a6d034f1c

diff --git a/templates/ssd-review.ss b/templates/ssd-review.ss
index 3715483..1a1a676 100644
--- a/templates/ssd-review.ss
+++ b/templates/ssd-review.ss
@@ -4773,6 +4773,7 @@
                       (android content SharedPreferences Editor)
                       (android content res Resources)
                       (android content DialogInterface)
+                      (android content pm PackageInfo)
                       (android content pm PackageManager)
                       (android graphics Bitmap)
                       (android graphics Bitmap Config)
@@ -4787,6 +4788,7 @@
                       (android os Build)
                       (android os Environment)
                       (android os ParcelFileDescriptor)
+                      (android os SystemClock)
                       (android provider DocumentsContract)
                       (android provider OpenableColumns)
                       (android provider Settings)
@@ -5059,6 +5061,7 @@
         (type Matrix)
         (type Page)
         (type PdfRenderer)
+        (type PackageInfo)
         (type Rect)
         (type Runnable)
         (type Thread)
@@ -5296,6 +5299,38 @@
         (extern (statusLogFieldsRawForUi
                   (text : String)) : JSONObject
           (kotlin-call statusLogFields))
+        (extern (clientLogPayloadJsonRawForUi
+                  (event : String)
+                  (uptimeMillis : Int)
+                  (threadName : String)
+                  (app : JSONObject)
+                  (device : JSONObject)
+                  (pdfName : String)
+                  (page : Int32)
+                  (pageCount : Int32)
+                  (selectedGroupId : String)
+                  (fields : JSONObject)) : JSONObject
+          (kotlin-call clientLogPayloadJson))
+        (extern (appLogPackageInfoRawForUi
+                  (packageName : String)) : JSONObject
+          (kotlin-call appLogPackageInfo))
+        (extern (appLogVersionInfoRawForUi
+                  (packageName : String)
+                  (versionName : String)
+                  (versionCode : Int)) : JSONObject
+          (kotlin-call appLogVersionInfo))
+        (extern (androidPackageVersionCodeRawForUi
+                  (sdk : Int32)
+                  (apiP : Int32)
+                  (longVersionCode : Int)
+                  (legacyVersionCode : Int)) : Int
+          (kotlin-call androidPackageVersionCode))
+        (extern (deviceLogInfoJsonRawForUi
+                  (sdk : Int32)
+                  (release : String)
+                  (manufacturer : String)
+                  (model : String)) : JSONObject
+          (kotlin-call deviceLogInfoJson))
         (extern (windowSetSoftInputMode (window : Window) (mode : Int32)) : Unit
           (kotlin-member-call setSoftInputMode))
         (extern (alertDialogIsShowing (dialog : AlertDialog)) : Bool
@@ -5958,11 +5993,6 @@
                   (activity : MainActivity)
                   (uri : Uri)) : (List SsdPdfChoice)
           (kotlin-member-call findSsdPdfsFromTree))
-        (extern (mainActivityClientLogPayloadRaw
-                  (activity : MainActivity)
-                  (event : String)
-                  (fields : JSONObject)) : JSONObject
-          (kotlin-member-call clientLogPayload))
         (extern (mainActivitySendClientLogRaw
                   (activity : MainActivity)
                   (payload : JSONObject)
@@ -5983,10 +6013,44 @@
         (extern (mainActivityStatusViewRaw
                   (activity : MainActivity)) : TextView
           (kotlin-member-get status))
+        (extern (mainActivityPackageManagerRaw
+                  (activity : MainActivity)) : PackageManager
+          (kotlin-member-get packageManager))
+        (extern (packageManagerGetPackageInfoRaw
+                  (manager : PackageManager)
+                  (packageName : String)
+                  (flags : Int32)) : PackageInfo
+          (kotlin-member-call getPackageInfo))
+        (extern (packageInfoVersionCodeRaw
+                  (info : PackageInfo)) : Int32
+          (kotlin-member-get versionCode))
+        (extern (packageInfoLongVersionCodeRaw
+                  (info : PackageInfo)) : Int
+          (kotlin-member-get longVersionCode))
+        (extern (packageInfoVersionNameRaw
+                  (info : PackageInfo)) : (Nullable String)
+          (kotlin-member-get versionName))
         (extern (textViewTextSetRaw
                   (view : TextView)
                   (text : String)) : Unit
           (kotlin-member-set text))
+        (extern (systemClockUptimeMillisRaw) : Int
+          (kotlin-call SystemClock uptimeMillis))
+        (extern (threadCurrentRaw) : Thread
+          (kotlin-call Thread currentThread))
+        (extern (threadNameForUiRaw
+                  (thread : Thread)) : String
+          (kotlin-member-get name))
+        (extern (buildVersionSdkIntRaw) : Int32
+          (kotlin-value Build VERSION SDK_INT))
+        (extern (buildVersionReleaseRaw) : (Nullable String)
+          (kotlin-value Build VERSION RELEASE))
+        (extern (buildVersionCodesP) : Int32
+          (kotlin-value Build VERSION_CODES P))
+        (extern (buildManufacturerRaw) : (Nullable String)
+          (kotlin-value Build MANUFACTURER))
+        (extern (buildModelRaw) : (Nullable String)
+          (kotlin-value Build MODEL))
         (extern (clientCrashLoggerInstalledValueRaw) : Bool
           (kotlin-call clientCrashLoggerInstalledValue))
         (extern (clientCrashLoggerInstalledSetRaw
@@ -7874,6 +7938,53 @@
             event
             fields
             (mainActivityClientLogReadTimeoutMillisValue)))
+        (def (mainActivityAppLogInfo
+               (activity : MainActivity)) : JSONObject
+          (let ((packageName
+                  (mainActivityPackageNameRaw activity)))
+            (let ((fallback
+                    (appLogPackageInfoRawForUi packageName)))
+              (try
+                (let ((info
+                        (packageManagerGetPackageInfoRaw
+                          (mainActivityPackageManagerRaw activity)
+                          packageName
+                          (int32 0))))
+                  (appLogVersionInfoRawForUi
+                    packageName
+                    (nullableTextOrEmpty
+                      (packageInfoVersionNameRaw info))
+                    (androidPackageVersionCodeRawForUi
+                      (buildVersionSdkIntRaw)
+                      (buildVersionCodesP)
+                      (packageInfoLongVersionCodeRaw info)
+                      (int (packageInfoVersionCodeRaw info)))))
+                (catch (error : Exception)
+                  fallback)))))
+        (def (mainActivityDeviceLogInfo) : JSONObject
+          (deviceLogInfoJsonRawForUi
+            (buildVersionSdkIntRaw)
+            (nullableTextOrEmpty (buildVersionReleaseRaw))
+            (nullableTextOrEmpty (buildManufacturerRaw))
+            (nullableTextOrEmpty (buildModelRaw))))
+        (def (mainActivityClientLogPayloadRaw
+               (activity : MainActivity)
+               (event : String)
+               (fields : JSONObject)) : JSONObject
+          (clientLogPayloadJsonRawForUi
+            event
+            (systemClockUptimeMillisRaw)
+            (nullableTextOrEmpty
+              (nullable-some
+                (threadNameForUiRaw (threadCurrentRaw))))
+            (mainActivityAppLogInfo activity)
+            (mainActivityDeviceLogInfo)
+            (mainActivityPdfNameRaw activity)
+            (+ (mainActivityPageIndexRaw activity) (int32 1))
+            (mainActivityPageCountValueRaw activity)
+            (nullableTextOrEmpty
+              (mainActivitySelectedGroupIdRaw activity))
+            fields))
         (def (mainActivityLogDetectResultRaw
                (activity : MainActivity)
                (stage : String)
@@ -11284,7 +11395,7 @@
                   (activity : MainActivity)
                   (event : String)
                   (fields : JSONObject)) : JSONObject
-          (kotlin-member-call clientLogPayload))
+          (kotlin-call mainActivityClientLogPayloadRaw))
         (extern (mainActivityCrashSendClientLogRaw
                   (activity : MainActivity)
                   (payload : JSONObject)
@@ -12544,41 +12655,8 @@
        "            connection.disconnect()"
        "        }"
        "    }"
-       ""
-       "    internal fun clientLogPayload(event: String, fields: JSONObject): JSONObject ="
-       "        clientLogPayloadJson("
-       "            event,"
-       "            SystemClock.uptimeMillis(),"
-       "            nullableTextOrEmpty(Thread.currentThread().name),"
-       "            appLogInfo(),"
-       "            deviceLogInfo(),"
-       "            pdfName,"
-       "            pageIndex + 1,"
-       "            pageCount,"
-       "            nullableTextOrEmpty(selectedGroupId),"
-       "            fields"
-       "        )"
-       ""
-       "    private fun appLogInfo(): JSONObject {"
-       "        val out = appLogPackageInfo(packageName)"
-       "        return try {"
-       "            val info = packageManager.getPackageInfo(packageName, 0)"
-       "            @Suppress(\"DEPRECATION\")"
-       "            val legacyVersionCode = info.versionCode.toLong()"
-       "            val versionCode = androidPackageVersionCode(Build.VERSION.SDK_INT, Build.VERSION_CODES.P, info.longVersionCode, legacyVersionCode)"
-       "            appLogVersionInfo(packageName, nullableTextOrEmpty(info.versionName), versionCode)"
-       "        } catch (_: Exception) { out }"
-       "    }"
-       ""
-       "    private fun deviceLogInfo(): JSONObject ="
-       "        deviceLogInfoJson("
-       "            Build.VERSION.SDK_INT,"
-       "            nullableTextOrEmpty(Build.VERSION.RELEASE),"
-       "            nullableTextOrEmpty(Build.MANUFACTURER),"
-       "            nullableTextOrEmpty(Build.MODEL)"
-       "        )"
-       ""
-       "    internal fun throwableLog(error: Throwable): JSONObject {"
+	       ""
+	       "    internal fun throwableLog(error: Throwable): JSONObject {"
        "        val writer = StringWriter()"
        "        error.printStackTrace(PrintWriter(writer))"
        "        val stack = writer.toString()"