Move SSD package query strings to typed Kotlin

ober

5e8272a6fac21d0f5e570730cde08f0692893656

diff --git a/templates/ssd-review.ss b/templates/ssd-review.ss
index 25eee5b..c6c89c8 100644
--- a/templates/ssd-review.ss
+++ b/templates/ssd-review.ss
@@ -3801,6 +3801,8 @@
                 selectionIgnoredLoadingStatus
                 shouldShowFiringArc shouldFocusFiringArc
                 hasReplacementLabel hasResolvedLabel
+                packageUriText mediaStorePdfSelection
+                mediaStoreDisplayNameSort
                 clampPageIndex shiftPageIndex displayGroupCanvasLabel
                 dropdownHeight dialogPageNumber dialogPageNumberText
                 pageNumberText sessionIdFromUuid nullableLowercaseOrEmpty
@@ -4185,6 +4187,19 @@
           (not (string-blank? replacement)))
         (def (hasResolvedLabel (resolved : String)) : Bool
           (not (string-blank? resolved)))
+        (def (packageUriText (packageName : String)) : String
+          (string-append "package:" packageName))
+        (def (mediaStorePdfSelection (mimeTypeColumn : String)
+                                     (displayNameColumn : String)) : String
+          (string-append
+            "("
+            (string-append
+              mimeTypeColumn
+              (string-append
+                "=? OR "
+                (string-append displayNameColumn " LIKE ?)")))))
+        (def (mediaStoreDisplayNameSort (displayNameColumn : String)) : String
+          (string-append displayNameColumn " COLLATE NOCASE ASC"))
         (def (dropdownHeight (screenHeight : Int32)) : Int32
           (let ((third (/ screenHeight (int32 3))))
             (if (> third (int32 620))
@@ -5528,7 +5543,7 @@
        "        reopenSsdBrowserOnResume = true"
        "        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {"
        "            val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION).apply {"
-       "                data = Uri.parse(\"package:$packageName\")"
+       "                data = Uri.parse(packageUriText(packageName))"
        "            }"
        "            try {"
        "                startActivity(intent)"
@@ -6393,14 +6408,14 @@
        "            MediaStore.MediaColumns.RELATIVE_PATH,"
        "            MediaStore.MediaColumns.MIME_TYPE"
        "        )"
-       "        val selection = \"(${MediaStore.MediaColumns.MIME_TYPE}=? OR ${MediaStore.MediaColumns.DISPLAY_NAME} LIKE ?)\""
+       "        val selection = mediaStorePdfSelection(MediaStore.MediaColumns.MIME_TYPE, MediaStore.MediaColumns.DISPLAY_NAME)"
        "        val selectionArgs = arrayOf(\"application/pdf\", \"%.pdf\")"
        "        contentResolver.query("
        "            MediaStore.Downloads.EXTERNAL_CONTENT_URI,"
        "            projection,"
        "            selection,"
        "            selectionArgs,"
-       "            \"${MediaStore.MediaColumns.DISPLAY_NAME} COLLATE NOCASE ASC\""
+       "            mediaStoreDisplayNameSort(MediaStore.MediaColumns.DISPLAY_NAME)"
        "        )?.use { cursor ->"
        "            val idCol = cursor.getColumnIndexOrThrow(MediaStore.Downloads._ID)"
        "            val nameCol = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DISPLAY_NAME)"