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."); + } + } }