Move SSD MainActivity state checks to typed Kotlin

ober

f6405ab1f9e89229d54e112874ca17afa3aad1d9

diff --git a/templates/ssd-review.ss b/templates/ssd-review.ss
index 02e5f46..a45f041 100644
--- a/templates/ssd-review.ss
+++ b/templates/ssd-review.ss
@@ -1511,6 +1511,7 @@
         (export make-SsdPdfChoice SsdPdfChoice?
                 SsdPdfChoice-label SsdPdfChoice-uri
                 ssdPdfChoiceLabels ssdPdfChoiceUriAt
+                ssdPdfChoicesAvailable ssdPdfChoicesEmpty
                 ssdPdfUniqueChoicesByLabel ssdPdfFoundStatus
                 ssdPdfDownloadLabel ssdPdfDownloadFileLabel ssdPdfTreeLabel
                 ssdPdfUniqueSortedLimitedChoices)
@@ -1527,6 +1528,10 @@
               labels)))
         (def (ssdPdfChoiceUriAt (choices : (List SsdPdfChoice)) (index : Int32)) : Uri
           (SsdPdfChoice-uri (list-ref choices index)))
+        (def (ssdPdfChoicesAvailable (choices : (List SsdPdfChoice))) : Bool
+          (> (list-size choices) (int32 0)))
+        (def (ssdPdfChoicesEmpty (choices : (List SsdPdfChoice))) : Bool
+          (= (list-size choices) (int32 0)))
         (def (ssdPdfFoundStatus (choices : (List SsdPdfChoice))) : String
           (string-append
             "Found "
@@ -4164,6 +4169,11 @@
                 canvasLabelPresent
                 shouldCaptureViewport
                 hasReplacementLabel hasResolvedLabel
+                ssdBrowserResumeReady focusChangeShouldShowDropdown
+                dialogReadyToShowDropdown focusedDialogReadyToShowDropdown
+                permissionResultGranted downloadAccessBeforeRuntimePermissions
+                downloadAccessFromPermission viewportScalePreferencePresent
+                displayNameColumnPresent displayNameCursorHasFirstRow
                 packageUriText mediaStorePdfSelection
                 mediaStoreDisplayNameSort
                 requestIsOpenPdf requestIsOpenSsdPdfTree
@@ -4633,6 +4643,27 @@
           (not (string-blank? replacement)))
         (def (hasResolvedLabel (resolved : String)) : Bool
           (not (string-blank? resolved)))
+        (def (ssdBrowserResumeReady (pending : Bool) (hasDirectAccess : Bool)) : Bool
+          (and pending hasDirectAccess))
+        (def (focusChangeShouldShowDropdown (hasFocus : Bool)) : Bool
+          hasFocus)
+        (def (dialogReadyToShowDropdown (dialogShowing : Bool)) : Bool
+          dialogShowing)
+        (def (focusedDialogReadyToShowDropdown (dialogShowing : Bool)
+                                               (hasFocus : Bool)) : Bool
+          (and dialogShowing hasFocus))
+        (def (permissionResultGranted (actual : Int32) (granted : Int32)) : Bool
+          (= actual granted))
+        (def (downloadAccessBeforeRuntimePermissions (beforeRuntimePermissions : Bool)) : Bool
+          beforeRuntimePermissions)
+        (def (downloadAccessFromPermission (permissionGranted : Bool)) : Bool
+          permissionGranted)
+        (def (viewportScalePreferencePresent (present : Bool)) : Bool
+          present)
+        (def (displayNameColumnPresent (columnIndex : Int32)) : Bool
+          (>= columnIndex (int32 0)))
+        (def (displayNameCursorHasFirstRow (hasFirstRow : Bool)) : Bool
+          hasFirstRow)
         (def (packageUriText (packageName : String)) : String
           (string-append "package:" packageName))
         (def (mediaStorePdfSelection (mimeTypeColumn : String)
@@ -5866,7 +5897,7 @@
        ""
        "    override fun onResume() {"
        "        super.onResume()"
-       "        if (reopenSsdBrowserOnResume && hasDirectDownloadAccess()) {"
+       "        if (ssdBrowserResumeReady(reopenSsdBrowserOnResume, hasDirectDownloadAccess())) {"
        "            reopenSsdBrowserOnResume = false"
        "            openPdf()"
        "        }"
@@ -5988,7 +6019,7 @@
        "            threshold = 1"
        "            setAdapter(ArrayAdapter(this@MainActivity, android.R.layout.simple_dropdown_item_1line, boxTypeDisplays))"
        "            setOnClickListener { showDropDown() }"
-       "            setOnFocusChangeListener { _, hasFocus -> if (hasFocus) post { showDropDown() } }"
+       "            setOnFocusChangeListener { _, hasFocus -> if (focusChangeShouldShowDropdown(hasFocus)) post { showDropDown() } }"
        "        }"
        ""
        "    private fun firingArcInput(): AutoCompleteTextView ="
@@ -5998,7 +6029,7 @@
        "            threshold = 0"
        "            setAdapter(ArrayAdapter(this@MainActivity, android.R.layout.simple_dropdown_item_1line, firingArcDisplays))"
        "            setOnClickListener { showDropDown() }"
-       "            setOnFocusChangeListener { _, hasFocus -> if (hasFocus) post { showDropDown() } }"
+       "            setOnFocusChangeListener { _, hasFocus -> if (focusChangeShouldShowDropdown(hasFocus)) post { showDropDown() } }"
        "        }"
        ""
        "    private fun wireBoxTypeDialogBehavior("
@@ -6053,14 +6084,14 @@
        "        )"
        "        boxType.requestFocus()"
        "        boxType.post {"
-       "            if (dialog.isShowing) {"
+       "            if (dialogReadyToShowDropdown(dialog.isShowing)) {"
        "                boxType.bringToFront()"
        "                boxType.requestFocus()"
        "                boxType.showDropDown()"
        "            }"
        "        }"
        "        boxType.postDelayed({"
-       "            if (dialog.isShowing && boxType.hasFocus()) {"
+       "            if (focusedDialogReadyToShowDropdown(dialog.isShowing, boxType.hasFocus())) {"
        "                boxType.showDropDown()"
        "            }"
        "        }, 250)"
@@ -6076,7 +6107,7 @@
        "            }"
        "            val unique = uniquePdfChoices(choices)"
        "            runOnUiThread {"
-       "                if (unique.isNotEmpty()) {"
+       "                if (ssdPdfChoicesAvailable(unique)) {"
        "                    showPdfChoiceDialog(unique, \"Open SSD PDF\")"
        "                } else {"
        "                    showNoSsdPdfsDialog()"
@@ -6904,7 +6935,7 @@
        "            try {"
        "                val choices = findSsdPdfsFromTree(treeUri)"
        "                runOnUiThread {"
-       "                    if (choices.isEmpty()) {"
+       "                    if (ssdPdfChoicesEmpty(choices)) {"
        "                        AlertDialog.Builder(this)"
        "                            .setTitle(noSsdPdfsTitle())"
        "                            .setMessage(noSsdPdfsInFolderMessage())"
@@ -7048,9 +7079,9 @@
        "    private fun hasDirectDownloadAccess(): Boolean {"
        "        if (sdkAtLeast(Build.VERSION.SDK_INT, Build.VERSION_CODES.R)) {"
        "            if (Environment.isExternalStorageManager()) return true"
-       "        } else if (sdkBefore(Build.VERSION.SDK_INT, Build.VERSION_CODES.M)) {"
+       "        } else if (downloadAccessBeforeRuntimePermissions(sdkBefore(Build.VERSION.SDK_INT, Build.VERSION_CODES.M))) {"
        "            return true"
-       "        } else if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {"
+       "        } else if (downloadAccessFromPermission(permissionResultGranted(checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE), PackageManager.PERMISSION_GRANTED))) {"
        "            return true"
        "        }"
        "        val dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)"
@@ -7158,7 +7189,7 @@
        "        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 (!prefs.contains(PREF_LAST_VIEWPORT_SCALE)) return null"
+       "        if (!viewportScalePreferencePresent(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),"
@@ -7198,8 +7229,10 @@
        "    private fun displayName(uri: Uri): String {"
        "        contentResolver.query(uri, null, null, null, null)?.use { cursor ->"
        "            val index = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)"
-       "            if (index >= 0 && cursor.moveToFirst()) {"
-       "                return cursor.getString(index)"
+       "            if (displayNameColumnPresent(index)) {"
+       "                if (displayNameCursorHasFirstRow(cursor.moveToFirst())) {"
+       "                    return cursor.getString(index)"
+       "                }"
        "            }"
        "        }"
        "        return uri.lastPathSegment ?: \"ssd.pdf\""