diff options
5 files changed, 67 insertions, 28 deletions
diff --git a/core/java/android/view/KeyEvent.java b/core/java/android/view/KeyEvent.java index 829b2b74ac9f..a2147b714ec6 100644 --- a/core/java/android/view/KeyEvent.java +++ b/core/java/android/view/KeyEvent.java @@ -804,8 +804,11 @@ public class KeyEvent extends InputEvent implements Parcelable { public static final int KEYCODE_SYSTEM_NAVIGATION_LEFT = 282; /** Key code constant: Consumed by the system for navigation right */ public static final int KEYCODE_SYSTEM_NAVIGATION_RIGHT = 283; + /** Key code constant: Show all apps + * @hide */ + public static final int KEYCODE_ALL_APPS = 284; - private static final int LAST_KEYCODE = KEYCODE_SYSTEM_NAVIGATION_RIGHT; + private static final int LAST_KEYCODE = KEYCODE_ALL_APPS; // NOTE: If you add a new keycode here you must also add it to: // isSystem() diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 8151ceb26407..12d707b7b7b2 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -1891,6 +1891,7 @@ <enum name="KEYCODE_SYSTEM_NAVIGATION_DOWN" value="281" /> <enum name="KEYCODE_SYSTEM_NAVIGATION_LEFT" value="282" /> <enum name="KEYCODE_SYSTEM_NAVIGATION_RIGHT" value="283" /> + <enum name="KEYCODE_ALL_APPS" value="284" /> </attr> <!-- ***************************************************************** --> diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index dad312505ec9..85fa7a1b4c3e 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -13231,7 +13231,6 @@ public class ActivityManagerService extends IActivityManager.Stub return; } } - // We are now ready to launch the assist activity. IResultReceiver sendReceiver = null; Bundle sendBundle = null; @@ -13261,17 +13260,24 @@ public class ActivityManagerService extends IActivityManager.Stub return; } - long ident = Binder.clearCallingIdentity(); + final long ident = Binder.clearCallingIdentity(); try { - pae.intent.replaceExtras(pae.extras); - pae.intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK - | Intent.FLAG_ACTIVITY_SINGLE_TOP - | Intent.FLAG_ACTIVITY_CLEAR_TOP); - closeSystemDialogs("assist"); - try { - mContext.startActivityAsUser(pae.intent, new UserHandle(pae.userHandle)); - } catch (ActivityNotFoundException e) { - Slog.w(TAG, "No activity to handle assist action.", e); + if (TextUtils.equals(pae.intent.getAction(), + android.service.voice.VoiceInteractionService.SERVICE_INTERFACE)) { + pae.intent.putExtras(pae.extras); + mContext.startServiceAsUser(pae.intent, new UserHandle(pae.userHandle)); + } else { + pae.intent.replaceExtras(pae.extras); + pae.intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK + | Intent.FLAG_ACTIVITY_SINGLE_TOP + | Intent.FLAG_ACTIVITY_CLEAR_TOP); + closeSystemDialogs("assist"); + + try { + mContext.startActivityAsUser(pae.intent, new UserHandle(pae.userHandle)); + } catch (ActivityNotFoundException e) { + Slog.w(TAG, "No activity to handle assist action.", e); + } } } finally { Binder.restoreCallingIdentity(ident); diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 27159fabf6c5..0610b77c08f9 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -829,6 +829,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { private static final int MSG_ACCESSIBILITY_TV = 23; private static final int MSG_DISPATCH_BACK_KEY_TO_AUTOFILL = 24; private static final int MSG_SYSTEM_KEY_PRESS = 25; + private static final int MSG_HANDLE_ALL_APPS = 26; private static final int MSG_REQUEST_TRANSIENT_BARS_ARG_STATUS = 0; private static final int MSG_REQUEST_TRANSIENT_BARS_ARG_NAVIGATION = 1; @@ -921,6 +922,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { case MSG_SYSTEM_KEY_PRESS: sendSystemKeyToStatusBar(msg.arg1); break; + case MSG_HANDLE_ALL_APPS: + launchAllAppsAction(); + break; } } } @@ -1801,6 +1805,17 @@ public class PhoneWindowManager implements WindowManagerPolicy { private void launchAllAppsAction() { Intent intent = new Intent(Intent.ACTION_ALL_APPS); + if (mHasFeatureLeanback) { + final PackageManager pm = mContext.getPackageManager(); + Intent intentLauncher = new Intent(Intent.ACTION_MAIN); + intentLauncher.addCategory(Intent.CATEGORY_HOME); + ResolveInfo resolveInfo = pm.resolveActivityAsUser(intentLauncher, + PackageManager.MATCH_SYSTEM_ONLY, + mCurrentUserId); + if (resolveInfo != null) { + intent.setPackage(resolveInfo.activityInfo.packageName); + } + } startActivityAsUser(intent, UserHandle.CURRENT); } @@ -3620,6 +3635,14 @@ public class PhoneWindowManager implements WindowManagerPolicy { return -1; } else if (mHasFeatureLeanback && interceptAccessibilityGestureTv(keyCode, down)) { return -1; + } else if (keyCode == KeyEvent.KEYCODE_ALL_APPS) { + if (!down) { + mHandler.removeMessages(MSG_HANDLE_ALL_APPS); + Message msg = mHandler.obtainMessage(MSG_HANDLE_ALL_APPS); + msg.setAsynchronous(true); + msg.sendToTarget(); + } + return -1; } // Toggle Caps Lock on META-ALT. diff --git a/services/core/java/com/android/server/search/SearchManagerService.java b/services/core/java/com/android/server/search/SearchManagerService.java index 896977141702..c3fa82344941 100644 --- a/services/core/java/com/android/server/search/SearchManagerService.java +++ b/services/core/java/com/android/server/search/SearchManagerService.java @@ -17,7 +17,6 @@ package com.android.server.search; import android.app.ActivityManager; -import android.app.AppGlobals; import android.app.IActivityManager; import android.app.ISearchManager; import android.app.SearchManager; @@ -26,7 +25,6 @@ import android.content.ComponentName; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; -import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.database.ContentObserver; @@ -37,6 +35,7 @@ import android.os.RemoteException; import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; +import android.service.voice.VoiceInteractionService; import android.util.Log; import android.util.SparseArray; @@ -272,24 +271,25 @@ public class SearchManagerService extends ISearchManager.Stub { } } + // Check and return VIS component private ComponentName getLegacyAssistComponent(int userHandle) { try { userHandle = ActivityManager.handleIncomingUser(Binder.getCallingPid(), - Binder.getCallingUid(), userHandle, true, false, "getLegacyAssistComponent", null); - IPackageManager pm = AppGlobals.getPackageManager(); - Intent assistIntent = new Intent(Intent.ACTION_ASSIST); - ResolveInfo info = - pm.resolveIntent(assistIntent, - assistIntent.resolveTypeIfNeeded(mContext.getContentResolver()), - PackageManager.MATCH_DEFAULT_ONLY, userHandle); - if (info != null) { + Binder.getCallingUid(), userHandle, true, false, "getLegacyAssistComponent", + null); + PackageManager pm = mContext.getPackageManager(); + Intent intentAssistProbe = new Intent(VoiceInteractionService.SERVICE_INTERFACE); + List<ResolveInfo> infoListVis = pm.queryIntentServicesAsUser(intentAssistProbe, + PackageManager.MATCH_SYSTEM_ONLY, userHandle); + if (infoListVis == null || infoListVis.isEmpty()) { + return null; + } else { + ResolveInfo rInfo = infoListVis.get(0); return new ComponentName( - info.activityInfo.applicationInfo.packageName, - info.activityInfo.name); + rInfo.serviceInfo.applicationInfo.packageName, + rInfo.serviceInfo.name); + } - } catch (RemoteException re) { - // Local call - Log.e(TAG, "RemoteException in getLegacyAssistComponent: " + re); } catch (Exception e) { Log.e(TAG, "Exception in getLegacyAssistComponent: " + e); } @@ -304,9 +304,15 @@ public class SearchManagerService extends ISearchManager.Stub { } long ident = Binder.clearCallingIdentity(); try { - Intent intent = new Intent(Intent.ACTION_ASSIST); + Intent intent = new Intent(VoiceInteractionService.SERVICE_INTERFACE); intent.setComponent(comp); + IActivityManager am = ActivityManager.getService(); + if (args != null) { + args.putInt(Intent.EXTRA_KEY_EVENT, android.view.KeyEvent.KEYCODE_ASSIST); + } + intent.putExtras(args); + return am.launchAssistIntent(intent, ActivityManager.ASSIST_CONTEXT_BASIC, hint, userHandle, args); } catch (RemoteException e) { |