Move SSD dropdown callbacks to typed Kotlin

ober

200f487d452169da91f9558c855fb2abb7bd1ff7

diff --git a/templates/ssd-review.ss b/templates/ssd-review.ss
index 727fb05..ceb77ae 100644
--- a/templates/ssd-review.ss
+++ b/templates/ssd-review.ss
@@ -4610,12 +4610,15 @@
       (kotlin-imports (java io File)
                       (java io InputStream)
                       (java io OutputStream)
+                      (android app AlertDialog)
                       (android graphics Bitmap)
                       (android content Intent)
                       (android database Cursor)
                       (android net Uri)
                       (android os ParcelFileDescriptor)
+                      (android view View)
                       (android view Window)
+                      (android widget AutoCompleteTextView)
                       (android widget TextView)
                       (androidx documentfile provider DocumentFile)
                       (org json JSONObject))
@@ -4734,6 +4737,8 @@
                 truthStoreLoadTruthForSession
                 ssdBrowserResumeReady focusChangeShouldShowDropdown
                 dialogReadyToShowDropdown focusedDialogReadyToShowDropdown
+                autoCompleteInstallDropdownOpeners
+                autoCompleteFocusAndShowDropdown
                 permissionResultGranted downloadAccessBeforeRuntimePermissions
                 downloadAccessFromPermission activityResultRejected
                 pageNavigationBlocked pageNavigationBlockedForUri
@@ -4781,6 +4786,8 @@
         (type FloatArray)
         (type Bitmap)
         (type Char)
+        (type AlertDialog)
+        (type AutoCompleteTextView)
         (type File)
         (type InputStream)
         (type OutputStream)
@@ -4788,6 +4795,7 @@
         (type Intent)
         (type Uri)
         (type ParcelFileDescriptor)
+        (type View)
         (type Window)
         (type DocumentFile)
         (type JSONObject)
@@ -4809,6 +4817,41 @@
           (kotlin-member-call delete))
         (extern (windowSetSoftInputMode (window : Window) (mode : Int32)) : Unit
           (kotlin-member-call setSoftInputMode))
