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

Commit 9321d720 authored by Daniel Akinola's avatar Daniel Akinola
Browse files

Fix talkback reading out marquee text

Talkback was focusing on inner marquee text view, so it would announce
partially visible strings like "Open in brows". The parent button
already has the relevant string as part of its content description so
just ignore the inner layout for a11y purposes

Fix: 398128081
Test: manual testing
Flag: EXEMPT bugfix
Change-Id: I4dabb52b0047bee1ff9ca1743afe784ddb6c628c
parent a17f2afa
Loading
Loading
Loading
Loading
+1 −7
Original line number Original line Diff line number Diff line
@@ -43,8 +43,7 @@
            android:layout_height="@dimen/desktop_mode_handle_menu_icon_radius"
            android:layout_height="@dimen/desktop_mode_handle_menu_icon_radius"
            android:layout_marginStart="10dp"
            android:layout_marginStart="10dp"
            android:layout_marginEnd="12dp"
            android:layout_marginEnd="12dp"
            android:contentDescription="@string/app_icon_text"
            android:contentDescription="@string/app_icon_text" />
            android:importantForAccessibility="no"/>


        <com.android.wm.shell.windowdecor.MarqueedTextView
        <com.android.wm.shell.windowdecor.MarqueedTextView
            android:id="@+id/application_name"
            android:id="@+id/application_name"
@@ -142,7 +141,6 @@
            android:contentDescription="@string/screenshot_text"
            android:contentDescription="@string/screenshot_text"
            android:text="@string/screenshot_text"
            android:text="@string/screenshot_text"
            android:src="@drawable/desktop_mode_ic_handle_menu_screenshot"
            android:src="@drawable/desktop_mode_ic_handle_menu_screenshot"
            android:importantForAccessibility="no"
            style="@style/DesktopModeHandleMenuActionButton"/>
            style="@style/DesktopModeHandleMenuActionButton"/>


        <com.android.wm.shell.windowdecor.HandleMenuActionButton
        <com.android.wm.shell.windowdecor.HandleMenuActionButton
@@ -150,7 +148,6 @@
            android:contentDescription="@string/new_window_text"
            android:contentDescription="@string/new_window_text"
            android:text="@string/new_window_text"
            android:text="@string/new_window_text"
            android:src="@drawable/desktop_mode_ic_handle_menu_new_window"
            android:src="@drawable/desktop_mode_ic_handle_menu_new_window"
            android:importantForAccessibility="no"
            style="@style/DesktopModeHandleMenuActionButton"/>
            style="@style/DesktopModeHandleMenuActionButton"/>


        <com.android.wm.shell.windowdecor.HandleMenuActionButton
        <com.android.wm.shell.windowdecor.HandleMenuActionButton
@@ -158,7 +155,6 @@
            android:contentDescription="@string/manage_windows_text"
            android:contentDescription="@string/manage_windows_text"
            android:text="@string/manage_windows_text"
            android:text="@string/manage_windows_text"
            android:src="@drawable/desktop_mode_ic_handle_menu_manage_windows"
            android:src="@drawable/desktop_mode_ic_handle_menu_manage_windows"
            android:importantForAccessibility="no"
            style="@style/DesktopModeHandleMenuActionButton"/>
            style="@style/DesktopModeHandleMenuActionButton"/>


        <com.android.wm.shell.windowdecor.HandleMenuActionButton
        <com.android.wm.shell.windowdecor.HandleMenuActionButton
@@ -166,7 +162,6 @@
            android:contentDescription="@string/change_aspect_ratio_text"
            android:contentDescription="@string/change_aspect_ratio_text"
            android:text="@string/change_aspect_ratio_text"
            android:text="@string/change_aspect_ratio_text"
            android:src="@drawable/desktop_mode_ic_handle_menu_change_aspect_ratio"
            android:src="@drawable/desktop_mode_ic_handle_menu_change_aspect_ratio"
            android:importantForAccessibility="no"
            style="@style/DesktopModeHandleMenuActionButton"/>
            style="@style/DesktopModeHandleMenuActionButton"/>
    </LinearLayout>
    </LinearLayout>


@@ -186,7 +181,6 @@
            android:text="@string/open_in_browser_text"
            android:text="@string/open_in_browser_text"
            android:src="@drawable/desktop_mode_ic_handle_menu_open_in_browser"
            android:src="@drawable/desktop_mode_ic_handle_menu_open_in_browser"
            style="@style/DesktopModeHandleMenuActionButton"
            style="@style/DesktopModeHandleMenuActionButton"
            android:importantForAccessibility="no"
            android:layout_width="0dp"
            android:layout_width="0dp"
            android:layout_weight="1"/>
            android:layout_weight="1"/>


