Generate SSD activity result handling from typed Jerboa

ober

055c1554f8eb3bacaa7a6ce3c90f24379d2c73a0

diff --git a/templates/ssd-review.ss b/templates/ssd-review.ss
index 7befe51..d23b620 100644
--- a/templates/ssd-review.ss
+++ b/templates/ssd-review.ss
@@ -4927,6 +4927,7 @@
                 mainActivityRequestDownloadAccess
                 mainActivityRememberAndBrowseSsdFolder
                 mainActivitySyncSelectedTree
+                mainActivityHandleActivityResult
                 mainActivityHandleReadStoragePermissionResult
                 mainActivitySetPositiveChooseSsdPdfFolder
                 mainActivitySetNeutralChooseSsdPdfFolder
@@ -5139,10 +5140,16 @@
                   (resolver : ContentResolver)
                   (uri : Uri)) : (Nullable InputStream)
           (kotlin-member-call openInputStream))
+        (extern (contentResolverOpenOutputStreamRaw
+                  (resolver : ContentResolver)
+                  (uri : Uri)) : (Nullable OutputStream)
+          (kotlin-member-call openOutputStream))
         (extern (sha1HexRaw (input : InputStream)) : String
           (kotlin-call sha1Hex))
         (extern (uiInputStreamCloseRaw (input : InputStream)) : Unit
           (kotlin-member-call close))
+        (extern (uiOutputStreamCloseRaw (output : OutputStream)) : Unit
+          (kotlin-member-call close))
         (extern (uuidRandomRaw) : UUID
           (kotlin-call UUID randomUUID))
         (extern (uuidToStringRaw (uuid : UUID)) : String
@@ -8519,6 +8526,86 @@
               uri
               (persistableReadWriteUriPermissionFlags flags))
             (mainActivitySyncSelectedTreeAsync activity store uri)))
+        (def (mainActivityExportTruthZipToUri
+               (activity : MainActivity)
+               (store : TruthStore)
+               (uri : Uri)) : Unit
+          (let ((output
+                  (contentResolverOpenOutputStreamRaw
+                    (mainActivityContentResolverRaw activity)
+                    uri)))
+            (if (nullable-null? output)
+              (begin)
+              (let ((stream (nullable-get output)))
+                (try-finally
+                  (begin
+                    (truthStoreExportZipArchive store stream)
+                    (mainActivitySetStatusRaw
+                      activity
+                      (exportedTruthZipStatus)))
+                  (uiOutputStreamCloseRaw stream))))))
+        (def (mainActivityImportTruthZipFromUri
+               (activity : MainActivity)
+               (store : TruthStore)
+               (uri : Uri)) : Unit
+          (let ((input
+                  (contentResolverOpenInputStreamRaw
+                    (mainActivityContentResolverRaw activity)
+                    uri)))
+            (if (nullable-null? input)
+              (begin)
+              (let ((stream (nullable-get input)))
+                (try-finally
+                  (let ((count
+                          (truthStoreImportZipArchive store stream)))
+                    (mainActivitySetStatusRaw
+                      activity
+                      (importedTruthZipStatus
+                        count
+                        (truthStoreStorageSummary store))))
+                  (uiInputStreamCloseRaw stream))))))
+        (def (mainActivityHandleActivityResult
+               (activity : MainActivity)
+               (store : TruthStore)
+               (requestCode : Int32)
+               (resultCode : Int32)
+               (data : (Nullable Intent))
+               (okCode : Int32)
+               (requestOpenPdfCode : Int32)
+               (requestOpenTreeCode : Int32)
+               (requestExportZipCode : Int32)
+               (requestImportZipCode : Int32)
+               (requestSyncTreeCode : Int32)
+               (treePreferenceKey : String)
+               (lastPdfPreferenceKey : String)) : Unit
+          (if (activityResultRejected resultCode okCode)
+            (begin)
+            (if (intentDataUriPresent data)
+              (let ((uri (intentDataUriOrEmpty data))
+                    (flags (intentFlagsOrZero data)))
+                (if (requestIsOpenPdf requestCode requestOpenPdfCode)
+                  (mainActivityLoadPdfRaw activity uri flags)
+                  (if (requestIsOpenSsdPdfTree requestCode requestOpenTreeCode)
+                    (mainActivityRememberAndBrowseSsdFolder
+                      activity
+                      uri
+                      flags
+                      treePreferenceKey
+                      lastPdfPreferenceKey
+                      requestOpenPdfCode
+                      requestOpenTreeCode)
+                    (if (requestIsExportZip requestCode requestExportZipCode)
+                      (mainActivityExportTruthZipToUri activity store uri)
+                      (if (requestIsImportZip requestCode requestImportZipCode)
+                        (mainActivityImportTruthZipFromUri activity store uri)
+                        (if (requestIsSyncTree requestCode requestSyncTreeCode)
+                          (mainActivitySyncSelectedTree
+                            activity
+                            store
+                            uri
+                            flags)
+                          (begin)))))))
+              (begin))))
         (def (mainActivityHandleReadStoragePermissionResult
                (activity : MainActivity)
                (requestCode : Int32)
@@ -11783,33 +11870,7 @@
        ""
        "    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {"
        "        super.onActivityResult(requestCode, resultCode, data)"
-       "        if (activityResultRejected(resultCode, RESULT_OK)) return"
-       "        if (!intentDataUriPresent(data)) return"
-       "        val uri = intentDataUriOrEmpty(data)"
-       "        val flags = intentFlagsOrZero(data)"
-       "        if (requestIsOpenPdf(requestCode, REQ_OPEN_PDF)) {"
-       "            loadPdf(uri, flags)"
-       "        } else if (requestIsOpenSsdPdfTree(requestCode, REQ_OPEN_SSD_PDF_TREE)) {"
-       "            mainActivityRememberAndBrowseSsdFolder(this, uri, flags, PREF_SSD_PDF_TREE_URI, PREF_LAST_PDF_URI, REQ_OPEN_PDF, REQ_OPEN_SSD_PDF_TREE)"
-       "        } else if (requestIsExportZip(requestCode, REQ_EXPORT_ZIP)) {"
-       "            val output = contentResolver.openOutputStream(uri)"
-       "            if (outputStreamPresent(output)) {"
-       "                checkNotNull(output).use {"
-       "                    truthStoreExportZipArchive(truthStore, it)"
-       "                    setStatus(exportedTruthZipStatus())"
-       "                }"
-       "            }"
-       "        } else if (requestIsImportZip(requestCode, REQ_IMPORT_ZIP)) {"
-       "            val input = contentResolver.openInputStream(uri)"
-       "            if (inputStreamPresent(input)) {"
-       "                checkNotNull(input).use {"
-       "                    val count = truthStoreImportZipArchive(truthStore, it)"
-       "                    setStatus(importedTruthZipStatus(count, truthStoreStorageSummary(truthStore)))"
-       "                }"
-       "            }"
-       "        } else if (requestIsSyncTree(requestCode, REQ_SYNC_TREE)) {"
-       "            mainActivitySyncSelectedTree(this, truthStore, uri, flags)"
-       "        }"
+       "        mainActivityHandleActivityResult(this, truthStore, requestCode, resultCode, data, RESULT_OK, REQ_OPEN_PDF, REQ_OPEN_SSD_PDF_TREE, REQ_EXPORT_ZIP, REQ_IMPORT_ZIP, REQ_SYNC_TREE, PREF_SSD_PDF_TREE_URI, PREF_LAST_PDF_URI)"
        "    }"
        ""
        "    override fun onRequestPermissionsResult("