Generate SSD area approve actions from typed Jerboa

ober

b52b47eb2b4cf5b45dc39074eab0746f2c7772b9

diff --git a/templates/ssd-review.ss b/templates/ssd-review.ss
index 7127ecf..09d3122 100644
--- a/templates/ssd-review.ss
+++ b/templates/ssd-review.ss
@@ -4889,6 +4889,8 @@
                 mainActivitySaveTruth
                 mainActivityDeleteGroup
                 mainActivityDeleteSelectedGroup
+                mainActivityApproveArea
+                mainActivityAppendAreaToGroupAction
                 mainActivityAddApprovedAreaGroup
                 mainActivityAppendAreaToGroup
                 mainActivitySuppressGroupAsDeleted
@@ -5669,22 +5671,6 @@
         (extern (mainActivityShowNoSsdPdfsDialogRaw
                   (activity : MainActivity)) : Unit
           (kotlin-member-call showNoSsdPdfsDialog))
-        (extern (mainActivityApproveAreaRaw
-                  (activity : MainActivity)
-                  (rect : FloatArray)
-                  (detectedIds : (List String))
-                  (label : String)
-                  (boxType : String)
-                  (firingArc : String)
-                  (count : Int32)) : Unit
-          (kotlin-member-call approveArea))
-        (extern (mainActivityAppendAreaToGroupRaw
-                  (activity : MainActivity)
-                  (rect : FloatArray)
-                  (detectedIds : (List String))
-                  (group : SsdGroup)
-                  (count : Int32)) : Unit
-          (kotlin-member-call appendAreaToGroup))
         (extern (mainActivitySaveSessionAsyncRaw
                   (activity : MainActivity)
                   (session : SsdSession)
@@ -6831,6 +6817,96 @@
                     loadedSession
                     (ssdGroupOrEmpty group)
                     rejectHaptic))))))
