Generate SSD area boundary action from typed Jerboa

ober

c687329a324791260202c707ee7edf5236f2ada3

diff --git a/templates/ssd-review.ss b/templates/ssd-review.ss
index 09d3122..fd95ebd 100644
--- a/templates/ssd-review.ss
+++ b/templates/ssd-review.ss
@@ -4891,6 +4891,7 @@
                 mainActivityDeleteSelectedGroup
                 mainActivityApproveArea
                 mainActivityAppendAreaToGroupAction
+                mainActivityApplySsdArea
                 mainActivityAddApprovedAreaGroup
                 mainActivityAppendAreaToGroup
                 mainActivitySuppressGroupAsDeleted
@@ -5330,6 +5331,10 @@
                   (activity : MainActivity)
                   (id : String)) : String
           (kotlin-call boxTypesDisplayAndroid))
+        (extern (ssdSessionApplySsdAreaRaw
+                  (session : SsdSession)
+                  (area : FloatArray)) : JSONObject
+          (kotlin-call ssdSessionApplySsdArea))
         (extern (stringLines (text : String)) : (List String)
           (kotlin-member-call lines))
         (extern (stringSplitTwoChars (text : String)
@@ -5579,6 +5584,12 @@
         (extern (mainActivityPdfNameRaw
                   (activity : MainActivity)) : String
           (kotlin-member-get pdfName))
+        (extern (mainActivityPdfSha1Raw
+                  (activity : MainActivity)) : String
+          (kotlin-member-get pdfSha1))
+        (extern (mainActivityPageCountValueRaw
+                  (activity : MainActivity)) : Int32
+          (kotlin-member-get pageCount))
         (extern (mainActivityContentResolverRaw
                   (activity : MainActivity)) : ContentResolver
           (kotlin-member-get contentResolver))
@@ -5593,10 +5604,6 @@
                   (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)
@@ -5618,6 +5625,9 @@
         (extern (mainActivityCurrentSessionRaw
                   (activity : MainActivity)) : (Nullable SsdSession)
           (kotlin-member-get currentSession))
+        (extern (mainActivitySelectedGroupIdRaw
+                  (activity : MainActivity)) : (Nullable String)
+          (kotlin-member-get selectedGroupId))
         (extern (mainActivityRunOnUiThreadRaw
                   (activity : MainActivity)
                   (callback : (-> Unit))) : Unit
@@ -5634,10 +5644,6 @@
         (extern (mainActivityRenderCurrentPageRaw
                   (activity : MainActivity)) : Unit
           (kotlin-member-call renderCurrentPage))
-        (extern (mainActivityApplySsdAreaRaw
-                  (activity : MainActivity)
-                  (rect : FloatArray)) : Unit
-          (kotlin-member-call applySsdArea))
         (extern (mainActivityShowApproveDialogRaw
                   (activity : MainActivity)
                   (rect : FloatArray)
@@ -6907,6 +6913,61 @@
                       loadedSession
                       (appendSavingStatus group added)
                       (appendSavedStatus group))))))))
