Move SSD append group checks to typed Kotlin

ober

bf35177afa40c5ed397d5db82e2687ae7ff5571d

diff --git a/templates/ssd-review.ss b/templates/ssd-review.ss
index 7c5afa0..208df40 100644
--- a/templates/ssd-review.ss
+++ b/templates/ssd-review.ss
@@ -544,6 +544,7 @@
                 ssdSessionSelectedGroupId ssdSessionRelativeGroupId
                 ssdSessionCellIdsForGroupId
                 ssdSessionGroupPresent ssdSessionGroupMissing
+                ssdGroupMissing ssdGroupOrEmpty
                 ssdSessionGroupContainsCellId
                 ssdSessionCellIdSet
                 ssdSessionFindCellById ssdSessionCellsByIds
@@ -829,6 +830,21 @@
         (def (ssdSessionGroupMissing (session : SsdSession)
                                      (group : SsdGroup)) : Bool
           (not (ssdSessionGroupPresent session group)))
+        (def (ssdGroupMissing (group : (Nullable SsdGroup))) : Bool
+          (nullable-null? group))
+        (def (ssdGroupOrEmpty (group : (Nullable SsdGroup))) : SsdGroup
+          (if (nullable-null? group)
+            (make-SsdGroup
+              ""
+              ""
+              ""
+              ""
+              (int32 0)
+              (float-array (float32 0.0) (float32 0.0) (float32 0.0) (float32 0.0))
+              (mutable-list-empty String)
+              ""
+              "")
+            (nullable-get group)))
         (def (ssdSessionGroupContainsCellId (session : SsdSession)
                                             (groupId : (Nullable String))
                                             (cellId : String)) : Bool
@@ -6440,18 +6456,19 @@
        "    private fun startAppendMode() {"
        "        val session = currentSession ?: return"
        "        val group = ssdSessionFindGroupById(session, selectedGroupId)"
-       "        if (group == null) {"
+       "        if (ssdGroupMissing(group)) {"
        "            appendMode = false"
        "            reviewView.selectMode = false"
        "            setStatus(\"Select an existing group first, then tap Append\")"
        "            return"
 	       "        }"
+       "        val appendGroup = ssdGroupOrEmpty(group)"
 	       "        appendMode = true"
 	       "        ssdAreaMode = false"
 	       "        reviewView.snapSelectionToCells = true"
 	       "        reviewView.selectMode = true"
-	       "        reviewView.selectedGroupId = group.id"
-	       "        setStatus(appendModeStatus(group))"
+	       "        reviewView.selectedGroupId = appendGroup.id"
+	       "        setStatus(appendModeStatus(appendGroup))"
 	       "    }"
 	       ""
 	       "    private fun startSsdAreaMode() {"
@@ -6837,18 +6854,19 @@
        "    private fun showAppendDialog(rect: FloatArray, detectedIds: List<String>) {"
        "        val session = currentSession ?: return"
        "        val group = ssdSessionFindGroupById(session, selectedGroupId)"
-       "        if (group == null) {"
+       "        if (ssdGroupMissing(group)) {"
        "            appendMode = false"
        "            reviewView.selectMode = false"
        "            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(group)"
+       "        val title = appendDialogTitle(appendGroup)"
        "        val dialog = AlertDialog.Builder(this)"
        "            .setTitle(title)"
        "            .setMessage(detectedBoxesMessage(detectedIds.size))"
@@ -6863,7 +6881,7 @@
        "        dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {"
        "            val countValue = dialogCountValue(count.text.toString())"
        "            dialog.dismiss()"
-       "            appendAreaToGroup(rect, detectedIds, group, countValue)"
+       "            appendAreaToGroup(rect, detectedIds, appendGroup, countValue)"
        "        }"
        "        count.requestFocus()"
        "    }"