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
24ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport android.app.AppOpsManager;
25ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport android.content.ComponentName;
26ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport android.content.Context;
27ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport android.content.Intent;
28ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport android.content.pm.ApplicationInfo;
29ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport android.content.pm.PackageManager;
30ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport android.net.Uri;
31ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport android.os.Binder;
32ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport android.os.Bundle;
33ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport android.os.RemoteException;
34ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport android.os.UserHandle;
35ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport android.os.UserManager;
36ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport android.telecom.PhoneAccount;
37ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport android.telecom.PhoneAccountHandle;
38ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport android.telecom.TelecomManager;
390a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liuimport android.telecom.VideoProfile;
400a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liuimport android.telephony.TelephonyManager;
4184b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liuimport android.test.suitebuilder.annotation.SmallTest;
42ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
43ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport com.android.internal.telecom.ITelecomService;
440a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liuimport com.android.server.telecom.Call;
45ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport com.android.server.telecom.CallIntentProcessor;
460a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liuimport com.android.server.telecom.CallState;
47ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport com.android.server.telecom.CallsManager;
48ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport com.android.server.telecom.PhoneAccountRegistrar;
49ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport com.android.server.telecom.TelecomServiceImpl;
50ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport com.android.server.telecom.TelecomSystem;
51ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport com.android.server.telecom.components.UserCallIntentProcessor;
52ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport com.android.server.telecom.components.UserCallIntentProcessorFactory;
53ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
54ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport org.mockito.ArgumentCaptor;
55ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport org.mockito.ArgumentMatcher;
56609992b6d222e54a74cc7e6af06173090103a28aHall Liuimport org.mockito.Matchers;
57ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport org.mockito.Mock;
58609992b6d222e54a74cc7e6af06173090103a28aHall Liuimport org.mockito.internal.matchers.VarargMatcher;
59ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
60ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport java.util.ArrayList;
61ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport java.util.Collection;
62ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport java.util.List;
63ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
64ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport static android.Manifest.permission.REGISTER_SIM_SUBSCRIPTION;
65ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport static android.Manifest.permission.WRITE_SECURE_SETTINGS;
66ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport static org.mockito.Matchers.any;
67ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport static org.mockito.Matchers.anyBoolean;
68ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport static org.mockito.Matchers.anyInt;
69ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport static org.mockito.Matchers.anyString;
70ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport static org.mockito.Matchers.argThat;
71ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport static org.mockito.Matchers.eq;
720a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liuimport static org.mockito.Matchers.isNull;
73ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport static org.mockito.Mockito.doNothing;
74ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport static org.mockito.Mockito.doReturn;
75ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport static org.mockito.Mockito.doThrow;
760a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liuimport static org.mockito.Mockito.mock;
77ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport static org.mockito.Mockito.never;
78ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport static org.mockito.Mockito.spy;
79ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport static org.mockito.Mockito.verify;
80ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport static org.mockito.Mockito.when;
81ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
82ecda55454f4993003e71e09a63d20f94a216cc47Hall Liupublic class TelecomServiceImplTest extends TelecomTestCase {
83ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public static class CallIntentProcessAdapterFake implements CallIntentProcessor.Adapter {
84ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        @Override
85ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        public void processOutgoingCallIntent(Context context, CallsManager callsManager,
86ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                Intent intent) {
87ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
88ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
89ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
90ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        @Override
91ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        public void processIncomingCallIntent(CallsManager callsManager, Intent intent) {
92ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
93ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
94ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
95ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        @Override
96ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        public void processUnknownCallIntent(CallsManager callsManager, Intent intent) {
97ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
98ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
99ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
100ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
101ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public static class DefaultDialerManagerAdapterFake
102ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            implements TelecomServiceImpl.DefaultDialerManagerAdapter {
103ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        @Override
104ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        public String getDefaultDialerApplication(Context context) {
105ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            return null;
106ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
107ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
108ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        @Override
109501b9b3775232bb3033afd9f1fd608dd07d0b91eSantos Cordon        public String getDefaultDialerApplication(Context context, int userId) {
110501b9b3775232bb3033afd9f1fd608dd07d0b91eSantos Cordon            return null;
111501b9b3775232bb3033afd9f1fd608dd07d0b91eSantos Cordon        }
112501b9b3775232bb3033afd9f1fd608dd07d0b91eSantos Cordon
113501b9b3775232bb3033afd9f1fd608dd07d0b91eSantos Cordon        @Override
114ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        public boolean setDefaultDialerApplication(Context context, String packageName) {
115ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            return false;
116ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
117ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
118ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        @Override
119ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        public boolean isDefaultOrSystemDialer(Context context, String packageName) {
120ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            return false;
121ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
122ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
123ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
1240a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    public static class SubscriptionManagerAdapterFake
1250a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu            implements TelecomServiceImpl.SubscriptionManagerAdapter {
1260a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        @Override
1270a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        public int getDefaultVoiceSubId() {
1280a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu            return 0;
1290a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        }
1300a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    }
1310a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu
132ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private static class AnyStringIn extends ArgumentMatcher<String> {
133ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        private Collection<String> mStrings;
134ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        public AnyStringIn(Collection<String> strings) {
135ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            this.mStrings = strings;
136ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
137ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
138ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        @Override
139ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        public boolean matches(Object string) {
140ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            return mStrings.contains(string);
141ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
142ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
143ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
144609992b6d222e54a74cc7e6af06173090103a28aHall Liu    private static class IntVarArgMatcher extends ArgumentMatcher<int[]> implements VarargMatcher {
145609992b6d222e54a74cc7e6af06173090103a28aHall Liu        @Override
146609992b6d222e54a74cc7e6af06173090103a28aHall Liu        public boolean matches(Object argument) {
147609992b6d222e54a74cc7e6af06173090103a28aHall Liu            return true;
148609992b6d222e54a74cc7e6af06173090103a28aHall Liu        }
149609992b6d222e54a74cc7e6af06173090103a28aHall Liu    }
150609992b6d222e54a74cc7e6af06173090103a28aHall Liu
151ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private ITelecomService.Stub mTSIBinder;
152ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private AppOpsManager mAppOpsManager;
153ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private UserManager mUserManager;
154ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
155ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    @Mock private CallsManager mFakeCallsManager;
156ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    @Mock private PhoneAccountRegistrar mFakePhoneAccountRegistrar;
157ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    @Mock private TelecomManager mTelecomManager;
158ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private CallIntentProcessor.Adapter mCallIntentProcessorAdapter =
159ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            spy(new CallIntentProcessAdapterFake());
160ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private TelecomServiceImpl.DefaultDialerManagerAdapter mDefaultDialerManagerAdapter =
161ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            spy(new DefaultDialerManagerAdapterFake());
1620a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    private TelecomServiceImpl.SubscriptionManagerAdapter mSubscriptionManagerAdapter =
1630a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu            spy(new SubscriptionManagerAdapterFake());
164ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    @Mock private UserCallIntentProcessor mUserCallIntentProcessor;
165ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
166ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private final TelecomSystem.SyncRoot mLock = new TelecomSystem.SyncRoot() { };
167ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
168ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private static final String DEFAULT_DIALER_PACKAGE = "com.google.android.dialer";
169ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private static final UserHandle USER_HANDLE_16 = new UserHandle(16);
170ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private static final UserHandle USER_HANDLE_17 = new UserHandle(17);
171ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private static final PhoneAccountHandle TEL_PA_HANDLE_16 = new PhoneAccountHandle(
172ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            new ComponentName("test", "telComponentName"), "0", USER_HANDLE_16);
173ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private static final PhoneAccountHandle SIP_PA_HANDLE_17 = new PhoneAccountHandle(
174ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            new ComponentName("test", "sipComponentName"), "1", USER_HANDLE_17);
175ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private static final PhoneAccountHandle TEL_PA_HANDLE_CURRENT = new PhoneAccountHandle(
176ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            new ComponentName("test", "telComponentName"), "2", Binder.getCallingUserHandle());
177ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private static final PhoneAccountHandle SIP_PA_HANDLE_CURRENT = new PhoneAccountHandle(
178ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            new ComponentName("test", "sipComponentName"), "3", Binder.getCallingUserHandle());
179ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
180ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    @Override
181ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void setUp() throws Exception {
182ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        super.setUp();
183ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        mContext = mComponentContextFixture.getTestDouble().getApplicationContext();
184ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        mComponentContextFixture.putBooleanResource(
185ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                com.android.internal.R.bool.config_voice_capable, true);
186ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
187ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doReturn(mContext).when(mContext).getApplicationContext();
188ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doNothing().when(mContext).sendBroadcastAsUser(any(Intent.class), any(UserHandle.class),
189ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                anyString());
190ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        TelecomServiceImpl telecomServiceImpl = new TelecomServiceImpl(
191ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                mContext,
192ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                mFakeCallsManager,
193ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                mFakePhoneAccountRegistrar,
194ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                mCallIntentProcessorAdapter,
195ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                new UserCallIntentProcessorFactory() {
196ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                    @Override
197ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                    public UserCallIntentProcessor create(Context context, UserHandle userHandle) {
198ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                        return mUserCallIntentProcessor;
199ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                    }
200ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                },
201ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                mDefaultDialerManagerAdapter,
2020a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu                mSubscriptionManagerAdapter,
203ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                mLock);
204ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        mTSIBinder = telecomServiceImpl.getBinder();
205ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        mComponentContextFixture.setTelecomManager(mTelecomManager);
206ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(mTelecomManager.getDefaultDialerPackage()).thenReturn(DEFAULT_DIALER_PACKAGE);
207ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(mTelecomManager.getSystemDialerPackage()).thenReturn(DEFAULT_DIALER_PACKAGE);
208ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
209ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        mAppOpsManager = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE);
210ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
211ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
212ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doReturn(DEFAULT_DIALER_PACKAGE)
213ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .when(mDefaultDialerManagerAdapter)
214ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .getDefaultDialerApplication(any(Context.class));
215ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
216ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doReturn(true)
217ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .when(mDefaultDialerManagerAdapter)
218ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .isDefaultOrSystemDialer(any(Context.class), eq(DEFAULT_DIALER_PACKAGE));
219ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
220ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
22184b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
222ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testGetDefaultOutgoingPhoneAccount() throws RemoteException {
223ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(mFakePhoneAccountRegistrar
224ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .getOutgoingPhoneAccountForScheme(eq("tel"), any(UserHandle.class)))
225ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .thenReturn(TEL_PA_HANDLE_16);
226ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(mFakePhoneAccountRegistrar
227ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .getOutgoingPhoneAccountForScheme(eq("sip"), any(UserHandle.class)))
228ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .thenReturn(SIP_PA_HANDLE_17);
229ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        makeAccountsVisibleToAllUsers(TEL_PA_HANDLE_16, SIP_PA_HANDLE_17);
230ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
231ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        PhoneAccountHandle returnedHandleTel
232ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                = mTSIBinder.getDefaultOutgoingPhoneAccount("tel", DEFAULT_DIALER_PACKAGE);
233ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertEquals(TEL_PA_HANDLE_16, returnedHandleTel);
234ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
235ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        PhoneAccountHandle returnedHandleSip
236ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                = mTSIBinder.getDefaultOutgoingPhoneAccount("sip", DEFAULT_DIALER_PACKAGE);
237ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertEquals(SIP_PA_HANDLE_17, returnedHandleSip);
238ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
239ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
24084b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
241ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testGetDefaultOutgoingPhoneAccountFailure() throws RemoteException {
242ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        // make sure that the list of user profiles doesn't include anything the PhoneAccountHandles
243ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        // are associated with
244ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
245ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(mFakePhoneAccountRegistrar
246ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .getOutgoingPhoneAccountForScheme(eq("tel"), any(UserHandle.class)))
247ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .thenReturn(TEL_PA_HANDLE_16);
248ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(mFakePhoneAccountRegistrar.getPhoneAccountUnchecked(TEL_PA_HANDLE_16)).thenReturn(
249ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                makePhoneAccount(TEL_PA_HANDLE_16).build());
250ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(mAppOpsManager.noteOp(eq(AppOpsManager.OP_READ_PHONE_STATE), anyInt(), anyString()))
251ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .thenReturn(AppOpsManager.MODE_IGNORED);
252ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doThrow(new SecurityException()).when(mContext)
253ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .enforceCallingOrSelfPermission(eq(READ_PRIVILEGED_PHONE_STATE), anyString());
254ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
255ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        PhoneAccountHandle returnedHandleTel
256ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                = mTSIBinder.getDefaultOutgoingPhoneAccount("tel", "");
257ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertNull(returnedHandleTel);
258ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
259ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
26084b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
261ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testGetUserSelectedOutgoingPhoneAccount() throws RemoteException {
262ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(mFakePhoneAccountRegistrar.getUserSelectedOutgoingPhoneAccount(any(UserHandle.class)))
263ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .thenReturn(TEL_PA_HANDLE_16);
264ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(mFakePhoneAccountRegistrar.getPhoneAccountUnchecked(TEL_PA_HANDLE_16)).thenReturn(
265ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                makeMultiUserPhoneAccount(TEL_PA_HANDLE_16).build());
266ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
267ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        PhoneAccountHandle returnedHandle
268ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                = mTSIBinder.getUserSelectedOutgoingPhoneAccount();
269ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertEquals(TEL_PA_HANDLE_16, returnedHandle);
270ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
271ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
27284b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
273ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testSetUserSelectedOutgoingPhoneAccount() throws RemoteException {
274ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        mTSIBinder.setUserSelectedOutgoingPhoneAccount(TEL_PA_HANDLE_16);
275ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        verify(mFakePhoneAccountRegistrar)
276ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .setUserSelectedOutgoingPhoneAccount(eq(TEL_PA_HANDLE_16), any(UserHandle.class));
277ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
278ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
27984b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
280ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testSetUserSelectedOutgoingPhoneAccountFailure() throws RemoteException {
281ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doThrow(new SecurityException()).when(mContext).enforceCallingOrSelfPermission(
282ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                anyString(), anyString());
283ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        try {
284ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            mTSIBinder.setUserSelectedOutgoingPhoneAccount(TEL_PA_HANDLE_16);
285ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        } catch (SecurityException e) {
286ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            // desired result
287ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
288ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        verify(mFakePhoneAccountRegistrar, never())
289ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .setUserSelectedOutgoingPhoneAccount(
290ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                        any(PhoneAccountHandle.class), any(UserHandle.class));
291ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
292ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
29384b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
294ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testGetCallCapablePhoneAccounts() throws RemoteException {
295ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        List<PhoneAccountHandle> fullPHList = new ArrayList<PhoneAccountHandle>() {{
296ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            add(TEL_PA_HANDLE_16);
297ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            add(SIP_PA_HANDLE_17);
298ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }};
299ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
300ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        List<PhoneAccountHandle> smallPHList = new ArrayList<PhoneAccountHandle>() {{
301ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            add(SIP_PA_HANDLE_17);
302ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }};
303ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        // Returns all phone accounts when getCallCapablePhoneAccounts is called.
304ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(mFakePhoneAccountRegistrar
305ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .getCallCapablePhoneAccounts(anyString(), eq(true), any(UserHandle.class)))
306ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .thenReturn(fullPHList);
307ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        // Returns only enabled phone accounts when getCallCapablePhoneAccounts is called.
308ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(mFakePhoneAccountRegistrar
309ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .getCallCapablePhoneAccounts(anyString(), eq(false), any(UserHandle.class)))
310ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .thenReturn(smallPHList);
311ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        makeAccountsVisibleToAllUsers(TEL_PA_HANDLE_16, SIP_PA_HANDLE_17);
312ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
313ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertEquals(fullPHList,
314ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                mTSIBinder.getCallCapablePhoneAccounts(true, DEFAULT_DIALER_PACKAGE));
315ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertEquals(smallPHList,
316ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                mTSIBinder.getCallCapablePhoneAccounts(false, DEFAULT_DIALER_PACKAGE));
317ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
318ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
31984b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
320ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testGetCallCapablePhoneAccountsFailure() throws RemoteException {
321ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        List<String> enforcedPermissions = new ArrayList<String>() {{
322ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            add(READ_PHONE_STATE);
323ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            add(READ_PRIVILEGED_PHONE_STATE);
324ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }};
325ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doThrow(new SecurityException()).when(mContext).enforceCallingOrSelfPermission(
326ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                argThat(new AnyStringIn(enforcedPermissions)), anyString());
327ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
328ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        List<PhoneAccountHandle> result = null;
329ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        try {
330ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            result = mTSIBinder.getCallCapablePhoneAccounts(true, "");
331ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        } catch (SecurityException e) {
332ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            // intended behavior
333ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
334ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertNull(result);
335ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        verify(mFakePhoneAccountRegistrar, never())
336ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .getCallCapablePhoneAccounts(anyString(), anyBoolean(), any(UserHandle.class));
337ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
338ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
33984b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
340ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testGetPhoneAccountsSupportingScheme() throws RemoteException {
341ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        List<PhoneAccountHandle> sipPHList = new ArrayList<PhoneAccountHandle>() {{
342ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            add(SIP_PA_HANDLE_17);
343ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }};
344ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
345ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        List<PhoneAccountHandle> telPHList = new ArrayList<PhoneAccountHandle>() {{
346ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            add(TEL_PA_HANDLE_16);
347ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }};
348ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(mFakePhoneAccountRegistrar
349ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .getCallCapablePhoneAccounts(eq("tel"), anyBoolean(), any(UserHandle.class)))
350ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .thenReturn(telPHList);
351ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(mFakePhoneAccountRegistrar
352ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .getCallCapablePhoneAccounts(eq("sip"), anyBoolean(), any(UserHandle.class)))
353ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .thenReturn(sipPHList);
354ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        makeAccountsVisibleToAllUsers(TEL_PA_HANDLE_16, SIP_PA_HANDLE_17);
355ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
356ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertEquals(telPHList,
357ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                mTSIBinder.getPhoneAccountsSupportingScheme("tel", DEFAULT_DIALER_PACKAGE));
358ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertEquals(sipPHList,
359ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                mTSIBinder.getPhoneAccountsSupportingScheme("sip", DEFAULT_DIALER_PACKAGE));
360ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
361ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
36284b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
363ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testGetPhoneAccountsForPackage() throws RemoteException {
364ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        List<PhoneAccountHandle> phoneAccountHandleList = new ArrayList<PhoneAccountHandle>() {{
365ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            add(TEL_PA_HANDLE_16);
366ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            add(SIP_PA_HANDLE_17);
367ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }};
368ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(mFakePhoneAccountRegistrar
369ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .getPhoneAccountsForPackage(anyString(), any(UserHandle.class)))
370ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .thenReturn(phoneAccountHandleList);
371ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        makeAccountsVisibleToAllUsers(TEL_PA_HANDLE_16, SIP_PA_HANDLE_17);
372ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertEquals(phoneAccountHandleList,
373ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                mTSIBinder.getPhoneAccountsForPackage(
374ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                        TEL_PA_HANDLE_16.getComponentName().getPackageName()));
375ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
376ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
37784b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
378ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testGetPhoneAccount() throws RemoteException {
379ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        makeAccountsVisibleToAllUsers(TEL_PA_HANDLE_16, SIP_PA_HANDLE_17);
380ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertEquals(TEL_PA_HANDLE_16, mTSIBinder.getPhoneAccount(TEL_PA_HANDLE_16)
381ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .getAccountHandle());
382ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertEquals(SIP_PA_HANDLE_17, mTSIBinder.getPhoneAccount(SIP_PA_HANDLE_17)
383ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .getAccountHandle());
384ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
385ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
38684b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
387ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testGetAllPhoneAccounts() throws RemoteException {
388ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        List<PhoneAccount> phoneAccountList = new ArrayList<PhoneAccount>() {{
389ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            add(makePhoneAccount(TEL_PA_HANDLE_16).build());
390ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            add(makePhoneAccount(SIP_PA_HANDLE_17).build());
391ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }};
392ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(mFakePhoneAccountRegistrar.getAllPhoneAccounts(any(UserHandle.class)))
393ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .thenReturn(phoneAccountList);
394ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
395ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertEquals(2, mTSIBinder.getAllPhoneAccounts().size());
396ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
397ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
39884b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
399ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testRegisterPhoneAccount() throws RemoteException {
400ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        String packageNameToUse = "com.android.officialpackage";
401ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        PhoneAccountHandle phHandle = new PhoneAccountHandle(new ComponentName(
402ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                packageNameToUse, "cs"), "test", Binder.getCallingUserHandle());
403ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        PhoneAccount phoneAccount = makePhoneAccount(phHandle).build();
404ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doReturn(PackageManager.PERMISSION_GRANTED)
405ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .when(mContext).checkCallingOrSelfPermission(MODIFY_PHONE_STATE);
406ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
407ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        registerPhoneAccountTestHelper(phoneAccount, true);
408ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
409ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
41084b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
411ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testRegisterPhoneAccountWithoutModifyPermission() throws RemoteException {
412ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        // tests the case where the package does not have MODIFY_PHONE_STATE but is
413ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        // registering its own phone account as a third-party connection service
414ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        String packageNameToUse = "com.thirdparty.connectionservice";
415ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        PhoneAccountHandle phHandle = new PhoneAccountHandle(new ComponentName(
416ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                packageNameToUse, "cs"), "asdf", Binder.getCallingUserHandle());
417ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        PhoneAccount phoneAccount = makePhoneAccount(phHandle).build();
418ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
419ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doReturn(PackageManager.PERMISSION_DENIED)
420ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .when(mContext).checkCallingOrSelfPermission(MODIFY_PHONE_STATE);
421ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        PackageManager pm = mContext.getPackageManager();
422ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(pm.hasSystemFeature(PackageManager.FEATURE_CONNECTION_SERVICE)).thenReturn(true);
423ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
424ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        registerPhoneAccountTestHelper(phoneAccount, true);
425ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
426ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
42784b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
428ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testRegisterPhoneAccountWithoutModifyPermissionFailure() throws RemoteException {
429ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        // tests the case where the third party package should not be allowed to register a phone
430ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        // account due to the lack of modify permission.
431ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        String packageNameToUse = "com.thirdparty.connectionservice";
432ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        PhoneAccountHandle phHandle = new PhoneAccountHandle(new ComponentName(
433ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                packageNameToUse, "cs"), "asdf", Binder.getCallingUserHandle());
434ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        PhoneAccount phoneAccount = makePhoneAccount(phHandle).build();
435ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
436ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doReturn(PackageManager.PERMISSION_DENIED)
437ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .when(mContext).checkCallingOrSelfPermission(MODIFY_PHONE_STATE);
438ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        PackageManager pm = mContext.getPackageManager();
439ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(pm.hasSystemFeature(PackageManager.FEATURE_CONNECTION_SERVICE)).thenReturn(false);
440ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
441ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        registerPhoneAccountTestHelper(phoneAccount, false);
442ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
443ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
44484b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
445ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testRegisterPhoneAccountWithoutSimSubscriptionPermissionFailure()
446ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            throws RemoteException {
447ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        String packageNameToUse = "com.thirdparty.connectionservice";
448ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        PhoneAccountHandle phHandle = new PhoneAccountHandle(new ComponentName(
449ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                packageNameToUse, "cs"), "asdf", Binder.getCallingUserHandle());
450ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        PhoneAccount phoneAccount = makePhoneAccount(phHandle)
451ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .setCapabilities(PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION).build();
452ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
453ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doReturn(PackageManager.PERMISSION_GRANTED)
454ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .when(mContext).checkCallingOrSelfPermission(MODIFY_PHONE_STATE);
455ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doThrow(new SecurityException())
456ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .when(mContext)
457ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .enforceCallingOrSelfPermission(eq(REGISTER_SIM_SUBSCRIPTION), anyString());
458ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
459ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        registerPhoneAccountTestHelper(phoneAccount, false);
460ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
461ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
46284b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
463ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testRegisterPhoneAccountWithoutMultiUserPermissionFailure()
464ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            throws Exception {
465ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        String packageNameToUse = "com.thirdparty.connectionservice";
466ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        PhoneAccountHandle phHandle = new PhoneAccountHandle(new ComponentName(
467ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                packageNameToUse, "cs"), "asdf", Binder.getCallingUserHandle());
468ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        PhoneAccount phoneAccount = makeMultiUserPhoneAccount(phHandle).build();
469ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
470ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doReturn(PackageManager.PERMISSION_GRANTED)
471ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .when(mContext).checkCallingOrSelfPermission(MODIFY_PHONE_STATE);
472ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
473ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        PackageManager packageManager = mContext.getPackageManager();
474ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(packageManager.getApplicationInfo(packageNameToUse, PackageManager.GET_META_DATA))
475ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .thenReturn(new ApplicationInfo());
476ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
477ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        registerPhoneAccountTestHelper(phoneAccount, false);
478ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
479ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
480ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private void registerPhoneAccountTestHelper(PhoneAccount testPhoneAccount,
481ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            boolean shouldSucceed) throws RemoteException {
482ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
483ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        boolean didExceptionOccur = false;
484ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        try {
485ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            mTSIBinder.registerPhoneAccount(testPhoneAccount);
486ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        } catch (Exception e) {
487ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            didExceptionOccur = true;
488ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
489ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
490ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        if (shouldSucceed) {
491ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            assertFalse(didExceptionOccur);
492ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            verify(mFakePhoneAccountRegistrar).registerPhoneAccount(testPhoneAccount);
493ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            verify(mContext).sendBroadcastAsUser(intentCaptor.capture(), eq(UserHandle.ALL),
494ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                    anyString());
495ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
496ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            Intent capturedIntent = intentCaptor.getValue();
497ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            assertEquals(TelecomManager.ACTION_PHONE_ACCOUNT_REGISTERED,
498ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                    capturedIntent.getAction());
499ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            Bundle intentExtras = capturedIntent.getExtras();
500ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            assertEquals(1, intentExtras.size());
501ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            assertEquals(testPhoneAccount.getAccountHandle(),
502ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                    intentExtras.get(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE));
503ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        } else {
504ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            assertTrue(didExceptionOccur);
505ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            verify(mFakePhoneAccountRegistrar, never())
506ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                    .registerPhoneAccount(any(PhoneAccount.class));
507ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            verify(mContext, never())
508ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                    .sendBroadcastAsUser(any(Intent.class), any(UserHandle.class), anyString());
509ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
510ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
511ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
51284b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
513ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testUnregisterPhoneAccount() throws RemoteException {
514ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        String packageNameToUse = "com.android.officialpackage";
515ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        PhoneAccountHandle phHandle = new PhoneAccountHandle(new ComponentName(
516ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                packageNameToUse, "cs"), "test", Binder.getCallingUserHandle());
517ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
518ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
519ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doReturn(PackageManager.PERMISSION_GRANTED)
520ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .when(mContext).checkCallingOrSelfPermission(MODIFY_PHONE_STATE);
521ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
522ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        mTSIBinder.unregisterPhoneAccount(phHandle);
523ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        verify(mFakePhoneAccountRegistrar).unregisterPhoneAccount(phHandle);
524ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        verify(mContext).sendBroadcastAsUser(intentCaptor.capture(), eq(UserHandle.ALL),
525ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                anyString());
526ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        Intent capturedIntent = intentCaptor.getValue();
527ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertEquals(TelecomManager.ACTION_PHONE_ACCOUNT_UNREGISTERED,
528ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                capturedIntent.getAction());
529ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        Bundle intentExtras = capturedIntent.getExtras();
530ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertEquals(1, intentExtras.size());
531ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertEquals(phHandle, intentExtras.get(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE));
532ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
533ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
53484b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
535ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testUnregisterPhoneAccountFailure() throws RemoteException {
536ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        String packageNameToUse = "com.thirdparty.connectionservice";
537ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        PhoneAccountHandle phHandle = new PhoneAccountHandle(new ComponentName(
538ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                packageNameToUse, "cs"), "asdf", Binder.getCallingUserHandle());
539ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
540ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doReturn(PackageManager.PERMISSION_DENIED)
541ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .when(mContext).checkCallingOrSelfPermission(MODIFY_PHONE_STATE);
542ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        PackageManager pm = mContext.getPackageManager();
543ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(pm.hasSystemFeature(PackageManager.FEATURE_CONNECTION_SERVICE)).thenReturn(false);
544ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
545ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        try {
546ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            mTSIBinder.unregisterPhoneAccount(phHandle);
547ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        } catch (UnsupportedOperationException e) {
548ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            // expected behavior
549ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
550ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        verify(mFakePhoneAccountRegistrar, never())
551ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .unregisterPhoneAccount(any(PhoneAccountHandle.class));
552ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        verify(mContext, never())
553ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .sendBroadcastAsUser(any(Intent.class), any(UserHandle.class), anyString());
554ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
555ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
55684b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
557ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testAddNewIncomingCall() throws Exception {
558c34d474f16c40a0a5595cefbe455e4fd34d535d8Brad Ebinger        PhoneAccount phoneAccount = makePhoneAccount(TEL_PA_HANDLE_CURRENT).build();
559c34d474f16c40a0a5595cefbe455e4fd34d535d8Brad Ebinger        phoneAccount.setIsEnabled(true);
560c34d474f16c40a0a5595cefbe455e4fd34d535d8Brad Ebinger        doReturn(phoneAccount).when(mFakePhoneAccountRegistrar).getPhoneAccount(
561c34d474f16c40a0a5595cefbe455e4fd34d535d8Brad Ebinger                eq(TEL_PA_HANDLE_CURRENT), any(UserHandle.class));
562ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doNothing().when(mAppOpsManager).checkPackage(anyInt(), anyString());
563ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        Bundle extras = createSampleExtras();
564ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
565ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        mTSIBinder.addNewIncomingCall(TEL_PA_HANDLE_CURRENT, extras);
566ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
567ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        addCallTestHelper(TelecomManager.ACTION_INCOMING_CALL,
568ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                CallIntentProcessor.KEY_IS_INCOMING_CALL, extras, false);
569ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
570ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
57184b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
572ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testAddNewIncomingCallFailure() throws Exception {
573ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        try {
574ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            mTSIBinder.addNewIncomingCall(TEL_PA_HANDLE_16, null);
575ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        } catch (SecurityException e) {
576ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            // expected
577ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
578ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
579ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doThrow(new SecurityException()).when(mAppOpsManager).checkPackage(anyInt(), anyString());
580ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
581ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        try {
582ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            mTSIBinder.addNewIncomingCall(TEL_PA_HANDLE_CURRENT, null);
583ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        } catch (SecurityException e) {
584ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            // expected
585ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
586ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
587ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        // Verify that neither of these attempts got through
588ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        verify(mCallIntentProcessorAdapter, never())
589ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .processIncomingCallIntent(any(CallsManager.class), any(Intent.class));
590ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
591ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
59284b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
593ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testAddNewUnknownCall() throws Exception {
594c34d474f16c40a0a5595cefbe455e4fd34d535d8Brad Ebinger        PhoneAccount phoneAccount = makePhoneAccount(TEL_PA_HANDLE_CURRENT).build();
595c34d474f16c40a0a5595cefbe455e4fd34d535d8Brad Ebinger        phoneAccount.setIsEnabled(true);
596c34d474f16c40a0a5595cefbe455e4fd34d535d8Brad Ebinger        doReturn(phoneAccount).when(mFakePhoneAccountRegistrar).getPhoneAccount(
597c34d474f16c40a0a5595cefbe455e4fd34d535d8Brad Ebinger                eq(TEL_PA_HANDLE_CURRENT), any(UserHandle.class));
598ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doNothing().when(mAppOpsManager).checkPackage(anyInt(), anyString());
599ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        Bundle extras = createSampleExtras();
600ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
601ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        mTSIBinder.addNewUnknownCall(TEL_PA_HANDLE_CURRENT, extras);
602ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
603ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        addCallTestHelper(TelecomManager.ACTION_NEW_UNKNOWN_CALL,
604ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                CallIntentProcessor.KEY_IS_UNKNOWN_CALL, extras, true);
605ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
606ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
60784b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
608ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testAddNewUnknownCallFailure() throws Exception {
609ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        try {
610ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            mTSIBinder.addNewUnknownCall(TEL_PA_HANDLE_16, null);
611ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        } catch (SecurityException e) {
612ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            // expected
613ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
614ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
615ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doThrow(new SecurityException()).when(mAppOpsManager).checkPackage(anyInt(), anyString());
616ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
617ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        try {
618ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            mTSIBinder.addNewUnknownCall(TEL_PA_HANDLE_CURRENT, null);
619ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        } catch (SecurityException e) {
620ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            // expected
621ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
622ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
623ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        // Verify that neither of these attempts got through
624ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        verify(mCallIntentProcessorAdapter, never())
625ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .processIncomingCallIntent(any(CallsManager.class), any(Intent.class));
626ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
627ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
628ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private void addCallTestHelper(String expectedAction, String extraCallKey,
629ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            Bundle expectedExtras, boolean isUnknown) {
630ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
631ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        if (isUnknown) {
632ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            verify(mCallIntentProcessorAdapter).processUnknownCallIntent(any(CallsManager.class),
633ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                    intentCaptor.capture());
634ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        } else {
635ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            verify(mCallIntentProcessorAdapter).processIncomingCallIntent(any(CallsManager.class),
636ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                    intentCaptor.capture());
637ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
638ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        Intent capturedIntent = intentCaptor.getValue();
639ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertEquals(expectedAction, capturedIntent.getAction());
640ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        Bundle intentExtras = capturedIntent.getExtras();
641ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertEquals(TEL_PA_HANDLE_CURRENT,
642ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                intentExtras.get(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE));
643ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertTrue(intentExtras.getBoolean(extraCallKey));
644ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
645ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        if (isUnknown) {
646ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            for (String expectedKey : expectedExtras.keySet()) {
647ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                assertTrue(intentExtras.containsKey(expectedKey));
648ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                assertEquals(expectedExtras.get(expectedKey), intentExtras.get(expectedKey));
649ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            }
650ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
651ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        else {
652ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            assertTrue(areBundlesEqual(expectedExtras,
653ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                    (Bundle) intentExtras.get(TelecomManager.EXTRA_INCOMING_CALL_EXTRAS)));
654ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
655ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
656ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
65784b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
658ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testPlaceCallWithNonEmergencyPermission() throws Exception {
659ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        Uri handle = Uri.parse("tel:6505551234");
660ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        Bundle extras = createSampleExtras();
661ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
662ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(mAppOpsManager.noteOp(eq(AppOpsManager.OP_CALL_PHONE), anyInt(), anyString()))
663ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .thenReturn(AppOpsManager.MODE_ALLOWED);
664ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doReturn(PackageManager.PERMISSION_GRANTED)
665ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .when(mContext).checkCallingPermission(CALL_PHONE);
666ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
667ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        mTSIBinder.placeCall(handle, extras, DEFAULT_DIALER_PACKAGE);
668ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        placeCallTestHelper(handle, extras, true);
669ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
670ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
67184b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
672ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testPlaceCallWithAppOpsOff() throws Exception {
673ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        Uri handle = Uri.parse("tel:6505551234");
674ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        Bundle extras = createSampleExtras();
675ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
676ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(mAppOpsManager.noteOp(eq(AppOpsManager.OP_CALL_PHONE), anyInt(), anyString()))
677ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .thenReturn(AppOpsManager.MODE_IGNORED);
678ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doReturn(PackageManager.PERMISSION_GRANTED)
679ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .when(mContext).checkCallingPermission(CALL_PHONE);
680ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
681ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        mTSIBinder.placeCall(handle, extras, DEFAULT_DIALER_PACKAGE);
682ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        placeCallTestHelper(handle, extras, false);
683ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
684ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
68584b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
686ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testPlaceCallWithNoCallingPermission() throws Exception {
687ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        Uri handle = Uri.parse("tel:6505551234");
688ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        Bundle extras = createSampleExtras();
689ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
690ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        when(mAppOpsManager.noteOp(eq(AppOpsManager.OP_CALL_PHONE), anyInt(), anyString()))
691ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .thenReturn(AppOpsManager.MODE_ALLOWED);
692ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doReturn(PackageManager.PERMISSION_DENIED)
693ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .when(mContext).checkCallingPermission(CALL_PHONE);
694ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
695ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        mTSIBinder.placeCall(handle, extras, DEFAULT_DIALER_PACKAGE);
696ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        placeCallTestHelper(handle, extras, false);
697ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
698ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
699ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private void placeCallTestHelper(Uri expectedHandle, Bundle expectedExtras,
700ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            boolean shouldNonEmergencyBeAllowed) {
701ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
702ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        verify(mUserCallIntentProcessor).processIntent(intentCaptor.capture(), anyString(),
703ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                eq(shouldNonEmergencyBeAllowed));
704ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        Intent capturedIntent = intentCaptor.getValue();
705ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertEquals(Intent.ACTION_CALL, capturedIntent.getAction());
706ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertEquals(expectedHandle, capturedIntent.getData());
707ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertTrue(areBundlesEqual(expectedExtras, capturedIntent.getExtras()));
708ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
709ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
71084b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
711ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testPlaceCallFailure() throws Exception {
712ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        Uri handle = Uri.parse("tel:6505551234");
713ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        Bundle extras = createSampleExtras();
714ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
715ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doThrow(new SecurityException())
716ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .when(mContext).enforceCallingOrSelfPermission(eq(CALL_PHONE), anyString());
717ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
718ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        try {
719ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            mTSIBinder.placeCall(handle, extras, "arbitrary_package_name");
720ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        } catch (SecurityException e) {
721ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            // expected
722ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
723ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
724ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        verify(mUserCallIntentProcessor, never())
725ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .processIntent(any(Intent.class), anyString(), anyBoolean());
726ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
727ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
72884b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
729ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testSetDefaultDialer() throws Exception {
730ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        String packageName = "sample.package";
731ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
732ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doReturn(true)
733ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .when(mDefaultDialerManagerAdapter)
734ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                .setDefaultDialerApplication(any(Context.class), eq(packageName));
735ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
736ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        mTSIBinder.setDefaultDialer(packageName);
737ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
738ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        verify(mDefaultDialerManagerAdapter).setDefaultDialerApplication(any(Context.class),
739ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                eq(packageName));
740ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
741ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        verify(mContext).sendBroadcastAsUser(intentCaptor.capture(), any(UserHandle.class));
742ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        Intent capturedIntent = intentCaptor.getValue();
743ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertEquals(TelecomManager.ACTION_DEFAULT_DIALER_CHANGED, capturedIntent.getAction());
744ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        String packageNameExtra = capturedIntent.getStringExtra(
745ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME);
746ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertEquals(packageName, packageNameExtra);
747ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
748ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
74984b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
750ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    public void testSetDefaultDialerNoModifyPhoneStatePermission() throws Exception {
751ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doThrow(new SecurityException()).when(mContext).enforceCallingOrSelfPermission(
752ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                eq(MODIFY_PHONE_STATE), anyString());
753ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        setDefaultDialerFailureTestHelper();
754ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
755ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
75684b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
7570a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    public void testSetDefaultDialerNoWriteSecureSettingsPermission() throws Exception {
758ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        doThrow(new SecurityException()).when(mContext).enforceCallingOrSelfPermission(
759ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                eq(WRITE_SECURE_SETTINGS), anyString());
760ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        setDefaultDialerFailureTestHelper();
761ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
762ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
763ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private void setDefaultDialerFailureTestHelper() throws Exception {
764ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        boolean exceptionThrown = false;
765ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        try {
766ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            mTSIBinder.setDefaultDialer(DEFAULT_DIALER_PACKAGE);
767ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        } catch (SecurityException e) {
768ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            exceptionThrown = true;
769ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
770ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        assertTrue(exceptionThrown);
771ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        verify(mDefaultDialerManagerAdapter, never()).setDefaultDialerApplication(
772ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                any(Context.class), anyString());
773ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        verify(mContext, never()).sendBroadcastAsUser(any(Intent.class), any(UserHandle.class));
774ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
775ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
77684b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
7770a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    public void testIsVoicemailNumber() throws Exception {
7780a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        String vmNumber = "010";
7790a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        makeAccountsVisibleToAllUsers(TEL_PA_HANDLE_CURRENT);
7800a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu
7810a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        doReturn(true).when(mFakePhoneAccountRegistrar).isVoiceMailNumber(TEL_PA_HANDLE_CURRENT,
7820a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu                vmNumber);
7830a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        assertTrue(mTSIBinder.isVoiceMailNumber(TEL_PA_HANDLE_CURRENT,
7840a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu                vmNumber, DEFAULT_DIALER_PACKAGE));
7850a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    }
7860a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu
78784b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
7880a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    public void testIsVoicemailNumberAccountNotVisibleFailure() throws Exception {
7890a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        String vmNumber = "010";
7900a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu
7910a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        doReturn(true).when(mFakePhoneAccountRegistrar).isVoiceMailNumber(TEL_PA_HANDLE_CURRENT,
7920a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu                vmNumber);
7930a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu
7940a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        when(mFakePhoneAccountRegistrar.getPhoneAccount(TEL_PA_HANDLE_CURRENT,
7950a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu                Binder.getCallingUserHandle())).thenReturn(null);
7960a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        assertFalse(mTSIBinder
7970a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu                .isVoiceMailNumber(TEL_PA_HANDLE_CURRENT, vmNumber, DEFAULT_DIALER_PACKAGE));
7980a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    }
7990a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu
80084b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
8010a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    public void testGetVoicemailNumberWithNullAccountHandle() throws Exception {
8020a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        when(mFakePhoneAccountRegistrar.getPhoneAccount(isNull(PhoneAccountHandle.class),
8030a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu                eq(Binder.getCallingUserHandle())))
8040a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu                .thenReturn(makePhoneAccount(TEL_PA_HANDLE_CURRENT).build());
8050a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        int subId = 58374;
8060a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        String vmNumber = "543";
8070a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        doReturn(subId).when(mSubscriptionManagerAdapter).getDefaultVoiceSubId();
8080a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu
8090a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        TelephonyManager mockTelephonyManager =
8100a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu                (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
8110a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        when(mockTelephonyManager.getVoiceMailNumber(subId)).thenReturn(vmNumber);
8120a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu
8130a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        assertEquals(vmNumber, mTSIBinder.getVoiceMailNumber(null, DEFAULT_DIALER_PACKAGE));
8140a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    }
8150a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu
81684b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
8170a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    public void testGetVoicemailNumberWithNonNullAccountHandle() throws Exception {
8180a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        when(mFakePhoneAccountRegistrar.getPhoneAccount(eq(TEL_PA_HANDLE_CURRENT),
8190a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu                eq(Binder.getCallingUserHandle())))
8200a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu                .thenReturn(makePhoneAccount(TEL_PA_HANDLE_CURRENT).build());
8210a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        int subId = 58374;
8220a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        String vmNumber = "543";
8230a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu
8240a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        TelephonyManager mockTelephonyManager =
8250a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu                (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
8260a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        when(mockTelephonyManager.getVoiceMailNumber(subId)).thenReturn(vmNumber);
8270a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        when(mFakePhoneAccountRegistrar.getSubscriptionIdForPhoneAccount(TEL_PA_HANDLE_CURRENT))
8280a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu                .thenReturn(subId);
8290a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu
8300a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        assertEquals(vmNumber,
8310a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu                mTSIBinder.getVoiceMailNumber(TEL_PA_HANDLE_CURRENT, DEFAULT_DIALER_PACKAGE));
8320a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    }
8330a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu
83484b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
8350a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    public void testGetLine1Number() throws Exception {
8360a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        int subId = 58374;
8370a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        String line1Number = "9482752023479";
8380a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        makeAccountsVisibleToAllUsers(TEL_PA_HANDLE_CURRENT);
8390a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        when(mFakePhoneAccountRegistrar.getSubscriptionIdForPhoneAccount(TEL_PA_HANDLE_CURRENT))
8400a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu                .thenReturn(subId);
8410a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        TelephonyManager mockTelephonyManager =
8420a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu                (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
843ce68874475498dcb69a543559177d69ac6dae215Shishir Agrawal        when(mockTelephonyManager.getLine1Number(subId)).thenReturn(line1Number);
8440a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu
8450a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        assertEquals(line1Number,
8460a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu                mTSIBinder.getLine1Number(TEL_PA_HANDLE_CURRENT, DEFAULT_DIALER_PACKAGE));
8470a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    }
8480a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu
84984b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
8500a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    public void testEndCallWithRingingForegroundCall() throws Exception {
8510a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        Call call = mock(Call.class);
8520a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        when(call.getState()).thenReturn(CallState.RINGING);
8530a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        when(mFakeCallsManager.getForegroundCall()).thenReturn(call);
8540a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        assertTrue(mTSIBinder.endCall());
8550a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        verify(call).reject(false, null);
8560a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    }
8570a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu
85884b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
8590a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    public void testEndCallWithNonRingingForegroundCall() throws Exception {
8600a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        Call call = mock(Call.class);
8610a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        when(call.getState()).thenReturn(CallState.ACTIVE);
8620a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        when(mFakeCallsManager.getForegroundCall()).thenReturn(call);
8630a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        assertTrue(mTSIBinder.endCall());
8640a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        verify(call).disconnect();
8650a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    }
8660a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu
86784b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
8680a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    public void testEndCallWithNoForegroundCall() throws Exception {
8690a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        Call call = mock(Call.class);
8700a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        when(call.getState()).thenReturn(CallState.ACTIVE);
871609992b6d222e54a74cc7e6af06173090103a28aHall Liu        when(mFakeCallsManager.getFirstCallWithState(argThat(new IntVarArgMatcher())))
8720a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu                .thenReturn(call);
8730a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        assertTrue(mTSIBinder.endCall());
8740a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        verify(call).disconnect();
8750a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    }
8760a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu
87784b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
8780a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    public void testEndCallWithNoCalls() throws Exception {
8790a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        assertFalse(mTSIBinder.endCall());
8800a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    }
8810a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu
88284b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
8830a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    public void testAcceptRingingCall() throws Exception {
8840a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        Call call = mock(Call.class);
8850a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        when(mFakeCallsManager.getFirstCallWithState(any(int[].class)))
8860a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu                .thenReturn(call);
8870a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        // Not intended to be a real video state. Here to ensure that the call will be answered
8880a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        // with whatever video state it's currently in.
8890a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        int fakeVideoState = 29578215;
8900a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        when(call.getVideoState()).thenReturn(fakeVideoState);
8910a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        mTSIBinder.acceptRingingCall();
8920a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        verify(call).answer(fakeVideoState);
8930a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    }
8940a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu
89584b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu    @SmallTest
8960a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    public void testAcceptRingingCallWithValidVideoState() throws Exception {
8970a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        Call call = mock(Call.class);
8980a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        when(mFakeCallsManager.getFirstCallWithState(any(int[].class)))
8990a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu                .thenReturn(call);
9000a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        // Not intended to be a real video state. Here to ensure that the call will be answered
9010a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        // with the video state passed in to acceptRingingCallWithVideoState
9020a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        int fakeVideoState = 29578215;
9030a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        int realVideoState = VideoProfile.STATE_RX_ENABLED | VideoProfile.STATE_TX_ENABLED;
9040a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        when(call.getVideoState()).thenReturn(fakeVideoState);
9050a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        mTSIBinder.acceptRingingCallWithVideoState(realVideoState);
9060a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        verify(call).answer(realVideoState);
9070a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    }
9080a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu
909ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    /**
910ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu     * Register phone accounts for the supplied PhoneAccountHandles to make them
911ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu     * visible to all users (via the isVisibleToCaller method in TelecomServiceImpl.
912ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu     * @param handles the handles for which phone accounts should be created for.
913ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu     */
914ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private void makeAccountsVisibleToAllUsers(PhoneAccountHandle... handles) {
915ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        for (PhoneAccountHandle ph : handles) {
916ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            when(mFakePhoneAccountRegistrar.getPhoneAccountUnchecked(eq(ph))).thenReturn(
917ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                    makeMultiUserPhoneAccount(ph).build());
918ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            when(mFakePhoneAccountRegistrar
919ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                    .getPhoneAccount(eq(ph), any(UserHandle.class), anyBoolean()))
920ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                    .thenReturn(makeMultiUserPhoneAccount(ph).build());
9210a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu            when(mFakePhoneAccountRegistrar
9220a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu                    .getPhoneAccount(eq(ph), any(UserHandle.class)))
9230a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu                    .thenReturn(makeMultiUserPhoneAccount(ph).build());
924ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
925ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
926ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
927ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private PhoneAccount.Builder makeMultiUserPhoneAccount(PhoneAccountHandle paHandle) {
928ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        PhoneAccount.Builder paBuilder = makePhoneAccount(paHandle);
929ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        paBuilder.setCapabilities(PhoneAccount.CAPABILITY_MULTI_USER);
930ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        return paBuilder;
931ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
932ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
933ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private PhoneAccount.Builder makePhoneAccount(PhoneAccountHandle paHandle) {
934ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        return new PhoneAccount.Builder(paHandle, "testLabel");
935ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
936ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
937ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private Bundle createSampleExtras() {
938ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        Bundle extras = new Bundle();
939ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        extras.putString("test_key", "test_value");
940ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        return extras;
941ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
942ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
943ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private static boolean areBundlesEqual(Bundle b1, Bundle b2) {
944ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        for (String key1 : b1.keySet()) {
945ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            if (!b1.get(key1).equals(b2.get(key1))) {
946ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                return false;
947ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            }
948ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
949ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
950ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        for (String key2 : b2.keySet()) {
951ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            if (!b2.get(key2).equals(b1.get(key2))) {
952ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                return false;
953ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            }
954ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
955ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        return true;
956ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
957ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu}
958