Generate SSD session saves from typed Jerboa

ober

fddb2ed2f7056e62d840c85e8ec9aeb05a02245a

diff --git a/templates/ssd-review.ss b/templates/ssd-review.ss
index 955ccba..a01e975 100644
--- a/templates/ssd-review.ss
+++ b/templates/ssd-review.ss
@@ -4918,6 +4918,7 @@
                 mainActivitySetPdfChoiceItems
                 mainActivityPullTruthDumpAsync
                 mainActivityPushTruthDumpAsync
+                mainActivitySaveSessionAsync
                 mainActivitySaveTruthSnapshotAsync
                 mainActivityMergeRemoteTruthAsync
                 mainActivityRenderCurrentPageAsync
@@ -5691,13 +5692,6 @@
         (extern (mainActivityShowNoSsdPdfsDialogRaw
                   (activity : MainActivity)) : Unit
           (kotlin-member-call showNoSsdPdfsDialog))
-        (extern (mainActivitySaveSessionAsyncRaw
-                  (activity : MainActivity)
-                  (session : SsdSession)
-                  (savingStatus : String)
-                  (savedStatus : String)
-                  (afterSaved : (-> Unit))) : Unit
-          (kotlin-member-call saveSessionAsync))
         (extern (mainActivityClientLogPayloadRaw
                   (activity : MainActivity)
                   (event : String)
@@ -6687,16 +6681,44 @@
             (autoCompleteFocusAndShowDropdown dialog boxType)))
         (def (mainActivitySaveSessionNoAfter
                (activity : MainActivity)
+               (view : SsdReviewView)
+               (store : TruthStore)
                (session : SsdSession)
                (savingStatus : String)
                (savedStatus : String)) : Unit
-          (mainActivitySaveSessionAsyncRaw
+          (mainActivitySaveSessionAsync
             activity
+            view
+            store
             session
             savingStatus
             savedStatus
             (lambda ()
               (begin))))
+        (def (mainActivitySaveSessionAsync
+               (activity : MainActivity)
+               (view : SsdReviewView)
+               (store : TruthStore)
+               (session : SsdSession)
+               (savingStatus : String)
+               (savedStatus : String)
+               (afterSaved : (-> Unit)
+                 (default (lambda () (begin))))) : Unit
+          (let ((truth (ssdSessionToTruthJson session))
+                (viewport (reviewViewCaptureViewportForSave view)))
+            (begin
+              (mainActivityClearInteractionModes activity view)
+              (reviewViewClearInteractionState view)
+              (reviewViewRestoreViewportAfterLayout view viewport)
+              (mainActivitySetStatusRaw activity savingStatus)
+              (mainActivitySaveTruthSnapshotAsync
+                activity
+                view
+                store
+                truth
+                viewport
+                savedStatus
+                afterSaved))))
         (def (mainActivityChangePage
                (activity : MainActivity)
                (uri : (Nullable Uri))
@@ -6789,11 +6811,14 @@
                         confirmHaptic)
                       (mainActivitySaveSessionNoAfter
                         activity
+                        view
+                        store
                         loadedSession
                         (approveSavingStatus approvedGroup)
                         (approveSavedStatus approvedGroup)))))))))
         (def (mainActivitySaveTruth
                (activity : MainActivity)
+               (view : SsdReviewView)
                (store : TruthStore)
                (session : (Nullable SsdSession))) : Unit
           (if (sessionMissing session)
@@ -6801,6 +6826,8 @@
             (let ((loadedSession (ssdSessionOrEmpty session)))
               (mainActivitySaveSessionNoAfter
                 activity
+                view
+                store
                 loadedSession
                 (saveTruthSavingStatus)
                 (saveTruthSavedStatus (truthStoreStorageSummary store))))))
@@ -6817,6 +6844,8 @@
             (reviewViewPerformHapticAndInvalidate view rejectHaptic)
             (mainActivitySaveSessionNoAfter
               activity
+              view
+              store
               session
               (deleteSavingStatus group)
               (deleteSavedStatus group))))
@@ -6896,6 +6925,8 @@
                         confirmHaptic)
                       (mainActivitySaveSessionNoAfter
                         activity
+                        view
+                        store
                         loadedSession
                         (approveCountSavingStatus group (SsdGroup-count group))
                         (approveCountSavedStatus group (SsdGroup-count group)))))))))))
@@ -6932,6 +6963,8 @@
                       confirmHaptic)
                     (mainActivitySaveSessionNoAfter
                       activity
+                      view
+                      store
                       loadedSession
                       (appendSavingStatus group added)
                       (appendSavedStatus group))))))))
@@ -6982,8 +7015,10 @@
                       (reviewViewPerformHapticAndInvalidate
                         view
                         confirmHaptic)
-                      (mainActivitySaveSessionAsyncRaw
+                      (mainActivitySaveSessionAsync
                         activity
+                        view
+                        store
                         loadedSession
                         "SSD area set; saving boundary..."
                         "SSD area saved; detecting inside boundary..."
@@ -8578,8 +8613,10 @@
                           (reviewViewPerformHapticAndInvalidate
                             view
                             confirmHaptic)
-                          (mainActivitySaveSessionAsyncRaw
+                          (mainActivitySaveSessionAsync
                             activity
+                            view
+                            truthStore
                             session
                             (editSavingStatus group)
                             (editSavedStatus group)
@@ -10443,7 +10480,7 @@
 	       "            addView(mainActivityActionRow(this@MainActivity, LinearLayout.HORIZONTAL, Gravity.CENTER_VERTICAL,"
 	       "                button(\"Approve\", ButtonKind.ACCENT) { mainActivityApproveSelectedGroup(this@MainActivity, reviewView, truthStore, currentSession, selectedGroupId, HapticFeedbackConstants.CONFIRM) },"
 	       "                button(\"Delete\", ButtonKind.DANGER) { mainActivityDeleteSelectedGroup(this@MainActivity, reviewView, truthStore, currentSession, selectedGroupId, HapticFeedbackConstants.REJECT) },"
-	       "                button(\"Save\") { mainActivitySaveTruth(this@MainActivity, truthStore, currentSession) },"
+	       "                button(\"Save\") { mainActivitySaveTruth(this@MainActivity, reviewView, truthStore, currentSession) },"
 	       "            ))"
        "            addView(mainActivityActionRow(this@MainActivity, LinearLayout.HORIZONTAL, Gravity.CENTER_VERTICAL,"
        "                button(\"Pull Truth\") { mainActivityPullTruthDumpAsync(this@MainActivity, truthStore) },"
@@ -10707,20 +10744,6 @@
        "        count.requestFocus()"
        "    }"
        ""
-       "    internal fun saveSessionAsync("
-       "        session: SsdSession,"
-       "        savingStatus: String,"
-       "        savedStatus: String,"
-       "        afterSaved: () -> Unit = {}"
-       "    ) {"
-       "        val truth = ssdSessionToTruthJson(session)"
-       "        val viewport = reviewViewCaptureViewportForSave(reviewView)"
-        "        mainActivityFinishSelectInteraction(this, reviewView)"
-       "        reviewViewRestoreViewportAfterLayout(reviewView, viewport)"
-       "        setStatus(savingStatus)"
-       "        mainActivitySaveTruthSnapshotAsync(this, reviewView, truthStore, truth, viewport, savedStatus, afterSaved)"
-       "    }"
-       ""
        "    private fun showGroupEditDialog(group: SsdGroup) {"
        "        if (sessionMissing(currentSession)) return"
        "        val session = ssdSessionOrEmpty(currentSession)"