summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--api/16.txt1
-rw-r--r--api/current.txt1
-rw-r--r--core/java/android/app/SearchManager.java30
-rwxr-xr-xcore/java/android/view/KeyEvent.java6
-rwxr-xr-xinclude/androidfw/KeycodeLabels.h1
-rw-r--r--packages/SystemUI/src/com/android/systemui/SearchPanelView.java38
-rw-r--r--policy/src/com/android/internal/policy/impl/LockScreen.java24
-rwxr-xr-xpolicy/src/com/android/internal/policy/impl/PhoneWindowManager.java68
8 files changed, 116 insertions, 53 deletions
diff --git a/api/16.txt b/api/16.txt
index c95de36..eb09d85 100644
--- a/api/16.txt
+++ b/api/16.txt
@@ -23186,6 +23186,7 @@ package android.view {
field public static final int KEYCODE_ALT_RIGHT = 58; // 0x3a
field public static final int KEYCODE_APOSTROPHE = 75; // 0x4b
field public static final int KEYCODE_APP_SWITCH = 187; // 0xbb
+ field public static final int KEYCODE_ASSIST = 219; // 0xdb
field public static final int KEYCODE_AT = 77; // 0x4d
field public static final int KEYCODE_AVR_INPUT = 182; // 0xb6
field public static final int KEYCODE_AVR_POWER = 181; // 0xb5
diff --git a/api/current.txt b/api/current.txt
index 55c9e28..9f1e152 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -23194,6 +23194,7 @@ package android.view {
field public static final int KEYCODE_ALT_RIGHT = 58; // 0x3a
field public static final int KEYCODE_APOSTROPHE = 75; // 0x4b
field public static final int KEYCODE_APP_SWITCH = 187; // 0xbb
+ field public static final int KEYCODE_ASSIST = 219; // 0xdb
field public static final int KEYCODE_AT = 77; // 0x4d
field public static final int KEYCODE_AVR_INPUT = 182; // 0xb6
field public static final int KEYCODE_AVR_POWER = 181; // 0xb5
diff --git a/core/java/android/app/SearchManager.java b/core/java/android/app/SearchManager.java
index 691ee30..e8bd546 100644
--- a/core/java/android/app/SearchManager.java
+++ b/core/java/android/app/SearchManager.java
@@ -22,6 +22,7 @@ import android.content.ContentResolver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
+import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.database.Cursor;
import android.graphics.Rect;
@@ -32,6 +33,7 @@ import android.os.RemoteException;
import android.os.ServiceManager;
import android.text.TextUtils;
import android.util.Log;
+import android.util.Slog;
import android.view.KeyEvent;
import java.util.List;
@@ -837,4 +839,32 @@ public class SearchManager
}
}
+ /**
+ * Returns true if the global assist activity is available.
+ * @return True if the assistant is available.
+ *
+ * @hide
+ */
+ public final boolean isAssistantAvailable() {
+ Intent intent = getAssistIntent();
+ return intent != null
+ && mContext.getPackageManager().queryIntentActivities(intent,
+ PackageManager.MATCH_DEFAULT_ONLY).size() > 0;
+ }
+
+ /**
+ * Gets an intent to launch the global assist activity, or null if not available.
+ * @return The assist intent.
+ *
+ * @hide
+ */
+ public final Intent getAssistIntent() {
+ ComponentName globalSearchActivity = getGlobalSearchActivity();
+ if (globalSearchActivity != null) {
+ Intent intent = new Intent(Intent.ACTION_ASSIST);
+ intent.setPackage(globalSearchActivity.getPackageName());
+ return intent;
+ }
+ return null;
+ }
}
diff --git a/core/java/android/view/KeyEvent.java b/core/java/android/view/KeyEvent.java
index 1080229..c2a3e58 100755
--- a/core/java/android/view/KeyEvent.java
+++ b/core/java/android/view/KeyEvent.java
@@ -620,8 +620,11 @@ public class KeyEvent extends InputEvent implements Parcelable {
public static final int KEYCODE_RO = 217;
/** Key code constant: Japanese kana key. */
public static final int KEYCODE_KANA = 218;
+ /** Key code constant: Assist key.
+ * Launches the global assist activity. Not delivered to applications. */
+ public static final int KEYCODE_ASSIST = 219;
- private static final int LAST_KEYCODE = KEYCODE_KANA;
+ private static final int LAST_KEYCODE = KEYCODE_ASSIST;
// NOTE: If you add a new keycode here you must also add it to:
// isSystem()
@@ -862,6 +865,7 @@ public class KeyEvent extends InputEvent implements Parcelable {
names.append(KEYCODE_YEN, "KEYCODE_YEN");
names.append(KEYCODE_RO, "KEYCODE_RO");
names.append(KEYCODE_KANA, "KEYCODE_KANA");
+ names.append(KEYCODE_ASSIST, "KEYCODE_ASSIST");
};
// Symbolic names of all metakeys in bit order from least significant to most significant.
diff --git a/include/androidfw/KeycodeLabels.h b/include/androidfw/KeycodeLabels.h
index 1828062..538949d 100755
--- a/include/androidfw/KeycodeLabels.h
+++ b/include/androidfw/KeycodeLabels.h
@@ -243,6 +243,7 @@ static const KeycodeLabel KEYCODES[] = {
{ "YEN", 216 },
{ "RO", 217 },
{ "KANA", 218 },
+ { "ASSIST", 219 },
// NOTE: If you add a new keycode here you must also add it to several other files.
// Refer to frameworks/base/core/java/android/view/KeyEvent.java for the full list.
diff --git a/packages/SystemUI/src/com/android/systemui/SearchPanelView.java b/packages/SystemUI/src/com/android/systemui/SearchPanelView.java
index 923bcba..c082c97 100644
--- a/packages/SystemUI/src/com/android/systemui/SearchPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/SearchPanelView.java
@@ -23,7 +23,6 @@ import android.content.ActivityNotFoundException;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
-import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.os.Vibrator;
import android.provider.Settings;
@@ -35,6 +34,7 @@ import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnPreDrawListener;
import android.widget.FrameLayout;
+
import com.android.internal.widget.multiwaveview.GlowPadView;
import com.android.internal.widget.multiwaveview.GlowPadView.OnTriggerListener;
import com.android.systemui.R;
@@ -53,6 +53,7 @@ public class SearchPanelView extends FrameLayout implements
private static final String ASSIST_ICON_METADATA_NAME =
"com.android.systemui.action_assist_icon";
private final Context mContext;
+ private final SearchManager mSearchManager;
private BaseStatusBar mBar;
private StatusBarTouchProxy mStatusBarTouchProxy;
@@ -73,38 +74,12 @@ public class SearchPanelView extends FrameLayout implements
}
}
- private SearchManager mSearchManager;
-
- // This code should be the same as that used in LockScreen.java
public boolean isAssistantAvailable() {
- Intent intent = getAssistIntent();
- return intent == null ? false
- : mContext.getPackageManager().queryIntentActivities(intent,
- PackageManager.MATCH_DEFAULT_ONLY).size() > 0;
+ return mSearchManager != null && mSearchManager.isAssistantAvailable();
}
private Intent getAssistIntent() {
- Intent intent = null;
- SearchManager searchManager = getSearchManager();
- if (searchManager != null) {
- ComponentName globalSearchActivity = searchManager.getGlobalSearchActivity();
- if (globalSearchActivity != null) {
- intent = new Intent(Intent.ACTION_ASSIST);
- intent.setPackage(globalSearchActivity.getPackageName());
- } else {
- Slog.w(TAG, "No global search activity");
- }
- } else {
- Slog.w(TAG, "No SearchManager");
- }
- return intent;
- }
-
- private SearchManager getSearchManager() {
- if (mSearchManager == null) {
- mSearchManager = (SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE);
- }
- return mSearchManager;
+ return mSearchManager != null ? mSearchManager.getAssistIntent() : null;
}
private void startAssistActivity() {
@@ -175,9 +150,8 @@ public class SearchPanelView extends FrameLayout implements
// TODO: fetch views
mGlowPadView = (GlowPadView) findViewById(R.id.glow_pad_view);
mGlowPadView.setOnTriggerListener(mGlowPadViewListener);
- SearchManager searchManager = getSearchManager();
- if (searchManager != null) {
- ComponentName component = searchManager.getGlobalSearchActivity();
+ if (mSearchManager != null) {
+ ComponentName component = mSearchManager.getGlobalSearchActivity();
if (component != null) {
if (!mGlowPadView.replaceTargetDrawablesIfPresent(component,
ASSIST_ICON_METADATA_NAME,
diff --git a/policy/src/com/android/internal/policy/impl/LockScreen.java b/policy/src/com/android/internal/policy/impl/LockScreen.java
index c9388cb..4af66ce 100644
--- a/policy/src/com/android/internal/policy/impl/LockScreen.java
+++ b/policy/src/com/android/internal/policy/impl/LockScreen.java
@@ -32,7 +32,6 @@ import android.content.ActivityNotFoundException;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
-import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Vibrator;
@@ -254,29 +253,14 @@ class LockScreen extends LinearLayout implements KeyguardScreen {
}
}
- // This code should be the same as that in SearchPanelView
- public boolean isAssistantAvailable() {
- Intent intent = getAssistIntent();
- return intent == null ? false
- : mContext.getPackageManager().queryIntentActivities(intent,
- PackageManager.MATCH_DEFAULT_ONLY).size() > 0;
+ private boolean isAssistantAvailable() {
+ SearchManager searchManager = getSearchManager();
+ return searchManager != null && searchManager.isAssistantAvailable();
}
private Intent getAssistIntent() {
- Intent intent = null;
SearchManager searchManager = getSearchManager();
- if (searchManager != null) {
- ComponentName globalSearchActivity = searchManager.getGlobalSearchActivity();
- if (globalSearchActivity != null) {
- intent = new Intent(Intent.ACTION_ASSIST);
- intent.setPackage(globalSearchActivity.getPackageName());
- } else {
- Slog.w(TAG, "No global search activity");
- }
- } else {
- Slog.w(TAG, "No SearchManager");
- }
- return intent;
+ return searchManager != null ? searchManager.getAssistIntent() : null;
}
private SearchManager getSearchManager() {
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index 9ef8d6b..a5190f1 100755
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -19,6 +19,7 @@ import android.app.ActivityManager;
import android.app.ActivityManagerNative;
import android.app.IUiModeManager;
import android.app.ProgressDialog;
+import android.app.SearchManager;
import android.app.UiModeManager;
import android.content.ActivityNotFoundException;
import android.content.BroadcastReceiver;
@@ -235,6 +236,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
static public final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions";
static public final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";
static public final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";
+ static public final String SYSTEM_DIALOG_REASON_ASSIST = "assist";
/**
* These are the system UI flags that, when changing, can cause the layout
@@ -279,6 +281,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
LocalPowerManager mPowerManager;
IStatusBarService mStatusBarService;
Vibrator mVibrator; // Vibrator for giving feedback of orientation changes
+ SearchManager mSearchManager;
// Vibrator pattern for haptic feedback of a long press.
long[] mLongPressVibePattern;
@@ -462,6 +465,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
Intent mDeskDockIntent;
boolean mSearchKeyShortcutPending;
boolean mConsumeSearchKeyUp;
+ boolean mAssistKeyLongPressed;
// support for activating the lock screen while the screen is on
boolean mAllowLockscreenWhenOn;
@@ -1860,6 +1864,26 @@ public class PhoneWindowManager implements WindowManagerPolicy {
showOrHideRecentAppsDialog(RECENT_APPS_BEHAVIOR_SHOW_OR_DISMISS);
}
return -1;
+ } else if (keyCode == KeyEvent.KEYCODE_ASSIST) {
+ if (down) {
+ if (repeatCount == 0) {
+ mAssistKeyLongPressed = false;
+ } else if (repeatCount == 1) {
+ mAssistKeyLongPressed = true;
+ if (!keyguardOn) {
+ launchAssistLongPressAction();
+ }
+ }
+ } else {
+ if (mAssistKeyLongPressed) {
+ mAssistKeyLongPressed = false;
+ } else {
+ if (!keyguardOn) {
+ launchAssistAction();
+ }
+ }
+ }
+ return -1;
}
// Shortcuts are invoked through Search+key, so intercept those here
@@ -2050,6 +2074,50 @@ public class PhoneWindowManager implements WindowManagerPolicy {
return false;
}
+ private void launchAssistLongPressAction() {
+ performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false);
+ sendCloseSystemWindows(SYSTEM_DIALOG_REASON_ASSIST);
+
+ // launch the search activity
+ Intent intent = new Intent(Intent.ACTION_SEARCH_LONG_PRESS);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ try {
+ SearchManager searchManager = getSearchManager();
+ if (searchManager != null) {
+ searchManager.stopSearch();
+ }
+ mContext.startActivity(intent);
+ } catch (ActivityNotFoundException e) {
+ Slog.w(TAG, "No activity to handle assist long press action.", e);
+ }
+ }
+
+ private void launchAssistAction() {
+ sendCloseSystemWindows(SYSTEM_DIALOG_REASON_ASSIST);
+
+ SearchManager searchManager = getSearchManager();
+ if (searchManager != null) {
+ Intent intent = searchManager.getAssistIntent();
+ if (intent != null) {
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
+ | Intent.FLAG_ACTIVITY_SINGLE_TOP
+ | Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ try {
+ mContext.startActivity(intent);
+ } catch (ActivityNotFoundException e) {
+ Slog.w(TAG, "No activity to handle assist action.", e);
+ }
+ }
+ }
+ }
+
+ private SearchManager getSearchManager() {
+ if (mSearchManager == null) {
+ mSearchManager = (SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE);
+ }
+ return mSearchManager;
+ }
+
/**
* A home key -> launch home action was detected. Take the appropriate action
* given the situation with the keyguard.