summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Brown <jeffbrown@google.com>2012-06-13 18:28:57 -0700
committerJeff Brown <jeffbrown@google.com>2012-06-14 04:16:26 -0700
commitde7a8ead2467a4a152a5a9b2416c8048f1b48bbb (patch)
tree5ab60322af4c99c1c24eb96f44883a77a867d843
parent82134f76936be049cc4b23a894ba7decc1d59952 (diff)
downloadframeworks_base-de7a8ead2467a4a152a5a9b2416c8048f1b48bbb.zip
frameworks_base-de7a8ead2467a4a152a5a9b2416c8048f1b48bbb.tar.gz
frameworks_base-de7a8ead2467a4a152a5a9b2416c8048f1b48bbb.tar.bz2
Add new ASSIST key and map it to the global assist intent.
Moved some duplicate code from SearchPanelView and LockScreen over to SearchManager to avoid creating yet another copy of it in PhoneWindowManager. Bug: 6594275 Change-Id: Ib4ebcd6817639d17548952ab2ce7cb876c05777c
-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.