Move SSD activity session selection updates to typed Kotlin

ober

c7f28d89580c3d81d5bc25c6b9de8bff94495cf3

diff --git a/templates/ssd-review.ss b/templates/ssd-review.ss
index aa27f2f..13c14d9 100644
--- a/templates/ssd-review.ss
+++ b/templates/ssd-review.ss
@@ -4645,6 +4645,8 @@
                 reviewViewSetSsdAreaFromSession
                 reviewViewSetSsdAreaFromNullableSession reviewViewShowSession
                 reviewViewClearSessionState reviewViewShowBitmap
+                mainActivitySelectGroupId mainActivityClearSession
+                mainActivityShowSession
                 ssdBrowserResumeReady focusChangeShouldShowDropdown
                 dialogReadyToShowDropdown focusedDialogReadyToShowDropdown
                 permissionResultGranted downloadAccessBeforeRuntimePermissions
@@ -4704,6 +4706,7 @@
         (type JSONObject)
         (type SsdSession)
         (type SsdReviewView)
+        (type MainActivity)
         (type TruthStore)
         (type ViewportState)
         (extern (fileIsFile (file : File)) : Bool
@@ -4759,6 +4762,14 @@
         (extern (reviewViewBitmapSet (view : SsdReviewView)
                                      (bitmap : (Nullable Bitmap))) : Unit
           (kotlin-member-set bitmap))
+        (extern (mainActivityCurrentSessionSet
+                  (activity : MainActivity)
+                  (session : (Nullable SsdSession))) : Unit
+          (kotlin-member-set currentSession))
+        (extern (mainActivitySelectedGroupIdSet
+                  (activity : MainActivity)
+                  (id : (Nullable String))) : Unit
+          (kotlin-member-set selectedGroupId))
         (def (normalizeFiringArc (value : String)) : String
           (string-uppercase (string-trim value)))
         (def (normalizeLabel (value : String)) : String
@@ -5267,6 +5278,25 @@
         (def (reviewViewShowBitmap (view : SsdReviewView)
                                    (bitmap : Bitmap)) : Unit
           (reviewViewBitmapSet view (nullable-some bitmap)))
+        (def (mainActivitySelectGroupId (activity : MainActivity)
+                                        (view : SsdReviewView)
+                                        (id : (Nullable String))) : Unit
+          (begin
+            (mainActivitySelectedGroupIdSet activity id)
+            (reviewViewSelectGroupId view id)))
+        (def (mainActivityClearSession (activity : MainActivity)
+                                       (view : SsdReviewView)) : Unit
+          (begin
+            (mainActivityCurrentSessionSet activity (nullable-none SsdSession))
+            (mainActivitySelectGroupId activity view (nullable-none String))
+            (reviewViewClearSessionState view)))
+        (def (mainActivityShowSession (activity : MainActivity)
+                                      (view : SsdReviewView)
+                                      (session : SsdSession)) : Unit
+          (begin
+            (mainActivityCurrentSessionSet activity (nullable-some session))
+            (mainActivitySelectGroupId activity view (nullable-none String))
+            (reviewViewShowSession view session)))
         (def (shouldCaptureViewport (includeViewport : Bool)) : Bool
           includeViewport)
         (def (viewportForSave (view : SsdReviewView)
@@ -6718,8 +6748,8 @@
        "    private var pageIndex: Int = 0"
        "    private var pageCount: Int = 0"
        "    private var currentBitmap: Bitmap? = null"
-	       "    private var currentSession: SsdSession? = null"
-	       "    private var selectedGroupId: String? = null"
+	       "    internal var currentSession: SsdSession? = null"
+	       "    internal var selectedGroupId: String? = null"
 	       "    private var appendMode: Boolean = false"
 	       "    private var ssdAreaMode: Boolean = false"
 	       "    private var reopenSsdBrowserOnResume: Boolean = false"
@@ -7135,9 +7165,8 @@
        "        ssdSessionStoreSsdArea(session, area)"
        "        val outsideCount = ssdSessionSsdAreaOutsideCount(session)"
        "        val removed = ssdSessionPruneGroupsOutsideSsdArea(session)"
-	       "        selectedGroupId = ssdSessionSelectedGroupId(session, selectedGroupId)"
+	       "        mainActivitySelectGroupId(this, reviewView, ssdSessionSelectedGroupId(session, selectedGroupId))"
 	       "        reviewViewSetSsdAreaFromSession(reviewView, session)"
-	       "        reviewViewSelectGroupId(reviewView, selectedGroupId)"
 	       "        truthStore.appendEvent(\"ssd_area_set\", session, ssdAreaSetDetails(removed, beforeGroups, outsideCount))"
 	       "        reviewView.performHapticFeedback(HapticFeedbackConstants.CONFIRM)"
 	       "        reviewView.invalidate()"
@@ -7156,8 +7185,7 @@
        "        val group = ssdSessionFindGroupById(session, groupId)"
        "        if (ssdGroupMissing(group)) return"
        "        val selectedGroup = ssdGroupOrEmpty(group)"
-	       "        selectedGroupId = selectedGroup.id"
-	       "        reviewViewSelectGroupId(reviewView, selectedGroup.id)"
+	       "        mainActivitySelectGroupId(this, reviewView, selectedGroup.id)"
 	       "        reviewView.centerOnGroup(selectedGroup)"
 	       "        reviewView.performHapticFeedback(HapticFeedbackConstants.CLOCK_TICK)"
        "        setStatus(selectedGroupStatus(selectedGroup))"
@@ -7167,8 +7195,7 @@
        "        val group = ssdCurrentSelectedGroup(currentSession, selectedGroupId)"
        "        if (ssdGroupMissing(group)) return null"
        "        val selectedGroup = ssdGroupOrEmpty(group)"
-       "        selectedGroupId = selectedGroup.id"
-       "        reviewViewSelectGroupId(reviewView, selectedGroup.id)"
+       "        mainActivitySelectGroupId(this, reviewView, selectedGroup.id)"
        "        return selectedGroup"
        "    }"
        ""
@@ -7217,10 +7244,8 @@
        "                runOnUiThread {"
        "                    if (isStaleLoad(renderGeneration, uri, renderPageIndex)) return@runOnUiThread"
        "                    currentBitmap = bitmap"
-       "                    currentSession = null"
-       "                    selectedGroupId = null"
 	       "                    reviewViewShowBitmap(reviewView, bitmap)"
-	       "                    reviewViewClearSessionState(reviewView)"
+	       "                    mainActivityClearSession(this, reviewView)"
        "                    restoreViewportAfterLayout(restoredViewport)"
 	       "                    setStatus(renderedLoadingTruthStatus(renderPdfName, renderPageIndex, renderPageCount))"
        "                    detectCurrent("
@@ -7279,9 +7304,7 @@
 	      "                    ssdSessionPruneGroupsOutsideSsdArea(session)"
 	       "                    runOnUiThread {"
        "                        if (isStaleLoad(expectedGeneration, uri, expectedPageIndex)) return@runOnUiThread"
-       "                        currentSession = session"
-       "                        selectedGroupId = null"
-	       "                        reviewViewShowSession(reviewView, session)"
+	       "                        mainActivityShowSession(this, reviewView, session)"
 	       "                        setStatus(sessionCountsStatus(session, \", replayed cached truth\"))"
 	       "                        logDetectResult(\"cached-truth\", session, \"local-truth\")"
        "                    }"
@@ -7327,9 +7350,7 @@
        "                val learnedGuesses = learnedGuessesForDetection(truthStore, session, existingTruthGroupCount)"
        "                runOnUiThread {"
        "                    if (isStaleLoad(expectedGeneration, uri, expectedPageIndex)) return@runOnUiThread"
-       "                    currentSession = session"
-       "                    selectedGroupId = null"
-	       "                    reviewViewShowSession(reviewView, session)"
+	       "                    mainActivityShowSession(this, reviewView, session)"
        "                    val truthNote = detectionTruthNoteFor(existingTruth)"
        "                    val ocrNote = detectionOcrNote(ocrGuesses, session.ocrWords.size)"
        "                    val learnedNote = detectionLearnedNote(learnedGuesses)"
@@ -7370,9 +7391,7 @@
        "            ssdSessionPruneGroupsOutsideSsdArea(merged)"
        "            runOnUiThread {"
        "                if (isStaleLoad(generation, uri, page)) return@runOnUiThread"
-       "                currentSession = merged"
-       "                selectedGroupId = null"
-       "                reviewViewShowSession(reviewView, merged)"
+       "                mainActivityShowSession(this, reviewView, merged)"
        "                reviewView.invalidate()"
        "                setStatus(sessionCountsStatus(merged, \", pulled remote truth\"))"
        "                logDetectResult(\"remote-truth\", merged, \"remote-truth\")"
@@ -7537,8 +7556,7 @@
        "        val ids = selectedOrManualCellIds(session, rect, detectedIds, count)"
        "        val group = ssdSessionAddApprovedAreaGroup(session, ids, cleanLabel, resolvedBoxTypeIdOr(resolvedType, boxType), firingArc)"
        "        truthStore.appendEvent(\"group_approved\", session)"
-       "        selectedGroupId = group.id"
-       "        reviewViewSelectGroupId(reviewView, group.id)"
+       "        mainActivitySelectGroupId(this, reviewView, group.id)"
        "        finishSelectInteraction()"
        "        reviewView.performHapticFeedback(HapticFeedbackConstants.CONFIRM)"
        "        reviewView.invalidate()"
@@ -7556,8 +7574,7 @@
        "        val ids = selectedOrManualCellIds(session, rect, detectedIds, count)"
        "        val added = ssdSessionAppendAreaToGroup(session, group, ids)"
        "        finishSelectInteraction()"
-       "        selectedGroupId = group.id"
-       "        reviewViewSelectGroupId(reviewView, group.id)"
+       "        mainActivitySelectGroupId(this, reviewView, group.id)"
        "        truthStore.appendEvent(\"group_appended\", session)"
        "        reviewView.performHapticFeedback(HapticFeedbackConstants.CONFIRM)"
        "        reviewView.invalidate()"
@@ -7660,8 +7677,7 @@
        "        val deletedGroup = ssdGroupOrEmpty(group)"
        "        ssdSessionSuppressGroupAsDeleted(session, deletedGroup)"
        "        truthStore.appendEvent(\"group_deleted\", session)"
-	       "        selectedGroupId = ssdSessionSelectedGroupId(session, null)"
-       "        reviewViewSelectGroupId(reviewView, selectedGroupId)"
+	       "        mainActivitySelectGroupId(this, reviewView, ssdSessionSelectedGroupId(session, null))"
        "        reviewView.performHapticFeedback(HapticFeedbackConstants.REJECT)"
        "        reviewView.invalidate()"
        "        saveSessionAsync("