Move SSD review event appends to typed Kotlin

ober

979037f793a74ee2b5574f28f2af995657843572

diff --git a/templates/ssd-review.ss b/templates/ssd-review.ss
index 350057a..a0a1108 100644
--- a/templates/ssd-review.ss
+++ b/templates/ssd-review.ss
@@ -4682,6 +4682,11 @@
                 mainActivitySetTruthStore mainActivitySetStatusView
                 mainActivitySetReviewView
                 truthStoreApplyTruthAndPrune
+                truthStoreAppendSsdAreaSet
+                truthStoreAppendGroupApproved
+                truthStoreAppendGroupAppended
+                truthStoreAppendGroupEdited
+                truthStoreAppendGroupDeleted
                 ssdBrowserResumeReady focusChangeShouldShowDropdown
                 dialogReadyToShowDropdown focusedDialogReadyToShowDropdown
                 permissionResultGranted downloadAccessBeforeRuntimePermissions
@@ -4781,6 +4786,16 @@
         (extern (truthStoreApplyTruth (store : TruthStore)
                                       (session : SsdSession)) : Unit
           (kotlin-member-call applyTruth))
+        (extern (truthStoreAppendEvent (store : TruthStore)
+                                       (eventType : String)
+                                       (session : SsdSession)) : Unit
+          (kotlin-member-call appendEvent))
+        (extern (truthStoreAppendEventWithDetails
+                  (store : TruthStore)
+                  (eventType : String)
+                  (session : SsdSession)
+                  (details : JSONObject)) : Unit
+          (kotlin-member-call appendEvent))
         (extern (reviewViewCaptureViewport (view : SsdReviewView)) : (Nullable ViewportState)
           (kotlin-member-call captureViewport))
         (extern (reviewViewRotateClockwise (view : SsdReviewView)) : Unit
@@ -5663,6 +5678,27 @@
             (truthStoreApplyTruth store session)
             (ssdSessionPruneGroupsOutsideSsdArea session)
             (begin)))
+        (def (truthStoreAppendSsdAreaSet
+               (store : TruthStore)
+               (session : SsdSession)
+               (details : JSONObject)) : Unit
+          (truthStoreAppendEventWithDetails store "ssd_area_set" session details))
+        (def (truthStoreAppendGroupApproved
+               (store : TruthStore)
+               (session : SsdSession)) : Unit
+          (truthStoreAppendEvent store "group_approved" session))
+        (def (truthStoreAppendGroupAppended
+               (store : TruthStore)
+               (session : SsdSession)) : Unit
+          (truthStoreAppendEvent store "group_appended" session))
+        (def (truthStoreAppendGroupEdited
+               (store : TruthStore)
+               (session : SsdSession)) : Unit
+          (truthStoreAppendEvent store "group_edited" session))
+        (def (truthStoreAppendGroupDeleted
+               (store : TruthStore)
+               (session : SsdSession)) : Unit
+          (truthStoreAppendEvent store "group_deleted" session))
         (def (shouldCaptureViewport (includeViewport : Bool)) : Bool
           includeViewport)
         (def (viewportForSave (view : SsdReviewView)
@@ -7529,7 +7565,7 @@
        "        val details = ssdSessionApplySsdArea(session, area)"
 	       "        mainActivitySelectGroupId(this, reviewView, ssdSessionSelectedGroupId(session, selectedGroupId))"
 	       "        reviewViewSetSsdAreaFromSession(reviewView, session)"
-	       "        truthStore.appendEvent(\"ssd_area_set\", session, details)"
+	       "        truthStoreAppendSsdAreaSet(truthStore, session, details)"
 	       "        reviewView.performHapticFeedback(HapticFeedbackConstants.CONFIRM)"
 	       "        reviewView.invalidate()"
 	       "        saveSessionAsync("
@@ -7576,7 +7612,7 @@
        "        val approvedGroup = ssdGroupOrEmpty(group)"
        "        finalizeGroupLabel(approvedGroup)"
        "        ssdSessionApproveGroup(session, approvedGroup)"
-       "        truthStore.appendEvent(\"group_approved\", session)"
+       "        truthStoreAppendGroupApproved(truthStore, session)"
        "        reviewView.performHapticFeedback(HapticFeedbackConstants.CONFIRM)"
        "        reviewView.invalidate()"
        "        saveSessionAsync("
@@ -7902,7 +7938,7 @@
        "        val resolvedType = BoxTypes.resolve(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)"
-       "        truthStore.appendEvent(\"group_approved\", session)"
+       "        truthStoreAppendGroupApproved(truthStore, session)"
        "        finishSelectInteraction()"
        "        reviewView.performHapticFeedback(HapticFeedbackConstants.CONFIRM)"
        "        reviewView.invalidate()"
@@ -7919,7 +7955,7 @@
        "        if (ssdSessionGroupMissing(session, group)) return"
        "        val added = mainActivityAppendAreaToGroup(this, reviewView, session, rect, detectedIds, group, count)"
        "        finishSelectInteraction()"
-       "        truthStore.appendEvent(\"group_appended\", session)"
+       "        truthStoreAppendGroupAppended(truthStore, session)"
        "        reviewView.performHapticFeedback(HapticFeedbackConstants.CONFIRM)"
        "        reviewView.invalidate()"
        "        saveSessionAsync("
@@ -7984,7 +8020,7 @@
        "                firingArcText,"
        "                count.text.toString()"
        "            )"
-       "            truthStore.appendEvent(\"group_edited\", session)"
+       "            truthStoreAppendGroupEdited(truthStore, session)"
        "            reviewView.performHapticFeedback(HapticFeedbackConstants.CONFIRM)"
        "            reviewView.invalidate()"
        "            saveSessionAsync("
@@ -8020,7 +8056,7 @@
        "        if (ssdGroupMissing(group)) return"
        "        val deletedGroup = ssdGroupOrEmpty(group)"
        "        mainActivitySuppressGroupAsDeleted(this, reviewView, session, deletedGroup)"
-       "        truthStore.appendEvent(\"group_deleted\", session)"
+       "        truthStoreAppendGroupDeleted(truthStore, session)"
        "        reviewView.performHapticFeedback(HapticFeedbackConstants.REJECT)"
        "        reviewView.invalidate()"
        "        saveSessionAsync("