Allow only preloaded voice recognition services to blame calling apps.

Bug: 170795434
Test: manual
Merged-In: Ided2b19661d937ff0b4ec881f2e629afe47435e5
Change-Id: I92a146e5763afd07a44f8e9c7a3c71a27d1f16bd
This commit is contained in:
Ahaan Ugale
2020-11-20 12:25:27 -08:00
parent 35c4f102e4
commit 19e29925ee

View File

@@ -34,6 +34,7 @@ import android.compat.annotation.UnsupportedAppUsage;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.ParceledListSlice; import android.content.pm.ParceledListSlice;
import android.database.DatabaseUtils; import android.database.DatabaseUtils;
@@ -7649,23 +7650,28 @@ public class AppOpsManager {
} }
final String voiceRecognitionComponent = Settings.Secure.getString( final String voiceRecognitionComponent = Settings.Secure.getString(
context.getContentResolver(), Settings.Secure.VOICE_RECOGNITION_SERVICE); context.getContentResolver(), Settings.Secure.VOICE_RECOGNITION_SERVICE);
final String voiceInteractionComponent = Settings.Secure.getString(
context.getContentResolver(), Settings.Secure.VOICE_INTERACTION_SERVICE);
final String voiceRecognitionServicePackageName = final String voiceRecognitionServicePackageName =
getComponentPackagenameFromString(voiceRecognitionComponent); getComponentPackageNameFromString(voiceRecognitionComponent);
final String voiceInteractionServicePackageName = return (Objects.equals(packageName, voiceRecognitionServicePackageName))
getComponentPackagenameFromString(voiceInteractionComponent); && isPackagePreInstalled(context, packageName);
return Objects.equals(packageName, voiceRecognitionServicePackageName) && Objects.equals(
voiceRecognitionServicePackageName, voiceInteractionServicePackageName);
} }
private static String getComponentPackagenameFromString(String from) { private static String getComponentPackageNameFromString(String from) {
ComponentName componentName = from != null ? ComponentName.unflattenFromString(from) : null; ComponentName componentName = from != null ? ComponentName.unflattenFromString(from) : null;
return componentName != null ? componentName.getPackageName() : ""; return componentName != null ? componentName.getPackageName() : "";
} }
private static boolean isPackagePreInstalled(Context context, String packageName) {
try {
final PackageManager pm = context.getPackageManager();
final ApplicationInfo info = pm.getApplicationInfo(packageName, 0);
return ((info.flags & ApplicationInfo.FLAG_SYSTEM) != 0);
} catch (PackageManager.NameNotFoundException e) {
return false;
}
}
/** /**
* Do a quick check for whether an application might be able to perform an operation. * Do a quick check for whether an application might be able to perform an operation.
* This is <em>not</em> a security check; you must use {@link #noteOp(String, int, String, * This is <em>not</em> a security check; you must use {@link #noteOp(String, int, String,