Move SSD review group selection to typed Kotlin

ober

a10b033e22ac31e188127549fef27240479fa23c

diff --git a/templates/ssd-review.ss b/templates/ssd-review.ss
index c04adcb..18bf820 100644
--- a/templates/ssd-review.ss
+++ b/templates/ssd-review.ss
@@ -4654,7 +4654,10 @@
                 reviewViewClearDragPoints reviewViewClearInteractionDetails
                 reviewViewSetLastTouchPosition
                 reviewViewSetPointerPosition
-                mainActivitySelectGroupId mainActivityClearSession
+                mainActivitySelectGroupId
+                mainActivitySelectRequestedGroup
+                mainActivitySelectCurrentGroup
+                mainActivityClearSession
                 mainActivityShowSession mainActivitySetAppendMode
                 mainActivitySetSsdAreaMode mainActivityClearInteractionModes
                 mainActivityStartAppendInteraction
@@ -5455,6 +5458,36 @@
           (begin
             (mainActivitySelectedGroupIdSet activity id)
             (reviewViewSelectGroupId view id)))
+        (def (mainActivitySelectRequestedGroup
+               (activity : MainActivity)
+               (view : SsdReviewView)
+               (session : (Nullable SsdSession))
+               (groupId : (Nullable String))) : (Nullable SsdGroup)
+          (if (nullable-null? session)
+            (nullable-none SsdGroup)
+            (let ((group (ssdSessionFindGroupById (nullable-get session) groupId)))
+              (if (nullable-null? group)
+                (nullable-none SsdGroup)
+                (begin
+                  (mainActivitySelectGroupId
+                    activity
+                    view
+                    (nullable-some (SsdGroup-id (nullable-get group))))
+                  group)))))
+        (def (mainActivitySelectCurrentGroup
+               (activity : MainActivity)
+               (view : SsdReviewView)
+               (session : (Nullable SsdSession))
+               (groupId : (Nullable String))) : (Nullable SsdGroup)
+          (let ((group (ssdCurrentSelectedGroup session groupId)))
+            (if (nullable-null? group)
+              (nullable-none SsdGroup)
+              (begin
+                (mainActivitySelectGroupId
+                  activity
+                  view
+                  (nullable-some (SsdGroup-id (nullable-get group))))
+                group))))
         (def (mainActivityClearSession (activity : MainActivity)
                                        (view : SsdReviewView)) : Unit
           (begin
@@ -7415,23 +7448,18 @@
 	       "    }"
 	       ""
 	       "    private fun selectGroup(groupId: String?) {"
-       "        if (sessionMissing(currentSession)) return"
-       "        val session = ssdSessionOrEmpty(currentSession)"
-       "        val group = ssdSessionFindGroupById(session, groupId)"
+       "        val group = mainActivitySelectRequestedGroup(this, reviewView, currentSession, groupId)"
        "        if (ssdGroupMissing(group)) return"
        "        val selectedGroup = ssdGroupOrEmpty(group)"
-	       "        mainActivitySelectGroupId(this, reviewView, selectedGroup.id)"
 	       "        reviewView.centerOnGroup(selectedGroup)"
 	       "        reviewView.performHapticFeedback(HapticFeedbackConstants.CLOCK_TICK)"
        "        setStatus(selectedGroupStatus(selectedGroup))"
        "    }"
        ""
        "    private fun selectedGroup(): SsdGroup? {"
-       "        val group = ssdCurrentSelectedGroup(currentSession, selectedGroupId)"
+       "        val group = mainActivitySelectCurrentGroup(this, reviewView, currentSession, selectedGroupId)"
        "        if (ssdGroupMissing(group)) return null"
-       "        val selectedGroup = ssdGroupOrEmpty(group)"
-       "        mainActivitySelectGroupId(this, reviewView, selectedGroup.id)"
-       "        return selectedGroup"
+       "        return ssdGroupOrEmpty(group)"
        "    }"
        ""
        "    private fun selectRelativeGroup(delta: Int) {"