+1 −2
Original line number Original line Diff line number Diff line
@@ -22,8 +22,7 @@
    android:layout_height="match_parent"
    android:layout_height="match_parent"
    android:gravity="start|center_vertical"
    android:gravity="start|center_vertical"
    android:paddingHorizontal="16dp"
    android:paddingHorizontal="16dp"
    android:clickable="true"
    android:importantForAccessibility="yes"
    android:focusable="true"
    android:orientation="horizontal"
    android:orientation="horizontal"
    android:background="?android:attr/selectableItemBackground">
    android:background="?android:attr/selectableItemBackground">


+1 −0
Original line number Original line Diff line number Diff line
@@ -45,6 +45,7 @@
        <item name="android:layout_height">52dp</item>
        <item name="android:layout_height">52dp</item>
        <item name="android:textColor">@androidprv:color/materialColorOnSurface</item>
        <item name="android:textColor">@androidprv:color/materialColorOnSurface</item>
        <item name="android:drawableTint">@androidprv:color/materialColorOnSurface</item>
        <item name="android:drawableTint">@androidprv:color/materialColorOnSurface</item>
        <item name="android:importantForAccessibility">no</item>
    </style>
    </style>


    <style name="DesktopModeHandleMenuActionButtonImage">
    <style name="DesktopModeHandleMenuActionButtonImage">
