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

Commit 67690484 authored by Simon Wingrove's avatar Simon Wingrove
Browse files

Use expand and collapse a11y on privacy dialog.

This will allow TalkBack to read the expanded/collapsed state, and
actions when the state changes.

Bug: 380161221
Test: Manually, using TalkBack
Flag: com.android.systemui.expand_collapse_privacy_dialog
Change-Id: I4f3898a4b0827b364e0c125faaea31097aaa7db0
parent a4980435
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -2014,6 +2014,16 @@ flag {
   }
}

flag {
  name: "expand_collapse_privacy_dialog"
  namespace: "systemui"
  description: "Add expand and collapse actions to accessibility, to allow announcement in TalkBack when state changes."
  bug: "380161221"
  metadata {
    purpose: PURPOSE_BUGFIX
  }
}

flag {
    name: "show_locked_by_your_watch_keyguard_indicator"
    namespace: "systemui"
+82 −31
Original line number Diff line number Diff line
@@ -39,6 +39,11 @@ import androidx.annotation.DrawableRes
import androidx.annotation.WorkerThread
import androidx.core.view.ViewCompat
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_COLLAPSE
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_EXPAND
import androidx.core.view.accessibility.AccessibilityViewCommand
import com.android.systemui.Flags
import com.android.systemui.animation.ViewHierarchyAnimator
import com.android.systemui.res.R
import com.android.systemui.statusbar.phone.SystemUIDialog
@@ -282,9 +287,25 @@ class PrivacyDialogV2(

        val expandToggle =
            itemHeader.findViewById<ImageView>(R.id.privacy_dialog_item_header_expand_toggle)!!
        expandToggle.setImageResource(R.drawable.privacy_dialog_expand_toggle_down)
        expandToggle.visibility = View.VISIBLE
        val expandedLayout =
            itemCard.findViewById<View>(R.id.privacy_dialog_item_header_expanded_layout)!!
        expandedLayout.setOnClickListener {
            // Stop clicks from propagating
        }

        if (Flags.expandCollapsePrivacyDialog()) {
            updateExpansion(ACTION_COLLAPSE, itemCard, expandedLayout, expandToggle)

            itemCard.setOnClickListener {
                if (expandedLayout.visibility == View.VISIBLE) {
                    updateExpansion(ACTION_COLLAPSE, it!!, expandedLayout, expandToggle)
                } else {
                    updateExpansion(ACTION_EXPAND, it!!, expandedLayout, expandToggle)
                }
            }
        } else {
            expandToggle.setImageResource(R.drawable.privacy_dialog_expand_toggle_down)
            ViewCompat.replaceAccessibilityAction(
                itemCard,
                AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_CLICK,
@@ -292,12 +313,6 @@ class PrivacyDialogV2(
                null,
            )

        val expandedLayout =
            itemCard.findViewById<View>(R.id.privacy_dialog_item_header_expanded_layout)!!
        expandedLayout.setOnClickListener {
            // Stop clicks from propagating
        }

            itemCard.setOnClickListener {
                if (expandedLayout.visibility == View.VISIBLE) {
                    expandedLayout.visibility = View.GONE
@@ -324,6 +339,42 @@ class PrivacyDialogV2(
                )
            }
        }
    }

    private fun updateExpansion(
        newState: AccessibilityActionCompat,
        itemCard: View,
        expandedLayout: View,
        expandToggle: ImageView,
    ) {
        expandedLayout.visibility = if (newState == ACTION_COLLAPSE) View.GONE else View.VISIBLE
        expandToggle.setImageResource(
            if (newState == ACTION_COLLAPSE) R.drawable.privacy_dialog_expand_toggle_down
            else R.drawable.privacy_dialog_expand_toggle_up
        )
        val accessibilityString =
            context.getString(
                if (newState == ACTION_COLLAPSE) R.string.privacy_dialog_expand_action
                else R.string.privacy_dialog_collapse_action
            )
        ViewCompat.replaceAccessibilityAction(
            itemCard,
            AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_CLICK,
            accessibilityString,
            null,
        )
        val expandCollapseAccessibilityListener =
            AccessibilityViewCommand { view: View, _: AccessibilityViewCommand.CommandArguments? ->
                view.callOnClick()
            }
        ViewCompat.replaceAccessibilityAction(
            itemCard,
            if (newState == ACTION_COLLAPSE) ACTION_EXPAND else ACTION_COLLAPSE,
            accessibilityString,
            expandCollapseAccessibilityListener,
        )
        ViewCompat.removeAccessibilityAction(itemCard, newState.id)
    }

    private fun updateIconView(iconView: ImageView, indicatorIcon: Drawable, active: Boolean) {
        indicatorIcon.setTint(getForegroundColor(active))