Perform haptic feedback on nav button key press
Fixes: 203614307
Test: manual
Change-Id: Icaea3f5e436522f23202c20fcc7f7c5dbe309372
diff --git a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java
index 01cf23b..eccdae1 100644
--- a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java
@@ -420,7 +420,7 @@
return recentsCoords;
}, new Handler());
recentsButton.setOnClickListener(v -> {
- navButtonController.onButtonClick(BUTTON_RECENTS);
+ navButtonController.onButtonClick(BUTTON_RECENTS, v);
mHitboxExtender.onRecentsButtonClicked();
});
mPropertyHolders.add(new StatePropertyHolder(recentsButton,
@@ -634,9 +634,9 @@
buttonView.setImageResource(drawableId);
buttonView.setContentDescription(parent.getContext().getString(
navButtonController.getButtonContentDescription(buttonType)));
- buttonView.setOnClickListener(view -> navButtonController.onButtonClick(buttonType));
+ buttonView.setOnClickListener(view -> navButtonController.onButtonClick(buttonType, view));
buttonView.setOnLongClickListener(view ->
- navButtonController.onButtonLongClick(buttonType));
+ navButtonController.onButtonLongClick(buttonType, view));
return buttonView;
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarNavButtonController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarNavButtonController.java
index 4ff0649..3392b6b 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarNavButtonController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarNavButtonController.java
@@ -33,6 +33,8 @@
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
+import android.view.HapticFeedbackConstants;
+import android.view.View;
import androidx.annotation.IntDef;
import androidx.annotation.Nullable;
@@ -113,7 +115,9 @@
mHandler = handler;
}
- public void onButtonClick(@TaskbarButton int buttonType) {
+ public void onButtonClick(@TaskbarButton int buttonType, View view) {
+ // Provide the same haptic feedback that the system offers for virtual keys.
+ view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
switch (buttonType) {
case BUTTON_BACK:
logEvent(LAUNCHER_TASKBAR_BACK_BUTTON_TAP);
@@ -144,7 +148,9 @@
}
}
- public boolean onButtonLongClick(@TaskbarButton int buttonType) {
+ public boolean onButtonLongClick(@TaskbarButton int buttonType, View view) {
+ // Provide the same haptic feedback that the system offers for virtual keys.
+ view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
switch (buttonType) {
case BUTTON_HOME:
logEvent(LAUNCHER_TASKBAR_HOME_BUTTON_LONGPRESS);
diff --git a/quickstep/tests/src/com/android/launcher3/taskbar/TaskbarNavButtonControllerTest.java b/quickstep/tests/src/com/android/launcher3/taskbar/TaskbarNavButtonControllerTest.java
index d8be307..4eec319 100644
--- a/quickstep/tests/src/com/android/launcher3/taskbar/TaskbarNavButtonControllerTest.java
+++ b/quickstep/tests/src/com/android/launcher3/taskbar/TaskbarNavButtonControllerTest.java
@@ -23,6 +23,7 @@
import static org.mockito.Mockito.when;
import android.os.Handler;
+import android.view.View;
import androidx.test.runner.AndroidJUnit4;
@@ -58,6 +59,8 @@
TaskbarControllers mockTaskbarControllers;
@Mock
TaskbarActivityContext mockTaskbarActivityContext;
+ @Mock
+ View mockView;
private TaskbarNavButtonController mNavButtonController;
@@ -76,110 +79,110 @@
@Test
public void testPressBack() {
- mNavButtonController.onButtonClick(BUTTON_BACK);
+ mNavButtonController.onButtonClick(BUTTON_BACK, mockView);
verify(mockSystemUiProxy, times(1)).onBackPressed();
}
@Test
public void testPressImeSwitcher() {
- mNavButtonController.onButtonClick(BUTTON_IME_SWITCH);
+ mNavButtonController.onButtonClick(BUTTON_IME_SWITCH, mockView);
verify(mockSystemUiProxy, times(1)).onImeSwitcherPressed();
}
@Test
public void testPressA11yShortClick() {
- mNavButtonController.onButtonClick(BUTTON_A11Y);
+ mNavButtonController.onButtonClick(BUTTON_A11Y, mockView);
verify(mockSystemUiProxy, times(1))
.notifyAccessibilityButtonClicked(DISPLAY_ID);
}
@Test
public void testPressA11yLongClick() {
- mNavButtonController.onButtonLongClick(BUTTON_A11Y);
+ mNavButtonController.onButtonLongClick(BUTTON_A11Y, mockView);
verify(mockSystemUiProxy, times(1)).notifyAccessibilityButtonLongClicked();
}
@Test
public void testLongPressHome() {
- mNavButtonController.onButtonLongClick(BUTTON_HOME);
+ mNavButtonController.onButtonLongClick(BUTTON_HOME, mockView);
verify(mockSystemUiProxy, times(1)).startAssistant(any());
}
@Test
public void testPressHome() {
- mNavButtonController.onButtonClick(BUTTON_HOME);
+ mNavButtonController.onButtonClick(BUTTON_HOME, mockView);
verify(mockCommandHelper, times(1)).addCommand(TYPE_HOME);
}
@Test
public void testPressRecents() {
- mNavButtonController.onButtonClick(BUTTON_RECENTS);
+ mNavButtonController.onButtonClick(BUTTON_RECENTS, mockView);
verify(mockCommandHelper, times(1)).addCommand(TYPE_TOGGLE);
}
@Test
public void testPressRecentsWithScreenPinned() {
mNavButtonController.updateSysuiFlags(SYSUI_STATE_SCREEN_PINNING);
- mNavButtonController.onButtonClick(BUTTON_RECENTS);
+ mNavButtonController.onButtonClick(BUTTON_RECENTS, mockView);
verify(mockCommandHelper, times(0)).addCommand(TYPE_TOGGLE);
}
@Test
public void testLongPressBackRecentsNotPinned() {
- mNavButtonController.onButtonLongClick(BUTTON_RECENTS);
- mNavButtonController.onButtonLongClick(BUTTON_BACK);
+ mNavButtonController.onButtonLongClick(BUTTON_RECENTS, mockView);
+ mNavButtonController.onButtonLongClick(BUTTON_BACK, mockView);
verify(mockSystemUiProxy, times(0)).stopScreenPinning();
}
@Test
public void testLongPressBackRecentsPinned() {
mNavButtonController.updateSysuiFlags(SYSUI_STATE_SCREEN_PINNING);
- mNavButtonController.onButtonLongClick(BUTTON_RECENTS);
- mNavButtonController.onButtonLongClick(BUTTON_BACK);
+ mNavButtonController.onButtonLongClick(BUTTON_RECENTS, mockView);
+ mNavButtonController.onButtonLongClick(BUTTON_BACK, mockView);
verify(mockSystemUiProxy, times(1)).stopScreenPinning();
}
@Test
public void testLongPressBackRecentsTooLongPinned() {
mNavButtonController.updateSysuiFlags(SYSUI_STATE_SCREEN_PINNING);
- mNavButtonController.onButtonLongClick(BUTTON_RECENTS);
+ mNavButtonController.onButtonLongClick(BUTTON_RECENTS, mockView);
try {
Thread.sleep(SCREEN_PIN_LONG_PRESS_THRESHOLD + 5);
} catch (InterruptedException e) {
e.printStackTrace();
}
- mNavButtonController.onButtonLongClick(BUTTON_BACK);
+ mNavButtonController.onButtonLongClick(BUTTON_BACK, mockView);
verify(mockSystemUiProxy, times(0)).stopScreenPinning();
}
@Test
public void testLongPressBackRecentsMultipleAttemptPinned() {
mNavButtonController.updateSysuiFlags(SYSUI_STATE_SCREEN_PINNING);
- mNavButtonController.onButtonLongClick(BUTTON_RECENTS);
+ mNavButtonController.onButtonLongClick(BUTTON_RECENTS, mockView);
try {
Thread.sleep(SCREEN_PIN_LONG_PRESS_THRESHOLD + 5);
} catch (InterruptedException e) {
e.printStackTrace();
}
- mNavButtonController.onButtonLongClick(BUTTON_BACK);
+ mNavButtonController.onButtonLongClick(BUTTON_BACK, mockView);
verify(mockSystemUiProxy, times(0)).stopScreenPinning();
// Try again w/in threshold
- mNavButtonController.onButtonLongClick(BUTTON_RECENTS);
- mNavButtonController.onButtonLongClick(BUTTON_BACK);
+ mNavButtonController.onButtonLongClick(BUTTON_RECENTS, mockView);
+ mNavButtonController.onButtonLongClick(BUTTON_BACK, mockView);
verify(mockSystemUiProxy, times(1)).stopScreenPinning();
}
@Test
public void testLongPressHomeScreenPinned() {
mNavButtonController.updateSysuiFlags(SYSUI_STATE_SCREEN_PINNING);
- mNavButtonController.onButtonLongClick(BUTTON_HOME);
+ mNavButtonController.onButtonLongClick(BUTTON_HOME, mockView);
verify(mockSystemUiProxy, times(0)).startAssistant(any());
}
@Test
public void testNoCallsToNullLogger() {
- mNavButtonController.onButtonClick(BUTTON_HOME);
+ mNavButtonController.onButtonClick(BUTTON_HOME, mockView);
verify(mockStatsLogManager, times(0)).logger();
verify(mockStatsLogger, times(0)).log(any());
}
@@ -187,9 +190,9 @@
@Test
public void testNoCallsAfterNullingOut() {
mNavButtonController.init(mockTaskbarControllers);
- mNavButtonController.onButtonClick(BUTTON_HOME);
+ mNavButtonController.onButtonClick(BUTTON_HOME, mockView);
mNavButtonController.onDestroy();
- mNavButtonController.onButtonClick(BUTTON_HOME);
+ mNavButtonController.onButtonClick(BUTTON_HOME, mockView);
verify(mockStatsLogger, times(1)).log(LAUNCHER_TASKBAR_HOME_BUTTON_TAP);
verify(mockStatsLogger, times(0)).log(LAUNCHER_TASKBAR_HOME_BUTTON_LONGPRESS);
}
@@ -197,7 +200,7 @@
@Test
public void testLogOnTap() {
mNavButtonController.init(mockTaskbarControllers);
- mNavButtonController.onButtonClick(BUTTON_HOME);
+ mNavButtonController.onButtonClick(BUTTON_HOME, mockView);
verify(mockStatsLogger, times(1)).log(LAUNCHER_TASKBAR_HOME_BUTTON_TAP);
verify(mockStatsLogger, times(0)).log(LAUNCHER_TASKBAR_HOME_BUTTON_LONGPRESS);
}
@@ -205,7 +208,7 @@
@Test
public void testLogOnLongpress() {
mNavButtonController.init(mockTaskbarControllers);
- mNavButtonController.onButtonLongClick(BUTTON_HOME);
+ mNavButtonController.onButtonLongClick(BUTTON_HOME, mockView);
verify(mockStatsLogger, times(1)).log(LAUNCHER_TASKBAR_HOME_BUTTON_LONGPRESS);
verify(mockStatsLogger, times(0)).log(LAUNCHER_TASKBAR_HOME_BUTTON_TAP);
}
@@ -213,11 +216,11 @@
@Test
public void testBackOverviewLogOnLongpress() {
mNavButtonController.init(mockTaskbarControllers);
- mNavButtonController.onButtonLongClick(BUTTON_RECENTS);
+ mNavButtonController.onButtonLongClick(BUTTON_RECENTS, mockView);
verify(mockStatsLogger, times(1)).log(LAUNCHER_TASKBAR_OVERVIEW_BUTTON_LONGPRESS);
verify(mockStatsLogger, times(0)).log(LAUNCHER_TASKBAR_OVERVIEW_BUTTON_TAP);
- mNavButtonController.onButtonLongClick(BUTTON_BACK);
+ mNavButtonController.onButtonLongClick(BUTTON_BACK, mockView);
verify(mockStatsLogger, times(1)).log(LAUNCHER_TASKBAR_BACK_BUTTON_LONGPRESS);
verify(mockStatsLogger, times(0)).log(LAUNCHER_TASKBAR_BACK_BUTTON_TAP);
}