Merge "Validate the VoiceInteractionService before rebind" into main
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
index 1d01420..a7dbecb 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
@@ -794,9 +794,8 @@
                 if (curService != null && !curService.isEmpty()) {
                     try {
                         serviceComponent = ComponentName.unflattenFromString(curService);
-                        serviceInfo = AppGlobals.getPackageManager()
-                                .getServiceInfo(serviceComponent, 0, mCurUser);
-                    } catch (RuntimeException | RemoteException e) {
+                        serviceInfo = getValidVoiceInteractionServiceInfo(serviceComponent);
+                    } catch (RuntimeException e) {
                         Slog.wtf(TAG, "Bad voice interaction service name " + curService, e);
                         serviceComponent = null;
                         serviceInfo = null;
@@ -834,6 +833,27 @@
             }
         }
 
+        @Nullable
+        private ServiceInfo getValidVoiceInteractionServiceInfo(
+                @Nullable ComponentName serviceComponent) {
+            if (serviceComponent == null) {
+                return null;
+            }
+            List<ResolveInfo> services = queryInteractorServices(
+                    mCurUser, serviceComponent.getPackageName());
+            for (int i = 0; i < services.size(); i++) {
+                ResolveInfo service = services.get(i);
+                VoiceInteractionServiceInfo info = new VoiceInteractionServiceInfo(
+                        mContext.getPackageManager(), service.serviceInfo);
+                ServiceInfo candidateInfo = info.getServiceInfo();
+                if (candidateInfo != null
+                        && candidateInfo.getComponentName().equals(serviceComponent)) {
+                    return candidateInfo;
+                }
+            }
+            return null;
+        }
+
         private List<ResolveInfo> queryInteractorServices(
                 @UserIdInt int user,
                 @Nullable String packageName) {