Move SSD MainActivity state checks to typed Kotlin
ober
f6405ab1f9e89229d54e112874ca17afa3aad1d9
--- 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\""