Merge "[Chipbar] Only request a11y focus if the chipbar has a button." into tm-qpr-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
2d13fdb105
@@ -142,6 +142,9 @@
|
|||||||
|
|
||||||
<item type="id" name="row_tag_for_content_view" />
|
<item type="id" name="row_tag_for_content_view" />
|
||||||
|
|
||||||
|
<!-- Chipbar -->
|
||||||
|
<item type="id" name="tag_chipbar_info"/>
|
||||||
|
|
||||||
<!-- Optional cancel button on Keyguard -->
|
<!-- Optional cancel button on Keyguard -->
|
||||||
<item type="id" name="cancel_button"/>
|
<item type="id" name="cancel_button"/>
|
||||||
|
|
||||||
|
|||||||
@@ -22,10 +22,13 @@ import android.os.PowerManager
|
|||||||
import android.view.Gravity
|
import android.view.Gravity
|
||||||
import android.view.MotionEvent
|
import android.view.MotionEvent
|
||||||
import android.view.View
|
import android.view.View
|
||||||
|
import android.view.View.ACCESSIBILITY_LIVE_REGION_ASSERTIVE
|
||||||
|
import android.view.View.ACCESSIBILITY_LIVE_REGION_NONE
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.view.WindowManager
|
import android.view.WindowManager
|
||||||
import android.view.accessibility.AccessibilityManager
|
import android.view.accessibility.AccessibilityManager
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
|
import androidx.annotation.IdRes
|
||||||
import com.android.internal.widget.CachingIconView
|
import com.android.internal.widget.CachingIconView
|
||||||
import com.android.systemui.Gefingerpoken
|
import com.android.systemui.Gefingerpoken
|
||||||
import com.android.systemui.R
|
import com.android.systemui.R
|
||||||
@@ -113,6 +116,8 @@ open class ChipbarCoordinator @Inject constructor(
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
currentView.setTag(INFO_TAG, newInfo)
|
||||||
|
|
||||||
// Detect falsing touches on the chip.
|
// Detect falsing touches on the chip.
|
||||||
parent = currentView.requireViewById(R.id.chipbar_root_view)
|
parent = currentView.requireViewById(R.id.chipbar_root_view)
|
||||||
parent.touchHandler = object : Gefingerpoken {
|
parent.touchHandler = object : Gefingerpoken {
|
||||||
@@ -165,8 +170,11 @@ open class ChipbarCoordinator @Inject constructor(
|
|||||||
} else {
|
} else {
|
||||||
""
|
""
|
||||||
}
|
}
|
||||||
currentView.requireViewById<ViewGroup>(R.id.chipbar_inner).contentDescription =
|
|
||||||
"$loadedIconDesc${newInfo.text.loadText(context)}"
|
val chipInnerView = currentView.getInnerView()
|
||||||
|
chipInnerView.contentDescription = "$loadedIconDesc${newInfo.text.loadText(context)}"
|
||||||
|
chipInnerView.accessibilityLiveRegion = ACCESSIBILITY_LIVE_REGION_ASSERTIVE
|
||||||
|
maybeGetAccessibilityFocus(newInfo, currentView)
|
||||||
|
|
||||||
// ---- Haptics ----
|
// ---- Haptics ----
|
||||||
newInfo.vibrationEffect?.let {
|
newInfo.vibrationEffect?.let {
|
||||||
@@ -174,23 +182,37 @@ open class ChipbarCoordinator @Inject constructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun maybeGetAccessibilityFocus(info: ChipbarInfo?, view: ViewGroup) {
|
||||||
|
// Don't steal focus unless the chipbar has something interactable.
|
||||||
|
// (The chipbar is marked as a live region, so its content will be announced whenever the
|
||||||
|
// content changes.)
|
||||||
|
if (info?.endItem is ChipbarEndItem.Button) {
|
||||||
|
view.getInnerView().requestAccessibilityFocus()
|
||||||
|
} else {
|
||||||
|
view.getInnerView().clearAccessibilityFocus()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun animateViewIn(view: ViewGroup) {
|
override fun animateViewIn(view: ViewGroup) {
|
||||||
val chipInnerView = view.requireViewById<ViewGroup>(R.id.chipbar_inner)
|
|
||||||
ViewHierarchyAnimator.animateAddition(
|
ViewHierarchyAnimator.animateAddition(
|
||||||
chipInnerView,
|
view.getInnerView(),
|
||||||
ViewHierarchyAnimator.Hotspot.TOP,
|
ViewHierarchyAnimator.Hotspot.TOP,
|
||||||
Interpolators.EMPHASIZED_DECELERATE,
|
Interpolators.EMPHASIZED_DECELERATE,
|
||||||
duration = ANIMATION_IN_DURATION,
|
duration = ANIMATION_IN_DURATION,
|
||||||
includeMargins = true,
|
includeMargins = true,
|
||||||
includeFadeIn = true,
|
includeFadeIn = true,
|
||||||
// We can only request focus once the animation finishes.
|
// We can only request focus once the animation finishes.
|
||||||
onAnimationEnd = { chipInnerView.requestAccessibilityFocus() },
|
onAnimationEnd = {
|
||||||
|
maybeGetAccessibilityFocus(view.getTag(INFO_TAG) as ChipbarInfo?, view)
|
||||||
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun animateViewOut(view: ViewGroup, onAnimationEnd: Runnable) {
|
override fun animateViewOut(view: ViewGroup, onAnimationEnd: Runnable) {
|
||||||
|
val innerView = view.getInnerView()
|
||||||
|
innerView.accessibilityLiveRegion = ACCESSIBILITY_LIVE_REGION_NONE
|
||||||
ViewHierarchyAnimator.animateRemoval(
|
ViewHierarchyAnimator.animateRemoval(
|
||||||
view.requireViewById<ViewGroup>(R.id.chipbar_inner),
|
innerView,
|
||||||
ViewHierarchyAnimator.Hotspot.TOP,
|
ViewHierarchyAnimator.Hotspot.TOP,
|
||||||
Interpolators.EMPHASIZED_ACCELERATE,
|
Interpolators.EMPHASIZED_ACCELERATE,
|
||||||
ANIMATION_OUT_DURATION,
|
ANIMATION_OUT_DURATION,
|
||||||
@@ -199,6 +221,10 @@ open class ChipbarCoordinator @Inject constructor(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun ViewGroup.getInnerView(): ViewGroup {
|
||||||
|
return requireViewById(R.id.chipbar_inner)
|
||||||
|
}
|
||||||
|
|
||||||
override fun start() {}
|
override fun start() {}
|
||||||
|
|
||||||
override fun getTouchableRegion(view: View, outRect: Rect) {
|
override fun getTouchableRegion(view: View, outRect: Rect) {
|
||||||
@@ -216,3 +242,4 @@ open class ChipbarCoordinator @Inject constructor(
|
|||||||
|
|
||||||
private const val ANIMATION_IN_DURATION = 500L
|
private const val ANIMATION_IN_DURATION = 500L
|
||||||
private const val ANIMATION_OUT_DURATION = 250L
|
private const val ANIMATION_OUT_DURATION = 250L
|
||||||
|
@IdRes private val INFO_TAG = R.id.tag_chipbar_info
|
||||||
|
|||||||
Reference in New Issue
Block a user