Generate SSD download access check from typed Jerboa

ober

e33c2f0905a888eed2900e1df19ac2ec5d86f7a0

diff --git a/templates/ssd-review.ss b/templates/ssd-review.ss
index d23b620..e5713a8 100644
--- a/templates/ssd-review.ss
+++ b/templates/ssd-review.ss
@@ -4772,12 +4772,14 @@
                       (android content SharedPreferences Editor)
                       (android content res Resources)
                       (android content DialogInterface)
+                      (android content pm PackageManager)
                       (android graphics Bitmap)
                       (android content Intent)
                       (android database Cursor)
                       (android graphics drawable GradientDrawable)
                       (android net Uri)
                       (android os Build)
+                      (android os Environment)
                       (android os ParcelFileDescriptor)
                       (android provider DocumentsContract)
                       (android provider Settings)
@@ -4925,6 +4927,7 @@
                 mainActivityInitialPickerUri mainActivityOpenPdf
                 mainActivityOpenAnyPdf mainActivityChooseSsdPdfFolder
                 mainActivityRequestDownloadAccess
+                mainActivityHasDirectDownloadAccess
                 mainActivityRememberAndBrowseSsdFolder
                 mainActivitySyncSelectedTree
                 mainActivityHandleActivityResult
@@ -5037,6 +5040,7 @@
         (type Bitmap)
         (type Char)
         (type Exception)
+        (type Environment)
         (type Runnable)
         (type Thread)
         (type AlertDialog)
@@ -5067,6 +5071,7 @@
         (type Manifest)
         (type Uri)
         (type ParcelFileDescriptor)
+        (type PackageManager)
         (type View)
         (type Window)
         (type DisplayMetrics)
@@ -5871,9 +5876,6 @@
                   (activity : MainActivity)
                   (uri : Uri)) : (List SsdPdfChoice)
           (kotlin-member-call findSsdPdfsFromTree))
-        (extern (mainActivityHasDirectDownloadAccessRaw
-                  (activity : MainActivity)) : Bool
-          (kotlin-member-call hasDirectDownloadAccess))
         (extern (mainActivityClientLogPayloadRaw
                   (activity : MainActivity)
                   (event : String)
@@ -7920,6 +7922,10 @@
           (kotlin-member-get flags))
         (extern (mainActivityPackageNameRaw (activity : MainActivity)) : String
           (kotlin-member-get packageName))
+        (extern (mainActivityCheckSelfPermissionRaw
+                  (activity : MainActivity)
+                  (permission : String)) : Int32
+          (kotlin-member-call checkSelfPermission))
         (extern (mainActivityGetPreferencesRaw
                   (activity : MainActivity)
                   (mode : Int32)) : SharedPreferences
@@ -7953,6 +7959,13 @@
           (kotlin-value FAST_TRUTH_GROUP_THRESHOLD))
         (extern (mainActivityClientLogReadTimeoutMillisValue) : Int32
           (kotlin-value CLIENT_LOG_READ_TIMEOUT_MS))
+        (extern (environmentIsExternalStorageManagerRaw) : Bool
+          (kotlin-call Environment isExternalStorageManager))
+        (extern (environmentDirectoryDownloads) : String
+          (kotlin-value Environment DIRECTORY_DOWNLOADS))
+        (extern (environmentGetExternalStoragePublicDirectoryRaw
+                  (kind : String)) : File
+          (kotlin-call Environment getExternalStoragePublicDirectory))
         (extern (documentsContractBuildDocumentUriRaw
                   (authority : String)
                   (documentId : String)) : Uri
@@ -8491,6 +8504,31 @@
                 (mainActivityGetPreferencesRaw activity (contextModePrivate)))
               key
               value)))
