Generate SSD PDF state persistence from typed Jerboa

ober

3e50345f2d37b94b90e8586d4cef7af2a5dac3e0

diff --git a/templates/ssd-review.ss b/templates/ssd-review.ss
index e5713a8..5f266b4 100644
--- a/templates/ssd-review.ss
+++ b/templates/ssd-review.ss
@@ -4924,6 +4924,8 @@
                 mainActivitySetPageIndex mainActivitySetPdfIdentity
                 mainActivitySetLoadedPdfState
                 mainActivityAdvanceLoadGeneration
+                mainActivityRestoreLastPdf mainActivityPersistCurrentPdfState
+                mainActivityRestoredViewportFor
                 mainActivityInitialPickerUri mainActivityOpenPdf
                 mainActivityOpenAnyPdf mainActivityChooseSsdPdfFolder
                 mainActivityRequestDownloadAccess
@@ -5834,15 +5836,6 @@
                   (activity : MainActivity)
                   (uri : Uri)) : Int32
           (kotlin-member-call pdfPageCount))
-        (extern (mainActivityPersistCurrentPdfStateRaw
-                  (activity : MainActivity)
-                  (includeViewport : Bool)) : Unit
-          (kotlin-member-call persistCurrentPdfState))
-        (extern (mainActivityRestoredViewportForRaw
-                  (activity : MainActivity)
-                  (uri : Uri)
-                  (page : Int32)) : (Nullable ViewportState)
-          (kotlin-member-call restoredViewportFor))
         (extern (mainActivityCurrentSessionRaw
                   (activity : MainActivity)) : (Nullable SsdSession)
           (kotlin-member-get currentSession))
@@ -5903,6 +5896,13 @@
                   (uri : Uri)
                   (flags : Int32)) : Unit
           (kotlin-member-call loadPdf))
+        (extern (mainActivityLoadPdfForRestoreRaw
+                  (activity : MainActivity)
+                  (uri : Uri)
+                  (flags : Int32)
+                  (initialPageIndex : Int32)
+                  (restoring : Bool)) : Unit
+          (kotlin-member-call loadPdf))
         (extern (mainActivityReviewViewSet
                   (activity : MainActivity)
                   (view : SsdReviewView)) : Unit
@@ -6915,7 +6915,7 @@
               (mainActivitySetPageIndex
                 activity
                 (shiftPageIndex pageIndex pageCount delta))
-              (mainActivityPersistCurrentPdfStateRaw activity #f)
+              (mainActivityPersistCurrentPdfState activity #f)
               (mainActivityRenderCurrentPage activity))))
         (def (mainActivityShowPageDialog
                (activity : MainActivity)
@@ -7938,6 +7938,20 @@
                   (key : String)
                   (value : String)) : Editor
           (kotlin-member-call putString))
+        (extern (sharedPreferencesEditorPutIntRaw
+                  (editor : Editor)
+                  (key : String)
+                  (value : Int32)) : Editor
+          (kotlin-member-call putInt))
+        (extern (sharedPreferencesEditorPutFloatRaw
+                  (editor : Editor)
+                  (key : String)
+                  (value : Float32)) : Editor
+          (kotlin-member-call putFloat))
+        (extern (sharedPreferencesEditorRemoveRaw
+                  (editor : Editor)
+                  (key : String)) : Editor
+          (kotlin-member-call remove))
         (extern (sharedPreferencesEditorApplyRaw
                   (editor : Editor)) : Unit
           (kotlin-member-call apply))
@@ -7946,6 +7960,20 @@
                   (key : String)
                   (defaultValue : (Nullable String))) : (Nullable String)
           (kotlin-member-call getString))
