Use status bar to launch assistant.
Bug: 289402228
Test: atest StemKeyGestureTests
Change-Id: I7f5780191e29d9eeef23a48d7ec9452ea820ecba
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index a53f7ca..db17edd 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -29,6 +29,7 @@
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.os.Build.VERSION_CODES.M;
import static android.os.Build.VERSION_CODES.O;
+import static android.os.IInputConstants.INVALID_INPUT_DEVICE_ID;
import static android.provider.Settings.Secure.VOLUME_HUSH_OFF;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.INVALID_DISPLAY;
@@ -1331,7 +1332,7 @@
mPowerKeyHandled = true;
performHapticFeedback(HapticFeedbackConstants.ASSISTANT_BUTTON, false,
"Power - Long Press - Go To Assistant");
- final int powerKeyDeviceId = Integer.MIN_VALUE;
+ final int powerKeyDeviceId = INVALID_INPUT_DEVICE_ID;
launchAssistAction(null, powerKeyDeviceId, eventTime,
AssistUtils.INVOCATION_TYPE_POWER_BUTTON_LONG_PRESS);
break;
@@ -1520,7 +1521,7 @@
}
}
- private void stemPrimaryLongPress() {
+ private void stemPrimaryLongPress(long eventTime) {
if (DEBUG_INPUT) {
Slog.d(TAG, "Executing stem primary long press action behavior.");
}
@@ -1529,7 +1530,12 @@
case LONG_PRESS_PRIMARY_NOTHING:
break;
case LONG_PRESS_PRIMARY_LAUNCH_VOICE_ASSISTANT:
- launchVoiceAssist(/* allowDuringSetup= */false);
+ final int stemPrimaryKeyDeviceId = INVALID_INPUT_DEVICE_ID;
+ launchAssistAction(
+ null,
+ stemPrimaryKeyDeviceId,
+ eventTime,
+ AssistUtils.INVOCATION_TYPE_UNKNOWN);
break;
}
}
@@ -2152,6 +2158,7 @@
mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class);
mAppOpsManager = mContext.getSystemService(AppOpsManager.class);
mSensorPrivacyManager = mContext.getSystemService(SensorPrivacyManager.class);
+ mSearchManager = mContext.getSystemService(SearchManager.class);
mDisplayManager = mContext.getSystemService(DisplayManager.class);
mDisplayManagerInternal = LocalServices.getService(DisplayManagerInternal.class);
mUserManagerInternal = LocalServices.getService(UserManagerInternal.class);
@@ -2650,7 +2657,7 @@
@Override
void onLongPress(long eventTime) {
- stemPrimaryLongPress();
+ stemPrimaryLongPress(eventTime);
}
@Override
@@ -3897,7 +3904,7 @@
// Add Intent Extra data.
Bundle args = null;
args = new Bundle();
- if (deviceId > Integer.MIN_VALUE) {
+ if (deviceId != INVALID_INPUT_DEVICE_ID) {
args.putInt(Intent.EXTRA_ASSIST_INPUT_DEVICE_ID, deviceId);
}
if (hint != null) {
@@ -3906,8 +3913,15 @@
args.putLong(Intent.EXTRA_TIME, eventTime);
args.putInt(AssistUtils.INVOCATION_TYPE_KEY, invocationType);
- ((SearchManager) mContext.createContextAsUser(UserHandle.of(mCurrentUserId), 0)
- .getSystemService(Context.SEARCH_SERVICE)).launchAssist(args);
+ if (mSearchManager != null) {
+ mSearchManager.launchAssist(args);
+ } else {
+ // Fallback to status bar if search manager doesn't exist (e.g. on wear).
+ StatusBarManagerInternal statusBar = getStatusBarManagerInternal();
+ if (statusBar != null) {
+ statusBar.startAssist(args);
+ }
+ }
}
/**
@@ -3918,39 +3932,16 @@
final boolean keyguardActive =
mKeyguardDelegate != null && mKeyguardDelegate.isShowing();
if (!keyguardActive) {
- if (mHasFeatureWatch && isInRetailMode()) {
- launchRetailVoiceAssist(allowDuringSetup);
- } else {
- startVoiceAssistIntent(allowDuringSetup);
- }
+ startActivityAsUser(
+ new Intent(Intent.ACTION_VOICE_ASSIST),
+ /* bundle= */ null,
+ UserHandle.CURRENT_OR_SELF,
+ allowDuringSetup);
} else {
mKeyguardDelegate.dismissKeyguardToLaunch(new Intent(Intent.ACTION_VOICE_ASSIST));
}
}
- private void launchRetailVoiceAssist(boolean allowDuringSetup) {
- Intent retailIntent = new Intent(ACTION_VOICE_ASSIST_RETAIL);
- ResolveInfo resolveInfo = mContext.getPackageManager().resolveActivity(
- retailIntent, /* flags= */0);
- if (resolveInfo != null) {
- retailIntent.setComponent(
- new ComponentName(resolveInfo.activityInfo.packageName,
- resolveInfo.activityInfo.name));
- startActivityAsUser(retailIntent, null, UserHandle.CURRENT_OR_SELF,
- allowDuringSetup);
- } else {
- Slog.w(TAG, "Couldn't find an app to process " + ACTION_VOICE_ASSIST_RETAIL
- + ". Fall back to start " + Intent.ACTION_VOICE_ASSIST);
- startVoiceAssistIntent(allowDuringSetup);
- }
- }
-
- private void startVoiceAssistIntent(boolean allowDuringSetup) {
- Intent intent = new Intent(Intent.ACTION_VOICE_ASSIST);
- startActivityAsUser(intent, null, UserHandle.CURRENT_OR_SELF,
- allowDuringSetup);
- }
-
private boolean isInRetailMode() {
return Settings.Global.getInt(mContext.getContentResolver(),
Settings.Global.DEVICE_DEMO_MODE, 0) == 1;
@@ -3973,13 +3964,6 @@
}
}
- private SearchManager getSearchManager() {
- if (mSearchManager == null) {
- mSearchManager = (SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE);
- }
- return mSearchManager;
- }
-
private void preloadRecentApps() {
mPreloadedRecentApps = true;
StatusBarManagerInternal statusbar = getStatusBarManagerInternal();
diff --git a/services/tests/wmtests/src/com/android/server/policy/PowerKeyGestureTests.java b/services/tests/wmtests/src/com/android/server/policy/PowerKeyGestureTests.java
index 6f65406..05a1482 100644
--- a/services/tests/wmtests/src/com/android/server/policy/PowerKeyGestureTests.java
+++ b/services/tests/wmtests/src/com/android/server/policy/PowerKeyGestureTests.java
@@ -112,7 +112,7 @@
// Show assistant.
mPhoneWindowManager.overrideLongPressOnPower(LONG_PRESS_POWER_ASSISTANT);
sendKey(KEYCODE_POWER, true);
- mPhoneWindowManager.assertAssistLaunch();
+ mPhoneWindowManager.assertSearchManagerLaunchAssist();
// Show global actions.
mPhoneWindowManager.overrideLongPressOnPower(LONG_PRESS_POWER_GLOBAL_ACTIONS);
diff --git a/services/tests/wmtests/src/com/android/server/policy/StemKeyGestureTests.java b/services/tests/wmtests/src/com/android/server/policy/StemKeyGestureTests.java
index 50e4c5c..eab8757 100644
--- a/services/tests/wmtests/src/com/android/server/policy/StemKeyGestureTests.java
+++ b/services/tests/wmtests/src/com/android/server/policy/StemKeyGestureTests.java
@@ -16,9 +16,11 @@
package com.android.server.policy;
+import static android.provider.Settings.Global.STEM_PRIMARY_BUTTON_LONG_PRESS;
import static android.provider.Settings.Global.STEM_PRIMARY_BUTTON_SHORT_PRESS;
import static android.view.KeyEvent.KEYCODE_STEM_PRIMARY;
+import static com.android.server.policy.PhoneWindowManager.LONG_PRESS_PRIMARY_LAUNCH_VOICE_ASSISTANT;
import static com.android.server.policy.PhoneWindowManager.SHORT_PRESS_PRIMARY_LAUNCH_ALL_APPS;
import static com.android.server.policy.PhoneWindowManager.SHORT_PRESS_PRIMARY_LAUNCH_TARGET_ACTIVITY;
@@ -90,6 +92,35 @@
mPhoneWindowManager.assertActivityTargetLaunched(targetComponent);
}
+ @Test
+ public void stemLongKey_triggerSearchServiceToLaunchAssist() {
+ overrideBehavior(
+ STEM_PRIMARY_BUTTON_LONG_PRESS,
+ LONG_PRESS_PRIMARY_LAUNCH_VOICE_ASSISTANT);
+ setUpPhoneWindowManager(/* supportSettingsUpdate= */ true);
+ mPhoneWindowManager.setupAssistForLaunch();
+ mPhoneWindowManager.overrideIsUserSetupComplete(true);
+
+ sendKey(KEYCODE_STEM_PRIMARY, /* longPress= */ true);
+ mPhoneWindowManager.assertSearchManagerLaunchAssist();
+ }
+
+ @Test
+ public void stemLongKey_whenNoSearchService_triggerStatusBarToStartAssist() {
+ overrideBehavior(
+ STEM_PRIMARY_BUTTON_LONG_PRESS,
+ LONG_PRESS_PRIMARY_LAUNCH_VOICE_ASSISTANT);
+ setUpPhoneWindowManager(/* supportSettingsUpdate= */ true);
+ mPhoneWindowManager.setupAssistForLaunch();
+ mPhoneWindowManager.overrideSearchManager(null);
+ mPhoneWindowManager.overrideStatusBarManagerInternal();
+ mPhoneWindowManager.overrideIsUserSetupComplete(true);
+
+ sendKey(KEYCODE_STEM_PRIMARY, /* longPress= */ true);
+ mPhoneWindowManager.assertStatusBarStartAssist();
+ }
+
+
private void overrideBehavior(String key, int expectedBehavior) {
Settings.Global.putLong(mContext.getContentResolver(), key, expectedBehavior);
}
diff --git a/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java b/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java
index 7742cac..bc8f06a 100644
--- a/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java
+++ b/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java
@@ -232,6 +232,7 @@
doReturn(mPackageManager).when(mContext).getPackageManager();
doReturn(mSensorPrivacyManager).when(mContext).getSystemService(
eq(SensorPrivacyManager.class));
+ doReturn(mSearchManager).when(mContext).getSystemService(eq(SearchManager.class));
doReturn(false).when(mPackageManager).hasSystemFeature(any());
try {
doThrow(new PackageManager.NameNotFoundException("test")).when(mPackageManager)
@@ -357,11 +358,7 @@
case LONG_PRESS_POWER_GO_TO_VOICE_ASSIST:
break;
case LONG_PRESS_POWER_ASSISTANT:
- doNothing().when(mPhoneWindowManager).sendCloseSystemWindows();
- doReturn(true).when(mPhoneWindowManager).isUserSetupComplete();
- doReturn(mContext).when(mContext).createContextAsUser(any(), anyInt());
- doReturn(mSearchManager).when(mContext)
- .getSystemService(eq(Context.SEARCH_SERVICE));
+ setupAssistForLaunch();
mPhoneWindowManager.mLongPressOnPowerAssistantTimeoutMs = 500;
break;
}
@@ -435,6 +432,16 @@
doReturn(isShowing).when(mKeyguardServiceDelegate).isShowing();
}
+ void setupAssistForLaunch() {
+ doNothing().when(mPhoneWindowManager).sendCloseSystemWindows();
+ doReturn(true).when(mPhoneWindowManager).isUserSetupComplete();
+ doReturn(mContext).when(mContext).createContextAsUser(any(), anyInt());
+ }
+
+ void overrideSearchManager(SearchManager searchManager) {
+ mPhoneWindowManager.mSearchManager = searchManager;
+ }
+
void assumeResolveActivityNotNull() {
ResolveInfo resolveInfo = new ResolveInfo();
doReturn(resolveInfo).when(mPackageManager).resolveActivity(any(), anyInt());
@@ -529,7 +536,7 @@
.interceptPowerKeyDown(any(), anyBoolean(), any());
}
- void assertAssistLaunch() {
+ void assertSearchManagerLaunchAssist() {
waitForIdle();
verify(mSearchManager, timeout(SHORTCUT_KEY_DELAY_MILLIS)).launchAssist(any());
}
@@ -552,6 +559,11 @@
verify(mStatusBarManagerInternal).showRecentApps(anyBoolean());
}
+ void assertStatusBarStartAssist() {
+ waitForIdle();
+ verify(mStatusBarManagerInternal).startAssist(any());
+ }
+
void assertSwitchKeyboardLayout(int direction) {
waitForIdle();
if (FeatureFlagUtils.isEnabled(mContext, FeatureFlagUtils.SETTINGS_NEW_KEYBOARD_UI)) {