Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a223ca4c authored by Ayush Sharma's avatar Ayush Sharma
Browse files

Use personal dialer for emergency call

Bug: 269593294
Test: atest TelecomUnitTests
Manual(
1. Placed a call to an emergency number with work profile paused
2. Personal profile dialer's InCall ui is launched.)

Change-Id: I81fc3493540d41696fce5210e4a7fcfd2755f443
parent 08f46018
Loading
Loading
Loading
Loading
+12 −3
Original line number Diff line number Diff line
@@ -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;
        }
    }
}
+66 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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();
@@ -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;
@@ -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);
@@ -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);
@@ -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
@@ -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);