1ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu/*
2ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu * Copyright (C) 2015 The Android Open Source Project
3ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu *
4ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu * Licensed under the Apache License, Version 2.0 (the "License");
5ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu * you may not use this file except in compliance with the License.
6ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu * You may obtain a copy of the License at
7ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu *
8ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu *      http://www.apache.org/licenses/LICENSE-2.0
9ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu *
10ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu * Unless required by applicable law or agreed to in writing, software
11ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu * distributed under the License is distributed on an "AS IS" BASIS,
12ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu * See the License for the specific language governing permissions and
14ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu * limitations under the License
15ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu */
16ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
17ecda55454f4993003e71e09a63d20f94a216cc47Hall Liupackage com.android.server.telecom.tests;
18ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
19ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport static android.Manifest.permission.CALL_PHONE;
20ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport static android.Manifest.permission.MODIFY_PHONE_STATE;
21ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport static android.Manifest.permission.READ_PHONE_STATE;
22ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport static android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE;
23ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
247c9283261ad4fdbc5ebbb74257671388f9c758c7Hall Liuimport android.app.ActivityManager;
25ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport android.app.AppOpsManager;
26ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport android.content.ComponentName;
27ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport android.content.Context;
28ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport android.content.Intent;
29ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport android.content.pm.ApplicationInfo;
30ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport android.content.pm.PackageManager;
31ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport android.net.Uri;
32ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport android.os.Binder;
33ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport android.os.Bundle;
34ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport android.os.RemoteException;
35ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport android.os.UserHandle;
36ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport android.os.UserManager;
37ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport android.telecom.PhoneAccount;
38ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport android.telecom.PhoneAccountHandle;
39ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport android.telecom.TelecomManager;
400a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liuimport android.telecom.VideoProfile;
410a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liuimport android.telephony.TelephonyManager;
4284b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liuimport android.test.suitebuilder.annotation.SmallTest;
43ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
44ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport com.android.internal.telecom.ITelecomService;
450a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liuimport com.android.server.telecom.Call;
46ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport com.android.server.telecom.CallIntentProcessor;
470a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liuimport com.android.server.telecom.CallState;
48ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport com.android.server.telecom.CallsManager;
497c9283261ad4fdbc5ebbb74257671388f9c758c7Hall Liuimport com.android.server.telecom.DefaultDialerCache;
50ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport com.android.server.telecom.PhoneAccountRegistrar;
51ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport com.android.server.telecom.TelecomServiceImpl;
52ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport com.android.server.telecom.TelecomSystem;
53ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport com.android.server.telecom.components.UserCallIntentProcessor;
54ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport com.android.server.telecom.components.UserCallIntentProcessorFactory;
55ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
56ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport org.mockito.ArgumentCaptor;
57ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport org.mockito.Mock;
588a30e647d639ae4a08ecf8dcf4100a29a5da3a3aPaul Duffinimport org.mockito.compat.ArgumentMatcher;
59609992b6d222e54a74cc7e6af06173090103a28aHall Liuimport org.mockito.internal.matchers.VarargMatcher;
60ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
61ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport java.util.ArrayList;
62ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport java.util.Collection;
63ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport java.util.List;
64ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
65ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport static android.Manifest.permission.REGISTER_SIM_SUBSCRIPTION;
66ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport static android.Manifest.permission.WRITE_SECURE_SETTINGS;
67d0fe76e8e74ac515cacc492fa2c783cf2247ac05Brad Ebingerimport static org.mockito.ArgumentMatchers.nullable;
68ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport static org.mockito.Matchers.any;
69ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport static org.mockito.Matchers.anyBoolean;
70ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport static org.mockito.Matchers.anyInt;
71ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport static org.mockito.Matchers.anyString;
72ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport static org.mockito.Matchers.argThat;
73ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport static org.mockito.Matchers.eq;
740a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liuimport static org.mockito.Matchers.isNull;
75ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport static org.mockito.Mockito.doNothing;
76ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport static org.mockito.Mockito.doReturn;
77ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport static org.mockito.Mockito.doThrow;
780a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liuimport static org.mockito.Mockito.mock;
79ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport static org.mockito.Mockito.never;
80ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport static org.mockito.Mockito.spy;
81ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport static org.mockito.Mockito.verify;
82ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport static org.mockito.Mockito.when;
83ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
84ecda55454f4993003e71e09a63d20f94a216cc47Hall Liupublic class TelecomServiceImplTest extends TelecomTestCase {
85ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public static class CallIntentProcessAdapterFake implements CallIntentProcessor.Adapter {
86ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        @Override
87ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        public void processOutgoingCallIntent(Context context, CallsManager callsManager,
88ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                Intent intent) {
89ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
90ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
91ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
92ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        @Override
93ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        public void processIncomingCallIntent(CallsManager callsManager, Intent intent) {
94ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
95ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
96ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
97ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        @Override
98ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        public void processUnknownCallIntent(CallsManager callsManager, Intent intent) {
99ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
100ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
101ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
102ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
1030a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    public static class SubscriptionManagerAdapterFake
1040a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu            implements TelecomServiceImpl.SubscriptionManagerAdapter {
1050a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        @Override
1060a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        public int getDefaultVoiceSubId() {
1070a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu            return 0;
1080a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        }
1090a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    }
1100a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu
111ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private static class AnyStringIn extends ArgumentMatcher<String> {
112ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        private Collection<String> mStrings;
113ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        public AnyStringIn(Collection<String> strings) {
114ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            this.mStrings = strings;
115ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
116ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
117ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        @Override
1188a30e647d639ae4a08ecf8dcf4100a29a5da3a3aPaul Duffin        public boolean matchesObject(Object string) {
119ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            return mStrings.contains(string);
120ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
121ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
122ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
123609992b6d222e54a74cc7e6af06173090103a28aHall Liu    private static class IntVarArgMatcher extends ArgumentMatcher<int[]> implements VarargMatcher {
124609992b6d222e54a74cc7e6af06173090103a28aHall Liu        @Override
1258a30e647d639ae4a08ecf8dcf4100a29a5da3a3aPaul Duffin        public boolean matchesObject(Object argument) {
126609992b6d222e54a74cc7e6af06173090103a28aHall Liu            return true;
127609992b6d222e54a74cc7e6af06173090103a28aHall Liu        }
128609992b6d222e54a74cc7e6af06173090103a28aHall Liu    }
129609992b6d222e54a74cc7e6af06173090103a28aHall Liu
130ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private ITelecomService.Stub mTSIBinder;
131ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private AppOpsManager mAppOpsManager;
132ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private UserManager mUserManager;
133ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
134ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    @Mock private CallsManager mFakeCallsManager;
135ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    @Mock private PhoneAccountRegistrar mFakePhoneAccountRegistrar;
136ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    @Mock private TelecomManager mTelecomManager;
137ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private CallIntentProcessor.Adapter mCallIntentProcessorAdapter =
138ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            spy(new CallIntentProcessAdapterFake());
1397c9283261ad4fdbc5ebbb74257671388f9c758c7Hall Liu    @Mock private DefaultDialerCache mDefaultDialerCache;
1400a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    private TelecomServiceImpl.SubscriptionManagerAdapter mSubscriptionManagerAdapter =
1410a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu            spy(new SubscriptionManagerAdapterFake());
142ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    @Mock private UserCallIntentProcessor mUserCallIntentProcessor;
143ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
144ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private final TelecomSystem.SyncRoot mLock = new TelecomSystem.SyncRoot() { };
145ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
146ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private static final String DEFAULT_DIALER_PACKAGE = "com.google.android.dialer";
147ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private static final UserHandle USER_HANDLE_16 = new UserHandle(16);
148ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private static final UserHandle USER_HANDLE_17 = new UserHandle(17);
149ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private static final PhoneAccountHandle TEL_PA_HANDLE_16 = new PhoneAccountHandle(
150ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            new ComponentName("test", "telComponentName"), "0", USER_HANDLE_16);
151ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private static final PhoneAccountHandle SIP_PA_HANDLE_17 = new PhoneAccountHandle(
152ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            new ComponentName("test", "sipComponentName"), "1", USER_HANDLE_17);
153ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private static final PhoneAccountHandle TEL_PA_HANDLE_CURRENT = new PhoneAccountHandle(
154ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            new ComponentName("test", "telComponentName"), "2", Binder.getCallingUserHandle());
155ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private static final PhoneAccountHandle SIP_PA_HANDLE_CURRENT = new PhoneAccountHandle(
156ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            new ComponentName("test", "sipComponentName"), "3", Binder.getCallingUserHandle());
157ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
158ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    @Override
159ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void setUp() throws Exception {
160ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        super.setUp();
161ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        mContext = mComponentContextFixture.getTestDouble().getApplicationContext();
162ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        mComponentContextFixture.putBooleanResource(
163ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                com.android.internal.R.bool.config_voice_capable, true);
164ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
165ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doReturn(mContext).when(mContext).getApplicationContext();
166ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doNothing().when(mContext).sendBroadcastAsUser(any(Intent.class), any(UserHandle.class),
167ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                anyString());
168ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        TelecomServiceImpl telecomServiceImpl = new TelecomServiceImpl(
169ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                mContext,
170ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                mFakeCallsManager,
171ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                mFakePhoneAccountRegistrar,
172ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                mCallIntentProcessorAdapter,
173ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                new UserCallIntentProcessorFactory() {
174ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                    @Override
175ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                    public UserCallIntentProcessor create(Context context, UserHandle userHandle) {
176ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                        return mUserCallIntentProcessor;
177ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                    }
178ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                },
1797c9283261ad4fdbc5ebbb74257671388f9c758c7Hall Liu                mDefaultDialerCache,
1800a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu                mSubscriptionManagerAdapter,
181ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                mLock);
182ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        mTSIBinder = telecomServiceImpl.getBinder();
183ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        mComponentContextFixture.setTelecomManager(mTelecomManager);
184ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(mTelecomManager.getDefaultDialerPackage()).thenReturn(DEFAULT_DIALER_PACKAGE);
185ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(mTelecomManager.getSystemDialerPackage()).thenReturn(DEFAULT_DIALER_PACKAGE);
186ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
187ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        mAppOpsManager = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE);
188ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
189ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
1907c9283261ad4fdbc5ebbb74257671388f9c758c7Hall Liu        when(mDefaultDialerCache.getDefaultDialerApplication(anyInt()))
1917c9283261ad4fdbc5ebbb74257671388f9c758c7Hall Liu                .thenReturn(DEFAULT_DIALER_PACKAGE);
1927c9283261ad4fdbc5ebbb74257671388f9c758c7Hall Liu        when(mDefaultDialerCache.isDefaultOrSystemDialer(eq(DEFAULT_DIALER_PACKAGE), anyInt()))
1937c9283261ad4fdbc5ebbb74257671388f9c758c7Hall Liu                .thenReturn(true);
194ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
195ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
19684b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
197ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testGetDefaultOutgoingPhoneAccount() throws RemoteException {
198ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(mFakePhoneAccountRegistrar
199ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .getOutgoingPhoneAccountForScheme(eq("tel"), any(UserHandle.class)))
200ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .thenReturn(TEL_PA_HANDLE_16);
201ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(mFakePhoneAccountRegistrar
202ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .getOutgoingPhoneAccountForScheme(eq("sip"), any(UserHandle.class)))
203ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .thenReturn(SIP_PA_HANDLE_17);
204ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        makeAccountsVisibleToAllUsers(TEL_PA_HANDLE_16, SIP_PA_HANDLE_17);
205ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
206ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        PhoneAccountHandle returnedHandleTel
207ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                = mTSIBinder.getDefaultOutgoingPhoneAccount("tel", DEFAULT_DIALER_PACKAGE);
208ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertEquals(TEL_PA_HANDLE_16, returnedHandleTel);
209ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
210ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        PhoneAccountHandle returnedHandleSip
211ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                = mTSIBinder.getDefaultOutgoingPhoneAccount("sip", DEFAULT_DIALER_PACKAGE);
212ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertEquals(SIP_PA_HANDLE_17, returnedHandleSip);
213ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
214ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
21584b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
216ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testGetDefaultOutgoingPhoneAccountFailure() throws RemoteException {
217ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        // make sure that the list of user profiles doesn't include anything the PhoneAccountHandles
218ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        // are associated with
219ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
220ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(mFakePhoneAccountRegistrar
221ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .getOutgoingPhoneAccountForScheme(eq("tel"), any(UserHandle.class)))
222ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .thenReturn(TEL_PA_HANDLE_16);
223ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(mFakePhoneAccountRegistrar.getPhoneAccountUnchecked(TEL_PA_HANDLE_16)).thenReturn(
224ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                makePhoneAccount(TEL_PA_HANDLE_16).build());
225ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(mAppOpsManager.noteOp(eq(AppOpsManager.OP_READ_PHONE_STATE), anyInt(), anyString()))
226ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .thenReturn(AppOpsManager.MODE_IGNORED);
227ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doThrow(new SecurityException()).when(mContext)
228ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .enforceCallingOrSelfPermission(eq(READ_PRIVILEGED_PHONE_STATE), anyString());
229ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
230ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        PhoneAccountHandle returnedHandleTel
231ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                = mTSIBinder.getDefaultOutgoingPhoneAccount("tel", "");
232ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertNull(returnedHandleTel);
233ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
234ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
23584b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
236ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testGetUserSelectedOutgoingPhoneAccount() throws RemoteException {
237ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(mFakePhoneAccountRegistrar.getUserSelectedOutgoingPhoneAccount(any(UserHandle.class)))
238ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .thenReturn(TEL_PA_HANDLE_16);
239ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(mFakePhoneAccountRegistrar.getPhoneAccountUnchecked(TEL_PA_HANDLE_16)).thenReturn(
240ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                makeMultiUserPhoneAccount(TEL_PA_HANDLE_16).build());
241ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
242ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        PhoneAccountHandle returnedHandle
243ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                = mTSIBinder.getUserSelectedOutgoingPhoneAccount();
244ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertEquals(TEL_PA_HANDLE_16, returnedHandle);
245ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
246ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
24784b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
248ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testSetUserSelectedOutgoingPhoneAccount() throws RemoteException {
249ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        mTSIBinder.setUserSelectedOutgoingPhoneAccount(TEL_PA_HANDLE_16);
250ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        verify(mFakePhoneAccountRegistrar)
251ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .setUserSelectedOutgoingPhoneAccount(eq(TEL_PA_HANDLE_16), any(UserHandle.class));
252ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
253ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
25484b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
255ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testSetUserSelectedOutgoingPhoneAccountFailure() throws RemoteException {
256ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doThrow(new SecurityException()).when(mContext).enforceCallingOrSelfPermission(
257d0fe76e8e74ac515cacc492fa2c783cf2247ac05Brad Ebinger                anyString(), nullable(String.class));
258ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        try {
259ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            mTSIBinder.setUserSelectedOutgoingPhoneAccount(TEL_PA_HANDLE_16);
260ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        } catch (SecurityException e) {
261ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            // desired result
262ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
263ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        verify(mFakePhoneAccountRegistrar, never())
264ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .setUserSelectedOutgoingPhoneAccount(
265ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                        any(PhoneAccountHandle.class), any(UserHandle.class));
266ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
267ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
26884b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
269ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testGetCallCapablePhoneAccounts() throws RemoteException {
270ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        List<PhoneAccountHandle> fullPHList = new ArrayList<PhoneAccountHandle>() {{
271ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            add(TEL_PA_HANDLE_16);
272ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            add(SIP_PA_HANDLE_17);
273ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }};
274ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
275ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        List<PhoneAccountHandle> smallPHList = new ArrayList<PhoneAccountHandle>() {{
276ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            add(SIP_PA_HANDLE_17);
277ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }};
278ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        // Returns all phone accounts when getCallCapablePhoneAccounts is called.
279ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(mFakePhoneAccountRegistrar
280d0fe76e8e74ac515cacc492fa2c783cf2247ac05Brad Ebinger                .getCallCapablePhoneAccounts(nullable(String.class), eq(true),
281d0fe76e8e74ac515cacc492fa2c783cf2247ac05Brad Ebinger                        nullable(UserHandle.class))).thenReturn(fullPHList);
282ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        // Returns only enabled phone accounts when getCallCapablePhoneAccounts is called.
283ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(mFakePhoneAccountRegistrar
284d0fe76e8e74ac515cacc492fa2c783cf2247ac05Brad Ebinger                .getCallCapablePhoneAccounts(nullable(String.class), eq(false),
285d0fe76e8e74ac515cacc492fa2c783cf2247ac05Brad Ebinger                        nullable(UserHandle.class))).thenReturn(smallPHList);
286ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        makeAccountsVisibleToAllUsers(TEL_PA_HANDLE_16, SIP_PA_HANDLE_17);
287ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
288ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertEquals(fullPHList,
289ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                mTSIBinder.getCallCapablePhoneAccounts(true, DEFAULT_DIALER_PACKAGE));
290ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertEquals(smallPHList,
291ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                mTSIBinder.getCallCapablePhoneAccounts(false, DEFAULT_DIALER_PACKAGE));
292ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
293ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
29484b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
295ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testGetCallCapablePhoneAccountsFailure() throws RemoteException {
296ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        List<String> enforcedPermissions = new ArrayList<String>() {{
297ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            add(READ_PHONE_STATE);
298ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            add(READ_PRIVILEGED_PHONE_STATE);
299ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }};
300ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doThrow(new SecurityException()).when(mContext).enforceCallingOrSelfPermission(
301ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                argThat(new AnyStringIn(enforcedPermissions)), anyString());
302ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
303ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        List<PhoneAccountHandle> result = null;
304ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        try {
305ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            result = mTSIBinder.getCallCapablePhoneAccounts(true, "");
306ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        } catch (SecurityException e) {
307ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            // intended behavior
308ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
309ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertNull(result);
310ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        verify(mFakePhoneAccountRegistrar, never())
311ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .getCallCapablePhoneAccounts(anyString(), anyBoolean(), any(UserHandle.class));
312ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
313ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
31484b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
315ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testGetPhoneAccountsSupportingScheme() throws RemoteException {
316ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        List<PhoneAccountHandle> sipPHList = new ArrayList<PhoneAccountHandle>() {{
317ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            add(SIP_PA_HANDLE_17);
318ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }};
319ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
320ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        List<PhoneAccountHandle> telPHList = new ArrayList<PhoneAccountHandle>() {{
321ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            add(TEL_PA_HANDLE_16);
322ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }};
323ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(mFakePhoneAccountRegistrar
324ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .getCallCapablePhoneAccounts(eq("tel"), anyBoolean(), any(UserHandle.class)))
325ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .thenReturn(telPHList);
326ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(mFakePhoneAccountRegistrar
327ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .getCallCapablePhoneAccounts(eq("sip"), anyBoolean(), any(UserHandle.class)))
328ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .thenReturn(sipPHList);
329ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        makeAccountsVisibleToAllUsers(TEL_PA_HANDLE_16, SIP_PA_HANDLE_17);
330ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
331ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertEquals(telPHList,
332ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                mTSIBinder.getPhoneAccountsSupportingScheme("tel", DEFAULT_DIALER_PACKAGE));
333ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertEquals(sipPHList,
334ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                mTSIBinder.getPhoneAccountsSupportingScheme("sip", DEFAULT_DIALER_PACKAGE));
335ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
336ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
33784b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
338ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testGetPhoneAccountsForPackage() throws RemoteException {
339ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        List<PhoneAccountHandle> phoneAccountHandleList = new ArrayList<PhoneAccountHandle>() {{
340ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            add(TEL_PA_HANDLE_16);
341ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            add(SIP_PA_HANDLE_17);
342ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }};
343ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(mFakePhoneAccountRegistrar
344ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .getPhoneAccountsForPackage(anyString(), any(UserHandle.class)))
345ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .thenReturn(phoneAccountHandleList);
346ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        makeAccountsVisibleToAllUsers(TEL_PA_HANDLE_16, SIP_PA_HANDLE_17);
347ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertEquals(phoneAccountHandleList,
348ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                mTSIBinder.getPhoneAccountsForPackage(
349ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                        TEL_PA_HANDLE_16.getComponentName().getPackageName()));
350ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
351ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
35284b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
353ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testGetPhoneAccount() throws RemoteException {
354ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        makeAccountsVisibleToAllUsers(TEL_PA_HANDLE_16, SIP_PA_HANDLE_17);
355ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertEquals(TEL_PA_HANDLE_16, mTSIBinder.getPhoneAccount(TEL_PA_HANDLE_16)
356ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .getAccountHandle());
357ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertEquals(SIP_PA_HANDLE_17, mTSIBinder.getPhoneAccount(SIP_PA_HANDLE_17)
358ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .getAccountHandle());
359ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
360ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
36184b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
362ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testGetAllPhoneAccounts() throws RemoteException {
363ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        List<PhoneAccount> phoneAccountList = new ArrayList<PhoneAccount>() {{
364ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            add(makePhoneAccount(TEL_PA_HANDLE_16).build());
365ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            add(makePhoneAccount(SIP_PA_HANDLE_17).build());
366ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }};
367ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(mFakePhoneAccountRegistrar.getAllPhoneAccounts(any(UserHandle.class)))
368ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .thenReturn(phoneAccountList);
369ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
370ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertEquals(2, mTSIBinder.getAllPhoneAccounts().size());
371ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
372ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
37384b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
374ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testRegisterPhoneAccount() throws RemoteException {
375ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        String packageNameToUse = "com.android.officialpackage";
376ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        PhoneAccountHandle phHandle = new PhoneAccountHandle(new ComponentName(
377ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                packageNameToUse, "cs"), "test", Binder.getCallingUserHandle());
378ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        PhoneAccount phoneAccount = makePhoneAccount(phHandle).build();
379ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doReturn(PackageManager.PERMISSION_GRANTED)
380ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .when(mContext).checkCallingOrSelfPermission(MODIFY_PHONE_STATE);
381ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
382ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        registerPhoneAccountTestHelper(phoneAccount, true);
383ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
384ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
38584b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
386ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testRegisterPhoneAccountWithoutModifyPermission() throws RemoteException {
387ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        // tests the case where the package does not have MODIFY_PHONE_STATE but is
388ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        // registering its own phone account as a third-party connection service
389ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        String packageNameToUse = "com.thirdparty.connectionservice";
390ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        PhoneAccountHandle phHandle = new PhoneAccountHandle(new ComponentName(
391ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                packageNameToUse, "cs"), "asdf", Binder.getCallingUserHandle());
392ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        PhoneAccount phoneAccount = makePhoneAccount(phHandle).build();
393ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
394ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doReturn(PackageManager.PERMISSION_DENIED)
395ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .when(mContext).checkCallingOrSelfPermission(MODIFY_PHONE_STATE);
396ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        PackageManager pm = mContext.getPackageManager();
397ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(pm.hasSystemFeature(PackageManager.FEATURE_CONNECTION_SERVICE)).thenReturn(true);
398ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
399ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        registerPhoneAccountTestHelper(phoneAccount, true);
400ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
401ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
40284b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
403ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testRegisterPhoneAccountWithoutModifyPermissionFailure() throws RemoteException {
404ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        // tests the case where the third party package should not be allowed to register a phone
405ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        // account due to the lack of modify permission.
406ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        String packageNameToUse = "com.thirdparty.connectionservice";
407ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        PhoneAccountHandle phHandle = new PhoneAccountHandle(new ComponentName(
408ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                packageNameToUse, "cs"), "asdf", Binder.getCallingUserHandle());
409ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        PhoneAccount phoneAccount = makePhoneAccount(phHandle).build();
410ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
411ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doReturn(PackageManager.PERMISSION_DENIED)
412ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .when(mContext).checkCallingOrSelfPermission(MODIFY_PHONE_STATE);
413ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        PackageManager pm = mContext.getPackageManager();
414ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(pm.hasSystemFeature(PackageManager.FEATURE_CONNECTION_SERVICE)).thenReturn(false);
415ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
416ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        registerPhoneAccountTestHelper(phoneAccount, false);
417ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
418ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
41984b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
420ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testRegisterPhoneAccountWithoutSimSubscriptionPermissionFailure()
421ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            throws RemoteException {
422ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        String packageNameToUse = "com.thirdparty.connectionservice";
423ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        PhoneAccountHandle phHandle = new PhoneAccountHandle(new ComponentName(
424ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                packageNameToUse, "cs"), "asdf", Binder.getCallingUserHandle());
425ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        PhoneAccount phoneAccount = makePhoneAccount(phHandle)
426ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .setCapabilities(PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION).build();
427ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
428ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doReturn(PackageManager.PERMISSION_GRANTED)
429ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .when(mContext).checkCallingOrSelfPermission(MODIFY_PHONE_STATE);
430ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doThrow(new SecurityException())
431ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .when(mContext)
432d0fe76e8e74ac515cacc492fa2c783cf2247ac05Brad Ebinger                .enforceCallingOrSelfPermission(eq(REGISTER_SIM_SUBSCRIPTION),
433d0fe76e8e74ac515cacc492fa2c783cf2247ac05Brad Ebinger                        nullable(String.class));
434ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
435ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        registerPhoneAccountTestHelper(phoneAccount, false);
436ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
437ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
43884b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
439ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testRegisterPhoneAccountWithoutMultiUserPermissionFailure()
440ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            throws Exception {
441ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        String packageNameToUse = "com.thirdparty.connectionservice";
442ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        PhoneAccountHandle phHandle = new PhoneAccountHandle(new ComponentName(
443ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                packageNameToUse, "cs"), "asdf", Binder.getCallingUserHandle());
444ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        PhoneAccount phoneAccount = makeMultiUserPhoneAccount(phHandle).build();
445ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
446ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doReturn(PackageManager.PERMISSION_GRANTED)
447ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .when(mContext).checkCallingOrSelfPermission(MODIFY_PHONE_STATE);
448ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
449ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        PackageManager packageManager = mContext.getPackageManager();
450ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(packageManager.getApplicationInfo(packageNameToUse, PackageManager.GET_META_DATA))
451ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .thenReturn(new ApplicationInfo());
452ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
453ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        registerPhoneAccountTestHelper(phoneAccount, false);
454ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
455ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
456ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private void registerPhoneAccountTestHelper(PhoneAccount testPhoneAccount,
457ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            boolean shouldSucceed) throws RemoteException {
458ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
459ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        boolean didExceptionOccur = false;
460ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        try {
461ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            mTSIBinder.registerPhoneAccount(testPhoneAccount);
462ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        } catch (Exception e) {
463ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            didExceptionOccur = true;
464ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
465ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
466ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        if (shouldSucceed) {
467ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            assertFalse(didExceptionOccur);
468ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            verify(mFakePhoneAccountRegistrar).registerPhoneAccount(testPhoneAccount);
469ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        } else {
470ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            assertTrue(didExceptionOccur);
471ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            verify(mFakePhoneAccountRegistrar, never())
472ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                    .registerPhoneAccount(any(PhoneAccount.class));
473ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
474ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
475ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
47684b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
477ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testUnregisterPhoneAccount() throws RemoteException {
478ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        String packageNameToUse = "com.android.officialpackage";
479ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        PhoneAccountHandle phHandle = new PhoneAccountHandle(new ComponentName(
480ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                packageNameToUse, "cs"), "test", Binder.getCallingUserHandle());
481ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
482ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
483ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doReturn(PackageManager.PERMISSION_GRANTED)
484ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .when(mContext).checkCallingOrSelfPermission(MODIFY_PHONE_STATE);
485ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
486ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        mTSIBinder.unregisterPhoneAccount(phHandle);
487ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        verify(mFakePhoneAccountRegistrar).unregisterPhoneAccount(phHandle);
488ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
489ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
49084b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
491ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testUnregisterPhoneAccountFailure() throws RemoteException {
492ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        String packageNameToUse = "com.thirdparty.connectionservice";
493ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        PhoneAccountHandle phHandle = new PhoneAccountHandle(new ComponentName(
494ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                packageNameToUse, "cs"), "asdf", Binder.getCallingUserHandle());
495ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
496ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doReturn(PackageManager.PERMISSION_DENIED)
497ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .when(mContext).checkCallingOrSelfPermission(MODIFY_PHONE_STATE);
498ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        PackageManager pm = mContext.getPackageManager();
499ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(pm.hasSystemFeature(PackageManager.FEATURE_CONNECTION_SERVICE)).thenReturn(false);
500ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
501ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        try {
502ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            mTSIBinder.unregisterPhoneAccount(phHandle);
503ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        } catch (UnsupportedOperationException e) {
504ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            // expected behavior
505ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
506ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        verify(mFakePhoneAccountRegistrar, never())
507ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .unregisterPhoneAccount(any(PhoneAccountHandle.class));
508ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        verify(mContext, never())
509ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .sendBroadcastAsUser(any(Intent.class), any(UserHandle.class), anyString());
510ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
511ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
51284b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
513ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testAddNewIncomingCall() throws Exception {
514c34d474f16c40a0a5595cefbe455e4fd34d535d8Brad Ebinger        PhoneAccount phoneAccount = makePhoneAccount(TEL_PA_HANDLE_CURRENT).build();
515c34d474f16c40a0a5595cefbe455e4fd34d535d8Brad Ebinger        phoneAccount.setIsEnabled(true);
516c34d474f16c40a0a5595cefbe455e4fd34d535d8Brad Ebinger        doReturn(phoneAccount).when(mFakePhoneAccountRegistrar).getPhoneAccount(
517c34d474f16c40a0a5595cefbe455e4fd34d535d8Brad Ebinger                eq(TEL_PA_HANDLE_CURRENT), any(UserHandle.class));
518ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doNothing().when(mAppOpsManager).checkPackage(anyInt(), anyString());
519ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        Bundle extras = createSampleExtras();
520ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
521ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        mTSIBinder.addNewIncomingCall(TEL_PA_HANDLE_CURRENT, extras);
522ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
523ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        addCallTestHelper(TelecomManager.ACTION_INCOMING_CALL,
524ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                CallIntentProcessor.KEY_IS_INCOMING_CALL, extras, false);
525ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
526ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
52784b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
528ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testAddNewIncomingCallFailure() throws Exception {
529ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        try {
530ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            mTSIBinder.addNewIncomingCall(TEL_PA_HANDLE_16, null);
531ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        } catch (SecurityException e) {
532ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            // expected
533ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
534ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
535ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doThrow(new SecurityException()).when(mAppOpsManager).checkPackage(anyInt(), anyString());
536ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
537ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        try {
538ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            mTSIBinder.addNewIncomingCall(TEL_PA_HANDLE_CURRENT, null);
539ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        } catch (SecurityException e) {
540ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            // expected
541ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
542ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
543ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        // Verify that neither of these attempts got through
544ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        verify(mCallIntentProcessorAdapter, never())
545ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .processIncomingCallIntent(any(CallsManager.class), any(Intent.class));
546ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
547ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
54884b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
549ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testAddNewUnknownCall() throws Exception {
550c34d474f16c40a0a5595cefbe455e4fd34d535d8Brad Ebinger        PhoneAccount phoneAccount = makePhoneAccount(TEL_PA_HANDLE_CURRENT).build();
551c34d474f16c40a0a5595cefbe455e4fd34d535d8Brad Ebinger        phoneAccount.setIsEnabled(true);
552c34d474f16c40a0a5595cefbe455e4fd34d535d8Brad Ebinger        doReturn(phoneAccount).when(mFakePhoneAccountRegistrar).getPhoneAccount(
553c34d474f16c40a0a5595cefbe455e4fd34d535d8Brad Ebinger                eq(TEL_PA_HANDLE_CURRENT), any(UserHandle.class));
554ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doNothing().when(mAppOpsManager).checkPackage(anyInt(), anyString());
555ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        Bundle extras = createSampleExtras();
556ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
557ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        mTSIBinder.addNewUnknownCall(TEL_PA_HANDLE_CURRENT, extras);
558ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
559ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        addCallTestHelper(TelecomManager.ACTION_NEW_UNKNOWN_CALL,
560ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                CallIntentProcessor.KEY_IS_UNKNOWN_CALL, extras, true);
561ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
562ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
56384b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
564ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testAddNewUnknownCallFailure() throws Exception {
565ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        try {
566ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            mTSIBinder.addNewUnknownCall(TEL_PA_HANDLE_16, null);
567ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        } catch (SecurityException e) {
568ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            // expected
569ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
570ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
571ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doThrow(new SecurityException()).when(mAppOpsManager).checkPackage(anyInt(), anyString());
572ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
573ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        try {
574ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            mTSIBinder.addNewUnknownCall(TEL_PA_HANDLE_CURRENT, null);
575ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        } catch (SecurityException e) {
576ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            // expected
577ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
578ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
579ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        // Verify that neither of these attempts got through
580ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        verify(mCallIntentProcessorAdapter, never())
581ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .processIncomingCallIntent(any(CallsManager.class), any(Intent.class));
582ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
583ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
584ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private void addCallTestHelper(String expectedAction, String extraCallKey,
585ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            Bundle expectedExtras, boolean isUnknown) {
586ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
587ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        if (isUnknown) {
588ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            verify(mCallIntentProcessorAdapter).processUnknownCallIntent(any(CallsManager.class),
589ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                    intentCaptor.capture());
590ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        } else {
591ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            verify(mCallIntentProcessorAdapter).processIncomingCallIntent(any(CallsManager.class),
592ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                    intentCaptor.capture());
593ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
594ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        Intent capturedIntent = intentCaptor.getValue();
595ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertEquals(expectedAction, capturedIntent.getAction());
596ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        Bundle intentExtras = capturedIntent.getExtras();
597ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertEquals(TEL_PA_HANDLE_CURRENT,
598ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                intentExtras.get(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE));
599ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertTrue(intentExtras.getBoolean(extraCallKey));
600ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
601ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        if (isUnknown) {
602ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            for (String expectedKey : expectedExtras.keySet()) {
603ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                assertTrue(intentExtras.containsKey(expectedKey));
604ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                assertEquals(expectedExtras.get(expectedKey), intentExtras.get(expectedKey));
605ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            }
606ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
607ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        else {
608ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            assertTrue(areBundlesEqual(expectedExtras,
609ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                    (Bundle) intentExtras.get(TelecomManager.EXTRA_INCOMING_CALL_EXTRAS)));
610ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
611ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
612ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
61384b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
614ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testPlaceCallWithNonEmergencyPermission() throws Exception {
615ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        Uri handle = Uri.parse("tel:6505551234");
616ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        Bundle extras = createSampleExtras();
617ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
618ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(mAppOpsManager.noteOp(eq(AppOpsManager.OP_CALL_PHONE), anyInt(), anyString()))
619ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .thenReturn(AppOpsManager.MODE_ALLOWED);
620ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doReturn(PackageManager.PERMISSION_GRANTED)
621ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .when(mContext).checkCallingPermission(CALL_PHONE);
622ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
623ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        mTSIBinder.placeCall(handle, extras, DEFAULT_DIALER_PACKAGE);
624ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        placeCallTestHelper(handle, extras, true);
625ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
626ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
62784b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
628ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testPlaceCallWithAppOpsOff() throws Exception {
629ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        Uri handle = Uri.parse("tel:6505551234");
630ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        Bundle extras = createSampleExtras();
631ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
632ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(mAppOpsManager.noteOp(eq(AppOpsManager.OP_CALL_PHONE), anyInt(), anyString()))
633ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .thenReturn(AppOpsManager.MODE_IGNORED);
634ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doReturn(PackageManager.PERMISSION_GRANTED)
635ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .when(mContext).checkCallingPermission(CALL_PHONE);
636ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
637ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        mTSIBinder.placeCall(handle, extras, DEFAULT_DIALER_PACKAGE);
638ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        placeCallTestHelper(handle, extras, false);
639ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
640ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
64184b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
642ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testPlaceCallWithNoCallingPermission() throws Exception {
643ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        Uri handle = Uri.parse("tel:6505551234");
644ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        Bundle extras = createSampleExtras();
645ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
646ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(mAppOpsManager.noteOp(eq(AppOpsManager.OP_CALL_PHONE), anyInt(), anyString()))
647ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .thenReturn(AppOpsManager.MODE_ALLOWED);
648ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doReturn(PackageManager.PERMISSION_DENIED)
649ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .when(mContext).checkCallingPermission(CALL_PHONE);
650ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
651ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        mTSIBinder.placeCall(handle, extras, DEFAULT_DIALER_PACKAGE);
652ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        placeCallTestHelper(handle, extras, false);
653ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
654ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
655ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private void placeCallTestHelper(Uri expectedHandle, Bundle expectedExtras,
656ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            boolean shouldNonEmergencyBeAllowed) {
657ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
658ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        verify(mUserCallIntentProcessor).processIntent(intentCaptor.capture(), anyString(),
659ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                eq(shouldNonEmergencyBeAllowed));
660ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        Intent capturedIntent = intentCaptor.getValue();
661ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertEquals(Intent.ACTION_CALL, capturedIntent.getAction());
662ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertEquals(expectedHandle, capturedIntent.getData());
663ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertTrue(areBundlesEqual(expectedExtras, capturedIntent.getExtras()));
664ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
665ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
66684b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
667ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testPlaceCallFailure() throws Exception {
668ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        Uri handle = Uri.parse("tel:6505551234");
669ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        Bundle extras = createSampleExtras();
670ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
671ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doThrow(new SecurityException())
672ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .when(mContext).enforceCallingOrSelfPermission(eq(CALL_PHONE), anyString());
673ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
674ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        try {
675ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            mTSIBinder.placeCall(handle, extras, "arbitrary_package_name");
676ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        } catch (SecurityException e) {
677ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            // expected
678ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
679ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
680ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        verify(mUserCallIntentProcessor, never())
681ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .processIntent(any(Intent.class), anyString(), anyBoolean());
682ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
683ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
68484b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
685ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testSetDefaultDialer() throws Exception {
686ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        String packageName = "sample.package";
6877c9283261ad4fdbc5ebbb74257671388f9c758c7Hall Liu        int currentUser = ActivityManager.getCurrentUser();
688ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
6897c9283261ad4fdbc5ebbb74257671388f9c758c7Hall Liu        when(mDefaultDialerCache.setDefaultDialer(eq(packageName), eq(currentUser)))
6907c9283261ad4fdbc5ebbb74257671388f9c758c7Hall Liu                .thenReturn(true);
691ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
692ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        mTSIBinder.setDefaultDialer(packageName);
693ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
6947c9283261ad4fdbc5ebbb74257671388f9c758c7Hall Liu        verify(mDefaultDialerCache).setDefaultDialer(eq(packageName), eq(currentUser));
695ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
696ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        verify(mContext).sendBroadcastAsUser(intentCaptor.capture(), any(UserHandle.class));
697ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        Intent capturedIntent = intentCaptor.getValue();
698ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertEquals(TelecomManager.ACTION_DEFAULT_DIALER_CHANGED, capturedIntent.getAction());
699ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        String packageNameExtra = capturedIntent.getStringExtra(
700ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME);
701ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertEquals(packageName, packageNameExtra);
702ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
703ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
70484b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
705ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testSetDefaultDialerNoModifyPhoneStatePermission() throws Exception {
706ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doThrow(new SecurityException()).when(mContext).enforceCallingOrSelfPermission(
707d0fe76e8e74ac515cacc492fa2c783cf2247ac05Brad Ebinger                eq(MODIFY_PHONE_STATE), nullable(String.class));
708ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        setDefaultDialerFailureTestHelper();
709ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
710ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
71184b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
7120a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    public void testSetDefaultDialerNoWriteSecureSettingsPermission() throws Exception {
713ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doThrow(new SecurityException()).when(mContext).enforceCallingOrSelfPermission(
714d0fe76e8e74ac515cacc492fa2c783cf2247ac05Brad Ebinger                eq(WRITE_SECURE_SETTINGS), nullable(String.class));
715ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        setDefaultDialerFailureTestHelper();
716ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
717ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
718ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private void setDefaultDialerFailureTestHelper() throws Exception {
719ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        boolean exceptionThrown = false;
720ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        try {
721ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            mTSIBinder.setDefaultDialer(DEFAULT_DIALER_PACKAGE);
722ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        } catch (SecurityException e) {
723ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            exceptionThrown = true;
724ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
725ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertTrue(exceptionThrown);
7267c9283261ad4fdbc5ebbb74257671388f9c758c7Hall Liu        verify(mDefaultDialerCache, never()).setDefaultDialer(anyString(), anyInt());
727ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        verify(mContext, never()).sendBroadcastAsUser(any(Intent.class), any(UserHandle.class));
728ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
729ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
73084b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
7310a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    public void testIsVoicemailNumber() throws Exception {
7320a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        String vmNumber = "010";
7330a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        makeAccountsVisibleToAllUsers(TEL_PA_HANDLE_CURRENT);
7340a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu
7350a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        doReturn(true).when(mFakePhoneAccountRegistrar).isVoiceMailNumber(TEL_PA_HANDLE_CURRENT,
7360a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu                vmNumber);
7370a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        assertTrue(mTSIBinder.isVoiceMailNumber(TEL_PA_HANDLE_CURRENT,
7380a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu                vmNumber, DEFAULT_DIALER_PACKAGE));
7390a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    }
7400a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu
74184b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
7420a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    public void testIsVoicemailNumberAccountNotVisibleFailure() throws Exception {
7430a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        String vmNumber = "010";
7440a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu
7450a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        doReturn(true).when(mFakePhoneAccountRegistrar).isVoiceMailNumber(TEL_PA_HANDLE_CURRENT,
7460a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu                vmNumber);
7470a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu
7480a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        when(mFakePhoneAccountRegistrar.getPhoneAccount(TEL_PA_HANDLE_CURRENT,
7490a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu                Binder.getCallingUserHandle())).thenReturn(null);
7500a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        assertFalse(mTSIBinder
7510a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu                .isVoiceMailNumber(TEL_PA_HANDLE_CURRENT, vmNumber, DEFAULT_DIALER_PACKAGE));
7520a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    }
7530a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu
75484b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
7550a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    public void testGetVoicemailNumberWithNullAccountHandle() throws Exception {
7560a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        when(mFakePhoneAccountRegistrar.getPhoneAccount(isNull(PhoneAccountHandle.class),
7570a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu                eq(Binder.getCallingUserHandle())))
7580a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu                .thenReturn(makePhoneAccount(TEL_PA_HANDLE_CURRENT).build());
7590a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        int subId = 58374;
7600a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        String vmNumber = "543";
7610a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        doReturn(subId).when(mSubscriptionManagerAdapter).getDefaultVoiceSubId();
7620a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu
7630a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        TelephonyManager mockTelephonyManager =
7640a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu                (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
7650a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        when(mockTelephonyManager.getVoiceMailNumber(subId)).thenReturn(vmNumber);
7660a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu
7670a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        assertEquals(vmNumber, mTSIBinder.getVoiceMailNumber(null, DEFAULT_DIALER_PACKAGE));
7680a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    }
7690a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu
77084b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
7710a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    public void testGetVoicemailNumberWithNonNullAccountHandle() throws Exception {
7720a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        when(mFakePhoneAccountRegistrar.getPhoneAccount(eq(TEL_PA_HANDLE_CURRENT),
7730a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu                eq(Binder.getCallingUserHandle())))
7740a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu                .thenReturn(makePhoneAccount(TEL_PA_HANDLE_CURRENT).build());
7750a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        int subId = 58374;
7760a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        String vmNumber = "543";
7770a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu
7780a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        TelephonyManager mockTelephonyManager =
7790a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu                (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
7800a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        when(mockTelephonyManager.getVoiceMailNumber(subId)).thenReturn(vmNumber);
7810a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        when(mFakePhoneAccountRegistrar.getSubscriptionIdForPhoneAccount(TEL_PA_HANDLE_CURRENT))
7820a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu                .thenReturn(subId);
7830a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu
7840a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        assertEquals(vmNumber,
7850a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu                mTSIBinder.getVoiceMailNumber(TEL_PA_HANDLE_CURRENT, DEFAULT_DIALER_PACKAGE));
7860a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    }
7870a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu
78884b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
7890a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    public void testGetLine1Number() throws Exception {
7900a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        int subId = 58374;
7910a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        String line1Number = "9482752023479";
7920a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        makeAccountsVisibleToAllUsers(TEL_PA_HANDLE_CURRENT);
7930a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        when(mFakePhoneAccountRegistrar.getSubscriptionIdForPhoneAccount(TEL_PA_HANDLE_CURRENT))
7940a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu                .thenReturn(subId);
7950a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        TelephonyManager mockTelephonyManager =
7960a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu                (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
797ce68874475498dcb69a543559177d69ac6dae215Shishir Agrawal        when(mockTelephonyManager.getLine1Number(subId)).thenReturn(line1Number);
7980a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu
7990a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        assertEquals(line1Number,
8000a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu                mTSIBinder.getLine1Number(TEL_PA_HANDLE_CURRENT, DEFAULT_DIALER_PACKAGE));
8010a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    }
8020a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu
80384b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
8040a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    public void testEndCallWithRingingForegroundCall() throws Exception {
8050a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        Call call = mock(Call.class);
8060a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        when(call.getState()).thenReturn(CallState.RINGING);
8070a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        when(mFakeCallsManager.getForegroundCall()).thenReturn(call);
8080a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        assertTrue(mTSIBinder.endCall());
8090a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        verify(call).reject(false, null);
8100a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    }
8110a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu
81284b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
8130a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    public void testEndCallWithNonRingingForegroundCall() throws Exception {
8140a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        Call call = mock(Call.class);
8150a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        when(call.getState()).thenReturn(CallState.ACTIVE);
8160a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        when(mFakeCallsManager.getForegroundCall()).thenReturn(call);
8170a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        assertTrue(mTSIBinder.endCall());
8180a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        verify(call).disconnect();
8190a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    }
8200a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu
82184b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
8220a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    public void testEndCallWithNoForegroundCall() throws Exception {
8230a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        Call call = mock(Call.class);
8240a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        when(call.getState()).thenReturn(CallState.ACTIVE);
825609992b6d222e54a74cc7e6af06173090103a28aHall Liu        when(mFakeCallsManager.getFirstCallWithState(argThat(new IntVarArgMatcher())))
8260a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu                .thenReturn(call);
8270a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        assertTrue(mTSIBinder.endCall());
8280a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        verify(call).disconnect();
8290a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    }
8300a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu
83184b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
8320a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    public void testEndCallWithNoCalls() throws Exception {
8330a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        assertFalse(mTSIBinder.endCall());
8340a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    }
8350a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu
83684b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
8370a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    public void testAcceptRingingCall() throws Exception {
8380a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        Call call = mock(Call.class);
839d0fe76e8e74ac515cacc492fa2c783cf2247ac05Brad Ebinger        when(mFakeCallsManager.getFirstCallWithState(anyInt())).thenReturn(call);
8400a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        // Not intended to be a real video state. Here to ensure that the call will be answered
8410a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        // with whatever video state it's currently in.
8420a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        int fakeVideoState = 29578215;
8430a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        when(call.getVideoState()).thenReturn(fakeVideoState);
844ccba720d2496060078a6551ffd1609c2dc7ce95cEugene Susla        mTSIBinder.acceptRingingCall("");
845d0fe76e8e74ac515cacc492fa2c783cf2247ac05Brad Ebinger        verify(call).answer(eq(fakeVideoState));
8460a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    }
8470a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu
84884b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
8490a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    public void testAcceptRingingCallWithValidVideoState() throws Exception {
8500a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        Call call = mock(Call.class);
851d0fe76e8e74ac515cacc492fa2c783cf2247ac05Brad Ebinger        when(mFakeCallsManager.getFirstCallWithState(anyInt())).thenReturn(call);
8520a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        // Not intended to be a real video state. Here to ensure that the call will be answered
8530a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        // with the video state passed in to acceptRingingCallWithVideoState
8540a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        int fakeVideoState = 29578215;
8550a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        int realVideoState = VideoProfile.STATE_RX_ENABLED | VideoProfile.STATE_TX_ENABLED;
8560a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        when(call.getVideoState()).thenReturn(fakeVideoState);
857ccba720d2496060078a6551ffd1609c2dc7ce95cEugene Susla        mTSIBinder.acceptRingingCallWithVideoState("", realVideoState);
8580a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        verify(call).answer(realVideoState);
8590a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    }
8600a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu
8614a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn    @SmallTest
8624a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn    public void testIsInCall() throws Exception {
8634a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn        when(mFakeCallsManager.hasOngoingCalls()).thenReturn(true);
8644a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn        assertTrue(mTSIBinder.isInCall(DEFAULT_DIALER_PACKAGE));
8654a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn    }
8664a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn
8674a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn    @SmallTest
8684a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn    public void testNotIsInCall() throws Exception {
8694a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn        when(mFakeCallsManager.hasOngoingCalls()).thenReturn(false);
8704a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn        assertFalse(mTSIBinder.isInCall(DEFAULT_DIALER_PACKAGE));
8714a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn    }
8724a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn
8734a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn    @SmallTest
8744a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn    public void testIsInCallFail() throws Exception {
8754a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn        doThrow(new SecurityException()).when(mContext).enforceCallingOrSelfPermission(
8764a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn                anyString(), any());
8774a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn        try {
8784a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn            mTSIBinder.isInCall("blah");
8794a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn            fail();
8804a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn        } catch (SecurityException e) {
8814a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn            // desired result
8824a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn        }
8834a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn        verify(mFakeCallsManager, never()).hasOngoingCalls();
8844a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn    }
8854a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn
8864a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn    @SmallTest
8874a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn    public void testIsInManagedCall() throws Exception {
8884a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn        when(mFakeCallsManager.hasOngoingManagedCalls()).thenReturn(true);
8894a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn        assertTrue(mTSIBinder.isInManagedCall(DEFAULT_DIALER_PACKAGE));
8904a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn    }
8914a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn
8924a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn    @SmallTest
8934a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn    public void testNotIsInManagedCall() throws Exception {
8944a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn        when(mFakeCallsManager.hasOngoingManagedCalls()).thenReturn(false);
8954a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn        assertFalse(mTSIBinder.isInManagedCall(DEFAULT_DIALER_PACKAGE));
8964a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn    }
8974a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn
8984a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn    @SmallTest
8994a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn    public void testIsInManagedCallFail() throws Exception {
9004a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn        doThrow(new SecurityException()).when(mContext).enforceCallingOrSelfPermission(
9014a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn                anyString(), any());
9024a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn        try {
9034a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn            mTSIBinder.isInManagedCall("blah");
9044a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn            fail();
9054a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn        } catch (SecurityException e) {
9064a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn            // desired result
9074a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn        }
9084a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn        verify(mFakeCallsManager, never()).hasOngoingCalls();
9094a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn    }
9104a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn
911ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    /**
912ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu     * Register phone accounts for the supplied PhoneAccountHandles to make them
913ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu     * visible to all users (via the isVisibleToCaller method in TelecomServiceImpl.
914ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu     * @param handles the handles for which phone accounts should be created for.
915ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu     */
916ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private void makeAccountsVisibleToAllUsers(PhoneAccountHandle... handles) {
917ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        for (PhoneAccountHandle ph : handles) {
918ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            when(mFakePhoneAccountRegistrar.getPhoneAccountUnchecked(eq(ph))).thenReturn(
919ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                    makeMultiUserPhoneAccount(ph).build());
920ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            when(mFakePhoneAccountRegistrar
921d0fe76e8e74ac515cacc492fa2c783cf2247ac05Brad Ebinger                    .getPhoneAccount(eq(ph), nullable(UserHandle.class), anyBoolean()))
922ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                    .thenReturn(makeMultiUserPhoneAccount(ph).build());
9230a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu            when(mFakePhoneAccountRegistrar
924d0fe76e8e74ac515cacc492fa2c783cf2247ac05Brad Ebinger                    .getPhoneAccount(eq(ph), nullable(UserHandle.class)))
9250a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu                    .thenReturn(makeMultiUserPhoneAccount(ph).build());
926ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
927ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
928ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
929ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private PhoneAccount.Builder makeMultiUserPhoneAccount(PhoneAccountHandle paHandle) {
930ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        PhoneAccount.Builder paBuilder = makePhoneAccount(paHandle);
931ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        paBuilder.setCapabilities(PhoneAccount.CAPABILITY_MULTI_USER);
932ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        return paBuilder;
933ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
934ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
935ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private PhoneAccount.Builder makePhoneAccount(PhoneAccountHandle paHandle) {
936ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        return new PhoneAccount.Builder(paHandle, "testLabel");
937ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
938ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
939ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private Bundle createSampleExtras() {
940ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        Bundle extras = new Bundle();
941ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        extras.putString("test_key", "test_value");
942ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        return extras;
943ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
944ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
945ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private static boolean areBundlesEqual(Bundle b1, Bundle b2) {
946ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        for (String key1 : b1.keySet()) {
947ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            if (!b1.get(key1).equals(b2.get(key1))) {
948ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                return false;
949ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            }
950ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
951ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
952ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        for (String key2 : b2.keySet()) {
953ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            if (!b2.get(key2).equals(b1.get(key2))) {
954ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                return false;
955ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            }
956ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
957ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        return true;
958ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
959ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu}
960