Move SSD review view callbacks to typed Kotlin

ober

ce7daecb240f2e7368fb34477341ed42a9b91d48

diff --git a/templates/ssd-review.ss b/templates/ssd-review.ss
index 767a5b2..736e9e3 100644
--- a/templates/ssd-review.ss
+++ b/templates/ssd-review.ss
@@ -4699,6 +4699,7 @@
                 reviewViewRestoreViewport
                 reviewViewRestoreViewportAfterLayout
                 reviewViewClearInteractionState
+                mainActivityInstallReviewViewCallbacks
                 mainActivitySelectGroupId
                 mainActivitySelectRequestedGroup
                 mainActivitySelectCurrentGroup
@@ -4940,6 +4941,18 @@
           (kotlin-member-call postDelayed))
         (extern (reviewViewClearInteractionStateRaw (view : SsdReviewView)) : Unit
           (kotlin-member-call clearInteractionState))
+        (extern (reviewViewOnStatusSet
+                  (view : SsdReviewView)
+                  (callback : (-> String Unit))) : Unit
+          (kotlin-member-set onStatus))
+        (extern (reviewViewOnAreaSelectedSet
+                  (view : SsdReviewView)
+                  (callback : (-> FloatArray (List String) Unit))) : Unit
+          (kotlin-member-set onAreaSelected))
+        (extern (reviewViewOnGroupTappedSet
+                  (view : SsdReviewView)
+                  (callback : (-> String Unit))) : Unit
+          (kotlin-member-set onGroupTapped))
         (extern (reviewViewSelectModeRaw (view : SsdReviewView)) : Bool
           (kotlin-member-get selectMode))
         (extern (reviewViewRotateClockwise (view : SsdReviewView)) : Unit
@@ -5076,6 +5089,15 @@
                   (activity : MainActivity)
                   (text : String)) : Unit
           (kotlin-member-call setStatus))
+        (extern (mainActivityHandleAreaSelectedRaw
+                  (activity : MainActivity)
+                  (rect : FloatArray)
+                  (detectedIds : (List String))) : Unit
+          (kotlin-member-call handleAreaSelected))
+        (extern (mainActivitySelectGroupRaw
+                  (activity : MainActivity)
+                  (groupId : String)) : Unit
+          (kotlin-member-call selectGroup))
         (extern (mainActivityRenderCurrentPageRaw
                   (activity : MainActivity)) : Unit
           (kotlin-member-call renderCurrentPage))
@@ -5721,6 +5743,22 @@
               (int32 180))))
         (def (reviewViewClearInteractionState (view : SsdReviewView)) : Unit
           (reviewViewClearInteractionStateRaw view))
+        (def (mainActivityInstallReviewViewCallbacks
+               (activity : MainActivity)
+               (view : SsdReviewView)) : Unit
+          (begin
+            (reviewViewOnStatusSet
+              view
+              (lambda ((text : String))
+                (mainActivitySetStatusRaw activity text)))
+            (reviewViewOnAreaSelectedSet
+              view
+              (lambda ((rect : FloatArray) (ids : (List String)))
+                (mainActivityHandleAreaSelectedRaw activity rect ids)))
+            (reviewViewOnGroupTappedSet
+              view
+              (lambda ((groupId : String))
+                (mainActivitySelectGroupRaw activity groupId)))))
         (def (mainActivitySelectGroupId (activity : MainActivity)
                                         (view : SsdReviewView)
                                         (id : (Nullable String))) : Unit
@@ -7571,9 +7609,7 @@
        "        })"
        "        root.addView(status)"
 	       "        mainActivitySetReviewView(this, SsdReviewView(this).apply {"
-	       "            onStatus = { setStatus(it) }"
-	       "            onAreaSelected = { rect, ids -> handleAreaSelected(rect, ids) }"
-	       "            onGroupTapped = { selectGroup(it) }"
+       "            mainActivityInstallReviewViewCallbacks(this@MainActivity, this)"
 	       "        })"
        "        root.addView(reviewView, LinearLayout.LayoutParams("
        "            LinearLayout.LayoutParams.MATCH_PARENT,"
@@ -7902,7 +7938,7 @@
 	       "        }"
 	       "    }"
 	       ""
-	       "    private fun selectGroup(groupId: String?) {"
+       "    internal fun selectGroup(groupId: String?) {"
        "        val group = mainActivitySelectRequestedGroup(this, reviewView, currentSession, groupId)"
        "        if (ssdGroupMissing(group)) return"
        "        val selectedGroup = ssdGroupOrEmpty(group)"
@@ -8116,7 +8152,7 @@
 	       "    private fun isStaleLoad(generation: Int, uri: Uri, page: Int): Boolean ="
 	       "        currentLoadStale(generation, loadGeneration, pdfUri, uri, pageIndex, page)"
 	       ""
-	       "    private fun handleAreaSelected(rect: FloatArray, detectedIds: List<String>) {"
+       "    internal fun handleAreaSelected(rect: FloatArray, detectedIds: List<String>) {"
 	       "        if (sessionMissing(currentSession)) {"
 	       "            setStatus(selectionIgnoredLoadingStatus())"
 	       "            return"