From c34796508035266fd5991490bb3a2301be6d0b5f Mon Sep 17 00:00:00 2001 From: Yasin Kilicdere Date: Mon, 5 Dec 2022 16:26:43 +0000 Subject: [PATCH] Use TelecomManager.isInCall instead of TelephonyManager.getCallState UserManager.canSwitchUsers and UserManager.getUserSwitchability were using the deprecated method TelephonyManager.getCallState and comparing the result with TelephonyManager.CALL_STATE_IDLE to findout whether there is an ongoing telephone call. This CL changes those methods to use a helper method, which calls TelecomManager.isInCall instead of the deprecated one. Also UserInteractor.canSwitchUsers was sometimes failing with a SecurityException during a user switch and crashing the systemui process, causing it to restart after the user switch. This change also saves the user switch flow from the underlying problem. Bug: 257538981 Test: atest UserManagerTest Change-Id: I378527db7decc170d385f0f1d89235b6f02649e6 --- core/java/android/os/UserManager.java | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index dd02e022c6393..07c4b441655ee 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -59,7 +59,7 @@ import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.location.LocationManager; import android.provider.Settings; -import android.telephony.TelephonyManager; +import android.telecom.TelecomManager; import android.util.AndroidException; import android.util.ArraySet; import android.util.Log; @@ -2139,13 +2139,8 @@ public class UserManager { mContext.getContentResolver(), Settings.Global.ALLOW_USER_SWITCHING_WHEN_SYSTEM_USER_LOCKED, 0) != 0; boolean isSystemUserUnlocked = isUserUnlocked(UserHandle.SYSTEM); - boolean inCall = false; - TelephonyManager telephonyManager = mContext.getSystemService(TelephonyManager.class); - if (telephonyManager != null) { - inCall = telephonyManager.getCallState() != TelephonyManager.CALL_STATE_IDLE; - } boolean isUserSwitchDisallowed = hasUserRestrictionForUser(DISALLOW_USER_SWITCH, mUserId); - return (allowUserSwitchingWhenSystemUserLocked || isSystemUserUnlocked) && !inCall + return (allowUserSwitchingWhenSystemUserLocked || isSystemUserUnlocked) && !inCall() && !isUserSwitchDisallowed; } @@ -2184,11 +2179,8 @@ public class UserManager { android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.INTERACT_ACROSS_USERS}, conditional = true) public @UserSwitchabilityResult int getUserSwitchability(UserHandle userHandle) { - final TelephonyManager tm = - (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE); - int flags = SWITCHABILITY_STATUS_OK; - if (tm.getCallState() != TelephonyManager.CALL_STATE_IDLE) { + if (inCall()) { flags |= SWITCHABILITY_STATUS_USER_IN_CALL; } if (hasUserRestrictionForUser(DISALLOW_USER_SWITCH, userHandle)) { @@ -5622,6 +5614,11 @@ public class UserManager { } } + private boolean inCall() { + final TelecomManager telecomManager = mContext.getSystemService(TelecomManager.class); + return telecomManager != null && telecomManager.isInCall(); + } + /* Cache key for anything that assumes that userIds cannot be re-used without rebooting. */ private static final String CACHE_KEY_STATIC_USER_PROPERTIES = "cache_key.static_user_props";