+        (extern (sharedPreferencesGetIntRaw
+                  (preferences : SharedPreferences)
+                  (key : String)
+                  (defaultValue : Int32)) : Int32
+          (kotlin-member-call getInt))
+        (extern (sharedPreferencesGetFloatRaw
+                  (preferences : SharedPreferences)
+                  (key : String)
+                  (defaultValue : Float32)) : Float32
+          (kotlin-member-call getFloat))
+        (extern (sharedPreferencesContainsRaw
+                  (preferences : SharedPreferences)
+                  (key : String)) : Bool
+          (kotlin-member-call contains))
         (extern (contentResolverTakePersistableUriPermissionRaw
                   (resolver : ContentResolver)
                   (uri : Uri)
@@ -7959,6 +7987,30 @@
           (kotlin-value FAST_TRUTH_GROUP_THRESHOLD))
         (extern (mainActivityClientLogReadTimeoutMillisValue) : Int32
           (kotlin-value CLIENT_LOG_READ_TIMEOUT_MS))
+        (extern (mainActivityPrefLastPdfUriValue) : String
+          (kotlin-value PREF_LAST_PDF_URI))
+        (extern (mainActivityPrefLastPdfNameValue) : String
+          (kotlin-value PREF_LAST_PDF_NAME))
+        (extern (mainActivityPrefLastPdfSha1Value) : String
+          (kotlin-value PREF_LAST_PDF_SHA1))
+        (extern (mainActivityPrefLastPageIndexValue) : String
+          (kotlin-value PREF_LAST_PAGE_INDEX))
+        (extern (mainActivityPrefLastPageCountValue) : String
+          (kotlin-value PREF_LAST_PAGE_COUNT))
+        (extern (mainActivityPrefLastViewportPageIndexValue) : String
+          (kotlin-value PREF_LAST_VIEWPORT_PAGE_INDEX))
+        (extern (mainActivityPrefLastViewportScaleValue) : String
+          (kotlin-value PREF_LAST_VIEWPORT_SCALE))
+        (extern (mainActivityPrefLastViewportOffsetXValue) : String
+          (kotlin-value PREF_LAST_VIEWPORT_OFFSET_X))
+        (extern (mainActivityPrefLastViewportOffsetYValue) : String
+          (kotlin-value PREF_LAST_VIEWPORT_OFFSET_Y))
+        (extern (mainActivityPrefLastViewportRotationValue) : String
+          (kotlin-value PREF_LAST_VIEWPORT_ROTATION))
+        (extern (mainActivityPrefLastViewportImageWidthValue) : String
+          (kotlin-value PREF_LAST_VIEWPORT_IMAGE_WIDTH))
+        (extern (mainActivityPrefLastViewportImageHeightValue) : String
+          (kotlin-value PREF_LAST_VIEWPORT_IMAGE_HEIGHT))
         (extern (environmentIsExternalStorageManagerRaw) : Bool
           (kotlin-call Environment isExternalStorageManager))
         (extern (environmentDirectoryDownloads) : String
@@ -8504,6 +8556,167 @@
                 (mainActivityGetPreferencesRaw activity (contextModePrivate)))
               key
               value)))
