Loading src/com/android/server/telecom/InCallController.java +12 −3 Original line number Diff line number Diff line Loading @@ -2600,8 +2600,17 @@ public class InCallController extends CallsManagerListenerBase implements private UserHandle getUserFromCall(Call call) { // Call may never be specified, so we can fall back to using the CallManager current user. return call == null ? mCallsManager.getCurrentUserHandle() : call.getUserHandleFromTargetPhoneAccount(); if (call == null) { return mCallsManager.getCurrentUserHandle(); } else { UserHandle userFromCall = call.getUserHandleFromTargetPhoneAccount(); UserManager userManager = mContext.getSystemService(UserManager.class); // Emergency call should never be blocked, so if the user associated with call is in // quite mode, use the primary user for the emergency call. if (call.isEmergencyCall() && userManager.isQuietModeEnabled(userFromCall)) { return mCallsManager.getCurrentUserHandle(); } return userFromCall; } } } tests/src/com/android/server/telecom/tests/InCallControllerTests.java +66 −0 Original line number Diff line number Diff line Loading @@ -74,6 +74,7 @@ import android.os.IBinder; import android.os.Looper; import android.os.Process; import android.os.UserHandle; import android.os.UserManager; import android.permission.PermissionCheckerManager; import android.telecom.CallAudioState; import android.telecom.InCallService; Loading Loading @@ -150,6 +151,7 @@ public class InCallControllerTests extends TelecomTestCase { @Mock PermissionInfo mMockPermissionInfo; @Mock InCallController.InCallServiceInfo mInCallServiceInfo; @Mock private AnomalyReporterAdapter mAnomalyReporterAdapter; @Mock UserManager mMockUserManager; @Rule public TestRule compatChangeRule = new PlatformCompatChangeRule(); Loading Loading @@ -180,6 +182,7 @@ public class InCallControllerTests extends TelecomTestCase { private static final PhoneAccountHandle PA_HANDLE = new PhoneAccountHandle(new ComponentName("pa_pkg", "pa_cls"), "pa_id_0", UserHandle.of(CURRENT_USER_ID)); private static final UserHandle DUMMY_USER_HANDLE = UserHandle.of(10); private UserHandle mUserHandle = UserHandle.of(CURRENT_USER_ID); private InCallController mInCallController; Loading Loading @@ -462,6 +465,9 @@ public class InCallControllerTests extends TelecomTestCase { when(mMockContext.getPackageManager()).thenReturn(mMockPackageManager); when(mMockCallsManager.isInEmergencyCall()).thenReturn(false); when(mMockCall.isEmergencyCall()).thenReturn(true); when(mMockContext.getSystemService(eq(UserManager.class))) .thenReturn(mMockUserManager); when(mMockUserManager.isQuietModeEnabled(any(UserHandle.class))).thenReturn(false); when(mMockCall.isIncoming()).thenReturn(false); when(mMockCall.getTargetPhoneAccount()).thenReturn(PA_HANDLE); when(mMockCall.getIntentExtras()).thenReturn(callExtras); Loading Loading @@ -539,6 +545,9 @@ public class InCallControllerTests extends TelecomTestCase { when(mMockContext.getPackageManager()).thenReturn(mMockPackageManager); when(mMockCallsManager.isInEmergencyCall()).thenReturn(true); when(mMockCall.isEmergencyCall()).thenReturn(true); when(mMockContext.getSystemService(eq(UserManager.class))) .thenReturn(mMockUserManager); when(mMockUserManager.isQuietModeEnabled(any(UserHandle.class))).thenReturn(false); when(mMockCall.isIncoming()).thenReturn(false); when(mMockCall.getTargetPhoneAccount()).thenReturn(PA_HANDLE); when(mMockCall.getIntentExtras()).thenReturn(callExtras); Loading Loading @@ -598,6 +607,60 @@ public class InCallControllerTests extends TelecomTestCase { eq(Manifest.permission.ACCESS_FINE_LOCATION), eq(mUserHandle)); } @MediumTest @Test public void testBindToService_UserAssociatedWithCallIsInQuietMode_EmergCallInCallUi_BindsToPrimaryUser() throws Exception { when(mMockCallsManager.getCurrentUserHandle()).thenReturn(mUserHandle); when(mMockContext.getPackageManager()).thenReturn(mMockPackageManager); when(mMockCall.isEmergencyCall()).thenReturn(true); when(mMockCall.getUserHandleFromTargetPhoneAccount()).thenReturn(DUMMY_USER_HANDLE); when(mMockContext.getSystemService(eq(UserManager.class))) .thenReturn(mMockUserManager); when(mMockUserManager.isQuietModeEnabled(any(UserHandle.class))).thenReturn(true); setupMockPackageManager(true /* default */, true /* system */, false /* external calls */); setupMockPackageManagerLocationPermission(SYS_PKG, false /* granted */); mInCallController.bindToServices(mMockCall); ArgumentCaptor<Intent> bindIntentCaptor = ArgumentCaptor.forClass(Intent.class); verify(mMockContext, times(1)).bindServiceAsUser( bindIntentCaptor.capture(), any(ServiceConnection.class), eq(serviceBindingFlags), eq(mUserHandle)); Intent bindIntent = bindIntentCaptor.getValue(); assertEquals(InCallService.SERVICE_INTERFACE, bindIntent.getAction()); } @MediumTest @Test public void testBindToService_UserAssociatedWithCallNotInQuietMode_EmergCallInCallUi_BindsToAssociatedUser() throws Exception { when(mMockCallsManager.getCurrentUserHandle()).thenReturn(mUserHandle); when(mMockContext.getPackageManager()).thenReturn(mMockPackageManager); when(mMockCall.isEmergencyCall()).thenReturn(true); when(mMockCall.getUserHandleFromTargetPhoneAccount()).thenReturn(DUMMY_USER_HANDLE); when(mMockContext.getSystemService(eq(UserManager.class))) .thenReturn(mMockUserManager); when(mMockUserManager.isQuietModeEnabled(any(UserHandle.class))).thenReturn(false); setupMockPackageManager(true /* default */, true /* system */, false /* external calls */); setupMockPackageManagerLocationPermission(SYS_PKG, false /* granted */); mInCallController.bindToServices(mMockCall); ArgumentCaptor<Intent> bindIntentCaptor = ArgumentCaptor.forClass(Intent.class); verify(mMockContext, times(1)).bindServiceAsUser( bindIntentCaptor.capture(), any(ServiceConnection.class), eq(serviceBindingFlags), eq(DUMMY_USER_HANDLE)); Intent bindIntent = bindIntentCaptor.getValue(); assertEquals(InCallService.SERVICE_INTERFACE, bindIntent.getAction()); } /** * This test verifies the behavior of Telecom when the system dialer crashes on binding and must * be restarted. Specifically, it ensures when the system dialer crashes we revoke the runtime Loading @@ -614,6 +677,9 @@ public class InCallControllerTests extends TelecomTestCase { when(mMockContext.getPackageManager()).thenReturn(mMockPackageManager); when(mMockCallsManager.isInEmergencyCall()).thenReturn(true); when(mMockCall.isEmergencyCall()).thenReturn(true); when(mMockContext.getSystemService(eq(UserManager.class))) .thenReturn(mMockUserManager); when(mMockUserManager.isQuietModeEnabled(any(UserHandle.class))).thenReturn(false); when(mMockCall.isIncoming()).thenReturn(false); when(mMockCall.getTargetPhoneAccount()).thenReturn(PA_HANDLE); when(mMockCall.getIntentExtras()).thenReturn(callExtras); Loading Loading
src/com/android/server/telecom/InCallController.java +12 −3 Original line number Diff line number Diff line Loading @@ -2600,8 +2600,17 @@ public class InCallController extends CallsManagerListenerBase implements private UserHandle getUserFromCall(Call call) { // Call may never be specified, so we can fall back to using the CallManager current user. return call == null ? mCallsManager.getCurrentUserHandle() : call.getUserHandleFromTargetPhoneAccount(); if (call == null) { return mCallsManager.getCurrentUserHandle(); } else { UserHandle userFromCall = call.getUserHandleFromTargetPhoneAccount(); UserManager userManager = mContext.getSystemService(UserManager.class); // Emergency call should never be blocked, so if the user associated with call is in // quite mode, use the primary user for the emergency call. if (call.isEmergencyCall() && userManager.isQuietModeEnabled(userFromCall)) { return mCallsManager.getCurrentUserHandle(); } return userFromCall; } } }
tests/src/com/android/server/telecom/tests/InCallControllerTests.java +66 −0 Original line number Diff line number Diff line Loading @@ -74,6 +74,7 @@ import android.os.IBinder; import android.os.Looper; import android.os.Process; import android.os.UserHandle; import android.os.UserManager; import android.permission.PermissionCheckerManager; import android.telecom.CallAudioState; import android.telecom.InCallService; Loading Loading @@ -150,6 +151,7 @@ public class InCallControllerTests extends TelecomTestCase { @Mock PermissionInfo mMockPermissionInfo; @Mock InCallController.InCallServiceInfo mInCallServiceInfo; @Mock private AnomalyReporterAdapter mAnomalyReporterAdapter; @Mock UserManager mMockUserManager; @Rule public TestRule compatChangeRule = new PlatformCompatChangeRule(); Loading Loading @@ -180,6 +182,7 @@ public class InCallControllerTests extends TelecomTestCase { private static final PhoneAccountHandle PA_HANDLE = new PhoneAccountHandle(new ComponentName("pa_pkg", "pa_cls"), "pa_id_0", UserHandle.of(CURRENT_USER_ID)); private static final UserHandle DUMMY_USER_HANDLE = UserHandle.of(10); private UserHandle mUserHandle = UserHandle.of(CURRENT_USER_ID); private InCallController mInCallController; Loading Loading @@ -462,6 +465,9 @@ public class InCallControllerTests extends TelecomTestCase { when(mMockContext.getPackageManager()).thenReturn(mMockPackageManager); when(mMockCallsManager.isInEmergencyCall()).thenReturn(false); when(mMockCall.isEmergencyCall()).thenReturn(true); when(mMockContext.getSystemService(eq(UserManager.class))) .thenReturn(mMockUserManager); when(mMockUserManager.isQuietModeEnabled(any(UserHandle.class))).thenReturn(false); when(mMockCall.isIncoming()).thenReturn(false); when(mMockCall.getTargetPhoneAccount()).thenReturn(PA_HANDLE); when(mMockCall.getIntentExtras()).thenReturn(callExtras); Loading Loading @@ -539,6 +545,9 @@ public class InCallControllerTests extends TelecomTestCase { when(mMockContext.getPackageManager()).thenReturn(mMockPackageManager); when(mMockCallsManager.isInEmergencyCall()).thenReturn(true); when(mMockCall.isEmergencyCall()).thenReturn(true); when(mMockContext.getSystemService(eq(UserManager.class))) .thenReturn(mMockUserManager); when(mMockUserManager.isQuietModeEnabled(any(UserHandle.class))).thenReturn(false); when(mMockCall.isIncoming()).thenReturn(false); when(mMockCall.getTargetPhoneAccount()).thenReturn(PA_HANDLE); when(mMockCall.getIntentExtras()).thenReturn(callExtras); Loading Loading @@ -598,6 +607,60 @@ public class InCallControllerTests extends TelecomTestCase { eq(Manifest.permission.ACCESS_FINE_LOCATION), eq(mUserHandle)); } @MediumTest @Test public void testBindToService_UserAssociatedWithCallIsInQuietMode_EmergCallInCallUi_BindsToPrimaryUser() throws Exception { when(mMockCallsManager.getCurrentUserHandle()).thenReturn(mUserHandle); when(mMockContext.getPackageManager()).thenReturn(mMockPackageManager); when(mMockCall.isEmergencyCall()).thenReturn(true); when(mMockCall.getUserHandleFromTargetPhoneAccount()).thenReturn(DUMMY_USER_HANDLE); when(mMockContext.getSystemService(eq(UserManager.class))) .thenReturn(mMockUserManager); when(mMockUserManager.isQuietModeEnabled(any(UserHandle.class))).thenReturn(true); setupMockPackageManager(true /* default */, true /* system */, false /* external calls */); setupMockPackageManagerLocationPermission(SYS_PKG, false /* granted */); mInCallController.bindToServices(mMockCall); ArgumentCaptor<Intent> bindIntentCaptor = ArgumentCaptor.forClass(Intent.class); verify(mMockContext, times(1)).bindServiceAsUser( bindIntentCaptor.capture(), any(ServiceConnection.class), eq(serviceBindingFlags), eq(mUserHandle)); Intent bindIntent = bindIntentCaptor.getValue(); assertEquals(InCallService.SERVICE_INTERFACE, bindIntent.getAction()); } @MediumTest @Test public void testBindToService_UserAssociatedWithCallNotInQuietMode_EmergCallInCallUi_BindsToAssociatedUser() throws Exception { when(mMockCallsManager.getCurrentUserHandle()).thenReturn(mUserHandle); when(mMockContext.getPackageManager()).thenReturn(mMockPackageManager); when(mMockCall.isEmergencyCall()).thenReturn(true); when(mMockCall.getUserHandleFromTargetPhoneAccount()).thenReturn(DUMMY_USER_HANDLE); when(mMockContext.getSystemService(eq(UserManager.class))) .thenReturn(mMockUserManager); when(mMockUserManager.isQuietModeEnabled(any(UserHandle.class))).thenReturn(false); setupMockPackageManager(true /* default */, true /* system */, false /* external calls */); setupMockPackageManagerLocationPermission(SYS_PKG, false /* granted */); mInCallController.bindToServices(mMockCall); ArgumentCaptor<Intent> bindIntentCaptor = ArgumentCaptor.forClass(Intent.class); verify(mMockContext, times(1)).bindServiceAsUser( bindIntentCaptor.capture(), any(ServiceConnection.class), eq(serviceBindingFlags), eq(DUMMY_USER_HANDLE)); Intent bindIntent = bindIntentCaptor.getValue(); assertEquals(InCallService.SERVICE_INTERFACE, bindIntent.getAction()); } /** * This test verifies the behavior of Telecom when the system dialer crashes on binding and must * be restarted. Specifically, it ensures when the system dialer crashes we revoke the runtime Loading @@ -614,6 +677,9 @@ public class InCallControllerTests extends TelecomTestCase { when(mMockContext.getPackageManager()).thenReturn(mMockPackageManager); when(mMockCallsManager.isInEmergencyCall()).thenReturn(true); when(mMockCall.isEmergencyCall()).thenReturn(true); when(mMockContext.getSystemService(eq(UserManager.class))) .thenReturn(mMockUserManager); when(mMockUserManager.isQuietModeEnabled(any(UserHandle.class))).thenReturn(false); when(mMockCall.isIncoming()).thenReturn(false); when(mMockCall.getTargetPhoneAccount()).thenReturn(PA_HANDLE); when(mMockCall.getIntentExtras()).thenReturn(callExtras); Loading