Move SSD save viewport selection to typed Kotlin

ober

56a3c2834f40ed3f83f2648f6ef137451b5baf1b

diff --git a/templates/ssd-review.ss b/templates/ssd-review.ss
index e5e26b3..8075c89 100644
--- a/templates/ssd-review.ss
+++ b/templates/ssd-review.ss
@@ -4416,7 +4416,7 @@
                 selectionIgnoredLoadingStatus
                 shouldShowFiringArc shouldFocusFiringArc
                 canvasLabelPresent canvasLabelMissing groupIdSelected
-                shouldCaptureViewport pdfUriLoaded uriOrEmpty
+                shouldCaptureViewport viewportForSave pdfUriLoaded uriOrEmpty
                 intentDataUriPresent intentDataUriOrEmpty intentFlagsOrZero
                 sessionMissing
                 viewportStatePresent viewportStateOrEmpty
@@ -4474,6 +4474,7 @@
         (type DocumentFile)
         (type JSONObject)
         (type SsdSession)
+        (type SsdReviewView)
         (type TruthStore)
         (type ViewportState)
         (extern (fileIsFile (file : File)) : Bool
@@ -4506,6 +4507,8 @@
         (extern (truthStoreLoadTruth (store : TruthStore)
                                      (session : SsdSession)) : (Nullable JSONObject)
           (kotlin-member-call loadTruth))
+        (extern (reviewViewCaptureViewport (view : SsdReviewView)) : (Nullable ViewportState)
+          (kotlin-member-call captureViewport))
         (def (normalizeFiringArc (value : String)) : String
           (string-uppercase (string-trim value)))
         (def (normalizeLabel (value : String)) : String
@@ -4943,6 +4946,11 @@
             (equal? groupId (nullable-get selectedGroupId))))
         (def (shouldCaptureViewport (includeViewport : Bool)) : Bool
           includeViewport)
+        (def (viewportForSave (view : SsdReviewView)
+                              (includeViewport : Bool)) : (Nullable ViewportState)
+          (if (shouldCaptureViewport includeViewport)
+            (reviewViewCaptureViewport view)
+            (nullable-none ViewportState)))
         (extern (uriParse (text : String)) : Uri
           (kotlin-call Uri parse))
         (extern (intentDataUri (intent : Intent)) : (Nullable Uri)
@@ -7733,7 +7741,7 @@
        "            .putString(PREF_LAST_PDF_SHA1, pdfSha1)"
        "            .putInt(PREF_LAST_PAGE_INDEX, pageIndex)"
        "            .putInt(PREF_LAST_PAGE_COUNT, pageCount)"
-       "        val viewport = if (shouldCaptureViewport(includeViewport)) reviewView.captureViewport() else null"
+       "        val viewport = viewportForSave(reviewView, includeViewport)"
        "        if (viewportStatePresent(viewport)) {"
        "            val savedViewport = viewportStateOrEmpty(viewport)"
        "            edit.putInt(PREF_LAST_VIEWPORT_PAGE_INDEX, pageIndex)"