Move SSD activity state checks to typed Kotlin

ober

e271629585178bb1fe61e0acbd2043e3029c19dd

diff --git a/templates/ssd-review.ss b/templates/ssd-review.ss
index 6677add..c69219d 100644
--- a/templates/ssd-review.ss
+++ b/templates/ssd-review.ss
@@ -4201,11 +4201,14 @@
                 ssdBrowserResumeReady focusChangeShouldShowDropdown
                 dialogReadyToShowDropdown focusedDialogReadyToShowDropdown
                 permissionResultGranted downloadAccessBeforeRuntimePermissions
-                downloadAccessFromPermission viewportScalePreferencePresent
+                downloadAccessFromPermission activityResultRejected
+                shouldPersistLoadedPdfState viewportScalePreferencePresent
+                lastPdfUriMismatch lastViewportPageMismatch
                 displayNameColumnPresent displayNameCursorHasFirstRow
                 currentLoadMatches
                 packageUriText mediaStorePdfSelection
                 mediaStoreDisplayNameSort
+                shouldSkipSsdPdfChoiceName
                 requestIsOpenPdf requestIsOpenSsdPdfTree
                 requestIsExportZip requestIsImportZip
                 requestIsSyncTree requestIsReadStorage
@@ -4689,8 +4692,17 @@
           beforeRuntimePermissions)
         (def (downloadAccessFromPermission (permissionGranted : Bool)) : Bool
           permissionGranted)
+        (def (activityResultRejected (resultCode : Int32) (okCode : Int32)) : Bool
+          (not (= resultCode okCode)))
+        (def (shouldPersistLoadedPdfState (restoring : Bool)) : Bool
+          (not restoring))
         (def (viewportScalePreferencePresent (present : Bool)) : Bool
           present)
+        (def (lastPdfUriMismatch (saved : (Nullable String)) (uriText : String)) : Bool
+          (or (nullable-null? saved)
+              (not (equal? (nullable-get saved) uriText))))
+        (def (lastViewportPageMismatch (savedPage : Int32) (page : Int32)) : Bool
+          (not (= savedPage page)))
         (def (displayNameColumnPresent (columnIndex : Int32)) : Bool
           (>= columnIndex (int32 0)))
         (def (displayNameCursorHasFirstRow (hasFirstRow : Bool)) : Bool
@@ -4718,6 +4730,10 @@
                 (string-append displayNameColumn " LIKE ?)")))))
         (def (mediaStoreDisplayNameSort (displayNameColumn : String)) : String
           (string-append displayNameColumn " COLLATE NOCASE ASC"))
+        (def (shouldSkipSsdPdfChoiceName (name : String)
+                                         (currentChoices : Int32)
+                                         (limit : Int32)) : Bool
+          (not (shouldIncludeSsdPdfChoiceName name currentChoices limit)))
         (def (requestCodeMatches (requestCode : Int32) (expected : Int32)) : Bool
           (= requestCode expected))
         (def (requestIsOpenPdf (requestCode : Int32) (expected : Int32)) : Bool
@@ -6930,7 +6946,7 @@
        ""
        "    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {"
        "        super.onActivityResult(requestCode, resultCode, data)"
-       "        if (resultCode != RESULT_OK) return"
+       "        if (activityResultRejected(resultCode, RESULT_OK)) return"
        "        val uri = data?.data ?: return"
        "        if (requestIsOpenPdf(requestCode, REQ_OPEN_PDF)) {"
        "            loadPdf(uri, data.flags)"
@@ -7066,7 +7082,7 @@
        "            val pathCol = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.RELATIVE_PATH)"
        "            while (cursor.moveToNext()) {"
        "                val name = cursor.getString(nameCol) ?: continue"
-       "                if (!shouldIncludeSsdPdfChoiceName(name, choices.size, MAX_SSD_PDF_CHOICES)) continue"
+       "                if (shouldSkipSsdPdfChoiceName(name, choices.size, MAX_SSD_PDF_CHOICES)) continue"
        "                val id = cursor.getLong(idCol)"
        "                val relativePath = cursor.getString(pathCol)?.trim('/') ?: \"\""
        "                val label = ssdPdfDownloadLabel(relativePath, name)"
@@ -7183,7 +7199,7 @@
        "                    pdfSha1 = hash"
        "                    pageCount = count"
        "                    pageIndex = clampPageIndex(initialPageIndex, count)"
-       "                    if (!restoring) persistCurrentPdfState(includeViewport = false)"
+       "                    if (shouldPersistLoadedPdfState(restoring)) persistCurrentPdfState(includeViewport = false)"
        "                    setStatus(loadedPdfStatus(pdfName, pageCount))"
        "                    renderCurrentPage()"
        "                }"
@@ -7236,8 +7252,8 @@
        ""
        "    private fun restoredViewportFor(uri: Uri, page: Int): ViewportState? {"
        "        val prefs = getPreferences(MODE_PRIVATE)"
-       "        if (prefs.getString(PREF_LAST_PDF_URI, null) != uri.toString()) return null"
-       "        if (prefs.getInt(PREF_LAST_VIEWPORT_PAGE_INDEX, -1) != page) return null"
+       "        if (lastPdfUriMismatch(prefs.getString(PREF_LAST_PDF_URI, null), uri.toString())) return null"
+       "        if (lastViewportPageMismatch(prefs.getInt(PREF_LAST_VIEWPORT_PAGE_INDEX, -1), page)) return null"
        "        if (!viewportScalePreferencePresent(prefs.contains(PREF_LAST_VIEWPORT_SCALE))) return null"
        "        return ViewportState("
        "            prefs.getFloat(PREF_LAST_VIEWPORT_SCALE, 1f),"