+        (def (mainActivityHasDirectDownloadAccess
+               (activity : MainActivity)
+               (sdkInt : Int32)
+               (androidRCode : Int32)
+               (androidMCode : Int32)
+               (readExternalStoragePermission : String)
+               (permissionGrantedCode : Int32)) : Bool
+          (if (>= sdkInt androidRCode)
+            (environmentIsExternalStorageManagerRaw)
+            (if (downloadAccessBeforeRuntimePermissions
+                  (< sdkInt androidMCode))
+              #t
+              (if (downloadAccessFromPermission
+                    (permissionResultGranted
+                      (mainActivityCheckSelfPermissionRaw
+                        activity
+                        readExternalStoragePermission)
+                      permissionGrantedCode))
+                #t
+                (try
+                  (fileListFilesPresent
+                    (environmentGetExternalStoragePublicDirectoryRaw
+                      (environmentDirectoryDownloads)))
+                  (catch (error : Exception)
+                    #f))))))
         (def (mainActivityRememberAndBrowseSsdFolder
                (activity : MainActivity)
                (uri : Uri)
@@ -8618,6 +8656,7 @@
                (androidRCode : Int32)
                (androidMCode : Int32)
                (readExternalStoragePermission : String)
+               (permissionGrantedCode : Int32)
                (manageAppAllFilesAccessAction : String)
                (manageAllFilesAccessAction : String)) : Unit
           (if (requestIsReadStorage requestCode readStorageRequestCode)
@@ -8634,6 +8673,7 @@
                 androidRCode
                 androidMCode
                 readExternalStoragePermission
+                permissionGrantedCode
                 manageAppAllFilesAccessAction
                 manageAllFilesAccessAction))
             (begin)))
@@ -8681,6 +8721,7 @@
                (androidRCode : Int32)
                (androidMCode : Int32)
                (readExternalStoragePermission : String)
+               (permissionGrantedCode : Int32)
                (manageAppAllFilesAccessAction : String)
                (manageAllFilesAccessAction : String)) : Unit
           (mainActivityOpenPdfAsync
@@ -8695,6 +8736,7 @@
             androidRCode
             androidMCode
             readExternalStoragePermission
+            permissionGrantedCode
             manageAppAllFilesAccessAction
             manageAllFilesAccessAction))
         (def (mainActivityOpenAnyPdf
@@ -8756,6 +8798,7 @@
                (androidRCode : Int32)
                (androidMCode : Int32)
                (readExternalStoragePermission : String)
+               (permissionGrantedCode : Int32)
                (manageAppAllFilesAccessAction : String)
                (manageAllFilesAccessAction : String)) : Unit
           (begin
@@ -8795,6 +8838,7 @@
                   androidRCode
                   androidMCode
                   readExternalStoragePermission
+                  permissionGrantedCode
                   manageAppAllFilesAccessAction
                   manageAllFilesAccessAction)))))
         (def (mainActivitySetPositiveChooseSsdPdfFolder
@@ -8869,6 +8913,7 @@
                (androidRCode : Int32)
                (androidMCode : Int32)
                (readExternalStoragePermission : String)
+               (permissionGrantedCode : Int32)
                (manageAppAllFilesAccessAction : String)
                (manageAllFilesAccessAction : String)) : Builder
           (alertDialogBuilderSetPositiveAction
@@ -8886,6 +8931,7 @@
                 androidRCode
                 androidMCode
                 readExternalStoragePermission
+                permissionGrantedCode
                 manageAppAllFilesAccessAction
                 manageAllFilesAccessAction))))
         (def (mainActivitySetNegativeCancelAppend
@@ -9026,6 +9072,7 @@
                (androidRCode : Int32)
                (androidMCode : Int32)
                (readExternalStoragePermission : String)
+               (permissionGrantedCode : Int32)
                (manageAppAllFilesAccessAction : String)
                (manageAllFilesAccessAction : String)) : Unit
           (begin
@@ -9056,6 +9103,7 @@
                 androidRCode
                 androidMCode
                 readExternalStoragePermission
+                permissionGrantedCode
                 manageAppAllFilesAccessAction
                 manageAllFilesAccessAction))
             (mainActivitySetStatusRaw activity (noSsdPdfsFoundStatus))))
