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) {