diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 209c785519470..bf253ab8993d5 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -1158,14 +1158,25 @@
0
0
+
+ 0
+
+
+
+
3500
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 8d56e7a163a7c..e2b46d0172885 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -464,6 +464,8 @@
+
+
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 37877cf8264e1..45dc49dba2ca4 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -332,6 +332,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";
@@ -540,6 +544,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
boolean mWakeOnAssistKeyPress;
boolean mWakeOnBackKeyPress;
long mWakeUpToLastStateTimeout;
+ int mSearchKeyBehavior;
+ ComponentName mSearchKeyTargetActivity;
private boolean mHandleVolumeKeysInWM;
@@ -2139,6 +2145,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(mContext, DEFAULT_DISPLAY);
@@ -3161,7 +3173,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) {
@@ -6344,4 +6368,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.");
+ }
+ }
}