Generate SSD main activity class from typed Jerboa

ober

b66f26114993978b178d190babdcbfca889ade87

diff --git a/.build.yml b/.build.yml
index 114accd..a871c7d 100644
--- a/.build.yml
+++ b/.build.yml
@@ -5,7 +5,7 @@ packages:
   - make=4.4.1-r4
 sources:
   # Build dependency: full immutable commit, mirrored in dependencies.lock.json.
-  - "https://git.sr.ht/~lisp/jerboa#344119da5afd49cc97ed78676474b98d0da8fc97"
+  - "https://git.sr.ht/~lisp/jerboa#75fe436882fc90a2d8375b8f2000e6a829f77b7c"
   # The second source is the build subject selected by the SourceHut submitter.
   - https://git.sr.ht/~lisp/jerboa-android
 tasks:
@@ -14,6 +14,6 @@ tasks:
       test "$(apk info -v chez-scheme)" = chez-scheme-10.3.0-r2
       test "$(apk info -v git)" = git-2.54.0-r0
       test "$(apk info -v make)" = make-4.4.1-r4
-      test "$(git -C ../jerboa rev-parse HEAD)" = 344119da5afd49cc97ed78676474b98d0da8fc97
-      test "$(git -C ../jerboa rev-parse 'HEAD^{tree}')" = 7869f8316b49971e0846fa995dd2f08f8940aee6
+      test "$(git -C ../jerboa rev-parse HEAD)" = 75fe436882fc90a2d8375b8f2000e6a829f77b7c
+      test "$(git -C ../jerboa rev-parse 'HEAD^{tree}')" = 883737c903b9a6d8b9200911a1ad77f8844e0597
       JERBOA="chez --libdirs .:../jerboa/lib --script" make test
diff --git a/dependencies.lock.json b/dependencies.lock.json
index 8e622d1..4723e8b 100644
--- a/dependencies.lock.json
+++ b/dependencies.lock.json
@@ -11,8 +11,8 @@
   "generator_runtime": {
     "name": "jerboa",
     "repository": "https://git.sr.ht/~lisp/jerboa",
-    "commit": "344119da5afd49cc97ed78676474b98d0da8fc97",
-    "tree": "7869f8316b49971e0846fa995dd2f08f8940aee6"
+    "commit": "75fe436882fc90a2d8375b8f2000e6a829f77b7c",
+    "tree": "883737c903b9a6d8b9200911a1ad77f8844e0597"
   },
   "assurance_tools": {
     "osv_scanner": {
diff --git a/scripts/verify-supply-chain.sh b/scripts/verify-supply-chain.sh
index 696b73b..2d946b0 100755
--- a/scripts/verify-supply-chain.sh
+++ b/scripts/verify-supply-chain.sh
@@ -3,8 +3,8 @@ set -eu
 
 repo=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd -P)
 lock="$repo/dependencies.lock.json"
-jerboa_commit=344119da5afd49cc97ed78676474b98d0da8fc97 # gitsafe:ignore
-jerboa_tree=7869f8316b49971e0846fa995dd2f08f8940aee6 # gitsafe:ignore
+jerboa_commit=75fe436882fc90a2d8375b8f2000e6a829f77b7c # gitsafe:ignore
+jerboa_tree=883737c903b9a6d8b9200911a1ad77f8844e0597 # gitsafe:ignore
 gradle_sha=20f1b1176237254a6fc204d8434196fa11a4cfb387567519c61556e8710aed78
 jdk_macos_sha=8fa1eff40bb637a33613b2ccb8b12c70dc3661cc22cf8e784943715769a05336
 jdk_linux_sha=d8afc263758141a66e0e3aafc321e783f7016696f4eaea067d340a269037d331
diff --git a/templates/ssd-review.ss b/templates/ssd-review.ss
index a9a6595..f5341e4 100644
--- a/templates/ssd-review.ss
+++ b/templates/ssd-review.ss
@@ -13301,103 +13301,148 @@
             (mainLifecyclePackageManagerPermissionGrantedValue)
             (mainLifecycleManageAppAllFilesAccessActionValue)
             (mainLifecycleManageAllFilesAccessActionValue)))))