+        (def (mainActivityRestoreLastPdf
+               (activity : MainActivity)) : Bool
+          (let ((preferences
+                  (mainActivityGetPreferencesRaw
+                    activity
+                    (contextModePrivate))))
+            (let ((raw
+                    (sharedPreferencesGetStringRaw
+                      preferences
+                      (mainActivityPrefLastPdfUriValue)
+                      (nullable-none String))))
+              (if (not (nullableTextPresent raw))
+                #f
+                (let ((page
+                        (sharedPreferencesGetIntRaw
+                          preferences
+                          (mainActivityPrefLastPageIndexValue)
+                          (int32 0))))
+                  (try
+                    (begin
+                      (mainActivityLoadPdfForRestoreRaw
+                        activity
+                        (uriParse (nullableTextOrEmpty raw))
+                        (intentFlagGrantReadUriPermission)
+                        page
+                        #t)
+                      #t)
+                    (catch (error : Exception)
+                      #f)))))))
+        (def (sharedPreferencesEditorRemoveSavedViewportRaw
+               (editor : Editor)) : Editor
+          (sharedPreferencesEditorRemoveRaw
+            (sharedPreferencesEditorRemoveRaw
+              (sharedPreferencesEditorRemoveRaw
+                (sharedPreferencesEditorRemoveRaw
+                  (sharedPreferencesEditorRemoveRaw
+                    (sharedPreferencesEditorRemoveRaw
+                      (sharedPreferencesEditorRemoveRaw
+                        editor
+                        (mainActivityPrefLastViewportPageIndexValue))
+                      (mainActivityPrefLastViewportScaleValue))
+                    (mainActivityPrefLastViewportOffsetXValue))
+                  (mainActivityPrefLastViewportOffsetYValue))
+                (mainActivityPrefLastViewportRotationValue))
+              (mainActivityPrefLastViewportImageWidthValue))
+            (mainActivityPrefLastViewportImageHeightValue)))
+        (def (sharedPreferencesEditorPutSavedViewportRaw
+               (editor : Editor)
+               (pageIndex : Int32)
+               (viewport : ViewportState)) : Editor
+          (sharedPreferencesEditorPutIntRaw
+            (sharedPreferencesEditorPutIntRaw
+              (sharedPreferencesEditorPutIntRaw
+                (sharedPreferencesEditorPutFloatRaw
+                  (sharedPreferencesEditorPutFloatRaw
+                    (sharedPreferencesEditorPutFloatRaw
+                      (sharedPreferencesEditorPutIntRaw
+                        editor
+                        (mainActivityPrefLastViewportPageIndexValue)
+                        pageIndex)
+                      (mainActivityPrefLastViewportScaleValue)
+                      (ViewportState-scale viewport))
+                    (mainActivityPrefLastViewportOffsetXValue)
+                    (ViewportState-offsetX viewport))
+                  (mainActivityPrefLastViewportOffsetYValue)
+                  (ViewportState-offsetY viewport))
+                (mainActivityPrefLastViewportRotationValue)
+                (ViewportState-rotationDegrees viewport))
+              (mainActivityPrefLastViewportImageWidthValue)
+              (ViewportState-imageWidth viewport))
+            (mainActivityPrefLastViewportImageHeightValue)
+            (ViewportState-imageHeight viewport)))
+        (def (mainActivityPersistCurrentPdfState
+               (activity : MainActivity)
+               (includeViewport : Bool)) : Unit
+          (if (not (pdfUriLoaded (mainActivityPdfUriRaw activity)))
+            (begin)
+            (let ((uri (uriOrEmpty (mainActivityPdfUriRaw activity))))
+              (let ((editor
+                      (sharedPreferencesEditorPutIntRaw
+                        (sharedPreferencesEditorPutIntRaw
+                          (sharedPreferencesEditorPutStringRaw
+                            (sharedPreferencesEditorPutStringRaw
+                              (sharedPreferencesEditorPutStringRaw
+                                (sharedPreferencesEditRaw
+                                  (mainActivityGetPreferencesRaw
+                                    activity
+                                    (contextModePrivate)))
+                                (mainActivityPrefLastPdfUriValue)
+                                (uriToStringRaw uri))
+                              (mainActivityPrefLastPdfNameValue)
+                              (mainActivityPdfNameRaw activity))
+                            (mainActivityPrefLastPdfSha1Value)
+                            (mainActivityPdfSha1Raw activity))
+                          (mainActivityPrefLastPageIndexValue)
+                          (mainActivityPageIndexRaw activity))
+                        (mainActivityPrefLastPageCountValue)
+                        (mainActivityPageCountValueRaw activity)))
+                    (viewport
+                      (viewportForSave
+                        (mainActivityReviewViewRaw activity)
+                        includeViewport)))
+                (if (viewportStatePresent viewport)
+                  (sharedPreferencesEditorApplyRaw
+                    (sharedPreferencesEditorPutSavedViewportRaw
+                      editor
+                      (mainActivityPageIndexRaw activity)
+                      (viewportStateOrEmpty viewport)))
+                  (sharedPreferencesEditorApplyRaw
+                    (sharedPreferencesEditorRemoveSavedViewportRaw
+                      editor)))))))
+        (def (mainActivityRestoredViewportFor
+               (activity : MainActivity)
+               (uri : Uri)
+               (page : Int32)) : (Nullable ViewportState)
+          (let ((preferences
+                  (mainActivityGetPreferencesRaw
+                    activity
+                    (contextModePrivate))))
+            (if (not
+                  (savedViewportAvailable
+                    (sharedPreferencesGetStringRaw
+                      preferences
+                      (mainActivityPrefLastPdfUriValue)
+                      (nullable-none String))
+                    (uriToStringRaw uri)
+                    (sharedPreferencesGetIntRaw
+                      preferences
+                      (mainActivityPrefLastViewportPageIndexValue)
+                      (int32 -1))
+                    page
+                    (sharedPreferencesContainsRaw
+                      preferences
+                      (mainActivityPrefLastViewportScaleValue))))
+              (nullable-none ViewportState)
+              (nullable-some
+                (make-ViewportState
+                  (sharedPreferencesGetFloatRaw
+                    preferences
+                    (mainActivityPrefLastViewportScaleValue)
+                    (float32 1.0))
+                  (sharedPreferencesGetFloatRaw
+                    preferences
+                    (mainActivityPrefLastViewportOffsetXValue)
+                    (float32 0.0))
+                  (sharedPreferencesGetFloatRaw
+                    preferences
+                    (mainActivityPrefLastViewportOffsetYValue)
+                    (float32 0.0))
+                  (sharedPreferencesGetIntRaw
+                    preferences
+                    (mainActivityPrefLastViewportRotationValue)
+                    (int32 0))
+                  (sharedPreferencesGetIntRaw
+                    preferences
+                    (mainActivityPrefLastViewportImageWidthValue)
+                    (int32 0))
+                  (sharedPreferencesGetIntRaw
+                    preferences
+                    (mainActivityPrefLastViewportImageHeightValue)
+                    (int32 0)))))))
         (def (mainActivityHasDirectDownloadAccess
                (activity : MainActivity)
                (sdkInt : Int32)
@@ -9273,7 +9486,7 @@
                       (renderPageCount
                         (mainActivityPageCountValueRaw activity))
                       (restoredViewport
-                        (mainActivityRestoredViewportForRaw
+                        (mainActivityRestoredViewportFor
                           activity
                           uri
                           renderPageIndex)))
@@ -9425,7 +9638,7 @@
                               count
                               initialPageIndex)
                             (if (shouldPersistLoadedPdfState restoring)
-                              (mainActivityPersistCurrentPdfStateRaw
+                              (mainActivityPersistCurrentPdfState
                                 activity
                                 #f)
                               (begin))
@@ -11840,7 +12053,7 @@
        "        mainActivitySetTruthStore(this, TruthStore(this))"
        "        setContentView(buildUi())"
        "        setStatus(startupStatus(truthStoreStorageSummary(truthStore)))"
-       "        restoreLastPdf()"
+	       "        mainActivityRestoreLastPdf(this)"
        "        mainActivitySeedBundledTruthAsync(this, truthStore)"
        "    }"
 	       ""
@@ -11854,7 +12067,7 @@
        ""
        "    override fun onPause() {"
        "        super.onPause()"
-       "        persistCurrentPdfState(includeViewport = true)"
+	       "        mainActivityPersistCurrentPdfState(this, true)"
        "    }"
        ""
        "    private fun buildUi(): View {"
@@ -12046,63 +12259,6 @@
        "        mainActivityLoadPdfAsync(this, uri, initialPageIndex, restoring)"
        "    }"
        ""
-       "    private fun restoreLastPdf(): Boolean {"
-       "        val prefs = getPreferences(MODE_PRIVATE)"
-       "        val raw = prefs.getString(PREF_LAST_PDF_URI, null)"
-       "        if (!nullableTextPresent(raw)) return false"
-       "        val page = prefs.getInt(PREF_LAST_PAGE_INDEX, 0)"
-       "        return try {"
-       "            loadPdf(Uri.parse(nullableTextOrEmpty(raw)), Intent.FLAG_GRANT_READ_URI_PERMISSION, page, restoring = true)"
-       "            true"
-       "        } catch (_: Exception) {"
-       "            false"
-       "        }"
-       "    }"
-       ""
-       "    internal fun persistCurrentPdfState(includeViewport: Boolean) {"
-       "        if (!pdfUriLoaded(pdfUri)) return"
-       "        val uri = uriOrEmpty(pdfUri)"
-       "        val edit = getPreferences(MODE_PRIVATE).edit()"
-       "            .putString(PREF_LAST_PDF_URI, uri.toString())"
-       "            .putString(PREF_LAST_PDF_NAME, pdfName)"
-       "            .putString(PREF_LAST_PDF_SHA1, pdfSha1)"
-       "            .putInt(PREF_LAST_PAGE_INDEX, pageIndex)"
-       "            .putInt(PREF_LAST_PAGE_COUNT, pageCount)"
-       "        val viewport = viewportForSave(reviewView, includeViewport)"
-       "        if (viewportStatePresent(viewport)) {"
-       "            val savedViewport = viewportStateOrEmpty(viewport)"
-       "            edit.putInt(PREF_LAST_VIEWPORT_PAGE_INDEX, pageIndex)"
-       "                .putFloat(PREF_LAST_VIEWPORT_SCALE, savedViewport.scale)"
-       "                .putFloat(PREF_LAST_VIEWPORT_OFFSET_X, savedViewport.offsetX)"
-       "                .putFloat(PREF_LAST_VIEWPORT_OFFSET_Y, savedViewport.offsetY)"
-       "                .putInt(PREF_LAST_VIEWPORT_ROTATION, savedViewport.rotationDegrees)"
-       "                .putInt(PREF_LAST_VIEWPORT_IMAGE_WIDTH, savedViewport.imageWidth)"
-       "                .putInt(PREF_LAST_VIEWPORT_IMAGE_HEIGHT, savedViewport.imageHeight)"
-       "        } else {"
-       "            edit.remove(PREF_LAST_VIEWPORT_PAGE_INDEX)"
-       "                .remove(PREF_LAST_VIEWPORT_SCALE)"
-       "                .remove(PREF_LAST_VIEWPORT_OFFSET_X)"
-       "                .remove(PREF_LAST_VIEWPORT_OFFSET_Y)"
-       "                .remove(PREF_LAST_VIEWPORT_ROTATION)"
-       "                .remove(PREF_LAST_VIEWPORT_IMAGE_WIDTH)"
-       "                .remove(PREF_LAST_VIEWPORT_IMAGE_HEIGHT)"
-       "        }"
-       "        edit.apply()"
-       "    }"
-       ""
-       "    internal fun restoredViewportFor(uri: Uri, page: Int): ViewportState? {"
-       "        val prefs = getPreferences(MODE_PRIVATE)"
-       "        if (!savedViewportAvailable(prefs.getString(PREF_LAST_PDF_URI, null), uri.toString(), prefs.getInt(PREF_LAST_VIEWPORT_PAGE_INDEX, -1), page, prefs.contains(PREF_LAST_VIEWPORT_SCALE))) return null"
-       "        return ViewportState("
-       "            prefs.getFloat(PREF_LAST_VIEWPORT_SCALE, 1f),"
-       "            prefs.getFloat(PREF_LAST_VIEWPORT_OFFSET_X, 0f),"
-       "            prefs.getFloat(PREF_LAST_VIEWPORT_OFFSET_Y, 0f),"
-       "            prefs.getInt(PREF_LAST_VIEWPORT_ROTATION, 0),"
-       "            prefs.getInt(PREF_LAST_VIEWPORT_IMAGE_WIDTH, 0),"
-       "            prefs.getInt(PREF_LAST_VIEWPORT_IMAGE_HEIGHT, 0)"
-       "        )"
-       "    }"
-       ""
        "    internal fun pdfPageCount(uri: Uri): Int {"
        "        openPdfRenderer(uri).use { renderer -> return renderer.pageCount }"
        "    }"