diff options
author | 2025-01-21 13:08:57 -0800 | |
---|---|---|
committer | 2025-01-21 18:13:36 -0800 | |
commit | 53722cfd1ef6e22a3370e30fb00e703c8ad9b735 (patch) | |
tree | 356cc92840c371273823672bc913b9b1d32d474e /service | |
parent | b2d37acd8c7488f2aec748aff3609b68206eaa7f (diff) |
Exempt AccessibilityTools from restriction, add new strings
AccessibilityTool AccessibilityServices should be exempt from the
in-call fraud restrictions. This CL also adds strings for accessibility
service blocking
Fixes: 391416431
Test: manual
Relnote: 25Q2 release work
Flag: android.permission.flags.enhanced_confirmation_in_call_apis_enabled
LOW_COVERAGE_REASON=b/391416431
Change-Id: I908ff29a5fe3e6ed370a431cebe319e2a6c57e92
Diffstat (limited to 'service')
-rw-r--r-- | service/java/com/android/ecm/EnhancedConfirmationService.java | 47 |
1 files changed, 43 insertions, 4 deletions
diff --git a/service/java/com/android/ecm/EnhancedConfirmationService.java b/service/java/com/android/ecm/EnhancedConfirmationService.java index 46b5eedbc..fc0ed20d0 100644 --- a/service/java/com/android/ecm/EnhancedConfirmationService.java +++ b/service/java/com/android/ecm/EnhancedConfirmationService.java @@ -20,6 +20,7 @@ import static android.app.ecm.EnhancedConfirmationManager.REASON_PACKAGE_RESTRIC import static android.app.ecm.EnhancedConfirmationManager.REASON_PHONE_STATE; import android.Manifest; +import android.accessibilityservice.AccessibilityServiceInfo; import android.annotation.FlaggedApi; import android.annotation.IntDef; import android.annotation.NonNull; @@ -54,10 +55,12 @@ import android.telephony.TelephonyManager; import android.util.ArrayMap; import android.util.ArraySet; import android.util.Log; +import android.view.accessibility.AccessibilityManager; import androidx.annotation.Keep; import androidx.annotation.RequiresApi; +import com.android.internal.annotations.GuardedBy; import com.android.internal.util.Preconditions; import com.android.permission.util.UserUtils; import com.android.server.LocalManagerRegistry; @@ -110,6 +113,10 @@ public class EnhancedConfirmationService extends SystemService { private ContentResolver mContentResolver; private TelephonyManager mTelephonyManager; + @GuardedBy("mUserAccessibilityManagers") + private final Map<Integer, AccessibilityManager> mUserAccessibilityManagers = + new ArrayMap<>(); + @Override public void onStart() { Context context = getContext(); @@ -314,7 +321,8 @@ public class EnhancedConfirmationService extends SystemService { if (isSettingEcmGuardedForPackage(settingIdentifier, packageName, userId)) { return REASON_PACKAGE_RESTRICTED; } - String globalProtectionReason = getGlobalProtectionReason(settingIdentifier); + String globalProtectionReason = + getGlobalProtectionReason(settingIdentifier, packageName, userId); if (globalProtectionReason != null) { return globalProtectionReason; } @@ -538,15 +546,46 @@ public class EnhancedConfirmationService extends SystemService { return false; } - private String getGlobalProtectionReason(@NonNull String settingIdentifier) { + private String getGlobalProtectionReason(@NonNull String settingIdentifier, + @NonNull String packageName, @UserIdInt int userId) { if (UNTRUSTED_CALL_RESTRICTED_SETTINGS.contains(settingIdentifier) && isUntrustedCallOngoing()) { - return REASON_PHONE_STATE; + if (!AppOpsManager.OPSTR_BIND_ACCESSIBILITY_SERVICE.equals(settingIdentifier)) { + return REASON_PHONE_STATE; + } + if (!isAccessibilityTool(packageName, userId)) { + return REASON_PHONE_STATE; + } + return null; } - return null; } + private boolean isAccessibilityTool(@NonNull String packageName, @UserIdInt int userId) { + AccessibilityManager am; + synchronized (mUserAccessibilityManagers) { + if (!mUserAccessibilityManagers.containsKey(userId)) { + Context userContext = + getContext().createContextAsUser(UserHandle.of(userId), 0); + mUserAccessibilityManagers.put(userId, userContext.getSystemService( + AccessibilityManager.class)); + } + am = mUserAccessibilityManagers.get(userId); + } + List<AccessibilityServiceInfo> infos = am.getInstalledAccessibilityServiceList(); + for (int i = 0; i < infos.size(); i++) { + AccessibilityServiceInfo info = infos.get(i); + String servicePackageName = null; + if (info.getResolveInfo() != null && info.getResolveInfo().serviceInfo != null) { + servicePackageName = info.getResolveInfo().serviceInfo.packageName; + } + if (packageName.equals(servicePackageName)) { + return info.isAccessibilityTool(); + } + } + return false; + } + @Nullable private ApplicationInfo getApplicationInfoAsUser(@Nullable String packageName, @UserIdInt int userId) { |