-    (kotlin-file-lines "com/sfb/ssdreview/MainActivity.kt"
-      (
-       "package com.sfb.ssdreview"
-       ""
-       "import android.Manifest"
-       "import android.app.Activity"
-       "import android.app.AlertDialog"
-       "import android.content.ContentUris"
-       "import android.content.Intent"
-	       "import android.content.pm.PackageManager"
-	       "import android.graphics.Bitmap"
-	       "import android.graphics.Color"
-	       "import android.graphics.Matrix"
-	       "import android.graphics.pdf.PdfRenderer"
-       "import android.net.Uri"
-       "import android.os.Build"
-       "import android.os.Bundle"
-       "import android.os.Environment"
-       "import android.os.ParcelFileDescriptor"
-       "import android.os.SystemClock"
-       "import android.provider.DocumentsContract"
-       "import android.provider.MediaStore"
-       "import android.provider.OpenableColumns"
-       "import android.provider.Settings"
-       "import android.text.Editable"
-       "import android.text.InputType"
-       "import android.view.Gravity"
-       "import android.view.HapticFeedbackConstants"
-       "import android.view.View"
-       "import android.widget.AutoCompleteTextView"
-       "import android.widget.Button"
-       "import android.widget.EditText"
-       "import android.widget.LinearLayout"
-       "import android.widget.ScrollView"
-       "import android.widget.TextView"
-	       "import android.widget.Toast"
-	       "import androidx.documentfile.provider.DocumentFile"
-       "import org.json.JSONObject"
-       "import java.io.File"
-       "import java.io.PrintWriter"
-       "import java.io.StringWriter"
-       "import javax.net.ssl.HttpsURLConnection"
-       "import java.net.URL"
-       "import java.util.UUID"
-       "import kotlin.concurrent.thread"
-       ""
-       "class MainActivity : Activity() {"
-       "    internal lateinit var truthStore: TruthStore"
-       "    internal lateinit var reviewView: SsdReviewView"
-       "    internal lateinit var status: TextView"
-       ""
-       "    internal var pdfUri: Uri? = null"
-       "    internal var pdfName: String = \"\""
-       "    internal var pdfSha1: String = \"\""
-       "    internal var pageIndex: Int = 0"
-       "    internal var pageCount: Int = 0"
-       "    internal var currentBitmap: Bitmap? = null"
-	       "    internal var currentSession: SsdSession? = null"
-	       "    internal var selectedGroupId: String? = null"
-	       "    internal var appendMode: Boolean = false"
-	       "    internal var ssdAreaMode: Boolean = false"
-       "    internal var reopenSsdBrowserOnResume: Boolean = false"
-       "    @Volatile internal var loadGeneration: Int = 0"
-       "    internal val boxTypeDisplays: List<String> by lazy { boxTypeDisplays(boxTypesLoadAndroid(this)) }"
-       "    override fun onCreate(savedInstanceState: Bundle?) {"
-       "        super.onCreate(savedInstanceState)"
-       "        mainActivityOnCreate(this)"
-       "    }"
-	       ""
-	       "    override fun onResume() {"
-	       "        super.onResume()"
-       "        mainActivityOnResume(this)"
-	       "    }"
-       ""
-       "    override fun onPause() {"
-       "        super.onPause()"
-       "        mainActivityOnPause(this)"
-       "    }"
-       ""
-       "    private fun buildUi(): View = mainActivityBuildUi(this)"
-       ""
-       "    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {"
-       "        super.onActivityResult(requestCode, resultCode, data)"
-       "        mainActivityOnActivityResult(this, requestCode, resultCode, data)"
-       "    }"
-       ""
-       "    override fun onRequestPermissionsResult("
-       "        requestCode: Int,"
-       "        permissions: Array<out String>,"
-       "        grantResults: IntArray"
-       "    ) {"
-       "        super.onRequestPermissionsResult(requestCode, permissions, grantResults)"
-       "        mainActivityOnReadStoragePermissionResult(this, requestCode)"
-       "    }"
-       ""
-	       "}"
-       ))
+    (typed-kotlin-file "com/sfb/ssdreview/MainActivity.kt"
+      (kotlin-imports (android app Activity)
+                      (android content Intent)
+                      (android graphics Bitmap)
+                      (android net Uri)
+                      (android os Bundle)
+                      (android widget TextView))
+      (typed-library (com sfb ssdreview)
+        (export MainActivity)
+        (type Activity)
+        (type Bitmap)
+        (type BoxType)
+        (type Bundle)
+        (type Int32)
+        (type IntArray)
+        (type Intent)
+        (type SsdReviewView)
+        (type SsdSession)
+        (type TextView)
+        (type TruthStore)
+        (type Uri)
+        (extern (mainActivitySuperOnCreate
+                  (savedInstanceState : (Nullable Bundle))) : Unit
+          (kotlin-call super onCreate))
+        (extern (mainActivitySuperOnResume) : Unit
+          (kotlin-call super onResume))
+        (extern (mainActivitySuperOnPause) : Unit
+          (kotlin-call super onPause))
+        (extern (mainActivitySuperOnActivityResult
+                  (requestCode : Int32)
+                  (resultCode : Int32)
+                  (data : (Nullable Intent))) : Unit
+          (kotlin-call super onActivityResult))
+        (extern (mainActivitySuperOnRequestPermissionsResult
+                  (requestCode : Int32)
+                  (permissions : (Array (Out String)))
+                  (grantResults : IntArray)) : Unit
+          (kotlin-call super onRequestPermissionsResult))
+        (extern (mainActivityBoxTypesLoadAndroid
+                  (activity : MainActivity)) : (List BoxType)
+          (kotlin-call boxTypesLoadAndroid))
+        (def (mainActivityInitialBoxTypeDisplays
+               (activity : MainActivity)) : (List String)
+          (boxTypeDisplays (mainActivityBoxTypesLoadAndroid activity)))
+        (class MainActivity ()
+          (extends Activity)
+          (var truthStore : TruthStore
+            (modifiers internal lateinit))
+          (var reviewView : SsdReviewView
+            (modifiers internal lateinit))
+          (var status : TextView
+            (modifiers internal lateinit))
+          (var pdfUri : (Nullable Uri)
+            (nullable-none Uri)
+            (modifiers internal))
+          (var pdfName : String
+            ""
+            (modifiers internal))
+          (var pdfSha1 : String
+            ""
+            (modifiers internal))
+          (var pageIndex : Int32
+            (int32 0)
+            (modifiers internal))
+          (var pageCount : Int32
+            (int32 0)
+            (modifiers internal))
+          (var currentBitmap : (Nullable Bitmap)
+            (nullable-none Bitmap)
+            (modifiers internal))
+          (var currentSession : (Nullable SsdSession)
+            (nullable-none SsdSession)
+            (modifiers internal))
+          (var selectedGroupId : (Nullable String)
+            (nullable-none String)
+            (modifiers internal))
+          (var appendMode : Bool
+            #f
+            (modifiers internal))
+          (var ssdAreaMode : Bool
+            #f
+            (modifiers internal))
+          (var reopenSsdBrowserOnResume : Bool
+            #f
+            (modifiers internal))
+          (var loadGeneration : Int32
+            (int32 0)
+            (modifiers @Volatile internal))
+          (var boxTypeDisplays : (List String)
+            (list-of String)
+            (modifiers internal))
+          (def (onCreate
+                 (savedInstanceState : (Nullable Bundle))) : Unit
+            (modifiers override)
+            (kotlin-name onCreate)
+            (begin
+              (mainActivitySuperOnCreate savedInstanceState)
+              (set! boxTypeDisplays
+                (mainActivityInitialBoxTypeDisplays this))
+              (mainActivityOnCreate this)))
+          (def (onResume) : Unit
+            (modifiers override)
+            (kotlin-name onResume)
+            (begin
+              (mainActivitySuperOnResume)
+              (mainActivityOnResume this)))
+          (def (onPause) : Unit
+            (modifiers override)
+            (kotlin-name onPause)
+            (begin
+              (mainActivitySuperOnPause)
+              (mainActivityOnPause this)))
+          (def (onActivityResult
+                 (requestCode : Int32)
+                 (resultCode : Int32)
+                 (data : (Nullable Intent))) : Unit
+            (modifiers override)
+            (kotlin-name onActivityResult)
+            (begin
+              (mainActivitySuperOnActivityResult
+                requestCode
+                resultCode
+                data)
+              (mainActivityOnActivityResult
+                this
+                requestCode
+                resultCode
+                data)))
+          (def (onRequestPermissionsResult
+                 (requestCode : Int32)
+                 (permissions : (Array (Out String)))
+                 (grantResults : IntArray)) : Unit
+            (modifiers override)
+            (kotlin-name onRequestPermissionsResult)
+            (begin
+              (mainActivitySuperOnRequestPermissionsResult
+                requestCode
+                permissions
+                grantResults)
+              (mainActivityOnReadStoragePermissionResult
+                this
+                requestCode))))))
     (typed-kotlin-file "com/sfb/ssdreview/SsdPdfDiscovery.kt"
       (kotlin-imports (android content ContentResolver)
                       (android database Cursor)