Generate SSD page rendering from typed Jerboa

ober

6e97e8e492594c72b80bfd0369714d2fdd4e91a1

diff --git a/templates/ssd-review.ss b/templates/ssd-review.ss
index ad7bab0..0774d63 100644
--- a/templates/ssd-review.ss
+++ b/templates/ssd-review.ss
@@ -4828,6 +4828,7 @@
                 mainActivityPullTruthDumpAsync
                 mainActivityPushTruthDumpAsync
                 mainActivityMergeRemoteTruthAsync
+                mainActivityRenderCurrentPageAsync
                 mainActivityInstallApproveAreaDialogButton
                 mainActivityInstallAppendDialogButton
                 mainActivityInstallEditDialogButtons
@@ -5342,6 +5343,25 @@
         (extern (mainActivityPageIndexRaw
                   (activity : MainActivity)) : Int32
           (kotlin-member-get pageIndex))
+        (extern (mainActivityRenderPdfPageRaw
+                  (activity : MainActivity)
+                  (uri : Uri)
+                  (page : Int32)) : Bitmap
+          (kotlin-member-call renderPdfPage))
+        (extern (mainActivityRestoreViewportAfterLayoutRaw
+                  (activity : MainActivity)
+                  (viewport : (Nullable ViewportState))) : Unit
+          (kotlin-member-call restoreViewportAfterLayout))
+        (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 (mainActivityCurrentSessionRaw
                   (activity : MainActivity)) : (Nullable SsdSession)
           (kotlin-member-get currentSession))
@@ -6918,6 +6938,73 @@
                                     (int32 0)
                                     (int32 0))))))))
                       (begin))))))))
+        (def (mainActivityRenderCurrentPageAsync
+               (activity : MainActivity)
+               (view : SsdReviewView)
+               (uri : Uri)
+               (renderPageIndex : Int32)
+               (renderGeneration : Int32)
+               (renderPdfName : String)
+               (renderPdfSha1 : String)
+               (renderPageCount : Int32)
+               (restoredViewport : (Nullable ViewportState))) : Unit
+          (runBackground
+            (lambda ()
+              (try
+                (let ((bitmap
+                        (mainActivityRenderPdfPageRaw
+                          activity
+                          uri
+                          renderPageIndex)))
+                  (mainActivityRunOnUiThreadRaw
+                    activity
+                    (lambda ()
+                      (if (currentLoadStale
+                            renderGeneration
+                            (mainActivityLoadGenerationRaw activity)
+                            (mainActivityPdfUriRaw activity)
+                            uri
+                            (mainActivityPageIndexRaw activity)
+                            renderPageIndex)
+                        (begin)
+                        (begin
+                          (mainActivityShowBitmapAndClearSession
+                            activity
+                            view
+                            bitmap)
+                          (mainActivityRestoreViewportAfterLayoutRaw
+                            activity
+                            restoredViewport)
+                          (mainActivitySetStatusRaw
+                            activity
+                            (renderedLoadingTruthStatus
+                              renderPdfName
+                              renderPageIndex
+                              renderPageCount))
+                          (mainActivityDetectCurrentRaw
+                            activity
+                            #f
+                            renderGeneration
+                            renderPageIndex
+                            (nullable-some uri)
+                            renderPdfName
+                            renderPdfSha1
+                            renderPageCount))))))
+                (catch (error : Exception)
+                  (mainActivityRunOnUiThreadRaw
+                    activity
+                    (lambda ()
+                      (if (currentLoadMatches
+                            renderGeneration
+                            (mainActivityLoadGenerationRaw activity)
+                            (mainActivityPdfUriRaw activity)
+                            uri
+                            (mainActivityPageIndexRaw activity)
+                            renderPageIndex)
+                        (mainActivitySetStatusRaw
+                          activity
+                          (renderFailedStatus (exceptionMessageRaw error)))
+                        (begin)))))))))
         (def (mainActivityInstallApproveAreaDialogButton
                (activity : MainActivity)
                (dialog : AlertDialog)
@@ -8707,7 +8794,7 @@
 	       "        reviewViewClearInteractionState(reviewView)"
 	       "    }"
        ""
-       "    private fun restoreViewportAfterLayout(viewport: ViewportState?) {"
+       "    internal fun restoreViewportAfterLayout(viewport: ViewportState?) {"
        "        reviewViewRestoreViewportAfterLayout(reviewView, viewport)"
        "    }"
        ""
@@ -8831,34 +8918,20 @@
        "        val renderPdfSha1 = pdfSha1"
        "        val renderPageCount = pageCount"
        "        val restoredViewport = restoredViewportFor(uri, renderPageIndex)"
-       "        thread {"
-       "            try {"
-       "                val bitmap = renderPdfPage(uri, renderPageIndex)"
-       "                runOnUiThread {"
-       "                    if (isStaleLoad(renderGeneration, uri, renderPageIndex)) return@runOnUiThread"
-       "                    mainActivityShowBitmapAndClearSession(this, reviewView, bitmap)"
-       "                    restoreViewportAfterLayout(restoredViewport)"
-	       "                    setStatus(renderedLoadingTruthStatus(renderPdfName, renderPageIndex, renderPageCount))"
-       "                    detectCurrent("
-       "                        expectedGeneration = renderGeneration,"
-       "                        expectedPageIndex = renderPageIndex,"
-       "                        expectedUri = uri,"
-       "                        expectedPdfName = renderPdfName,"
-       "                        expectedPdfSha1 = renderPdfSha1,"
-       "                        expectedPageCount = renderPageCount"
-       "                    )"
-       "                }"
-       "            } catch (error: Exception) {"
-       "                runOnUiThread {"
-       "                    if (isCurrentLoad(renderGeneration, uri, renderPageIndex)) {"
-       "                        setStatus(renderFailedStatus(error.message))"
-       "                    }"
-       "                }"
-       "            }"
-       "        }"
+       "        mainActivityRenderCurrentPageAsync("
+       "            this,"
+       "            reviewView,"
+       "            uri,"
+       "            renderPageIndex,"
+       "            renderGeneration,"
+       "            renderPdfName,"
+       "            renderPdfSha1,"
+       "            renderPageCount,"
+       "            restoredViewport"
+       "        )"
        "    }"
        ""
-       "    private fun detectCurrent("
+       "    internal fun detectCurrent("
        "        forceDetect: Boolean = false,"
        "        expectedGeneration: Int = loadGeneration,"
        "        expectedPageIndex: Int = pageIndex,"
@@ -9590,7 +9663,7 @@
        "        openPdfRenderer(uri).use { renderer -> return renderer.pageCount }"
        "    }"
        ""
-       "    private fun renderPdfPage(uri: Uri, index: Int): Bitmap {"
+       "    internal fun renderPdfPage(uri: Uri, index: Int): Bitmap {"
        "        openPdfRenderer(uri).use { renderer ->"
        "            renderer.openPage(index).use { page ->"
        "                val scale = DPI / 72f"