+        (def (mainActivityApproveArea
+               (activity : MainActivity)
+               (view : SsdReviewView)
+               (store : TruthStore)
+               (session : (Nullable SsdSession))
+               (rect : FloatArray)
+               (detectedIds : (List String))
+               (label : String)
+               (boxType : String)
+               (firingArc : String)
+               (count : Int32)
+               (confirmHaptic : Int32)) : Unit
+          (if (sessionMissing session)
+            (begin)
+            (let ((loadedSession (ssdSessionOrEmpty session)))
+              (let ((resolvedType
+                      (boxTypesResolveFromActivity activity boxType)))
+                (let ((resolvedName
+                        (if (nullable-null? resolvedType)
+                          (nullable-none String)
+                          (nullable-some
+                            (BoxType-name (nullable-get resolvedType))))))
+                  (let ((cleanLabel
+                          (manualGroupLabel
+                            (resolvedLabelForBoxTypeFromActivity
+                              activity
+                              label
+                              boxType
+                              "")
+                            resolvedName
+                            "")))
+                  (let ((group
+                          (mainActivityAddApprovedAreaGroup
+                            activity
+                            view
+                            loadedSession
+                            rect
+                            detectedIds
+                            cleanLabel
+                            (resolvedBoxTypeIdOrRaw resolvedType boxType)
+                            firingArc
+                            count)))
+                    (begin
+                      (truthStoreAppendGroupApproved store loadedSession)
+                      (mainActivityClearInteractionModes activity view)
+                      (reviewViewClearInteractionState view)
+                      (reviewViewPerformHapticAndInvalidate
+                        view
+                        confirmHaptic)
+                      (mainActivitySaveSessionNoAfter
+                        activity
+                        loadedSession
+                        (approveCountSavingStatus group (SsdGroup-count group))
+                        (approveCountSavedStatus group (SsdGroup-count group)))))))))))
+        (def (mainActivityAppendAreaToGroupAction
+               (activity : MainActivity)
+               (view : SsdReviewView)
+               (store : TruthStore)
+               (session : (Nullable SsdSession))
+               (rect : FloatArray)
+               (detectedIds : (List String))
+               (group : SsdGroup)
+               (count : Int32)
+               (confirmHaptic : Int32)) : Unit
+          (if (sessionMissing session)
+            (begin)
+            (let ((loadedSession (ssdSessionOrEmpty session)))
+              (if (ssdSessionGroupMissing loadedSession group)
+                (begin)
+                (let ((added
+                        (mainActivityAppendAreaToGroup
+                          activity
+                          view
+                          loadedSession
+                          rect
+                          detectedIds
+                          group
+                          count)))
+                  (begin
+                    (mainActivityClearInteractionModes activity view)
+                    (reviewViewClearInteractionState view)
+                    (truthStoreAppendGroupAppended store loadedSession)
+                    (reviewViewPerformHapticAndInvalidate
+                      view
+                      confirmHaptic)
+                    (mainActivitySaveSessionNoAfter
+                      activity
+                      loadedSession
+                      (appendSavingStatus group added)
+                      (appendSavedStatus group))))))))
         (def (mainActivityAddApprovedAreaGroup
                (activity : MainActivity)
                (view : SsdReviewView)
@@ -8267,7 +8343,10 @@
                (label : EditText)
                (boxType : AutoCompleteTextView)
                (firingArc : AutoCompleteTextView)
-               (count : EditText)) : Unit
+               (count : EditText)
+               (view : SsdReviewView)
+               (store : TruthStore)
+               (confirmHaptic : Int32)) : Unit
           (alertDialogSetPositiveButtonAction
             dialog
             (lambda ()
@@ -8284,33 +8363,44 @@
                         (autoCompleteDismissDropDown boxType)
                         (autoCompleteDismissDropDown firingArc)
                         (alertDialogDismiss dialog)
-                        (mainActivityApproveAreaRaw
+                        (mainActivityApproveArea
                           activity
+                          view
+                          store
+                          (mainActivityCurrentSessionRaw activity)
                           rect
                           detectedIds
                           labelText
                           boxTypeText
                           firingArcText
-                          countValue)))))))))
+                          countValue
+                          confirmHaptic)))))))))
         (def (mainActivityInstallAppendDialogButton
                (activity : MainActivity)
                (dialog : AlertDialog)
                (rect : FloatArray)
                (detectedIds : (List String))
                (group : SsdGroup)
-               (count : EditText)) : Unit
+               (count : EditText)
+               (view : SsdReviewView)
+               (store : TruthStore)
+               (confirmHaptic : Int32)) : Unit
           (alertDialogSetPositiveButtonAction
             dialog
             (lambda ()
               (let ((countValue (dialogCountValue (editTextText count))))
                 (begin
                   (alertDialogDismiss dialog)
-                  (mainActivityAppendAreaToGroupRaw
+                  (mainActivityAppendAreaToGroupAction
                     activity
+                    view
+                    store
+                    (mainActivityCurrentSessionRaw activity)
                     rect
                     detectedIds
                     group
-                    countValue))))))
+                    countValue
+                    confirmHaptic))))))
         (def (mainActivityInstallEditDialogButtons
                (activity : MainActivity)
                (dialog : AlertDialog)
@@ -10498,7 +10588,7 @@
        "            .setNegativeButton(\"Cancel\", null)"
        "            .setPositiveButton(\"Approve\", null)"
        "            .show()"
-       "        mainActivityInstallApproveAreaDialogButton(this, dialog, rect, detectedIds, label, boxType, firingArc, count)"
+       "        mainActivityInstallApproveAreaDialogButton(this, dialog, rect, detectedIds, label, boxType, firingArc, count, reviewView, truthStore, HapticFeedbackConstants.CONFIRM)"
        "        mainActivityFocusBoxTypeDropdown(dialog, boxType, resources.displayMetrics.heightPixels, android.view.WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE or android.view.WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE)"
        "    }"
        ""
@@ -10524,7 +10614,7 @@
        "            .let { mainActivitySetNegativeCancelAppend(it, this, reviewView) }"
        "            .setPositiveButton(\"Append\", null)"
        "            .show()"
-       "        mainActivityInstallAppendDialogButton(this, dialog, rect, detectedIds, appendGroup, count)"
+       "        mainActivityInstallAppendDialogButton(this, dialog, rect, detectedIds, appendGroup, count, reviewView, truthStore, HapticFeedbackConstants.CONFIRM)"
        "        count.requestFocus()"
        "    }"
        ""
@@ -10542,44 +10632,6 @@
        "        mainActivitySaveTruthSnapshotAsync(this, reviewView, truthStore, truth, viewport, savedStatus, afterSaved)"
        "    }"
        ""
-       "    internal fun approveArea("
-       "        rect: FloatArray,"
-       "        detectedIds: List<String>,"
-       "        label: String,"
-       "        boxType: String,"
-       "        firingArc: String,"
-       "        count: Int"
-       "    ) {"
-       "        if (sessionMissing(currentSession)) return"
-       "        val session = ssdSessionOrEmpty(currentSession)"
-       "        val resolvedType = boxTypesResolveAndroid(this, boxType)"
-       "        val cleanLabel = manualGroupLabel(resolvedLabelForBoxTypeAndroid(this, label, boxType, \"\"), resolvedBoxTypeNameOr(resolvedType, \"\"), \"\")"
-       "        val group = mainActivityAddApprovedAreaGroup(this, reviewView, session, rect, detectedIds, cleanLabel, resolvedBoxTypeIdOr(resolvedType, boxType), firingArc, count)"
-       "        truthStoreAppendGroupApproved(truthStore, session)"
-        "        mainActivityFinishSelectInteraction(this, reviewView)"
-       "        reviewViewPerformHapticAndInvalidate(reviewView, HapticFeedbackConstants.CONFIRM)"
-       "        saveSessionAsync("
-       "            session,"
-       "            approveCountSavingStatus(group, group.count),"
-       "            approveCountSavedStatus(group, group.count)"
-       "        )"
-       "    }"
-       ""
-       "    internal fun appendAreaToGroup(rect: FloatArray, detectedIds: List<String>, group: SsdGroup, count: Int) {"
-       "        if (sessionMissing(currentSession)) return"
-       "        val session = ssdSessionOrEmpty(currentSession)"
-       "        if (ssdSessionGroupMissing(session, group)) return"
-       "        val added = mainActivityAppendAreaToGroup(this, reviewView, session, rect, detectedIds, group, count)"
-        "        mainActivityFinishSelectInteraction(this, reviewView)"
-       "        truthStoreAppendGroupAppended(truthStore, session)"
-       "        reviewViewPerformHapticAndInvalidate(reviewView, HapticFeedbackConstants.CONFIRM)"
-       "        saveSessionAsync("
-       "            session,"
-       "            appendSavingStatus(group, added),"
-       "            appendSavedStatus(group)"
-       "        )"
-       "    }"
-       ""
        "    private fun showGroupEditDialog(group: SsdGroup) {"
        "        if (sessionMissing(currentSession)) return"
        "        val session = ssdSessionOrEmpty(currentSession)"