@@ -9408,6 +9456,7 @@
                (androidRCode : Int32)
                (androidMCode : Int32)
                (readExternalStoragePermission : String)
+               (permissionGrantedCode : Int32)
                (manageAppAllFilesAccessAction : String)
                (manageAllFilesAccessAction : String)) : Unit
           (begin
@@ -9446,8 +9495,13 @@
                               lastPdfPreferenceKey)
                             (mainActivityShowNoSsdPdfsDialog
                               activity
-                              (mainActivityHasDirectDownloadAccessRaw
-                                activity)
+                              (mainActivityHasDirectDownloadAccess
+                                activity
+                                sdkInt
+                                androidRCode
+                                androidMCode
+                                readExternalStoragePermission
+                                permissionGrantedCode)
                               requestOpenPdfCode
                               requestOpenTreeCode
                               requestReadStorageCode
@@ -9457,6 +9511,7 @@
                               androidRCode
                               androidMCode
                               readExternalStoragePermission
+                              permissionGrantedCode
                               manageAppAllFilesAccessAction
                               manageAllFilesAccessAction)))))))))))
         (def (alertDialogBuilderSetCancelAction
@@ -11788,14 +11843,14 @@
        "        restoreLastPdf()"
        "        mainActivitySeedBundledTruthAsync(this, truthStore)"
        "    }"
-       ""
-       "    override fun onResume() {"
-       "        super.onResume()"
-       "        if (ssdBrowserResumeReady(reopenSsdBrowserOnResume, hasDirectDownloadAccess())) {"
-       "            mainActivitySetReopenSsdBrowserOnResume(this, false)"
-       "            mainActivityOpenPdf(this, REQ_OPEN_PDF, REQ_OPEN_SSD_PDF_TREE, REQ_READ_STORAGE, PREF_SSD_PDF_TREE_URI, PREF_LAST_PDF_URI, Build.VERSION.SDK_INT, Build.VERSION_CODES.R, Build.VERSION_CODES.M, Manifest.permission.READ_EXTERNAL_STORAGE, Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION, Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION)"
-       "        }"
-       "    }"
+	       ""
+	       "    override fun onResume() {"
+	       "        super.onResume()"
+	       "        if (ssdBrowserResumeReady(reopenSsdBrowserOnResume, mainActivityHasDirectDownloadAccess(this, Build.VERSION.SDK_INT, Build.VERSION_CODES.R, Build.VERSION_CODES.M, Manifest.permission.READ_EXTERNAL_STORAGE, PackageManager.PERMISSION_GRANTED))) {"
+	       "            mainActivitySetReopenSsdBrowserOnResume(this, false)"
+	       "            mainActivityOpenPdf(this, REQ_OPEN_PDF, REQ_OPEN_SSD_PDF_TREE, REQ_READ_STORAGE, PREF_SSD_PDF_TREE_URI, PREF_LAST_PDF_URI, Build.VERSION.SDK_INT, Build.VERSION_CODES.R, Build.VERSION_CODES.M, Manifest.permission.READ_EXTERNAL_STORAGE, PackageManager.PERMISSION_GRANTED, Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION, Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION)"
+	       "        }"
+	       "    }"
        ""
        "    override fun onPause() {"
        "        super.onPause()"
@@ -11823,7 +11878,7 @@
        "        val controls = LinearLayout(this).apply {"
        "            orientation = LinearLayout.VERTICAL"
        "            addView(mainActivityActionRow(this@MainActivity, LinearLayout.HORIZONTAL, Gravity.CENTER_VERTICAL,"
-	       "                mainActivityButton(this@MainActivity, \"Open SSDs\", ButtonKind.PRIMARY) { mainActivityOpenPdf(this@MainActivity, REQ_OPEN_PDF, REQ_OPEN_SSD_PDF_TREE, REQ_READ_STORAGE, PREF_SSD_PDF_TREE_URI, PREF_LAST_PDF_URI, Build.VERSION.SDK_INT, Build.VERSION_CODES.R, Build.VERSION_CODES.M, Manifest.permission.READ_EXTERNAL_STORAGE, Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION, Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION) },"
+	       "                mainActivityButton(this@MainActivity, \"Open SSDs\", ButtonKind.PRIMARY) { mainActivityOpenPdf(this@MainActivity, REQ_OPEN_PDF, REQ_OPEN_SSD_PDF_TREE, REQ_READ_STORAGE, PREF_SSD_PDF_TREE_URI, PREF_LAST_PDF_URI, Build.VERSION.SDK_INT, Build.VERSION_CODES.R, Build.VERSION_CODES.M, Manifest.permission.READ_EXTERNAL_STORAGE, PackageManager.PERMISSION_GRANTED, Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION, Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION) },"
 	       "                mainActivityButton(this@MainActivity, \"Detect\", ButtonKind.ACCENT) { mainActivityDetectCurrentForceWithState(this@MainActivity, DPI, FAST_TRUTH_GROUP_THRESHOLD, 120, CLIENT_LOG_READ_TIMEOUT_MS) },"
 	       "                mainActivityButton(this@MainActivity, \"Set SSD Area\", ButtonKind.MODE) { mainActivityStartSsdAreaMode(this@MainActivity, reviewView, currentSession, selectedGroupId, HapticFeedbackConstants.CLOCK_TICK) },"
 	       "            ))"
@@ -11879,7 +11934,7 @@
        "        grantResults: IntArray"
        "    ) {"
        "        super.onRequestPermissionsResult(requestCode, permissions, grantResults)"
-       "        mainActivityHandleReadStoragePermissionResult(this, requestCode, REQ_READ_STORAGE, REQ_OPEN_PDF, REQ_OPEN_SSD_PDF_TREE, PREF_SSD_PDF_TREE_URI, PREF_LAST_PDF_URI, Build.VERSION.SDK_INT, Build.VERSION_CODES.R, Build.VERSION_CODES.M, Manifest.permission.READ_EXTERNAL_STORAGE, Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION, Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION)"
+       "        mainActivityHandleReadStoragePermissionResult(this, requestCode, REQ_READ_STORAGE, REQ_OPEN_PDF, REQ_OPEN_SSD_PDF_TREE, PREF_SSD_PDF_TREE_URI, PREF_LAST_PDF_URI, Build.VERSION.SDK_INT, Build.VERSION_CODES.R, Build.VERSION_CODES.M, Manifest.permission.READ_EXTERNAL_STORAGE, PackageManager.PERMISSION_GRANTED, Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION, Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION)"
        "    }"
        ""
        "    internal fun findSsdPdfsFromTree(treeUri: Uri): List<SsdPdfChoice> {"
@@ -11978,22 +12033,6 @@
        "            }"
        "    }"
        ""
-       "    internal fun hasDirectDownloadAccess(): Boolean {"
-       "        if (sdkAtLeast(Build.VERSION.SDK_INT, Build.VERSION_CODES.R)) {"
-       "            if (Environment.isExternalStorageManager()) return true"
-       "        } else if (downloadAccessBeforeRuntimePermissions(sdkBefore(Build.VERSION.SDK_INT, Build.VERSION_CODES.M))) {"
-       "            return true"
-       "        } else if (downloadAccessFromPermission(permissionResultGranted(checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE), PackageManager.PERMISSION_GRANTED))) {"
-       "            return true"
-       "        }"
-       "        val dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)"
-       "        return try {"
-       "            fileListFilesPresent(dir)"
-       "        } catch (_: Exception) {"
-       "            false"
-       "        }"
-       "    }"
-       ""
        "    internal fun loadPdf(uri: Uri, flags: Int, initialPageIndex: Int = 0, restoring: Boolean = false) {"
        "        try {"
        "            contentResolver.takePersistableUriPermission(uri, flags and Intent.FLAG_GRANT_READ_URI_PERMISSION)"