Move SSD edit dialog listeners to typed Jerboa

ober

d7e0d98b977941a5066ea2b051a62208ccf060d2

diff --git a/templates/ssd-review.ss b/templates/ssd-review.ss
index 3517397..3361b68 100644
--- a/templates/ssd-review.ss
+++ b/templates/ssd-review.ss
@@ -4818,6 +4818,10 @@
                 mainActivitySetPositiveOpenAnyPdf
                 mainActivitySetNegativeOpenAnyPdf
                 mainActivitySetPositiveRequestDownloadAccess
+                mainActivitySetNegativeCancelAppend
+                mainActivityInstallApproveAreaDialogButton
+                mainActivityInstallAppendDialogButton
+                mainActivityInstallEditDialogButtons
                 mainActivityRotateReviewPage
                 mainActivitySeedBundledTruthAsync
                 mainActivityHandleAreaSelectionAfterDelay
@@ -4919,6 +4923,7 @@
         (type SsdSession)
         (type SsdReviewView)
         (type MainActivity)
+        (type BoxType)
         (type TruthStore)
         (type TextView)
         (type TextWatcher)
@@ -4954,6 +4959,12 @@
                   (text : String)
                   (listener : (-> DialogInterface Int32 Unit))) : Builder
           (kotlin-member-call setNeutralButton))
+        (extern (alertDialogGetButtonRaw
+                  (dialog : AlertDialog)
+                  (which : Int32)) : Button
+          (kotlin-member-call getButton))
+        (extern (alertDialogDismissRaw (dialog : AlertDialog)) : Unit
+          (kotlin-member-call dismiss))
         (extern (autoCompleteDropDownHeightSet
                   (view : AutoCompleteTextView)
                   (height : Int32)) : Unit
@@ -5004,6 +5015,9 @@
                   (view : AutoCompleteTextView)
                   (listener : (-> AdapterView View Int32 Int Unit))) : Unit
           (kotlin-member-call setOnItemClickListener))
+        (extern (autoCompleteDismissDropDownRaw
+                  (view : AutoCompleteTextView)) : Unit
+          (kotlin-member-call dismissDropDown))
         (extern (editTextRaw
                   (view : EditText)) : Editable
           (kotlin-member-get text))
@@ -5032,6 +5046,24 @@
                   (label : String)
                   (previousBoxType : String)) : Bool
           (kotlin-call shouldKeepLabelForBoxTypeAndroid))
+        (extern (resolvedLabelForBoxTypeFromActivity
+                  (activity : MainActivity)
+                  (label : String)
+                  (boxType : String)
+                  (previousBoxType : String)) : String
+          (kotlin-call resolvedLabelForBoxTypeAndroid))
+        (extern (boxTypesResolveFromActivity
+                  (activity : MainActivity)
+                  (boxType : String)) : (Nullable BoxType)
+          (kotlin-call boxTypesResolveAndroid))
+        (extern (resolvedBoxTypeNameOrRaw
+                  (boxType : (Nullable BoxType))
+                  (fallback : String)) : String
+          (kotlin-call resolvedBoxTypeNameOr))
+        (extern (resolvedBoxTypeIdOrRaw
+                  (boxType : (Nullable BoxType))
+                  (fallback : String)) : String
+          (kotlin-call resolvedBoxTypeIdOr))
         (extern (stringLines (text : String)) : (List String)
           (kotlin-member-call lines))
         (extern (stringSplitTwoChars (text : String)
@@ -5310,6 +5342,32 @@
         (extern (mainActivityRequestDownloadAccessRaw
                   (activity : MainActivity)) : Unit
           (kotlin-member-call requestDownloadAccess))
+        (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 (mainActivityDeleteSelectedGroupRaw
+                  (activity : MainActivity)) : Unit
+          (kotlin-member-call deleteSelectedGroup))
+        (extern (mainActivitySaveSessionAsyncRaw
+                  (activity : MainActivity)
+                  (session : SsdSession)
+                  (savingStatus : String)
+                  (savedStatus : String)
+                  (afterSaved : (-> Unit))) : Unit
+          (kotlin-member-call saveSessionAsync))
         (extern (mainActivityReviewViewSet
                   (activity : MainActivity)
                   (view : SsdReviewView)) : Unit
@@ -6559,6 +6617,23 @@
             text
             (lambda ((unusedDialog : DialogInterface) (unusedWhich : Int32))
               (invoke action))))
+        (def (alertDialogSetPositiveButtonAction
+               (dialog : AlertDialog)
+               (action : (-> Unit))) : Unit
+          (buttonSetOnClickAction
+            (alertDialogGetButtonRaw dialog (int32 -1))
+            action))
+        (def (alertDialogSetNeutralButtonAction
+               (dialog : AlertDialog)
+               (action : (-> Unit))) : Unit
+          (buttonSetOnClickAction
+            (alertDialogGetButtonRaw dialog (int32 -3))
+            action))
+        (def (alertDialogDismiss (dialog : AlertDialog)) : Unit
+          (alertDialogDismissRaw dialog))
+        (def (autoCompleteDismissDropDown
+               (view : AutoCompleteTextView)) : Unit
+          (autoCompleteDismissDropDownRaw view))
         (def (mainActivitySetPositiveChooseSsdPdfFolder
                (builder : Builder)
                (activity : MainActivity)) : Builder
@@ -6599,6 +6674,130 @@
             "Access Downloads"
             (lambda ()
               (mainActivityRequestDownloadAccessRaw activity))))
