Generate SSD detection dispatch from typed Jerboa

ober

b887d472fc9833eca85e11c4da9d8a58138acb37

diff --git a/templates/ssd-review.ss b/templates/ssd-review.ss
index 058ee12..f507d0c 100644
--- a/templates/ssd-review.ss
+++ b/templates/ssd-review.ss
@@ -5813,16 +5813,6 @@
                   (uri : Uri)
                   (page : Int32)) : Bitmap
           (kotlin-member-call renderPdfPage))
-        (extern (mainActivityDetectCurrentRaw
-                  (activity : MainActivity)
-                  (forceDetect : Bool)
-                  (expectedGeneration : Int32)
-                  (expectedPageIndex : Int32)
-                  (expectedUri : (Nullable Uri))
-                  (expectedPdfName : String)
-                  (expectedPdfSha1 : String)
-                  (expectedPageCount : Int32)) : Unit
-          (kotlin-member-call detectCurrent))
         (extern (mainActivityPdfPageCountRaw
                   (activity : MainActivity)
                   (uri : Uri)) : Int32
@@ -5839,6 +5829,12 @@
         (extern (mainActivityCurrentSessionRaw
                   (activity : MainActivity)) : (Nullable SsdSession)
           (kotlin-member-get currentSession))
+        (extern (mainActivityCurrentBitmapRaw
+                  (activity : MainActivity)) : (Nullable Bitmap)
+          (kotlin-member-get currentBitmap))
+        (extern (mainActivityTruthStoreRaw
+                  (activity : MainActivity)) : TruthStore
+          (kotlin-member-get truthStore))
         (extern (mainActivitySelectedGroupIdRaw
                   (activity : MainActivity)) : (Nullable String)
           (kotlin-member-get selectedGroupId))
@@ -7426,9 +7422,47 @@
                 boxTypeDisplays
                 confirmHaptic
                 rejectHaptic))))
+        (def (mainActivityDetectCurrent
+               (activity : MainActivity)
+               (forceDetect : Bool)
+               (expectedGeneration : Int32)
+               (expectedPageIndex : Int32)
+               (expectedUri : (Nullable Uri))
+               (expectedPdfName : String)
+               (expectedPdfSha1 : String)
+               (expectedPageCount : Int32)
+               (dpi : Int32)
+               (fastTruthGroupThreshold : Int32)
+               (targetCellCount : Int32)
+               (clientLogReadTimeoutMillis : Int32)) : Unit
+          (let ((bitmap (mainActivityCurrentBitmapRaw activity)))
+            (if (bitmapLoaded bitmap)
+              (if (pdfUriLoaded expectedUri)
+                (mainActivityDetectCurrentAsync
+                  activity
+                  (mainActivityReviewViewRaw activity)
+                  (mainActivityTruthStoreRaw activity)
+                  (nullable-get bitmap)
+                  (uriOrEmpty expectedUri)
+                  forceDetect
+                  expectedGeneration
+                  expectedPageIndex
+                  expectedPdfName
+                  expectedPdfSha1
+                  expectedPageCount
+                  dpi
+                  fastTruthGroupThreshold
+                  targetCellCount
+                  clientLogReadTimeoutMillis)
+                (begin))
+              (begin))))
         (def (mainActivityDetectCurrentForceWithState
-               (activity : MainActivity)) : Unit
-          (mainActivityDetectCurrentRaw
+               (activity : MainActivity)
+               (dpi : Int32)
+               (fastTruthGroupThreshold : Int32)
+               (targetCellCount : Int32)
+               (clientLogReadTimeoutMillis : Int32)) : Unit
+          (mainActivityDetectCurrent
             activity
             #t
             (mainActivityLoadGenerationRaw activity)
@@ -7436,7 +7470,11 @@
             (mainActivityPdfUriRaw activity)
             (mainActivityPdfNameRaw activity)
             (mainActivityPdfSha1Raw activity)
-            (mainActivityPageCountValueRaw activity)))
+            (mainActivityPageCountValueRaw activity)
+            dpi
+            fastTruthGroupThreshold
+            targetCellCount
+            clientLogReadTimeoutMillis))
         (def (mainActivityApplySsdArea
                (activity : MainActivity)
                (view : SsdReviewView)
@@ -7482,7 +7520,11 @@
                         "SSD area saved; detecting inside boundary..."
                         (lambda ()
                           (mainActivityDetectCurrentForceWithState
-                            activity))))))))))
+                            activity
+                            (mainActivityDpiValue)
+                            (mainActivityFastTruthGroupThresholdValue)
+                            (int32 120)
+                            (mainActivityClientLogReadTimeoutMillisValue)))))))))))
         (def (mainActivityAddApprovedAreaGroup
                (activity : MainActivity)
                (view : SsdReviewView)
@@ -7877,6 +7919,12 @@
           (kotlin-member-call getString))
         (extern (contextModePrivate) : Int32
           (kotlin-value Context MODE_PRIVATE))
+        (extern (mainActivityDpiValue) : Int32
+          (kotlin-value DPI))
+        (extern (mainActivityFastTruthGroupThresholdValue) : Int32
+          (kotlin-value FAST_TRUTH_GROUP_THRESHOLD))
+        (extern (mainActivityClientLogReadTimeoutMillisValue) : Int32
+          (kotlin-value CLIENT_LOG_READ_TIMEOUT_MS))
         (extern (documentsContractBuildDocumentUriRaw
                   (authority : String)
                   (documentId : String)) : Uri
@@ -9034,7 +9082,7 @@
                               renderPdfName
                               renderPageIndex
                               renderPageCount))
