diff options
-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. |