diff options
author | 2024-02-14 12:39:01 -0800 | |
---|---|---|
committer | 2024-02-14 12:46:19 -0800 | |
commit | 4d509e0a502eb1f47e9968a1d7368d9000619080 (patch) | |
tree | ea781e301f1a8103c9a191758a17a98ed712a845 | |
parent | 6041a5076576619e4d000be90fbde90be8064c5a (diff) |
Separate TelecomManager#isInSelfManagedCall APIs
Instead of consolidating the TelecomManager#isInSelfManagedCall APIs
which combine the cross user logic with the ability to also specifiy a
user handle, create two separate APIs to handle this. One will allow the
caller to specify a user handle while the other will allow them to
specify if calls should be verified across all users.
Ensure that if the user handle specified isn't the caller or that
interacting across users is defined in the parameter, that the
permission check is enforced properly. Otherwise, ensure that the user
handle being verified is always the caller.
Bug: 323958718
Bug: 311773409
Test: atest SelfManagedConnectionServiceTest
Change-Id: Ie7096c0a876cca2cf8e1e70cd3ae102127f60197
4 files changed, 43 insertions, 11 deletions
diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 7d10cab7994f..8d12c77634b0 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -13977,7 +13977,8 @@ package android.telecom { method @Deprecated public java.util.List<android.telecom.PhoneAccountHandle> getPhoneAccountsForPackage(); method @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public java.util.List<android.telecom.PhoneAccountHandle> getPhoneAccountsSupportingScheme(String); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean isInEmergencyCall(); - method @FlaggedApi("com.android.server.telecom.flags.telecom_resolve_hidden_dependencies") @RequiresPermission(allOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.INTERACT_ACROSS_USERS}, conditional=true) public boolean isInSelfManagedCall(@NonNull String, @NonNull android.os.UserHandle, boolean); + method @FlaggedApi("com.android.server.telecom.flags.telecom_resolve_hidden_dependencies") @RequiresPermission(allOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.INTERACT_ACROSS_USERS}, conditional=true) public boolean isInSelfManagedCall(@NonNull String, @NonNull android.os.UserHandle); + method @FlaggedApi("com.android.server.telecom.flags.telecom_resolve_hidden_dependencies") @RequiresPermission(allOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.INTERACT_ACROSS_USERS}, conditional=true) public boolean isInSelfManagedCall(@NonNull String, boolean); method @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public boolean isRinging(); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setUserSelectedOutgoingPhoneAccount(@Nullable android.telecom.PhoneAccountHandle); field public static final String ACTION_CURRENT_TTY_MODE_CHANGED = "android.telecom.action.CURRENT_TTY_MODE_CHANGED"; diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index ea4e67a17e50..219184ce79f9 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -8155,7 +8155,7 @@ public class NotificationManagerService extends SystemService { try { return mTelecomManager.isInManagedCall() || mTelecomManager.isInSelfManagedCall(pkg, - UserHandle.getUserHandleForUid(uid), /* hasCrossUserAccess */ true); + /* hasCrossUserAccess */ true); } catch (IllegalStateException ise) { // Telecom is not ready (this is likely early boot), so there are no calls. return false; diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java index 6aacfd706adc..ea27e2be8922 100755 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -11941,7 +11941,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { // style + self managed call - bypasses block when(mTelecomManager.isInSelfManagedCall( - r.getSbn().getPackageName(), r.getUser(), true)).thenReturn(true); + r.getSbn().getPackageName(), true)).thenReturn(true); assertThat(mService.checkDisqualifyingFeatures(r.getUserId(), r.getUid(), r.getSbn().getId(), r.getSbn().getTag(), r, false, false)).isTrue(); @@ -12024,7 +12024,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { // style + self managed call - bypasses block mService.clearNotifications(); reset(mUsageStats); - when(mTelecomManager.isInSelfManagedCall(r.getSbn().getPackageName(), r.getUser(), true)) + when(mTelecomManager.isInSelfManagedCall(r.getSbn().getPackageName(), true)) .thenReturn(true); mService.addEnqueuedNotification(r); diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java index 15a978d167e1..c1ef9cf94ee2 100644 --- a/telecomm/java/android/telecom/TelecomManager.java +++ b/telecomm/java/android/telecom/TelecomManager.java @@ -2772,13 +2772,10 @@ public class TelecomManager { * calls for a given {@code packageName} and {@code userHandle}. * * @param packageName the package name of the app to check calls for. - * @param userHandle the user handle on which to check for calls. - * @param detectForAllUsers indicates if calls should be detected across all users. If it is - * set to {@code true}, and the caller has the ability to interact - * across users, the userHandle parameter is disregarded. + * @param userHandle the user handle to check calls for. * @return {@code true} if there are ongoing calls, {@code false} otherwise. - * @throws SecurityException if detectForAllUsers is true or userHandle is not the calling user - * and the caller does not grant the ability to interact across users. + * @throws SecurityException if the userHandle is not the calling user and the caller does not + * grant the ability to interact across users. * @hide */ @SystemApi @@ -2786,11 +2783,45 @@ public class TelecomManager { @RequiresPermission(allOf = {Manifest.permission.READ_PRIVILEGED_PHONE_STATE, Manifest.permission.INTERACT_ACROSS_USERS}, conditional = true) public boolean isInSelfManagedCall(@NonNull String packageName, - @NonNull UserHandle userHandle, boolean detectForAllUsers) { + @NonNull UserHandle userHandle) { ITelecomService service = getTelecomService(); if (service != null) { try { return service.isInSelfManagedCall(packageName, userHandle, + mContext.getOpPackageName(), false); + } catch (RemoteException e) { + Log.e(TAG, "RemoteException isInSelfManagedCall: " + e); + e.rethrowFromSystemServer(); + return false; + } + } else { + throw new IllegalStateException("Telecom service is not present"); + } + } + + /** + * Determines whether there are any ongoing {@link PhoneAccount#CAPABILITY_SELF_MANAGED} + * calls for a given {@code packageName} amongst all users, given that detectForAllUsers is true + * and the caller has the ability to interact across users. If detectForAllUsers isn't enabled, + * the calls will be checked against the caller. + * + * @param packageName the package name of the app to check calls for. + * @param detectForAllUsers indicates if calls should be detected across all users. + * @return {@code true} if there are ongoing calls, {@code false} otherwise. + * @throws SecurityException if detectForAllUsers is true and the caller does not grant the + * ability to interact across users. + * @hide + */ + @SystemApi + @FlaggedApi(Flags.FLAG_TELECOM_RESOLVE_HIDDEN_DEPENDENCIES) + @RequiresPermission(allOf = {Manifest.permission.READ_PRIVILEGED_PHONE_STATE, + Manifest.permission.INTERACT_ACROSS_USERS}, conditional = true) + public boolean isInSelfManagedCall(@NonNull String packageName, + boolean detectForAllUsers) { + ITelecomService service = getTelecomService(); + if (service != null) { + try { + return service.isInSelfManagedCall(packageName, null, mContext.getOpPackageName(), detectForAllUsers); } catch (RemoteException e) { Log.e(TAG, "RemoteException isInSelfManagedCall: " + e); |