-                          (mainActivityDetectCurrentRaw
+                          (mainActivityDetectCurrent
                             activity
                             #f
                             renderGeneration
@@ -9042,7 +9090,11 @@
                             (nullable-some uri)
                             renderPdfName
                             renderPdfSha1
-                            renderPageCount))))))
+                            renderPageCount
+                            (mainActivityDpiValue)
+                            (mainActivityFastTruthGroupThresholdValue)
+                            (int32 120)
+                            (mainActivityClientLogReadTimeoutMillisValue)))))))
                 (catch (error : Exception)
                   (mainActivityRunOnUiThreadRaw
                     activity
@@ -11571,7 +11623,7 @@
        "            orientation = LinearLayout.VERTICAL"
        "            addView(mainActivityActionRow(this@MainActivity, LinearLayout.HORIZONTAL, Gravity.CENTER_VERTICAL,"
 	       "                mainActivityButton(this@MainActivity, \"Open SSDs\", ButtonKind.PRIMARY) { mainActivityOpenPdf(this@MainActivity, REQ_OPEN_PDF, REQ_OPEN_SSD_PDF_TREE, REQ_READ_STORAGE, PREF_SSD_PDF_TREE_URI, PREF_LAST_PDF_URI, Build.VERSION.SDK_INT, Build.VERSION_CODES.R, Build.VERSION_CODES.M, Manifest.permission.READ_EXTERNAL_STORAGE, Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION, Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION) },"
-	       "                mainActivityButton(this@MainActivity, \"Detect\", ButtonKind.ACCENT) { detectCurrent(forceDetect = true) },"
+	       "                mainActivityButton(this@MainActivity, \"Detect\", ButtonKind.ACCENT) { mainActivityDetectCurrentForceWithState(this@MainActivity, DPI, FAST_TRUTH_GROUP_THRESHOLD, 120, CLIENT_LOG_READ_TIMEOUT_MS) },"
 	       "                mainActivityButton(this@MainActivity, \"Set SSD Area\", ButtonKind.MODE) { mainActivityStartSsdAreaMode(this@MainActivity, reviewView, currentSession, selectedGroupId, HapticFeedbackConstants.CLOCK_TICK) },"
 	       "            ))"
 	       "            addView(mainActivityActionRow(this@MainActivity, LinearLayout.HORIZONTAL, Gravity.CENTER_VERTICAL,"
@@ -11615,38 +11667,6 @@
        "        return root"
        "    }"
        ""
-       "    internal fun detectCurrent("
-       "        forceDetect: Boolean = false,"
-       "        expectedGeneration: Int = loadGeneration,"
-       "        expectedPageIndex: Int = pageIndex,"
-       "        expectedUri: Uri? = pdfUri,"
-       "        expectedPdfName: String = pdfName,"
-       "        expectedPdfSha1: String = pdfSha1,"
-       "        expectedPageCount: Int = pageCount"
-       "    ) {"
-       "        if (!bitmapLoaded(currentBitmap)) return"
-       "        val bitmap = checkNotNull(currentBitmap)"
-       "        if (!pdfUriLoaded(expectedUri)) return"
-       "        val uri = uriOrEmpty(expectedUri)"
-       "        mainActivityDetectCurrentAsync("
-       "            this,"
-       "            reviewView,"
-       "            truthStore,"
-       "            bitmap,"
-       "            uri,"
-       "            forceDetect,"
-       "            expectedGeneration,"
-       "            expectedPageIndex,"
-       "            expectedPdfName,"
-       "            expectedPdfSha1,"
-       "            expectedPageCount,"
-       "            DPI,"
-       "            FAST_TRUTH_GROUP_THRESHOLD,"
-       "            120,"
-       "            CLIENT_LOG_READ_TIMEOUT_MS"
-       "        )"
-       "    }"
-       ""
        "    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {"
        "        super.onActivityResult(requestCode, resultCode, data)"
        "        if (activityResultRejected(resultCode, RESULT_OK)) return"