Move SSD activity interaction modes to typed Kotlin

ober

603ca051dad39d792941a22934e5db28a332a473

diff --git a/templates/ssd-review.ss b/templates/ssd-review.ss
index 13c14d9..de814a2 100644
--- a/templates/ssd-review.ss
+++ b/templates/ssd-review.ss
@@ -4646,7 +4646,10 @@
                 reviewViewSetSsdAreaFromNullableSession reviewViewShowSession
                 reviewViewClearSessionState reviewViewShowBitmap
                 mainActivitySelectGroupId mainActivityClearSession
-                mainActivityShowSession
+                mainActivityShowSession mainActivitySetAppendMode
+                mainActivitySetSsdAreaMode mainActivityClearInteractionModes
+                mainActivityStartAppendInteraction
+                mainActivityStartSsdAreaInteraction
                 ssdBrowserResumeReady focusChangeShouldShowDropdown
                 dialogReadyToShowDropdown focusedDialogReadyToShowDropdown
                 permissionResultGranted downloadAccessBeforeRuntimePermissions
@@ -4770,6 +4773,14 @@
                   (activity : MainActivity)
                   (id : (Nullable String))) : Unit
           (kotlin-member-set selectedGroupId))
+        (extern (mainActivityAppendModeSet
+                  (activity : MainActivity)
+                  (enabled : Bool)) : Unit
+          (kotlin-member-set appendMode))
+        (extern (mainActivitySsdAreaModeSet
+                  (activity : MainActivity)
+                  (enabled : Bool)) : Unit
+          (kotlin-member-set ssdAreaMode))
         (def (normalizeFiringArc (value : String)) : String
           (string-uppercase (string-trim value)))
         (def (normalizeLabel (value : String)) : String
@@ -5297,6 +5308,30 @@
             (mainActivityCurrentSessionSet activity (nullable-some session))
             (mainActivitySelectGroupId activity view (nullable-none String))
             (reviewViewShowSession view session)))
+        (def (mainActivitySetAppendMode (activity : MainActivity)
+                                        (enabled : Bool)) : Unit
+          (mainActivityAppendModeSet activity enabled))
+        (def (mainActivitySetSsdAreaMode (activity : MainActivity)
+                                         (enabled : Bool)) : Unit
+          (mainActivitySsdAreaModeSet activity enabled))
+        (def (mainActivityClearInteractionModes (activity : MainActivity)
+                                                (view : SsdReviewView)) : Unit
+          (begin
+            (mainActivitySetAppendMode activity #f)
+            (mainActivitySetSsdAreaMode activity #f)
+            (reviewViewSetSelectMode view #f #t)))
+        (def (mainActivityStartAppendInteraction (activity : MainActivity)
+                                                 (view : SsdReviewView)) : Unit
+          (begin
+            (mainActivitySetAppendMode activity #t)
+            (mainActivitySetSsdAreaMode activity #f)
+            (reviewViewSetSelectMode view #t #t)))
+        (def (mainActivityStartSsdAreaInteraction (activity : MainActivity)
+                                                  (view : SsdReviewView)) : Unit
+          (begin
+            (mainActivitySetAppendMode activity #f)
+            (mainActivitySetSsdAreaMode activity #t)
+            (reviewViewSetSelectMode view #t #f)))
         (def (shouldCaptureViewport (includeViewport : Bool)) : Bool
           includeViewport)
         (def (viewportForSave (view : SsdReviewView)
@@ -6750,8 +6785,8 @@
        "    private var currentBitmap: Bitmap? = null"
 	       "    internal var currentSession: SsdSession? = null"
 	       "    internal var selectedGroupId: String? = null"
-	       "    private var appendMode: Boolean = false"
-	       "    private var ssdAreaMode: Boolean = false"
+	       "    internal var appendMode: Boolean = false"
+	       "    internal var ssdAreaMode: Boolean = false"
 	       "    private var reopenSsdBrowserOnResume: Boolean = false"
        "    @Volatile private var loadGeneration: Int = 0"
        "    private val boxTypeDisplays: List<String> by lazy { boxTypeDisplays(BoxTypes.load(this)) }"
@@ -7077,17 +7112,14 @@
        ""
 	       "    private fun setSelectMode(enabled: Boolean) {"
 	       "        if (selectModeDisabled(enabled)) {"
-	       "            appendMode = false"
-	       "            ssdAreaMode = false"
+	       "            mainActivityClearInteractionModes(this, reviewView)"
 	       "        }"
 	       "        reviewViewSetSelectMode(reviewView, enabled, !ssdAreaMode)"
 	       "        setStatus(selectModeStatus(ssdAreaMode, appendMode, reviewView.selectMode))"
        "    }"
        ""
 	       "    private fun finishSelectInteraction() {"
-	       "        appendMode = false"
-	       "        ssdAreaMode = false"
-	       "        reviewViewSetSelectMode(reviewView, false, true)"
+	       "        mainActivityClearInteractionModes(this, reviewView)"
 	       "        reviewView.clearInteractionState()"
 	       "    }"
        ""
@@ -7102,24 +7134,19 @@
        "        val session = ssdSessionOrEmpty(currentSession)"
        "        val group = ssdSessionFindGroupById(session, selectedGroupId)"
        "        if (ssdGroupMissing(group)) {"
-       "            appendMode = false"
-       "            reviewViewSetSelectMode(reviewView, false, true)"
+       "            mainActivityClearInteractionModes(this, reviewView)"
        "            setStatus(\"Select an existing group first, then tap Append\")"
        "            return"
-       "        }"
+	       "        }"
 	       "        val appendGroup = ssdGroupOrEmpty(group)"
-	       "        appendMode = true"
-	       "        ssdAreaMode = false"
-	       "        reviewViewSetSelectMode(reviewView, true, true)"
+	       "        mainActivityStartAppendInteraction(this, reviewView)"
 	       "        reviewViewSelectGroupId(reviewView, appendGroup.id)"
 	       "        setStatus(appendModeStatus(appendGroup))"
 	       "    }"
 	       ""
 	       "    private fun startSsdAreaMode() {"
 	       "        if (sessionMissing(currentSession)) return"
-	       "        appendMode = false"
-	       "        ssdAreaMode = true"
-	       "        reviewViewSetSelectMode(reviewView, true, false)"
+	       "        mainActivityStartSsdAreaInteraction(this, reviewView)"
 	       "        reviewViewSelectGroupId(reviewView, selectedGroupId)"
 	       "        reviewView.performHapticFeedback(HapticFeedbackConstants.CLOCK_TICK)"
 	       "        setStatus(\"SSD area mode: drag around the ship SSD; tags outside that area will be removed\")"
@@ -7482,8 +7509,7 @@
        "        val session = ssdSessionOrEmpty(currentSession)"
        "        val group = ssdSessionFindGroupById(session, selectedGroupId)"
        "        if (ssdGroupMissing(group)) {"
-       "            appendMode = false"
-       "            reviewViewSetSelectMode(reviewView, false, true)"
+       "            mainActivityClearInteractionModes(this, reviewView)"
        "            setStatus(appendCanceledNoGroupStatus())"
        "            return"
        "        }"
@@ -7499,8 +7525,7 @@
        "            .setMessage(detectedBoxesMessage(detectedIds.size))"
        "            .setView(count)"
        "            .setNegativeButton(\"Cancel\") { _, _ ->"
-       "                appendMode = false"
-       "                reviewViewSetSelectMode(reviewView, false, true)"
+       "                mainActivityClearInteractionModes(this, reviewView)"
        "                setStatus(appendCanceledStatus())"
        "            }"
        "            .setPositiveButton(\"Append\", null)"