Generate SSD append dialog from typed Jerboa

ober

480ba29eb57f7fd351fae48f5ff79f539c8817ee

diff --git a/templates/ssd-review.ss b/templates/ssd-review.ss
index d34d6c4..77132f3 100644
--- a/templates/ssd-review.ss
+++ b/templates/ssd-review.ss
@@ -4895,6 +4895,7 @@
                 mainActivityDeleteSelectedGroup
                 mainActivityApproveArea
                 mainActivityAppendAreaToGroupAction
+                mainActivityShowAppendDialog
                 mainActivityApplySsdArea
                 mainActivityHandleAreaSelected
                 mainActivityAddApprovedAreaGroup
@@ -5296,6 +5297,10 @@
                   (view : EditText)
                   (inputType : Int32)) : Unit
           (kotlin-member-set inputType))
+        (extern (editTextHintSetRaw
+                  (view : EditText)
+                  (hint : String)) : Unit
+          (kotlin-member-set hint))
         (extern (editTextSetTextRaw
                   (view : EditText)
                   (text : String)) : Unit
@@ -5307,6 +5312,9 @@
         (extern (editTextSelectAllRaw
                   (view : EditText)) : Unit
           (kotlin-member-call selectAll))
+        (extern (editTextRequestFocusRaw
+                  (view : EditText)) : Unit
+          (kotlin-member-call requestFocus))
         (extern (buttonSetOnClickListenerRaw
                   (button : Button)
                   (listener : (-> View Unit))) : Unit
@@ -7104,6 +7112,63 @@
                       loadedSession
                       (appendSavingStatus group added)
                       (appendSavedStatus group))))))))
+        (def (mainActivityShowAppendDialog
+               (activity : MainActivity)
+               (view : SsdReviewView)
+               (store : TruthStore)
+               (session : (Nullable SsdSession))
+               (selectedGroupId : (Nullable String))
+               (rect : FloatArray)
+               (detectedIds : (List String))
+               (confirmHaptic : Int32)) : Unit
+          (if (sessionMissing session)
+            (begin)
+            (let ((group
+                    (mainActivitySelectRequestedGroup
+                      activity
+                      view
+                      session
+                      selectedGroupId)))
+              (if (ssdGroupMissing group)
+                (begin
+                  (mainActivityClearInteractionModes activity view)
+                  (mainActivitySetStatusRaw
+                    activity
+                    (appendCanceledNoGroupStatus)))
+                (let ((appendGroup (ssdGroupOrEmpty group))
+                      (count
+                        (mainActivityNumberInput
+                          activity
+                          "Count"
+                          (detectedIdsCountText (list-size detectedIds)))))
+                  (let ((dialog
+                          (alertDialogBuilderShowRaw
+                            (alertDialogBuilderSetPositiveAction
+                              (mainActivitySetNegativeCancelAppend
+                                (alertDialogBuilderSetViewRaw
+                                  (alertDialogBuilderSetMessageRaw
+                                    (alertDialogBuilderSetTitleRaw
+                                      (alertDialogBuilderForActivityRaw activity)
+                                      (appendDialogTitle appendGroup))
+                                    (detectedBoxesMessage
+                                      (list-size detectedIds)))
+                                  count)
+                                activity
+                                view)
+                              "Append"
+                              (lambda () (begin))))))
+                    (begin
+                      (mainActivityInstallAppendDialogButton
+                        activity
+                        dialog
+                        rect
+                        detectedIds
+                        appendGroup
+                        count
+                        view
+                        store
+                        confirmHaptic)
+                      (editTextRequestFocusRaw count))))))))
         (def (mainActivityDetectCurrentForceWithState
                (activity : MainActivity)) : Unit
           (mainActivityDetectCurrentRaw
@@ -7690,6 +7755,16 @@
           (editableToString (editTextRaw view)))
         (def (editTextSetSelectionToEnd (view : EditText) (text : String)) : Unit
           (editTextSetSelectionRaw view (int32 (string-length text))))
+        (def (mainActivityNumberInput
+               (activity : MainActivity)
+               (hint : String)
+               (text : String)) : EditText
+          (let ((input (editTextForActivity activity)))
+            (begin
+              (editTextHintSetRaw input hint)
+              (editTextInputTypeSetRaw input (inputTypeClassNumber))
+              (editTextSetTextRaw input text)
+              input)))
         (def (editTextReplaceAutoLabelForBoxType
                (activity : MainActivity)
                (label : EditText)
@@ -10909,7 +10984,7 @@
 	       "            return"
 	       "        }"
 	       "        if (appendMode) {"
-	       "            showAppendDialog(rect, detectedIds)"
+	       "            mainActivityShowAppendDialog(this, reviewView, truthStore, session, selectedGroupId, rect, detectedIds, HapticFeedbackConstants.CONFIRM)"
 	       "            return"
        "        }"
        "        val layout = LinearLayout(this).apply {"
@@ -10944,32 +11019,6 @@
        "        mainActivityFocusBoxTypeDropdown(dialog, boxType, resources.displayMetrics.heightPixels, android.view.WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE or android.view.WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE)"
        "    }"
        ""
-       "    private fun showAppendDialog(rect: FloatArray, detectedIds: List<String>) {"
-       "        if (sessionMissing(currentSession)) return"
-       "        val group = mainActivitySelectRequestedGroup(this, reviewView, currentSession, selectedGroupId)"
-       "        if (ssdGroupMissing(group)) {"
-       "            mainActivityClearInteractionModes(this, reviewView)"
-       "            setStatus(appendCanceledNoGroupStatus())"
-       "            return"
-       "        }"
-       "        val appendGroup = ssdGroupOrEmpty(group)"
-       "        val count = EditText(this).apply {"
-       "            hint = \"Count\""
-       "            inputType = InputType.TYPE_CLASS_NUMBER"
-       "            setText(detectedIdsCountText(detectedIds.size))"
-       "        }"
-       "        val title = appendDialogTitle(appendGroup)"
-       "        val dialog = AlertDialog.Builder(this)"
-       "            .setTitle(title)"
-       "            .setMessage(detectedBoxesMessage(detectedIds.size))"
-       "            .setView(count)"
-       "            .let { mainActivitySetNegativeCancelAppend(it, this, reviewView) }"
-       "            .setPositiveButton(\"Append\", null)"
-       "            .show()"
-       "        mainActivityInstallAppendDialogButton(this, dialog, rect, detectedIds, appendGroup, count, reviewView, truthStore, HapticFeedbackConstants.CONFIRM)"
-       "        count.requestFocus()"
-       "    }"
-       ""
        "    private fun showGroupEditDialog(group: SsdGroup) {"
        "        if (sessionMissing(currentSession)) return"
        "        val session = ssdSessionOrEmpty(currentSession)"