diff options
author | Jeff Brown <jeffbrown@google.com> | 2012-06-13 18:28:57 -0700 |
---|---|---|
committer | Jeff Brown <jeffbrown@google.com> | 2012-06-14 04:16:26 -0700 |
commit | de7a8ead2467a4a152a5a9b2416c8048f1b48bbb (patch) | |
tree | 5ab60322af4c99c1c24eb96f44883a77a867d843 | |
parent | 82134f76936be049cc4b23a894ba7decc1d59952 (diff) | |
download | frameworks_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.txt | 1 | ||||
-rw-r--r-- | api/current.txt | 1 | ||||
-rw-r--r-- | core/java/android/app/SearchManager.java | 30 | ||||
-rwxr-xr-x | core/java/android/view/KeyEvent.java | 6 | ||||
-rwxr-xr-x | include/androidfw/KeycodeLabels.h | 1 | ||||
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/SearchPanelView.java | 38 | ||||
-rw-r--r-- | policy/src/com/android/internal/policy/impl/LockScreen.java | 24 | ||||
-rwxr-xr-x | policy/src/com/android/internal/policy/impl/PhoneWindowManager.java | 68 |
8 files changed, 116 insertions, 53 deletions
@@ -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. |