diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 14c1af4477008..4b05f99f82426 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -1118,14 +1118,25 @@
0
0
+
+ 0
+
+
+
+
3500
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 51251cdc94662..24147ae8dabe3 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -451,6 +451,8 @@
+
+
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index c8a11a529c303..a2670eee0106b 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -322,6 +322,10 @@ public class PhoneWindowManager implements WindowManagerPolicy {
static final int TRIPLE_PRESS_PRIMARY_NOTHING = 0;
static final int TRIPLE_PRESS_PRIMARY_TOGGLE_ACCESSIBILITY = 1;
+ // Must match: config_searchKeyBehavior in config.xml
+ static final int SEARCH_BEHAVIOR_DEFAULT_SEARCH = 0;
+ static final int SEARCH_BEHAVIOR_TARGET_ACTIVITY = 1;
+
static public final String SYSTEM_DIALOG_REASON_KEY = "reason";
static public final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions";
static public final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";
@@ -525,6 +529,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
boolean mWakeOnAssistKeyPress;
boolean mWakeOnBackKeyPress;
long mWakeUpToLastStateTimeout;
+ int mSearchKeyBehavior;
+ ComponentName mSearchKeyTargetActivity;
private boolean mHandleVolumeKeysInWM;
@@ -2078,6 +2084,12 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mWakeUpToLastStateTimeout = mContext.getResources().getInteger(
com.android.internal.R.integer.config_wakeUpToLastStateTimeoutMillis);
+ mSearchKeyBehavior = mContext.getResources().getInteger(
+ com.android.internal.R.integer.config_searchKeyBehavior);
+
+ mSearchKeyTargetActivity = ComponentName.unflattenFromString(
+ mContext.getResources().getString(
+ com.android.internal.R.string.config_searchKeyTargetActivity));
readConfigurationDependentBehaviors();
mDisplayFoldController = DisplayFoldController.create(context, DEFAULT_DISPLAY);
@@ -3010,7 +3022,19 @@ public class PhoneWindowManager implements WindowManagerPolicy {
toggleNotificationPanel();
}
return key_consumed;
-
+ case KeyEvent.KEYCODE_SEARCH:
+ if (down && repeatCount == 0 && !keyguardOn()) {
+ switch(mSearchKeyBehavior) {
+ case SEARCH_BEHAVIOR_TARGET_ACTIVITY: {
+ launchTargetSearchActivity();
+ return key_consumed;
+ }
+ case SEARCH_BEHAVIOR_DEFAULT_SEARCH:
+ default:
+ break;
+ }
+ }
+ break;
case KeyEvent.KEYCODE_SPACE:
// Handle keyboard layout switching. (META + SPACE)
if ((metaState & KeyEvent.META_META_MASK) == 0) {
@@ -6080,4 +6104,22 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
}
+ private void launchTargetSearchActivity() {
+ Intent intent;
+ if (mSearchKeyTargetActivity != null) {
+ intent = new Intent();
+ intent.setComponent(mSearchKeyTargetActivity);
+ } else {
+ intent = new Intent(Intent.ACTION_WEB_SEARCH);
+ }
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
+ | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
+ try {
+ startActivityAsUser(intent, UserHandle.CURRENT_OR_SELF);
+ } catch (ActivityNotFoundException ignore) {
+ Slog.e(TAG, "Could not resolve activity with : "
+ + intent.getComponent().flattenToString()
+ + " name.");
+ }
+ }
}