+        (def (mainActivityDetectCurrentForceWithState
+               (activity : MainActivity)) : Unit
+          (mainActivityDetectCurrentRaw
+            activity
+            #t
+            (mainActivityLoadGenerationRaw activity)
+            (mainActivityPageIndexRaw activity)
+            (mainActivityPdfUriRaw activity)
+            (mainActivityPdfNameRaw activity)
+            (mainActivityPdfSha1Raw activity)
+            (mainActivityPageCountValueRaw activity)))
+        (def (mainActivityApplySsdArea
+               (activity : MainActivity)
+               (view : SsdReviewView)
+               (store : TruthStore)
+               (session : (Nullable SsdSession))
+               (selectedGroupId : (Nullable String))
+               (rect : FloatArray)
+               (confirmHaptic : Int32)) : Unit
+          (if (sessionMissing session)
+            (begin)
+            (let ((loadedSession (ssdSessionOrEmpty session)))
+              (let ((area (ssdSessionBoundedSsdArea loadedSession rect)))
+                (if (ssdAreaSelectionTooSmall area)
+                  (begin
+                    (mainActivityClearInteractionModes activity view)
+                    (reviewViewClearInteractionState view)
+                    (mainActivitySetStatusRaw
+                      activity
+                      (ssdAreaIgnoredTooSmallStatus)))
+                  (let ((details
+                          (ssdSessionApplySsdAreaRaw loadedSession area)))
+                    (begin
+                      (mainActivitySelectGroupId
+                        activity
+                        view
+                        (ssdSessionSelectedGroupId
+                          loadedSession
+                          selectedGroupId))
+                      (reviewViewSetSsdAreaFromSession view loadedSession)
+                      (truthStoreAppendSsdAreaSet
+                        store
+                        loadedSession
+                        details)
+                      (reviewViewPerformHapticAndInvalidate
+                        view
+                        confirmHaptic)
+                      (mainActivitySaveSessionAsyncRaw
+                        activity
+                        loadedSession
+                        "SSD area set; saving boundary..."
+                        "SSD area saved; detecting inside boundary..."
+                        (lambda ()
+                          (mainActivityDetectCurrentForceWithState
+                            activity))))))))))
         (def (mainActivityAddApprovedAreaGroup
                (activity : MainActivity)
                (view : SsdReviewView)
@@ -7071,16 +7132,25 @@
         (def (mainActivityHandleAreaSelectionAfterDelay
                (activity : MainActivity)
                (view : SsdReviewView)
+               (store : TruthStore)
                (rect : FloatArray)
                (detectedIds : (List String))
-               (applyAsSsdArea : Bool)) : Unit
+               (applyAsSsdArea : Bool)
+               (confirmHaptic : Int32)) : Unit
           (reviewViewPostDelayedRaw
             view
             (lambda ()
               (if (sessionMissing (mainActivityCurrentSessionRaw activity))
                 (mainActivitySetStatusRaw activity (selectionIgnoredLoadingStatus))
                 (if applyAsSsdArea
-                  (mainActivityApplySsdAreaRaw activity rect)
+                  (mainActivityApplySsdArea
+                    activity
+                    view
+                    store
+                    (mainActivityCurrentSessionRaw activity)
+                    (mainActivitySelectedGroupIdRaw activity)
+                    rect
+                    confirmHaptic)
                   (mainActivityShowApproveDialogRaw activity rect detectedIds))))
             (int32 80)))
         (def (mainActivitySetTruthStore (activity : MainActivity)
@@ -10456,29 +10526,6 @@
        "        ).show()"
 	       "    }"
 	       ""
-       "    internal fun applySsdArea(rect: FloatArray) {"
-	       "        if (sessionMissing(currentSession)) return"
-	       "        val session = ssdSessionOrEmpty(currentSession)"
-       "        val area = ssdSessionBoundedSsdArea(session, rect)"
-       "        if (ssdAreaSelectionTooSmall(area)) {"
-       "            mainActivityFinishSelectInteraction(this, reviewView)"
-       "            setStatus(ssdAreaIgnoredTooSmallStatus())"
-       "            return"
-       "        }"
-       "        val details = ssdSessionApplySsdArea(session, area)"
-	       "        mainActivitySelectGroupId(this, reviewView, ssdSessionSelectedGroupId(session, selectedGroupId))"
-	       "        reviewViewSetSsdAreaFromSession(reviewView, session)"
-	       "        truthStoreAppendSsdAreaSet(truthStore, session, details)"
-	       "        reviewViewPerformHapticAndInvalidate(reviewView, HapticFeedbackConstants.CONFIRM)"
-	       "        saveSessionAsync("
-	       "            session,"
-	       "            \"SSD area set; saving boundary...\","
-	       "            \"SSD area saved; detecting inside boundary...\""
-	       "        ) {"
-	       "            detectCurrent(forceDetect = true)"
-	       "        }"
-	       "    }"
-	       ""
        "    private fun editSelectedGroup() {"
        "        val group = mainActivitySelectedGroup(this, reviewView, currentSession, selectedGroupId)"
        "        if (ssdGroupMissing(group)) return"
@@ -10547,7 +10594,7 @@
 	       "        val applyAsSsdArea = ssdAreaMode"
 	       "        val statusText = areaSelectionStatus(applyAsSsdArea, detectedIds.size)"
 	       "        setStatus(statusText)"
-       "        mainActivityHandleAreaSelectionAfterDelay(this, reviewView, rect, detectedIds, applyAsSsdArea)"
+       "        mainActivityHandleAreaSelectionAfterDelay(this, reviewView, truthStore, rect, detectedIds, applyAsSsdArea, HapticFeedbackConstants.CONFIRM)"
 	       "    }"
 	       ""
        "    internal fun showApproveDialog(rect: FloatArray, detectedIds: List<String>) {"