Fix assist for hardware long-press
Activating the assistant will now route through SysUI, so
we have the logic whether to start an activity or to start a voice
interaction session in one single place.
Bug: 22201770
Change-Id: I0f4699533aea2a1e595ee25a844434c82f548c01
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 3393d7d..87efb8d 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -3048,14 +3048,6 @@
}
}
- private void launchAssistAction() {
- launchAssistAction(null, Integer.MIN_VALUE);
- }
-
- private void launchAssistAction(String hint) {
- launchAssistAction(hint, Integer.MIN_VALUE);
- }
-
private void launchAssistAction(String hint, int deviceId) {
sendCloseSystemWindows(SYSTEM_DIALOG_REASON_ASSIST);
Bundle args = null;
@@ -3063,8 +3055,29 @@
args = new Bundle();
args.putInt(Intent.EXTRA_ASSIST_INPUT_DEVICE_ID, deviceId);
}
- ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
- .launchAssistAction(hint, UserHandle.myUserId(), args);
+ if ((mContext.getResources().getConfiguration().uiMode
+ & Configuration.UI_MODE_TYPE_MASK) == Configuration.UI_MODE_TYPE_TELEVISION) {
+ // On TV, use legacy handling until assistants are implemented in the proper way.
+ ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
+ .launchLegacyAssist(hint, UserHandle.myUserId(), args);
+ } else {
+ try {
+ if (hint != null) {
+ if (args == null) {
+ args = new Bundle();
+ }
+ args.putBoolean(hint, true);
+ }
+ IStatusBarService statusbar = getStatusBarService();
+ if (statusbar != null) {
+ statusbar.startAssist(args);
+ }
+ } catch (RemoteException e) {
+ Slog.e(TAG, "RemoteException when starting assist", e);
+ // re-acquire status bar service next time it is needed.
+ mStatusBarService = null;
+ }
+ }
}
private void startActivityAsUser(Intent intent, UserHandle handle) {
diff --git a/services/core/java/com/android/server/search/SearchManagerService.java b/services/core/java/com/android/server/search/SearchManagerService.java
index dd2286f..04b2f60 100644
--- a/services/core/java/com/android/server/search/SearchManagerService.java
+++ b/services/core/java/com/android/server/search/SearchManagerService.java
@@ -45,6 +45,8 @@
import com.android.internal.content.PackageMonitor;
import com.android.internal.util.IndentingPrintWriter;
+import com.android.server.LocalServices;
+import com.android.server.statusbar.StatusBarManagerInternal;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -240,16 +242,24 @@
}
@Override
- public ComponentName getAssistIntent(int userHandle) {
+ public void launchAssist(Bundle args) {
+ StatusBarManagerInternal statusBarManager =
+ LocalServices.getService(StatusBarManagerInternal.class);
+ if (statusBarManager != null) {
+ statusBarManager.startAssist(args);
+ }
+ }
+
+ private ComponentName getLegacyAssistComponent(int userHandle) {
try {
userHandle = ActivityManager.handleIncomingUser(Binder.getCallingPid(),
- Binder.getCallingUid(), userHandle, true, false, "getAssistIntent", null);
+ 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);
+ assistIntent.resolveTypeIfNeeded(mContext.getContentResolver()),
+ PackageManager.MATCH_DEFAULT_ONLY, userHandle);
if (info != null) {
return new ComponentName(
info.activityInfo.applicationInfo.packageName,
@@ -257,16 +267,16 @@
}
} catch (RemoteException re) {
// Local call
- Log.e(TAG, "RemoteException in getAssistIntent: " + re);
+ Log.e(TAG, "RemoteException in getLegacyAssistComponent: " + re);
} catch (Exception e) {
- Log.e(TAG, "Exception in getAssistIntent: " + e);
+ Log.e(TAG, "Exception in getLegacyAssistComponent: " + e);
}
return null;
}
@Override
- public boolean launchAssistAction(String hint, int userHandle, Bundle args) {
- ComponentName comp = getAssistIntent(userHandle);
+ public boolean launchLegacyAssist(String hint, int userHandle, Bundle args) {
+ ComponentName comp = getLegacyAssistComponent(userHandle);
if (comp == null) {
return false;
}
diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java
index 4692403..130815e 100644
--- a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java
@@ -16,6 +16,8 @@
package com.android.server.statusbar;
+import android.os.Bundle;
+
import com.android.server.notification.NotificationDelegate;
public interface StatusBarManagerInternal {
@@ -25,4 +27,5 @@
void notificationLightOff();
void showScreenPinningRequest();
void showAssistDisclosure();
+ void startAssist(Bundle args);
}
diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
index 5ceb6ad..2a817ea 100644
--- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
@@ -18,6 +18,7 @@
import android.app.StatusBarManager;
import android.os.Binder;
+import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.RemoteException;
@@ -165,6 +166,16 @@
}
}
}
+
+ @Override
+ public void startAssist(Bundle args) {
+ if (mBar != null) {
+ try {
+ mBar.startAssist(args);
+ } catch (RemoteException e) {
+ }
+ }
+ }
};
// ================================================================================
@@ -526,6 +537,15 @@
}
}
+ @Override
+ public void startAssist(Bundle args) {
+ if (mBar != null) {
+ try {
+ mBar.startAssist(args);
+ } catch (RemoteException ex) {}
+ }
+ }
+
private void enforceStatusBar() {
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.STATUS_BAR,
"StatusBarManagerService");