Move SSD vision bridge calls to typed Kotlin

ober

73627d583a700bf739ed9747ad0d4d165df5ce3d

diff --git a/templates/ssd-review.ss b/templates/ssd-review.ss
index f8ca681..f7f451c 100644
--- a/templates/ssd-review.ss
+++ b/templates/ssd-review.ss
@@ -7860,7 +7860,7 @@
        "                    truthStoreApplyTruthAndPrune(truthStore, session)"
        "                } else {"
        "                    copyExistingTruthSsdArea(session, existingTruth)"
-       "                    val nativeDetection = SsdVisionBridge.detect(bitmap)"
+       "                    val nativeDetection = ssdVisionDetect(bitmap)"
        "                    val detectedCells: List<SsdCell>"
        "                    if (nativeDetectionPresent(nativeDetection)) {"
        "                        val rustDetection = nativeDetectionOrEmpty(nativeDetection)"
@@ -7877,7 +7877,7 @@
        "                        truthStoreApplyTruthAndPrune(truthStore, session)"
        "                    }"
        "                    applyInitialGuesses(this, session)"
-       "                    ssdSessionAddOcrWords(session, SsdOcr.recognizeWords(bitmap))"
+       "                    ssdSessionAddOcrWords(session, ssdOcrRecognizeWords(bitmap))"
        "                    ocrGuesses = applyOcrGuesses(this, session, SsdOcr.patterns)"
        "                }"
        "                val learnedGuesses = learnedGuessesForDetection(truthStore, session, existingTruthGroupCount)"
@@ -7900,8 +7900,8 @@
        "                            detectFailedLogFields("
        "                                sourceKey(expectedPdfSha1, expectedPageIndex + 1, DPI),"
        "                                forceDetect,"
-       "                                SsdVisionBridge.isAvailable(),"
-       "                                SsdVisionBridge.loadErrorMessage(),"
+       "                                ssdVisionAvailable(),"
+       "                                ssdVisionLoadErrorMessage(),"
        "                                throwableLog(error)"
        "                            )"
        "                        )"
@@ -8690,8 +8690,8 @@
        "                detectorSource,"
        "                learnedGuesses,"
        "                ocrGuesses,"
-       "                SsdVisionBridge.isAvailable(),"
-       "                SsdVisionBridge.loadErrorMessage()"
+       "                ssdVisionAvailable(),"
+       "                ssdVisionLoadErrorMessage()"
        "            )"
        "        )"
        "    }"
@@ -8987,18 +8987,44 @@
         (def (shrinkRectToBoxFill (bitmap : Bitmap)
                                   (rect : FloatArray)) : (Nullable FloatArray)
           (shrinkRectByMaskKind bitmap rect (int32 1)))
-        (def (shrinkRectToBitmapContentOrOriginal
-               (bitmap : (Nullable Bitmap))
-               (rect : FloatArray)) : FloatArray
-          (if (nullable-null? bitmap)
-            rect
-            (let ((box (shrinkRectToBoxFill (nullable-get bitmap) rect)))
-              (if (nullable-null? box)
-                (let ((ink (shrinkRectToInk (nullable-get bitmap) rect)))
-                  (if (nullable-null? ink)
-                    rect
-                    (nullable-get ink)))
-                (nullable-get box)))))))
+	        (def (shrinkRectToBitmapContentOrOriginal
+	               (bitmap : (Nullable Bitmap))
+	               (rect : FloatArray)) : FloatArray
+	          (if (nullable-null? bitmap)
+	            rect
+	            (let ((box (shrinkRectToBoxFill (nullable-get bitmap) rect)))
+	              (if (nullable-null? box)
+	                (let ((ink (shrinkRectToInk (nullable-get bitmap) rect)))
+	                  (if (nullable-null? ink)
+	                    rect
+	                    (nullable-get ink)))
+	                (nullable-get box)))))))
+
+    (typed-kotlin-file "com/sfb/ssdreview/SsdVisionBridgeCalls.kt"
+      (kotlin-imports (android graphics Bitmap))
+      (typed-library (com sfb ssdreview)
+        (export ssdVisionDetect ssdVisionAvailable ssdVisionLoadErrorMessage
+                ssdOcrRecognizeWords)
+        (type Bitmap)
+        (type NativeDetection)
+        (type OcrWord)
+        (extern (ssdVisionDetectRaw
+                  (bitmap : Bitmap)) : (Nullable NativeDetection)
+          (kotlin-call SsdVisionBridge detect))
+        (extern (ssdVisionAvailableRaw) : Bool
+          (kotlin-call SsdVisionBridge isAvailable))
+        (extern (ssdVisionLoadErrorMessageRaw) : String
+          (kotlin-call SsdVisionBridge loadErrorMessage))
+        (extern (ssdOcrRecognizeWordsRaw (bitmap : Bitmap)) : (List OcrWord)
+          (kotlin-call SsdOcr recognizeWords))
+        (def (ssdVisionDetect (bitmap : Bitmap)) : (Nullable NativeDetection)
+          (ssdVisionDetectRaw bitmap))
+        (def (ssdVisionAvailable) : Bool
+          (ssdVisionAvailableRaw))
+        (def (ssdVisionLoadErrorMessage) : String
+          (ssdVisionLoadErrorMessageRaw))
+        (def (ssdOcrRecognizeWords (bitmap : Bitmap)) : (List OcrWord)
+          (ssdOcrRecognizeWordsRaw bitmap))))
     (kotlin-file-lines "com/sfb/ssdreview/SsdVisionBridge.kt"
       (
        "package com.sfb.ssdreview"