Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5cadec21 authored by Winson Chung's avatar Winson Chung
Browse files

Request input focus when showing the open-by-default dialog

Bug: 378565144
Flag: com.android.window.flags.use_input_reported_focus_for_accessibility
Test: Manual, enable accessibility service, open the dialog and
      verify accessibility focus moves there
Change-Id: I41099727e8837465b192c6e5e96bc8ca568af18e
parent 288bf55e
Loading
Loading
Loading
Loading
+21 −9
Original line number Diff line number Diff line
@@ -31,7 +31,6 @@ import android.view.LayoutInflater
import android.view.SurfaceControl
import android.view.SurfaceControlViewHost
import android.view.WindowManager.LayoutParams
import android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
import android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
import android.view.WindowManager.LayoutParams.TYPE_APPLICATION_PANEL
import android.view.WindowlessWindowManager
@@ -40,6 +39,7 @@ import android.widget.ImageView
import android.widget.RadioButton
import android.widget.TextView
import android.window.TaskConstants
import com.android.window.flags.Flags
import com.android.wm.shell.R
import com.android.wm.shell.common.DisplayController
import com.android.wm.shell.compatui.DialogAnimationController
@@ -107,8 +107,12 @@ internal class OpenByDefaultDialog(
        appIconView = dialog.requireViewById(R.id.application_icon)
        appNameView = dialog.requireViewById(R.id.application_name)

        if (Flags.useInputReportedFocusForAccessibility()) {
            createDialogWindow()
        } else {
            // TODO: ag/34061541 - once landed, can refactor with simpler fix
            transitions.runOnIdle(this::createDialogWindow)
        }

        dialog.setDismissOnClickListener { closeMenu() }
        dialog.setConfirmButtonClickListener {
@@ -117,6 +121,9 @@ internal class OpenByDefaultDialog(
        }

        listener.onDialogCreated()
        if (Flags.useInputReportedFocusForAccessibility()) {
            viewHost.requestInputFocus(true)
        }
    }

    private fun createDialogWindow() {
@@ -126,7 +133,7 @@ internal class OpenByDefaultDialog(
            taskBounds.width(),
            taskBounds.height(),
            TYPE_APPLICATION_PANEL,
            FLAG_NOT_FOCUSABLE or FLAG_NOT_TOUCH_MODAL,
            FLAG_NOT_TOUCH_MODAL,
            PixelFormat.TRANSLUCENT
        ).apply {
            token = Binder()
@@ -143,6 +150,7 @@ internal class OpenByDefaultDialog(
    }

    private fun onAnimationEnded() {
        if (!Flags.useInputReportedFocusForAccessibility()) {
            dialog.post {
                dialog.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED)
                val subHeader: TextView = dialog.requireViewById(R.id.dialog_subheader)
@@ -150,6 +158,7 @@ internal class OpenByDefaultDialog(
                subHeader.requestAccessibilityFocus()
            }
        }
    }

    private fun initializeRadioButtons() {
        openInAppButton = dialog.requireViewById(R.id.open_in_app_button)
@@ -175,6 +184,9 @@ internal class OpenByDefaultDialog(
    }

    private fun closeMenu() {
        if (Flags.useInputReportedFocusForAccessibility()) {
            viewHost.requestInputFocus(false)
        }
        loadAppInfoJob?.cancel()
        animationController.startExitAnimation(dialog) {
            // Release the host and manager after the exit animation
+4 −1
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import android.widget.Button
import android.widget.RadioButton
import android.widget.TextView
import androidx.constraintlayout.widget.ConstraintLayout
import com.android.window.flags.Flags
import com.android.wm.shell.R
import com.android.wm.shell.compatui.DialogContainerSupplier

@@ -74,8 +75,10 @@ class OpenByDefaultDialogView @JvmOverloads constructor(
        backgroundDim = background.mutate()
        backgroundDim.alpha = 128

        if (!Flags.useInputReportedFocusForAccessibility()) {
            setupA11yTraversal()
        }
    }

    // Set up a11y focus so that focus loops through elements within the dialog, instead of going to
    // elements behind the dialog.