Move SSD review viewport helpers to typed Kotlin

ober

9a53c126b755e7a9d99c222e4fffb56b6089740a

diff --git a/templates/ssd-review.ss b/templates/ssd-review.ss
index 5390440..e49762a 100644
--- a/templates/ssd-review.ss
+++ b/templates/ssd-review.ss
@@ -4666,6 +4666,10 @@
                 reviewViewRefresh
                 reviewViewFitImage
                 reviewViewCenterOnGroup
+                reviewViewSelectMode
+                reviewViewCaptureViewportForSave
+                reviewViewRestoreViewport
+                reviewViewClearInteractionState
                 mainActivitySelectGroupId
                 mainActivitySelectRequestedGroup
                 mainActivitySelectCurrentGroup
@@ -4803,6 +4807,14 @@
           (kotlin-member-call appendEvent))
         (extern (reviewViewCaptureViewport (view : SsdReviewView)) : (Nullable ViewportState)
           (kotlin-member-call captureViewport))
+        (extern (reviewViewRestoreViewportRaw
+                  (view : SsdReviewView)
+                  (viewport : (Nullable ViewportState))) : Unit
+          (kotlin-member-call restoreViewport))
+        (extern (reviewViewClearInteractionStateRaw (view : SsdReviewView)) : Unit
+          (kotlin-member-call clearInteractionState))
+        (extern (reviewViewSelectModeRaw (view : SsdReviewView)) : Bool
+          (kotlin-member-get selectMode))
         (extern (reviewViewRotateClockwise (view : SsdReviewView)) : Unit
           (kotlin-member-call rotateClockwise))
         (extern (reviewViewPerformHapticFeedback
@@ -5523,6 +5535,17 @@
                (view : SsdReviewView)
                (group : SsdGroup)) : Unit
           (reviewViewCenterOnGroupRaw view group))
+        (def (reviewViewSelectMode (view : SsdReviewView)) : Bool
+          (reviewViewSelectModeRaw view))
+        (def (reviewViewCaptureViewportForSave
+               (view : SsdReviewView)) : (Nullable ViewportState)
+          (reviewViewCaptureViewport view))
+        (def (reviewViewRestoreViewport
+               (view : SsdReviewView)
+               (viewport : (Nullable ViewportState))) : Unit
+          (reviewViewRestoreViewportRaw view viewport))
+        (def (reviewViewClearInteractionState (view : SsdReviewView)) : Unit
+          (reviewViewClearInteractionStateRaw view))
         (def (mainActivitySelectGroupId (activity : MainActivity)
                                         (view : SsdReviewView)
                                         (id : (Nullable String))) : Unit
@@ -7523,7 +7546,7 @@
        "    }"
        ""
        "    private fun toggleSelect() {"
-       "        setSelectMode(nextSelectMode(reviewView.selectMode))"
+       "        setSelectMode(nextSelectMode(reviewViewSelectMode(reviewView)))"
        "    }"
        ""
 	       "    private fun setSelectMode(enabled: Boolean) {"
@@ -7531,18 +7554,18 @@
 	       "            mainActivityClearInteractionModes(this, reviewView)"
 	       "        }"
 	       "        reviewViewSetSelectMode(reviewView, enabled, !ssdAreaMode)"
-	       "        setStatus(selectModeStatus(ssdAreaMode, appendMode, reviewView.selectMode))"
+	       "        setStatus(selectModeStatus(ssdAreaMode, appendMode, reviewViewSelectMode(reviewView)))"
        "    }"
        ""
 	       "    private fun finishSelectInteraction() {"
 	       "        mainActivityClearInteractionModes(this, reviewView)"
-	       "        reviewView.clearInteractionState()"
+	       "        reviewViewClearInteractionState(reviewView)"
 	       "    }"
        ""
        "    private fun restoreViewportAfterLayout(viewport: ViewportState?) {"
-       "        reviewView.restoreViewport(viewport)"
-       "        reviewView.post { reviewView.restoreViewport(viewport) }"
-       "        reviewView.postDelayed({ reviewView.restoreViewport(viewport) }, 180)"
+       "        reviewViewRestoreViewport(reviewView, viewport)"
+       "        reviewView.post { reviewViewRestoreViewport(reviewView, viewport) }"
+       "        reviewView.postDelayed({ reviewViewRestoreViewport(reviewView, viewport) }, 180)"
        "    }"
        ""
        "    private fun startAppendMode() {"
@@ -7940,7 +7963,7 @@
        "        afterSaved: () -> Unit = {}"
        "    ) {"
        "        val truth = ssdSessionToTruthJson(session)"
-       "        val viewport = reviewView.captureViewport()"
+       "        val viewport = reviewViewCaptureViewportForSave(reviewView)"
        "        finishSelectInteraction()"
        "        restoreViewportAfterLayout(viewport)"
        "        setStatus(savingStatus)"