+        (def (mainActivitySetNegativeCancelAppend
+               (builder : Builder)
+               (activity : MainActivity)
+               (view : SsdReviewView)) : Builder
+          (alertDialogBuilderSetNegativeAction
+            builder
+            "Cancel"
+            (lambda ()
+              (begin
+                (mainActivityClearInteractionModes activity view)
+                (mainActivitySetStatusRaw activity (appendCanceledStatus))))))
+        (def (mainActivityInstallApproveAreaDialogButton
+               (activity : MainActivity)
+               (dialog : AlertDialog)
+               (rect : FloatArray)
+               (detectedIds : (List String))
+               (label : EditText)
+               (boxType : AutoCompleteTextView)
+               (firingArc : AutoCompleteTextView)
+               (count : EditText)) : Unit
+          (alertDialogSetPositiveButtonAction
+            dialog
+            (lambda ()
+              (let ((boxTypeText (autoCompleteText boxType)))
+                (let ((labelText
+                        (resolvedLabelForBoxTypeFromActivity
+                          activity
+                          (editTextText label)
+                          boxTypeText
+                          "")))
+                  (let ((firingArcText (autoCompleteText firingArc)))
+                    (let ((countValue (dialogCountValue (editTextText count))))
+                      (begin
+                        (autoCompleteDismissDropDown boxType)
+                        (autoCompleteDismissDropDown firingArc)
+                        (alertDialogDismiss dialog)
+                        (mainActivityApproveAreaRaw
+                          activity
+                          rect
+                          detectedIds
+                          labelText
+                          boxTypeText
+                          firingArcText
+                          countValue)))))))))
+        (def (mainActivityInstallAppendDialogButton
+               (activity : MainActivity)
+               (dialog : AlertDialog)
+               (rect : FloatArray)
+               (detectedIds : (List String))
+               (group : SsdGroup)
+               (count : EditText)) : Unit
+          (alertDialogSetPositiveButtonAction
+            dialog
+            (lambda ()
+              (let ((countValue (dialogCountValue (editTextText count))))
+                (begin
+                  (alertDialogDismiss dialog)
+                  (mainActivityAppendAreaToGroupRaw
+                    activity
+                    rect
+                    detectedIds
+                    group
+                    countValue))))))
+        (def (mainActivityInstallEditDialogButtons
+               (activity : MainActivity)
+               (dialog : AlertDialog)
+               (session : SsdSession)
+               (group : SsdGroup)
+               (label : EditText)
+               (boxType : AutoCompleteTextView)
+               (firingArc : AutoCompleteTextView)
+               (count : EditText)
+               (view : SsdReviewView)
+               (truthStore : TruthStore)
+               (confirmHaptic : Int32)) : Unit
+          (begin
+            (alertDialogSetPositiveButtonAction
+              dialog
+              (lambda ()
+                (let ((boxTypeText (autoCompleteText boxType)))
+                  (let ((labelText
+                          (resolvedLabelForBoxTypeFromActivity
+                            activity
+                            (editTextText label)
+                            boxTypeText
+                            (SsdGroup-boxTypeId group))))
+                    (begin
+                      (autoCompleteDismissDropDown boxType)
+                      (autoCompleteDismissDropDown firingArc)
+                      (alertDialogDismiss dialog)
+                      (let ((resolved
+                              (boxTypesResolveFromActivity
+                                activity
+                                boxTypeText)))
+                        (begin
+                          (ssdSessionApplyEditedGroup
+                            session
+                            group
+                            labelText
+                            (resolvedBoxTypeNameOrRaw
+                              resolved
+                              (SsdGroup-label group))
+                            (resolvedBoxTypeIdOrRaw resolved boxTypeText)
+                            (autoCompleteText firingArc)
+                            (editTextText count))
+                          (truthStoreAppendGroupEdited truthStore session)
+                          (reviewViewPerformHapticAndInvalidate
+                            view
+                            confirmHaptic)
+                          (mainActivitySaveSessionAsyncRaw
+                            activity
+                            session
+                            (editSavingStatus group)
+                            (editSavedStatus group)
+                            (lambda ()
+                              (begin))))))))))
+            (alertDialogSetNeutralButtonAction
+              dialog
+              (lambda ()
+                (begin
+                  (autoCompleteDismissDropDown boxType)
+                  (autoCompleteDismissDropDown firingArc)
+                  (alertDialogDismiss dialog)
+                  (mainActivityDeleteSelectedGroupRaw activity))))))
         (def (permissionResultGranted (actual : Int32) (granted : Int32)) : Bool
           (= actual granted))
         (def (downloadAccessBeforeRuntimePermissions (beforeRuntimePermissions : Bool)) : Bool
@@ -8611,16 +8810,7 @@
        "            .setNegativeButton(\"Cancel\", null)"
        "            .setPositiveButton(\"Approve\", null)"
        "            .show()"
-       "        dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {"
-       "            val boxTypeText = boxType.text.toString()"
-       "            val labelText = resolvedLabelForBoxTypeAndroid(this, label.text.toString(), boxTypeText, \"\")"
-       "            val firingArcText = firingArc.text.toString()"
-       "            val countValue = dialogCountValue(count.text.toString())"
-       "            boxType.dismissDropDown()"
-       "            firingArc.dismissDropDown()"
-       "            dialog.dismiss()"
-       "            approveArea(rect, detectedIds, labelText, boxTypeText, firingArcText, countValue)"
-       "        }"
+       "        mainActivityInstallApproveAreaDialogButton(this, dialog, rect, detectedIds, label, boxType, firingArc, count)"
        "        focusBoxTypeDropdown(dialog, boxType)"
        "    }"
        ""
@@ -8643,21 +8833,14 @@
        "            .setTitle(title)"
        "            .setMessage(detectedBoxesMessage(detectedIds.size))"
        "            .setView(count)"
-       "            .setNegativeButton(\"Cancel\") { _, _ ->"
-       "                mainActivityClearInteractionModes(this, reviewView)"
-       "                setStatus(appendCanceledStatus())"
-       "            }"
+       "            .let { mainActivitySetNegativeCancelAppend(it, this, reviewView) }"
        "            .setPositiveButton(\"Append\", null)"
        "            .show()"
-       "        dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {"
-       "            val countValue = dialogCountValue(count.text.toString())"
-       "            dialog.dismiss()"
-       "            appendAreaToGroup(rect, detectedIds, appendGroup, countValue)"
-       "        }"
+       "        mainActivityInstallAppendDialogButton(this, dialog, rect, detectedIds, appendGroup, count)"
        "        count.requestFocus()"
        "    }"
        ""
-       "    private fun saveSessionAsync("
+       "    internal fun saveSessionAsync("
        "        session: SsdSession,"
        "        savingStatus: String,"
        "        savedStatus: String,"
@@ -8685,7 +8868,7 @@
        "        }"
        "    }"
        ""
-       "    private fun approveArea("
+       "    internal fun approveArea("
        "        rect: FloatArray,"
        "        detectedIds: List<String>,"
        "        label: String,"
@@ -8708,7 +8891,7 @@
        "        )"
        "    }"
        ""
-       "    private fun appendAreaToGroup(rect: FloatArray, detectedIds: List<String>, group: SsdGroup, count: Int) {"
+       "    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"
@@ -8761,37 +8944,19 @@
        "            .setNeutralButton(\"Delete\", null)"
        "            .setPositiveButton(\"Save\", null)"
        "            .show()"
-       "        dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {"
-       "            val boxTypeText = boxType.text.toString()"
-       "            val labelText = resolvedLabelForBoxTypeAndroid(this, label.text.toString(), boxTypeText, group.boxTypeId)"
-       "            val firingArcText = firingArc.text.toString()"
-       "            boxType.dismissDropDown()"
-       "            firingArc.dismissDropDown()"
-       "            dialog.dismiss()"
-       "            val resolved = boxTypesResolveAndroid(this, boxTypeText)"
-       "            ssdSessionApplyEditedGroup("
-       "                session,"
-       "                group,"
-       "                labelText,"
-       "                resolvedBoxTypeNameOr(resolved, group.label),"
-       "                resolvedBoxTypeIdOr(resolved, boxTypeText),"
-       "                firingArcText,"
-       "                count.text.toString()"
-       "            )"
-       "            truthStoreAppendGroupEdited(truthStore, session)"
-       "            reviewViewPerformHapticAndInvalidate(reviewView, HapticFeedbackConstants.CONFIRM)"
-       "            saveSessionAsync("
-       "                session,"
-       "                editSavingStatus(group),"
-       "                editSavedStatus(group)"
-       "            )"
-       "        }"
-       "        dialog.getButton(AlertDialog.BUTTON_NEUTRAL).setOnClickListener {"
-       "            boxType.dismissDropDown()"
-       "            firingArc.dismissDropDown()"
-       "            dialog.dismiss()"
-       "            deleteSelectedGroup()"
-       "        }"
+       "        mainActivityInstallEditDialogButtons("
+       "            this,"
+       "            dialog,"
+       "            session,"
+       "            group,"
+       "            label,"
+       "            boxType,"
+       "            firingArc,"
+       "            count,"
+       "            reviewView,"
+       "            truthStore,"
+       "            HapticFeedbackConstants.CONFIRM"
+       "        )"
        "        boxType.selectAll()"
        "        focusBoxTypeDropdown(dialog, boxType)"
        "    }"
@@ -8806,7 +8971,7 @@
        "        )"
        "    }"
        ""
-       "    private fun deleteSelectedGroup() {"
+       "    internal fun deleteSelectedGroup() {"
        "        if (sessionMissing(currentSession)) return"
        "        val session = ssdSessionOrEmpty(currentSession)"
        "        val group = selectedGroup()"