+        (extern (alertDialogIsShowing (dialog : AlertDialog)) : Bool
+          (kotlin-member-get isShowing))
+        (extern (autoCompleteDropDownHeightSet
+                  (view : AutoCompleteTextView)
+                  (height : Int32)) : Unit
+          (kotlin-member-set dropDownHeight))
+        (extern (autoCompleteShowDropDownRaw
+                  (view : AutoCompleteTextView)) : Unit
+          (kotlin-member-call showDropDown))
+        (extern (autoCompleteBringToFrontRaw
+                  (view : AutoCompleteTextView)) : Unit
+          (kotlin-member-call bringToFront))
+        (extern (autoCompleteRequestFocusRaw
+                  (view : AutoCompleteTextView)) : Unit
+          (kotlin-member-call requestFocus))
+        (extern (autoCompleteHasFocusRaw
+                  (view : AutoCompleteTextView)) : Bool
+          (kotlin-member-call hasFocus))
+        (extern (autoCompletePostRaw
+                  (view : AutoCompleteTextView)
+                  (callback : (-> Unit))) : Unit
+          (kotlin-member-call post))
+        (extern (autoCompletePostDelayedRaw
+                  (view : AutoCompleteTextView)
+                  (callback : (-> Unit))
+                  (delayMillis : Int32)) : Unit
+          (kotlin-member-call postDelayed))
+        (extern (autoCompleteSetOnClickListenerRaw
+                  (view : AutoCompleteTextView)
+                  (listener : (-> View Unit))) : Unit
+          (kotlin-member-call setOnClickListener))
+        (extern (autoCompleteSetOnFocusChangeListenerRaw
+                  (view : AutoCompleteTextView)
+                  (listener : (-> View Bool Unit))) : Unit
+          (kotlin-member-call setOnFocusChangeListener))
         (extern (stringLines (text : String)) : (List String)
           (kotlin-member-call lines))
         (extern (stringSplitTwoChars (text : String)
@@ -6027,6 +6070,45 @@
         (def (focusedDialogReadyToShowDropdown (dialogShowing : Bool)
                                                (hasFocus : Bool)) : Bool
           (and dialogShowing hasFocus))
+        (def (autoCompleteInstallDropdownOpeners
+               (view : AutoCompleteTextView)) : Unit
+          (begin
+            (autoCompleteSetOnClickListenerRaw
+              view
+              (lambda ((unused : View))
+                (autoCompleteShowDropDownRaw view)))
+            (autoCompleteSetOnFocusChangeListenerRaw
+              view
+              (lambda ((unused : View) (hasFocus : Bool))
+                (if (focusChangeShouldShowDropdown hasFocus)
+                  (autoCompletePostRaw
+                    view
+                    (lambda ()
+                      (autoCompleteShowDropDownRaw view)))
+                  (begin))))))
+        (def (autoCompleteFocusAndShowDropdown
+               (dialog : AlertDialog)
+               (view : AutoCompleteTextView)) : Unit
+          (begin
+            (autoCompleteRequestFocusRaw view)
+            (autoCompletePostRaw
+              view
+              (lambda ()
+                (if (dialogReadyToShowDropdown (alertDialogIsShowing dialog))
+                  (begin
+                    (autoCompleteBringToFrontRaw view)
+                    (autoCompleteRequestFocusRaw view)
+                    (autoCompleteShowDropDownRaw view))
+                  (begin))))
+            (autoCompletePostDelayedRaw
+              view
+              (lambda ()
+                (if (focusedDialogReadyToShowDropdown
+                      (alertDialogIsShowing dialog)
+                      (autoCompleteHasFocusRaw view))
+                  (autoCompleteShowDropDownRaw view)
+                  (begin)))
+              (int32 250))))
         (def (permissionResultGranted (actual : Int32) (granted : Int32)) : Bool
           (= actual granted))
         (def (downloadAccessBeforeRuntimePermissions (beforeRuntimePermissions : Bool)) : Bool
@@ -7574,8 +7656,7 @@
        "            inputType = InputType.TYPE_CLASS_TEXT"
        "            threshold = 1"
        "            setAdapter(ArrayAdapter(this@MainActivity, android.R.layout.simple_dropdown_item_1line, boxTypeDisplays))"
-       "            setOnClickListener { showDropDown() }"
-       "            setOnFocusChangeListener { _, hasFocus -> if (focusChangeShouldShowDropdown(hasFocus)) post { showDropDown() } }"
+       "            autoCompleteInstallDropdownOpeners(this)"
        "        }"
        ""
        "    private fun firingArcInput(): AutoCompleteTextView ="
@@ -7584,8 +7665,7 @@
        "            inputType = InputType.TYPE_CLASS_TEXT"
        "            threshold = 0"
        "            setAdapter(ArrayAdapter(this@MainActivity, android.R.layout.simple_dropdown_item_1line, firingArcDisplays))"
-       "            setOnClickListener { showDropDown() }"
-       "            setOnFocusChangeListener { _, hasFocus -> if (focusChangeShouldShowDropdown(hasFocus)) post { showDropDown() } }"
+       "            autoCompleteInstallDropdownOpeners(this)"
        "        }"
        ""
        "    private fun wireBoxTypeDialogBehavior("
@@ -7636,19 +7716,7 @@
        "            android.view.WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE or"
        "                android.view.WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE"
        "        )"
-       "        boxType.requestFocus()"
-       "        boxType.post {"
-       "            if (dialogReadyToShowDropdown(dialog.isShowing)) {"
-       "                boxType.bringToFront()"
-       "                boxType.requestFocus()"
-       "                boxType.showDropDown()"
-       "            }"
-       "        }"
-       "        boxType.postDelayed({"
-       "            if (focusedDialogReadyToShowDropdown(dialog.isShowing, boxType.hasFocus())) {"
-       "                boxType.showDropDown()"
-       "            }"
-       "        }, 250)"
+       "        autoCompleteFocusAndShowDropdown(dialog, boxType)"
        "    }"
        ""
        "    private fun openPdf() {"