+66 −31
Original line number Original line Diff line number Diff line
@@ -109,15 +109,18 @@ class HandleMenu(
        get() = (DesktopModeFlags.ENABLE_HANDLE_INPUT_FIX.isTrue() && !taskInfo.isFreeform)
        get() = (DesktopModeFlags.ENABLE_HANDLE_INPUT_FIX.isTrue() && !taskInfo.isFreeform)


    private val pillTopMargin: Int = loadDimensionPixelSize(
    private val pillTopMargin: Int = loadDimensionPixelSize(
        R.dimen.desktop_mode_handle_menu_pill_spacing_margin)
        R.dimen.desktop_mode_handle_menu_pill_spacing_margin
    )
    private val menuWidth = loadDimensionPixelSize(R.dimen.desktop_mode_handle_menu_width)
    private val menuWidth = loadDimensionPixelSize(R.dimen.desktop_mode_handle_menu_width)
    private val menuHeight = getHandleMenuHeight()
    private val menuHeight = getHandleMenuHeight()
    private val marginMenuTop = loadDimensionPixelSize(R.dimen.desktop_mode_handle_menu_margin_top)
    private val marginMenuTop = loadDimensionPixelSize(R.dimen.desktop_mode_handle_menu_margin_top)
    private val marginMenuStart = loadDimensionPixelSize(
    private val marginMenuStart = loadDimensionPixelSize(
        R.dimen.desktop_mode_handle_menu_margin_start)
        R.dimen.desktop_mode_handle_menu_margin_start
    )


    @VisibleForTesting
    @VisibleForTesting
    var handleMenuViewContainer: AdditionalViewContainer? = null
    var handleMenuViewContainer: AdditionalViewContainer? = null

    @VisibleForTesting
    @VisibleForTesting
    var handleMenuView: HandleMenuView? = null
    var handleMenuView: HandleMenuView? = null


@@ -240,7 +243,8 @@ class HandleMenu(
        val y = handleMenuPosition.y.toInt()
        val y = handleMenuPosition.y.toInt()
        handleMenuViewContainer =
        handleMenuViewContainer =
            if ((!taskInfo.isFreeform && DesktopModeFlags.ENABLE_HANDLE_INPUT_FIX.isTrue())
            if ((!taskInfo.isFreeform && DesktopModeFlags.ENABLE_HANDLE_INPUT_FIX.isTrue())
                    || forceShowSystemBars) {
                || forceShowSystemBars
            ) {
                AdditionalSystemViewContainer(
                AdditionalSystemViewContainer(
                    windowManagerWrapper = windowManagerWrapper,
                    windowManagerWrapper = windowManagerWrapper,
                    taskId = taskInfo.taskId,
                    taskId = taskInfo.taskId,
@@ -251,7 +255,11 @@ class HandleMenu(
                    flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or
                    flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or
                            WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
                            WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
                    view = handleMenuView.rootView,
                    view = handleMenuView.rootView,
                    forciblyShownTypes = if (forceShowSystemBars) { systemBars() } else { 0 },
                    forciblyShownTypes = if (forceShowSystemBars) {
                        systemBars()
                    } else {
                        0
                    },
                    ignoreCutouts = Flags.showAppHandleLargeScreens()
                    ignoreCutouts = Flags.showAppHandleLargeScreens()
                            || BubbleAnythingFlagHelper.enableBubbleToFullscreen()
                            || BubbleAnythingFlagHelper.enableBubbleToFullscreen()
                )
                )
@@ -369,7 +377,8 @@ class HandleMenu(
                inputPoint.y - globalMenuPosition.y
                inputPoint.y - globalMenuPosition.y
            )
            )
            if (splitScreenController.getSplitPosition(taskInfo.taskId)
            if (splitScreenController.getSplitPosition(taskInfo.taskId)
                == SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT) {
                == SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT
            ) {
                val leftStageBounds = Rect()
                val leftStageBounds = Rect()
                splitScreenController.getStageBounds(leftStageBounds, Rect())
                splitScreenController.getStageBounds(leftStageBounds, Rect())
                inputRelativeToMenu.x += leftStageBounds.width().toFloat()
                inputRelativeToMenu.x += leftStageBounds.width().toFloat()
@@ -398,7 +407,8 @@ class HandleMenu(
        var menuHeight = loadDimensionPixelSize(R.dimen.desktop_mode_handle_menu_height)
        var menuHeight = loadDimensionPixelSize(R.dimen.desktop_mode_handle_menu_height)
        if (!shouldShowWindowingPill) {
        if (!shouldShowWindowingPill) {
            menuHeight -= loadDimensionPixelSize(
            menuHeight -= loadDimensionPixelSize(
                R.dimen.desktop_mode_handle_menu_windowing_pill_height)
                R.dimen.desktop_mode_handle_menu_windowing_pill_height
            )
            menuHeight -= pillTopMargin
            menuHeight -= pillTopMargin
        }
        }
        if (!SHOULD_SHOW_SCREENSHOT_BUTTON) {
        if (!SHOULD_SHOW_SCREENSHOT_BUTTON) {
@@ -418,14 +428,16 @@ class HandleMenu(
        }
        }
        if (!shouldShowChangeAspectRatioButton) {
        if (!shouldShowChangeAspectRatioButton) {
            menuHeight -= loadDimensionPixelSize(
            menuHeight -= loadDimensionPixelSize(
                R.dimen.desktop_mode_handle_menu_change_aspect_ratio_height)
                R.dimen.desktop_mode_handle_menu_change_aspect_ratio_height
            )
        }
        }
        if (!shouldShowMoreActionsPill) {
        if (!shouldShowMoreActionsPill) {
            menuHeight -= pillTopMargin
            menuHeight -= pillTopMargin
        }
        }
        if (!shouldShowBrowserPill) {
        if (!shouldShowBrowserPill) {
            menuHeight -= loadDimensionPixelSize(
            menuHeight -= loadDimensionPixelSize(
                R.dimen.desktop_mode_handle_menu_open_in_browser_pill_height)
                R.dimen.desktop_mode_handle_menu_open_in_browser_pill_height
            )
            menuHeight -= pillTopMargin
            menuHeight -= pillTopMargin
        }
        }
        return menuHeight
        return menuHeight
@@ -468,48 +480,66 @@ class HandleMenu(


        // Insets for ripple effect of App Info Pill. and Windowing Pill. buttons
        // Insets for ripple effect of App Info Pill. and Windowing Pill. buttons
        val iconButtondrawableShiftInset = context.resources.getDimensionPixelSize(
        val iconButtondrawableShiftInset = context.resources.getDimensionPixelSize(
            R.dimen.desktop_mode_handle_menu_icon_button_ripple_inset_shift)
            R.dimen.desktop_mode_handle_menu_icon_button_ripple_inset_shift
        )
        val iconButtondrawableBaseInset = context.resources.getDimensionPixelSize(
        val iconButtondrawableBaseInset = context.resources.getDimensionPixelSize(
            R.dimen.desktop_mode_handle_menu_icon_button_ripple_inset_base)
            R.dimen.desktop_mode_handle_menu_icon_button_ripple_inset_base
        )
        private val iconButtonRippleRadius = context.resources.getDimensionPixelSize(
        private val iconButtonRippleRadius = context.resources.getDimensionPixelSize(
            R.dimen.desktop_mode_handle_menu_icon_button_ripple_radius)
            R.dimen.desktop_mode_handle_menu_icon_button_ripple_radius
        private val iconButtonDrawableInsetsBase = DrawableInsets(t = iconButtondrawableBaseInset,
        )
        private val iconButtonDrawableInsetsBase = DrawableInsets(
            t = iconButtondrawableBaseInset,
            b = iconButtondrawableBaseInset, l = iconButtondrawableBaseInset,
            b = iconButtondrawableBaseInset, l = iconButtondrawableBaseInset,
            r = iconButtondrawableBaseInset)
            r = iconButtondrawableBaseInset
        private val iconButtonDrawableInsetsLeft = DrawableInsets(t = iconButtondrawableBaseInset,
        )
            b = iconButtondrawableBaseInset, l = iconButtondrawableShiftInset, r = 0)
        private val iconButtonDrawableInsetsLeft = DrawableInsets(
        private val iconButtonDrawableInsetsRight = DrawableInsets(t = iconButtondrawableBaseInset,
            t = iconButtondrawableBaseInset,
            b = iconButtondrawableBaseInset, l = 0, r = iconButtondrawableShiftInset)
            b = iconButtondrawableBaseInset, l = iconButtondrawableShiftInset, r = 0
        )
        private val iconButtonDrawableInsetsRight = DrawableInsets(
            t = iconButtondrawableBaseInset,
            b = iconButtondrawableBaseInset, l = 0, r = iconButtondrawableShiftInset
        )


        // App Info Pill.
        // App Info Pill.
        private val appInfoPill = rootView.requireViewById<View>(R.id.app_info_pill)
        private val appInfoPill = rootView.requireViewById<View>(R.id.app_info_pill)
        private val collapseMenuButton = appInfoPill.requireViewById<HandleMenuImageButton>(
        private val collapseMenuButton = appInfoPill.requireViewById<HandleMenuImageButton>(
            R.id.collapse_menu_button)
            R.id.collapse_menu_button
        )

        @VisibleForTesting
        @VisibleForTesting
        val appIconView = appInfoPill.requireViewById<ImageView>(R.id.application_icon)
        val appIconView = appInfoPill.requireViewById<ImageView>(R.id.application_icon)

        @VisibleForTesting
        @VisibleForTesting
        val appNameView = appInfoPill.requireViewById<MarqueedTextView>(R.id.application_name)
        val appNameView = appInfoPill.requireViewById<MarqueedTextView>(R.id.application_name)


        // Windowing Pill.
        // Windowing Pill.
        private val windowingPill = rootView.requireViewById<View>(R.id.windowing_pill)
        private val windowingPill = rootView.requireViewById<View>(R.id.windowing_pill)
        private val fullscreenBtn = windowingPill.requireViewById<ImageButton>(
        private val fullscreenBtn = windowingPill.requireViewById<ImageButton>(
            R.id.fullscreen_button)
            R.id.fullscreen_button
        )
        private val splitscreenBtn = windowingPill.requireViewById<ImageButton>(
        private val splitscreenBtn = windowingPill.requireViewById<ImageButton>(
            R.id.split_screen_button)
            R.id.split_screen_button
        )
        private val floatingBtn = windowingPill.requireViewById<ImageButton>(R.id.floating_button)
        private val floatingBtn = windowingPill.requireViewById<ImageButton>(R.id.floating_button)
        private val floatingBtnSpace = windowingPill.requireViewById<Space>(
        private val floatingBtnSpace = windowingPill.requireViewById<Space>(
            R.id.floating_button_space)
            R.id.floating_button_space
        )


        private val desktopBtn = windowingPill.requireViewById<ImageButton>(R.id.desktop_button)
        private val desktopBtn = windowingPill.requireViewById<ImageButton>(R.id.desktop_button)
        private val desktopBtnSpace = windowingPill.requireViewById<Space>(
        private val desktopBtnSpace = windowingPill.requireViewById<Space>(
            R.id.desktop_button_space)
            R.id.desktop_button_space
        )


        // More Actions Pill.
        // More Actions Pill.
        private val moreActionsPill = rootView.requireViewById<View>(R.id.more_actions_pill)
        private val moreActionsPill = rootView.requireViewById<View>(R.id.more_actions_pill)
        private val screenshotBtn = moreActionsPill.requireViewById<HandleMenuActionButton>(
        private val screenshotBtn = moreActionsPill.requireViewById<HandleMenuActionButton>(
            R.id.screenshot_button)
            R.id.screenshot_button
        )
        private val newWindowBtn = moreActionsPill.requireViewById<HandleMenuActionButton>(
        private val newWindowBtn = moreActionsPill.requireViewById<HandleMenuActionButton>(
            R.id.new_window_button)
            R.id.new_window_button
        )
        private val manageWindowBtn = moreActionsPill
        private val manageWindowBtn = moreActionsPill
            .requireViewById<HandleMenuActionButton>(R.id.manage_windows_button)
            .requireViewById<HandleMenuActionButton>(R.id.manage_windows_button)
        private val changeAspectRatioBtn = moreActionsPill
        private val changeAspectRatioBtn = moreActionsPill
@@ -517,11 +547,14 @@ class HandleMenu(


        // Open in Browser/App Pill.
        // Open in Browser/App Pill.
        private val openInAppOrBrowserPill = rootView.requireViewById<View>(
        private val openInAppOrBrowserPill = rootView.requireViewById<View>(
            R.id.open_in_app_or_browser_pill)
            R.id.open_in_app_or_browser_pill
        )
        private val openInAppOrBrowserBtn = openInAppOrBrowserPill.requireViewById<View>(
        private val openInAppOrBrowserBtn = openInAppOrBrowserPill.requireViewById<View>(
            R.id.open_in_app_or_browser_button)
            R.id.open_in_app_or_browser_button
        )
        private val openByDefaultBtn = openInAppOrBrowserPill.requireViewById<ImageButton>(
        private val openByDefaultBtn = openInAppOrBrowserPill.requireViewById<ImageButton>(
            R.id.open_by_default_button)
            R.id.open_by_default_button
        )
        private val decorThemeUtil = DecorThemeUtil(context)
        private val decorThemeUtil = DecorThemeUtil(context)
        private val animator = HandleMenuAnimator(rootView, menuWidth, captionHeight.toFloat())
        private val animator = HandleMenuAnimator(rootView, menuWidth, captionHeight.toFloat())


@@ -804,9 +837,11 @@ class HandleMenu(
                getString(R.string.open_in_browser_text)
                getString(R.string.open_in_browser_text)
            }
            }


            val buttonRoot = openInAppOrBrowserBtn.requireViewById<LinearLayout>(R.id.action_button)
            val label = openInAppOrBrowserBtn.requireViewById<MarqueedTextView>(R.id.label)
            val label = openInAppOrBrowserBtn.requireViewById<MarqueedTextView>(R.id.label)
            val image = openInAppOrBrowserBtn.requireViewById<ImageView>(R.id.image)
            val image = openInAppOrBrowserBtn.requireViewById<ImageView>(R.id.image)
            openInAppOrBrowserBtn.contentDescription = btnText
            openInAppOrBrowserBtn.contentDescription = btnText
            buttonRoot.contentDescription = btnText
            label.apply {
            label.apply {
                text = btnText
                text = btnText
                setTextColor(style.textColor)
                setTextColor(style.textColor)
+1 −2
Original line number Original line Diff line number Diff line
@@ -23,9 +23,7 @@ import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.LayoutInflater
import android.widget.ImageView
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.LinearLayout
import android.widget.TextView
import androidx.core.content.withStyledAttributes
import androidx.core.content.withStyledAttributes
import androidx.core.view.isGone
import com.android.wm.shell.R
import com.android.wm.shell.R


/**
/**
@@ -54,6 +52,7 @@ class HandleMenuActionButton @JvmOverloads constructor(


        context.withStyledAttributes(attrs, R.styleable.HandleMenuActionButton) {
        context.withStyledAttributes(attrs, R.styleable.HandleMenuActionButton) {
            textView.text = getString(R.styleable.HandleMenuActionButton_android_text)
            textView.text = getString(R.styleable.HandleMenuActionButton_android_text)
            rootElement.contentDescription = getString(R.styleable.HandleMenuActionButton_android_text)
            textView.setTextColor(getColor(R.styleable.HandleMenuActionButton_android_textColor, 0))
            textView.setTextColor(getColor(R.styleable.HandleMenuActionButton_android_textColor, 0))
            iconView.setImageResource(getResourceId(
            iconView.setImageResource(getResourceId(
                R.styleable.HandleMenuActionButton_android_src, 0))
                R.styleable.HandleMenuActionButton_android_src, 0))