Change the long-press behavior on custom shortcuts to utilize an actual long-press

This helps with accessibility and allows Talkback, Voice Access and Switch Access to trigger the shortcuts.

Bug: b/283179879, b/283176063, b/283042620
Test: manual - activate shortcuts with Talkback, Voice Access and Switch Access
Change-Id: Ia3f6bd0b97c5d87ac4d65442d97716f5e8609268
This commit is contained in:
Brad Hinegardner
2023-05-25 01:36:54 +00:00
parent f69664925d
commit e2a46cc9bd
2 changed files with 52 additions and 25 deletions

View File

@@ -406,19 +406,21 @@ object KeyguardBottomAreaViewBinder {
view.isClickable = viewModel.isClickable
if (viewModel.isClickable) {
if (viewModel.useLongPress) {
view.setOnTouchListener(
KeyguardQuickAffordanceOnTouchListener(
view,
viewModel,
messageDisplayer,
vibratorHelper,
falsingManager,
)
val onTouchListener = KeyguardQuickAffordanceOnTouchListener(
view,
viewModel,
messageDisplayer,
vibratorHelper,
falsingManager,
)
view.setOnTouchListener(onTouchListener)
view.onLongClickListener =
OnLongClickListener(falsingManager, viewModel, vibratorHelper, onTouchListener)
} else {
view.setOnClickListener(OnClickListener(viewModel, checkNotNull(falsingManager)))
}
} else {
view.onLongClickListener = null
view.setOnClickListener(null)
view.setOnTouchListener(null)
}
@@ -454,6 +456,42 @@ object KeyguardBottomAreaViewBinder {
.start()
}
private class OnLongClickListener(
private val falsingManager: FalsingManager?,
private val viewModel: KeyguardQuickAffordanceViewModel,
private val vibratorHelper: VibratorHelper?,
private val onTouchListener: KeyguardQuickAffordanceOnTouchListener
) : View.OnLongClickListener {
override fun onLongClick(view: View): Boolean {
if (falsingManager?.isFalseLongTap(FalsingManager.MODERATE_PENALTY) == true) {
return true
}
if (viewModel.configKey != null) {
viewModel.onClicked(
KeyguardQuickAffordanceViewModel.OnClickedParameters(
configKey = viewModel.configKey,
expandable = Expandable.fromView(view),
slotId = viewModel.slotId,
)
)
vibratorHelper?.vibrate(
if (viewModel.isActivated) {
KeyguardBottomAreaVibrations.Activated
} else {
KeyguardBottomAreaVibrations.Deactivated
}
)
}
onTouchListener.cancel()
return true
}
override fun onLongClickUseDefaultHapticFeedback(view: View?) = false
}
private class OnClickListener(
private val viewModel: KeyguardQuickAffordanceViewModel,
private val falsingManager: FalsingManager,

View File

@@ -46,7 +46,7 @@ class KeyguardQuickAffordanceOnTouchListener(
@SuppressLint("ClickableViewAccessibility")
override fun onTouch(v: View, event: MotionEvent): Boolean {
return when (event.actionMasked) {
MotionEvent.ACTION_DOWN ->
MotionEvent.ACTION_DOWN -> {
if (viewModel.configKey != null) {
downDisplayCoords.set(event.rawX, event.rawY)
if (isUsingAccurateTool(event)) {
@@ -62,21 +62,10 @@ class KeyguardQuickAffordanceOnTouchListener(
.scaleX(PRESSED_SCALE)
.scaleY(PRESSED_SCALE)
.setDuration(longPressDurationMs)
.withEndAction {
if (
falsingManager?.isFalseLongTap(
FalsingManager.MODERATE_PENALTY
) == false
) {
dispatchClick(viewModel.configKey)
}
cancel()
}
}
true
} else {
false
}
false
}
MotionEvent.ACTION_MOVE -> {
if (!isUsingAccurateTool(event)) {
// Moving too far while performing a long-press gesture cancels that
@@ -91,7 +80,7 @@ class KeyguardQuickAffordanceOnTouchListener(
cancel()
}
}
true
false
}
MotionEvent.ACTION_UP -> {
if (isUsingAccurateTool(event)) {
@@ -146,7 +135,7 @@ class KeyguardQuickAffordanceOnTouchListener(
}
)
}
true
false
}
MotionEvent.ACTION_CANCEL -> {
cancel()
@@ -179,7 +168,7 @@ class KeyguardQuickAffordanceOnTouchListener(
view.setOnClickListener(null)
}
private fun cancel(onAnimationEnd: Runnable? = null) {
fun cancel(onAnimationEnd: Runnable? = null) {
longPressAnimator?.cancel()
longPressAnimator = null
view.animate().scaleX(1f).scaleY(1f).withEndAction(onAnimationEnd)