1f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon/*
2f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon * Copyright (C) 2014 The Android Open Source Project
3f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon *
4f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon * Licensed under the Apache License, Version 2.0 (the "License");
5f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon * you may not use this file except in compliance with the License.
6f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon * You may obtain a copy of the License at
7f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon *
8f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon *      http://www.apache.org/licenses/LICENSE-2.0
9f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon *
10f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon * Unless required by applicable law or agreed to in writing, software
11f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon * distributed under the License is distributed on an "AS IS" BASIS,
12f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon * See the License for the specific language governing permissions and
14f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon * limitations under the License.
15f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon */
16f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
17f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordonpackage com.android.server.telecom;
18f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
19cb0bd8a807c0b7d0c4db9fe9a48ea8cbf2efa97eYorke Leeimport static android.Manifest.permission.CALL_PHONE;
20ecd74a56dbce2d15ff46ad3e64a16dfe8b6c734fHall Liuimport static android.Manifest.permission.DUMP;
21cb0bd8a807c0b7d0c4db9fe9a48ea8cbf2efa97eYorke Leeimport static android.Manifest.permission.MODIFY_PHONE_STATE;
22cb0bd8a807c0b7d0c4db9fe9a48ea8cbf2efa97eYorke Leeimport static android.Manifest.permission.READ_PHONE_STATE;
233c2969304cf130119af613a37c50582bcfbf7921Amit Mahajanimport static android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE;
24cb0bd8a807c0b7d0c4db9fe9a48ea8cbf2efa97eYorke Leeimport static android.Manifest.permission.REGISTER_SIM_SUBSCRIPTION;
2571734c2db8a4e412d833b267777dd011e04cc942Yorke Leeimport static android.Manifest.permission.WRITE_SECURE_SETTINGS;
26cb0bd8a807c0b7d0c4db9fe9a48ea8cbf2efa97eYorke Lee
27a90ba73e6ca2e7e3ef88e41477bf595e03f9359fTyler Gunnimport android.Manifest;
28b3984309ff85330e0f99270d0bcd0e3d48055a6cYorke Leeimport android.app.ActivityManager;
29f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordonimport android.app.AppOpsManager;
30f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordonimport android.content.ComponentName;
31f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordonimport android.content.Context;
32f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordonimport android.content.Intent;
33f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordonimport android.content.pm.ApplicationInfo;
34f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordonimport android.content.pm.PackageManager;
35f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordonimport android.content.res.Resources;
36f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordonimport android.net.Uri;
37f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordonimport android.os.Binder;
38f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordonimport android.os.Bundle;
39240656f19c078b4f703d0502ce29114de0d45a50Tony Makimport android.os.Process;
40f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordonimport android.os.UserHandle;
41a3eccfee788c3ac3c831a443b085b141b39bb63dBrad Ebingerimport android.telecom.Log;
42f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordonimport android.telecom.PhoneAccount;
43f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordonimport android.telecom.PhoneAccountHandle;
44874c0f8fa95a5da5a82e67c1fe39697883d753ebHall Liuimport android.telecom.TelecomAnalytics;
45f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordonimport android.telecom.TelecomManager;
4642ef808c284791f21be8675174acc7297418fa45Tyler Gunnimport android.telecom.VideoProfile;
47f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordonimport android.telephony.SubscriptionManager;
48f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordonimport android.telephony.TelephonyManager;
493a04bdbd0ec0b970a3fa932b8de4f074d2faa417Tyler Gunnimport android.text.TextUtils;
5062da8e1505f887838dcd4895ebdb23a40b409515Brad Ebingerimport android.util.EventLog;
51f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
52f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordonimport com.android.internal.telecom.ITelecomService;
53f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordonimport com.android.internal.util.IndentingPrintWriter;
54ecda55454f4993003e71e09a63d20f94a216cc47Hall Liuimport com.android.server.telecom.components.UserCallIntentProcessorFactory;
55c926185584d458323465431c296c51fe52f87945Mohamedimport com.android.server.telecom.settings.BlockedNumbersActivity;
56f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
57f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordonimport java.io.FileDescriptor;
58f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordonimport java.io.PrintWriter;
5909611181c665403a8d9e70d95b7e0e4361976122Svet Ganovimport java.util.Collections;
60f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordonimport java.util.List;
61f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
62ccba720d2496060078a6551ffd1609c2dc7ce95cEugene Susla// TODO: Needed for move to system service: import com.android.internal.R;
63ccba720d2496060078a6551ffd1609c2dc7ce95cEugene Susla
64f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon/**
65f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon * Implementation of the ITelecom interface.
66f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon */
6778a5e6b9c1595c81f72d7a822617cb78db224e48Ihab Awadpublic class TelecomServiceImpl {
680a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu
690a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    public interface SubscriptionManagerAdapter {
700a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        int getDefaultVoiceSubId();
710a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    }
72ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
730a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    static class SubscriptionManagerAdapterImpl implements SubscriptionManagerAdapter {
740a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        @Override
750a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        public int getDefaultVoiceSubId() {
76ce68874475498dcb69a543559177d69ac6dae215Shishir Agrawal            return SubscriptionManager.getDefaultVoiceSubscriptionId();
770a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        }
78ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    }
790a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu
8042ef808c284791f21be8675174acc7297418fa45Tyler Gunn    private static final int DEFAULT_VIDEO_STATE = -1;
81738539670f87caa3edb6ba2b52f0ecba81ea25bdSantos Cordon
828d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad    private final ITelecomService.Stub mBinderImpl = new ITelecomService.Stub() {
83f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        @Override
8409611181c665403a8d9e70d95b7e0e4361976122Svet Ganov        public PhoneAccountHandle getDefaultOutgoingPhoneAccount(String uriScheme,
8509611181c665403a8d9e70d95b7e0e4361976122Svet Ganov                String callingPackage) {
8611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            try {
8711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.startSession("TSI.gDOPA");
8811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                synchronized (mLock) {
8911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    if (!canReadPhoneState(callingPackage, "getDefaultOutgoingPhoneAccount")) {
9011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        return null;
9111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    }
9209611181c665403a8d9e70d95b7e0e4361976122Svet Ganov
9311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    final UserHandle callingUserHandle = Binder.getCallingUserHandle();
9411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    long token = Binder.clearCallingIdentity();
9511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    try {
9611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        return mPhoneAccountRegistrar
9711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                                .getOutgoingPhoneAccountForScheme(uriScheme, callingUserHandle);
9811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    } catch (Exception e) {
9911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        Log.e(this, e, "getDefaultOutgoingPhoneAccount");
10011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        throw e;
10111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    } finally {
10211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        Binder.restoreCallingIdentity(token);
10311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    }
104f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon                }
10511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            } finally {
10611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.endSession();
107f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon            }
108f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        }
109f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
110f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        @Override
111f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        public PhoneAccountHandle getUserSelectedOutgoingPhoneAccount() {
1128d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad            synchronized (mLock) {
1138d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                try {
11411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    Log.startSession("TSI.gUSOPA");
115240656f19c078b4f703d0502ce29114de0d45a50Tony Mak                    final UserHandle callingUserHandle = Binder.getCallingUserHandle();
116240656f19c078b4f703d0502ce29114de0d45a50Tony Mak                    return mPhoneAccountRegistrar.getUserSelectedOutgoingPhoneAccount(
117240656f19c078b4f703d0502ce29114de0d45a50Tony Mak                            callingUserHandle);
1188d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                } catch (Exception e) {
1198d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                    Log.e(this, e, "getUserSelectedOutgoingPhoneAccount");
1208d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                    throw e;
12111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                } finally {
12211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    Log.endSession();
123f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon                }
124f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon            }
125f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        }
126f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
127f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        @Override
128f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        public void setUserSelectedOutgoingPhoneAccount(PhoneAccountHandle accountHandle) {
12911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            try {
13011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.startSession("TSI.sUSOPA");
13111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                synchronized (mLock) {
13211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    enforceModifyPermission();
13311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    UserHandle callingUserHandle = Binder.getCallingUserHandle();
13411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    long token = Binder.clearCallingIdentity();
13511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    try {
13611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        mPhoneAccountRegistrar.setUserSelectedOutgoingPhoneAccount(
13711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                                accountHandle, callingUserHandle);
13811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    } catch (Exception e) {
13911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        Log.e(this, e, "setUserSelectedOutgoingPhoneAccount");
14011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        throw e;
14111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    } finally {
14211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        Binder.restoreCallingIdentity(token);
14311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    }
1448d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                }
14511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            } finally {
14611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.endSession();
147f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon            }
148f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        }
149f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
150f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        @Override
151ea5cb93d81099f17654e0fdf9b8eda3bfa89f081Santos Cordon        public List<PhoneAccountHandle> getCallCapablePhoneAccounts(
152ea5cb93d81099f17654e0fdf9b8eda3bfa89f081Santos Cordon                boolean includeDisabledAccounts, String callingPackage) {
15311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            try {
15411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.startSession("TSI.gCCPA");
15511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                if (!canReadPhoneState(callingPackage, "getDefaultOutgoingPhoneAccount")) {
15611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    return Collections.emptyList();
1578d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                }
15811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                synchronized (mLock) {
15911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    final UserHandle callingUserHandle = Binder.getCallingUserHandle();
16011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    long token = Binder.clearCallingIdentity();
16111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    try {
16211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        return mPhoneAccountRegistrar.getCallCapablePhoneAccounts(null,
16311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                                includeDisabledAccounts, callingUserHandle);
16411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    } catch (Exception e) {
16511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        Log.e(this, e, "getCallCapablePhoneAccounts");
16611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        throw e;
16711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    } finally {
16851ad72199842935970b5eccc187bccd10a4b56a8Tyler Gunn                        Binder.restoreCallingIdentity(token);
16951ad72199842935970b5eccc187bccd10a4b56a8Tyler Gunn                    }
17051ad72199842935970b5eccc187bccd10a4b56a8Tyler Gunn                }
17151ad72199842935970b5eccc187bccd10a4b56a8Tyler Gunn            } finally {
17251ad72199842935970b5eccc187bccd10a4b56a8Tyler Gunn                Log.endSession();
17351ad72199842935970b5eccc187bccd10a4b56a8Tyler Gunn            }
17451ad72199842935970b5eccc187bccd10a4b56a8Tyler Gunn        }
17551ad72199842935970b5eccc187bccd10a4b56a8Tyler Gunn
17651ad72199842935970b5eccc187bccd10a4b56a8Tyler Gunn        @Override
17751ad72199842935970b5eccc187bccd10a4b56a8Tyler Gunn        public List<PhoneAccountHandle> getSelfManagedPhoneAccounts(String callingPackage) {
17851ad72199842935970b5eccc187bccd10a4b56a8Tyler Gunn            try {
17951ad72199842935970b5eccc187bccd10a4b56a8Tyler Gunn                Log.startSession("TSI.gSMPA");
18051ad72199842935970b5eccc187bccd10a4b56a8Tyler Gunn                if (!canReadPhoneState(callingPackage, "Requires READ_PHONE_STATE permission.")) {
18151ad72199842935970b5eccc187bccd10a4b56a8Tyler Gunn                    throw new SecurityException("Requires READ_PHONE_STATE permission.");
18251ad72199842935970b5eccc187bccd10a4b56a8Tyler Gunn                }
18351ad72199842935970b5eccc187bccd10a4b56a8Tyler Gunn                synchronized (mLock) {
18451ad72199842935970b5eccc187bccd10a4b56a8Tyler Gunn                    final UserHandle callingUserHandle = Binder.getCallingUserHandle();
18551ad72199842935970b5eccc187bccd10a4b56a8Tyler Gunn                    long token = Binder.clearCallingIdentity();
18651ad72199842935970b5eccc187bccd10a4b56a8Tyler Gunn                    try {
18751ad72199842935970b5eccc187bccd10a4b56a8Tyler Gunn                        return mPhoneAccountRegistrar.getSelfManagedPhoneAccounts(
18851ad72199842935970b5eccc187bccd10a4b56a8Tyler Gunn                                callingUserHandle);
18951ad72199842935970b5eccc187bccd10a4b56a8Tyler Gunn                    } catch (Exception e) {
19051ad72199842935970b5eccc187bccd10a4b56a8Tyler Gunn                        Log.e(this, e, "getSelfManagedPhoneAccounts");
19151ad72199842935970b5eccc187bccd10a4b56a8Tyler Gunn                        throw e;
19251ad72199842935970b5eccc187bccd10a4b56a8Tyler Gunn                    } finally {
19311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        Binder.restoreCallingIdentity(token);
19411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    }
19511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                }
19611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            } finally {
19711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.endSession();
198f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon            }
199f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        }
200f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
201f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        @Override
20209611181c665403a8d9e70d95b7e0e4361976122Svet Ganov        public List<PhoneAccountHandle> getPhoneAccountsSupportingScheme(String uriScheme,
20309611181c665403a8d9e70d95b7e0e4361976122Svet Ganov                String callingPackage) {
20411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            try {
20511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.startSession("TSI.gPASS");
20611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                synchronized (mLock) {
20711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    if (!canReadPhoneState(callingPackage, "getPhoneAccountsSupportingScheme")) {
20811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        return Collections.emptyList();
20911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    }
21011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    final UserHandle callingUserHandle = Binder.getCallingUserHandle();
21111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    long token = Binder.clearCallingIdentity();
21211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    try {
21311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        return mPhoneAccountRegistrar.getCallCapablePhoneAccounts(uriScheme, false,
21411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                                callingUserHandle);
21511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    } catch (Exception e) {
21611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        Log.e(this, e, "getPhoneAccountsSupportingScheme %s", uriScheme);
21711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        throw e;
21811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    } finally {
21911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        Binder.restoreCallingIdentity(token);
22011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    }
2218d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                }
22211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            } finally {
22311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.endSession();
224f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon            }
225f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        }
226f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
227f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        @Override
228f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        public List<PhoneAccountHandle> getPhoneAccountsForPackage(String packageName) {
2298d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad            synchronized (mLock) {
230240656f19c078b4f703d0502ce29114de0d45a50Tony Mak                final UserHandle callingUserHandle = Binder.getCallingUserHandle();
231240656f19c078b4f703d0502ce29114de0d45a50Tony Mak                long token = Binder.clearCallingIdentity();
2328d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                try {
23311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    Log.startSession("TSI.gPAFP");
234240656f19c078b4f703d0502ce29114de0d45a50Tony Mak                    return mPhoneAccountRegistrar.getPhoneAccountsForPackage(packageName,
235240656f19c078b4f703d0502ce29114de0d45a50Tony Mak                            callingUserHandle);
2368d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                } catch (Exception e) {
2378d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                    Log.e(this, e, "getPhoneAccountsForPackage %s", packageName);
2388d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                    throw e;
239240656f19c078b4f703d0502ce29114de0d45a50Tony Mak                } finally {
240240656f19c078b4f703d0502ce29114de0d45a50Tony Mak                    Binder.restoreCallingIdentity(token);
24111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    Log.endSession();
2428d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                }
243f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon            }
244f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        }
245f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
246f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        @Override
247f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        public PhoneAccount getPhoneAccount(PhoneAccountHandle accountHandle) {
2488d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad            synchronized (mLock) {
249240656f19c078b4f703d0502ce29114de0d45a50Tony Mak                final UserHandle callingUserHandle = Binder.getCallingUserHandle();
250240656f19c078b4f703d0502ce29114de0d45a50Tony Mak                long token = Binder.clearCallingIdentity();
2518d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                try {
25211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    Log.startSession("TSI.gPA");
253240656f19c078b4f703d0502ce29114de0d45a50Tony Mak                    // In ideal case, we should not resolve the handle across profiles. But given
254240656f19c078b4f703d0502ce29114de0d45a50Tony Mak                    // the fact that profile's call is handled by its parent user's in-call UI,
255240656f19c078b4f703d0502ce29114de0d45a50Tony Mak                    // parent user's in call UI need to be able to get phone account from the
256240656f19c078b4f703d0502ce29114de0d45a50Tony Mak                    // profile's phone account handle.
257240656f19c078b4f703d0502ce29114de0d45a50Tony Mak                    return mPhoneAccountRegistrar
258240656f19c078b4f703d0502ce29114de0d45a50Tony Mak                            .getPhoneAccount(accountHandle, callingUserHandle,
259240656f19c078b4f703d0502ce29114de0d45a50Tony Mak                            /* acrossProfiles */ true);
2608d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                } catch (Exception e) {
2618d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                    Log.e(this, e, "getPhoneAccount %s", accountHandle);
2628d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                    throw e;
263240656f19c078b4f703d0502ce29114de0d45a50Tony Mak                } finally {
264240656f19c078b4f703d0502ce29114de0d45a50Tony Mak                    Binder.restoreCallingIdentity(token);
26511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    Log.endSession();
266f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon                }
267f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon            }
268f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        }
269f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
270f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        @Override
271f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        public int getAllPhoneAccountsCount() {
2728d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad            synchronized (mLock) {
2738d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                try {
27411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    Log.startSession("TSI.gAPAC");
2758d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                    // This list is pre-filtered for the calling user.
2768d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                    return getAllPhoneAccounts().size();
2778d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                } catch (Exception e) {
2788d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                    Log.e(this, e, "getAllPhoneAccountsCount");
2798d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                    throw e;
28011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                } finally {
28111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    Log.endSession();
2828d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                }
283f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon            }
284f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        }
285f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
286f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        @Override
287f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        public List<PhoneAccount> getAllPhoneAccounts() {
2888d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad            synchronized (mLock) {
289240656f19c078b4f703d0502ce29114de0d45a50Tony Mak                final UserHandle callingUserHandle = Binder.getCallingUserHandle();
290240656f19c078b4f703d0502ce29114de0d45a50Tony Mak                long token = Binder.clearCallingIdentity();
2918d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                try {
29211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    Log.startSession("TSI.gAPA");
293240656f19c078b4f703d0502ce29114de0d45a50Tony Mak                    return mPhoneAccountRegistrar.getAllPhoneAccounts(callingUserHandle);
2948d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                } catch (Exception e) {
2958d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                    Log.e(this, e, "getAllPhoneAccounts");
2968d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                    throw e;
297240656f19c078b4f703d0502ce29114de0d45a50Tony Mak                } finally {
298240656f19c078b4f703d0502ce29114de0d45a50Tony Mak                    Binder.restoreCallingIdentity(token);
29911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    Log.endSession();
300f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon                }
301f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon            }
302f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        }
303f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
304f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        @Override
305f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        public List<PhoneAccountHandle> getAllPhoneAccountHandles() {
3068d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad            synchronized (mLock) {
307240656f19c078b4f703d0502ce29114de0d45a50Tony Mak                final UserHandle callingUserHandle = Binder.getCallingUserHandle();
308240656f19c078b4f703d0502ce29114de0d45a50Tony Mak                long token = Binder.clearCallingIdentity();
3098d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                try {
31011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    Log.startSession("TSI.gAPAH");
311240656f19c078b4f703d0502ce29114de0d45a50Tony Mak                    return mPhoneAccountRegistrar.getAllPhoneAccountHandles(callingUserHandle);
3128d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                } catch (Exception e) {
3138d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                    Log.e(this, e, "getAllPhoneAccounts");
3148d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                    throw e;
315240656f19c078b4f703d0502ce29114de0d45a50Tony Mak                } finally {
316240656f19c078b4f703d0502ce29114de0d45a50Tony Mak                    Binder.restoreCallingIdentity(token);
31711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    Log.endSession();
3188d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                }
319f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon            }
320f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        }
321f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
322f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        @Override
323f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        public PhoneAccountHandle getSimCallManager() {
324fc43ea86697d3d052415cbb4feda7bd508563532Sailesh Nepal            try {
32511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.startSession("TSI.gSCM");
32611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                long token = Binder.clearCallingIdentity();
32711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                int user;
32811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                try {
32911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    user = ActivityManager.getCurrentUser();
33011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    return getSimCallManagerForUser(user);
33111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                } finally {
33211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    Binder.restoreCallingIdentity(token);
33311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                }
334fc43ea86697d3d052415cbb4feda7bd508563532Sailesh Nepal            } finally {
33511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.endSession();
336fc43ea86697d3d052415cbb4feda7bd508563532Sailesh Nepal            }
337fc43ea86697d3d052415cbb4feda7bd508563532Sailesh Nepal        }
338fc43ea86697d3d052415cbb4feda7bd508563532Sailesh Nepal
339fc43ea86697d3d052415cbb4feda7bd508563532Sailesh Nepal        @Override
340fc43ea86697d3d052415cbb4feda7bd508563532Sailesh Nepal        public PhoneAccountHandle getSimCallManagerForUser(int user) {
3418d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad            synchronized (mLock) {
3428d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                try {
34311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    Log.startSession("TSI.gSCMFU");
344240656f19c078b4f703d0502ce29114de0d45a50Tony Mak                    final int callingUid = Binder.getCallingUid();
34559c21a747c31773a67a32675be29c4d0537a3513Santos Cordon                    long token = Binder.clearCallingIdentity();
34659c21a747c31773a67a32675be29c4d0537a3513Santos Cordon                    try {
347240656f19c078b4f703d0502ce29114de0d45a50Tony Mak                        if (user != ActivityManager.getCurrentUser()) {
348240656f19c078b4f703d0502ce29114de0d45a50Tony Mak                            enforceCrossUserPermission(callingUid);
349240656f19c078b4f703d0502ce29114de0d45a50Tony Mak                        }
350240656f19c078b4f703d0502ce29114de0d45a50Tony Mak                        return mPhoneAccountRegistrar.getSimCallManager(UserHandle.of(user));
35159c21a747c31773a67a32675be29c4d0537a3513Santos Cordon                    } finally {
35259c21a747c31773a67a32675be29c4d0537a3513Santos Cordon                        Binder.restoreCallingIdentity(token);
35359c21a747c31773a67a32675be29c4d0537a3513Santos Cordon                    }
3548d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                } catch (Exception e) {
3558d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                    Log.e(this, e, "getSimCallManager");
3568d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                    throw e;
35711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                } finally {
35811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    Log.endSession();
359f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon                }
360f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon            }
361f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        }
362f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
363f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        @Override
364f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        public void registerPhoneAccount(PhoneAccount account) {
36511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            try {
36611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.startSession("TSI.rPA");
36711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                synchronized (mLock) {
36811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    if (!mContext.getApplicationContext().getResources().getBoolean(
36911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                            com.android.internal.R.bool.config_voice_capable)) {
37011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        Log.w(this,
37111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                                "registerPhoneAccount not allowed on non-voice capable device.");
37211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        return;
3738d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                    }
37458061751ecd5d302f57436582fcff82689e2bb6cYorke Lee                    try {
37511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        enforcePhoneAccountModificationForPackage(
37611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                                account.getAccountHandle().getComponentName().getPackageName());
377acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn                        if (account.hasCapabilities(PhoneAccount.CAPABILITY_SELF_MANAGED)) {
378acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn                            enforceRegisterSelfManaged();
3799e806ee181a8422040f51b06effd433c9675a66fTyler Gunn                            if (account.hasCapabilities(PhoneAccount.CAPABILITY_CALL_PROVIDER) ||
3809e806ee181a8422040f51b06effd433c9675a66fTyler Gunn                                    account.hasCapabilities(
3819e806ee181a8422040f51b06effd433c9675a66fTyler Gunn                                            PhoneAccount.CAPABILITY_CONNECTION_MANAGER) ||
3829e806ee181a8422040f51b06effd433c9675a66fTyler Gunn                                    account.hasCapabilities(
3839e806ee181a8422040f51b06effd433c9675a66fTyler Gunn                                            PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION)) {
3849e806ee181a8422040f51b06effd433c9675a66fTyler Gunn                                throw new SecurityException("Self-managed ConnectionServices " +
3859e806ee181a8422040f51b06effd433c9675a66fTyler Gunn                                        "cannot also be call capable, connection managers, or " +
3869e806ee181a8422040f51b06effd433c9675a66fTyler Gunn                                        "SIM accounts.");
3879e806ee181a8422040f51b06effd433c9675a66fTyler Gunn                            }
388ca766d28471cc41d9ef33682a41edd1f99448d42Tyler Gunn
389ca766d28471cc41d9ef33682a41edd1f99448d42Tyler Gunn                            // For self-managed CS, the phone account registrar will override the
390ca766d28471cc41d9ef33682a41edd1f99448d42Tyler Gunn                            // label the user has set for the phone account.  This ensures the
391ca766d28471cc41d9ef33682a41edd1f99448d42Tyler Gunn                            // self-managed cs implementation can't spoof their app name.
392acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn                        }
39311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        if (account.hasCapabilities(PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION)) {
39411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                            enforceRegisterSimSubscriptionPermission();
39511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        }
39611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        if (account.hasCapabilities(PhoneAccount.CAPABILITY_MULTI_USER)) {
39711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                            enforceRegisterMultiUser();
39811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        }
39911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        enforceUserHandleMatchesCaller(account.getAccountHandle());
40087681f232cb7a97c96d5e0ea5421e9fb696a22c7Tyler Gunn                        final long token = Binder.clearCallingIdentity();
40187681f232cb7a97c96d5e0ea5421e9fb696a22c7Tyler Gunn                        try {
40287681f232cb7a97c96d5e0ea5421e9fb696a22c7Tyler Gunn                            mPhoneAccountRegistrar.registerPhoneAccount(account);
40387681f232cb7a97c96d5e0ea5421e9fb696a22c7Tyler Gunn                        } finally {
40487681f232cb7a97c96d5e0ea5421e9fb696a22c7Tyler Gunn                            Binder.restoreCallingIdentity(token);
40587681f232cb7a97c96d5e0ea5421e9fb696a22c7Tyler Gunn                        }
40611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    } catch (Exception e) {
40711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        Log.e(this, e, "registerPhoneAccount %s", account);
40811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        throw e;
40958061751ecd5d302f57436582fcff82689e2bb6cYorke Lee                    }
410f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon                }
41111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            } finally {
41211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.endSession();
413f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon            }
414f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        }
415f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
416f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        @Override
417f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        public void unregisterPhoneAccount(PhoneAccountHandle accountHandle) {
4188d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad            synchronized (mLock) {
4198d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                try {
42011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    Log.startSession("TSI.uPA");
4218d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                    enforcePhoneAccountModificationForPackage(
4228d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                            accountHandle.getComponentName().getPackageName());
4238d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                    enforceUserHandleMatchesCaller(accountHandle);
42487681f232cb7a97c96d5e0ea5421e9fb696a22c7Tyler Gunn                    final long token = Binder.clearCallingIdentity();
42587681f232cb7a97c96d5e0ea5421e9fb696a22c7Tyler Gunn                    try {
42687681f232cb7a97c96d5e0ea5421e9fb696a22c7Tyler Gunn                        mPhoneAccountRegistrar.unregisterPhoneAccount(accountHandle);
42787681f232cb7a97c96d5e0ea5421e9fb696a22c7Tyler Gunn                    } finally {
42887681f232cb7a97c96d5e0ea5421e9fb696a22c7Tyler Gunn                        Binder.restoreCallingIdentity(token);
42987681f232cb7a97c96d5e0ea5421e9fb696a22c7Tyler Gunn                    }
4308d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                } catch (Exception e) {
4318d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                    Log.e(this, e, "unregisterPhoneAccount %s", accountHandle);
4328d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                    throw e;
43311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                } finally {
43411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    Log.endSession();
4358d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                }
436f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon            }
437f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        }
438f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
439f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        @Override
440f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        public void clearAccounts(String packageName) {
4418d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad            synchronized (mLock) {
4428d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                try {
44311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    Log.startSession("TSI.cA");
4448d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                    enforcePhoneAccountModificationForPackage(packageName);
4458d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                    mPhoneAccountRegistrar
4468d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                            .clearAccounts(packageName, Binder.getCallingUserHandle());
4478d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                } catch (Exception e) {
4488d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                    Log.e(this, e, "clearAccounts %s", packageName);
4498d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                    throw e;
45011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                } finally {
45111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    Log.endSession();
4528d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                }
453f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon            }
454f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        }
455f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
456f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        /**
457f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon         * @see android.telecom.TelecomManager#isVoiceMailNumber
458f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon         */
459f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        @Override
46009611181c665403a8d9e70d95b7e0e4361976122Svet Ganov        public boolean isVoiceMailNumber(PhoneAccountHandle accountHandle, String number,
46109611181c665403a8d9e70d95b7e0e4361976122Svet Ganov                String callingPackage) {
46211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            try {
46311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.startSession("TSI.iVMN");
46411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                synchronized (mLock) {
46511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    if (!canReadPhoneState(callingPackage, "isVoiceMailNumber")) {
46611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        return false;
46711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    }
46811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    final UserHandle callingUserHandle = Binder.getCallingUserHandle();
46911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    if (!isPhoneAccountHandleVisibleToCallingUser(accountHandle,
47011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                            callingUserHandle)) {
47111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        Log.d(this, "%s is not visible for the calling user [iVMN]", accountHandle);
47211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        return false;
47311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    }
47411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    long token = Binder.clearCallingIdentity();
47511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    try {
47611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        return mPhoneAccountRegistrar.isVoiceMailNumber(accountHandle, number);
47711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    } catch (Exception e) {
47811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        Log.e(this, e, "getSubscriptionIdForPhoneAccount");
47911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        throw e;
48011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    } finally {
48111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        Binder.restoreCallingIdentity(token);
48211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    }
483f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon                }
48411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            } finally {
48511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.endSession();
486f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon            }
487f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        }
488f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
489f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        /**
490fb5ec30b085321ffcc7c3229f9d217a22f3120b2Yorke Lee         * @see android.telecom.TelecomManager#getVoiceMailNumber
491f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon         */
492f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        @Override
49309611181c665403a8d9e70d95b7e0e4361976122Svet Ganov        public String getVoiceMailNumber(PhoneAccountHandle accountHandle, String callingPackage) {
49411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            try {
49511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.startSession("TSI.gVMN");
49611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                synchronized (mLock) {
49711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    if (!canReadPhoneState(callingPackage, "getVoiceMailNumber")) {
498fb5ec30b085321ffcc7c3229f9d217a22f3120b2Yorke Lee                        return null;
4998d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                    }
50011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    try {
50111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        final UserHandle callingUserHandle = Binder.getCallingUserHandle();
50211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        if (!isPhoneAccountHandleVisibleToCallingUser(accountHandle,
50311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                                callingUserHandle)) {
50411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                            Log.d(this, "%s is not visible for the calling user [gVMN]",
50511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                                    accountHandle);
50611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                            return null;
50711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        }
5080a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu                        int subId = mSubscriptionManagerAdapter.getDefaultVoiceSubId();
50911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        if (accountHandle != null) {
51011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                            subId = mPhoneAccountRegistrar
51111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                                    .getSubscriptionIdForPhoneAccount(accountHandle);
51211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        }
51311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        return getTelephonyManager().getVoiceMailNumber(subId);
51411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    } catch (Exception e) {
51511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        Log.e(this, e, "getSubscriptionIdForPhoneAccount");
51611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        throw e;
5178d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                    }
51878a5e6b9c1595c81f72d7a822617cb78db224e48Ihab Awad                }
51911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            } finally {
52011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.endSession();
521f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon            }
522f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        }
523f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
524f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        /**
525ba304759d08cfe4995168b8eb359992ba97ccc89Nancy Chen         * @see android.telecom.TelecomManager#getLine1Number
526ba304759d08cfe4995168b8eb359992ba97ccc89Nancy Chen         */
527ba304759d08cfe4995168b8eb359992ba97ccc89Nancy Chen        @Override
52809611181c665403a8d9e70d95b7e0e4361976122Svet Ganov        public String getLine1Number(PhoneAccountHandle accountHandle, String callingPackage) {
52911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            try {
53011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.startSession("getL1N");
53111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                if (!canReadPhoneState(callingPackage, "getLine1Number")) {
532ebf2d0f2b4f17e958b0b23d94edc6b0d05334e43Santos Cordon                    return null;
533ebf2d0f2b4f17e958b0b23d94edc6b0d05334e43Santos Cordon                }
534ebf2d0f2b4f17e958b0b23d94edc6b0d05334e43Santos Cordon
53511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                synchronized (mLock) {
53611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    final UserHandle callingUserHandle = Binder.getCallingUserHandle();
53711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    if (!isPhoneAccountHandleVisibleToCallingUser(accountHandle,
53811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                            callingUserHandle)) {
53911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        Log.d(this, "%s is not visible for the calling user [gL1N]", accountHandle);
54011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        return null;
54111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    }
54211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger
54311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    long token = Binder.clearCallingIdentity();
54411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    try {
54511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        int subId = mPhoneAccountRegistrar.getSubscriptionIdForPhoneAccount(
54611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                                accountHandle);
547ce68874475498dcb69a543559177d69ac6dae215Shishir Agrawal                        return getTelephonyManager().getLine1Number(subId);
54811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    } catch (Exception e) {
54911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        Log.e(this, e, "getSubscriptionIdForPhoneAccount");
55011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        throw e;
55111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    } finally {
55211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        Binder.restoreCallingIdentity(token);
55311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    }
554ba304759d08cfe4995168b8eb359992ba97ccc89Nancy Chen                }
55511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            } finally {
55611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.endSession();
557ba304759d08cfe4995168b8eb359992ba97ccc89Nancy Chen            }
558ba304759d08cfe4995168b8eb359992ba97ccc89Nancy Chen        }
559ba304759d08cfe4995168b8eb359992ba97ccc89Nancy Chen
560ba304759d08cfe4995168b8eb359992ba97ccc89Nancy Chen        /**
561f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon         * @see android.telecom.TelecomManager#silenceRinger
562f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon         */
563f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        @Override
5645310196deda80ace064a7d5bc672dbe1974906b9Yorke Lee        public void silenceRinger(String callingPackage) {
56511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            try {
56611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.startSession("TSI.sR");
56711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                synchronized (mLock) {
56811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    enforcePermissionOrPrivilegedDialer(MODIFY_PHONE_STATE, callingPackage);
569ebf2d0f2b4f17e958b0b23d94edc6b0d05334e43Santos Cordon
57011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    long token = Binder.clearCallingIdentity();
57111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    try {
57211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        Log.i(this, "Silence Ringer requested by %s", callingPackage);
573e091ab90e37845cf4771051a6d2ce0ebadee4fe7Hall Liu                        mCallsManager.getCallAudioManager().silenceRingers();
574c07b8e190b04e8b3e504478fa808d646d8c88a52Sailesh Nepal                        mCallsManager.getInCallController().silenceRinger();
57511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    } finally {
57611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        Binder.restoreCallingIdentity(token);
57711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    }
578ebf2d0f2b4f17e958b0b23d94edc6b0d05334e43Santos Cordon                }
57911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            } finally {
58011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.endSession();
5818d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad            }
582f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        }
583f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
584f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        /**
585f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon         * @see android.telecom.TelecomManager#getDefaultPhoneApp
5865b3fc0a2ae85b893e7e971112458391c194f3d2dYorke Lee         * @deprecated - Use {@link android.telecom.TelecomManager#getDefaultDialerPackage()}
5875b3fc0a2ae85b893e7e971112458391c194f3d2dYorke Lee         *         instead.
588f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon         */
589f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        @Override
590f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        public ComponentName getDefaultPhoneApp() {
59111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            try {
59211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.startSession("TSI.gDPA");
59311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                // No need to synchronize
59411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Resources resources = mContext.getResources();
59511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                return new ComponentName(
59611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        resources.getString(R.string.ui_default_package),
59711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        resources.getString(R.string.dialer_default_class));
59811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            } finally {
59911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.endSession();
60011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            }
601f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        }
602f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
603f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        /**
6045291d4aeda2a4e7bfb6eeb33e0c910e8c14de82cYorke Lee         * @return the package name of the current user-selected default dialer. If no default
6055291d4aeda2a4e7bfb6eeb33e0c910e8c14de82cYorke Lee         *         has been selected, the package name of the system dialer is returned. If
6065291d4aeda2a4e7bfb6eeb33e0c910e8c14de82cYorke Lee         *         neither exists, then {@code null} is returned.
6075b3fc0a2ae85b893e7e971112458391c194f3d2dYorke Lee         * @see android.telecom.TelecomManager#getDefaultDialerPackage
6085b3fc0a2ae85b893e7e971112458391c194f3d2dYorke Lee         */
6095b3fc0a2ae85b893e7e971112458391c194f3d2dYorke Lee        @Override
6105b3fc0a2ae85b893e7e971112458391c194f3d2dYorke Lee        public String getDefaultDialerPackage() {
61129c003e7a3e439376120cbfac088010d3c099fecYorke Lee            try {
61211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.startSession("TSI.gDDP");
61311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                final long token = Binder.clearCallingIdentity();
61411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                try {
6157c9283261ad4fdbc5ebbb74257671388f9c758c7Hall Liu                    return mDefaultDialerCache.getDefaultDialerApplication(
6167c9283261ad4fdbc5ebbb74257671388f9c758c7Hall Liu                            ActivityManager.getCurrentUser());
61711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                } finally {
61811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    Binder.restoreCallingIdentity(token);
61911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                }
62029c003e7a3e439376120cbfac088010d3c099fecYorke Lee            } finally {
62111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.endSession();
62229c003e7a3e439376120cbfac088010d3c099fecYorke Lee            }
6235b3fc0a2ae85b893e7e971112458391c194f3d2dYorke Lee        }
6245b3fc0a2ae85b893e7e971112458391c194f3d2dYorke Lee
6255b3fc0a2ae85b893e7e971112458391c194f3d2dYorke Lee        /**
6265b3fc0a2ae85b893e7e971112458391c194f3d2dYorke Lee         * @see android.telecom.TelecomManager#getSystemDialerPackage
6275b3fc0a2ae85b893e7e971112458391c194f3d2dYorke Lee         */
6285b3fc0a2ae85b893e7e971112458391c194f3d2dYorke Lee        @Override
6295b3fc0a2ae85b893e7e971112458391c194f3d2dYorke Lee        public String getSystemDialerPackage() {
63011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            try {
63111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.startSession("TSI.gSDP");
63211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                return mContext.getResources().getString(R.string.ui_default_package);
63311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            } finally {
63411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.endSession();
63511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            }
6365b3fc0a2ae85b893e7e971112458391c194f3d2dYorke Lee        }
6375b3fc0a2ae85b893e7e971112458391c194f3d2dYorke Lee
6385b3fc0a2ae85b893e7e971112458391c194f3d2dYorke Lee        /**
639f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon         * @see android.telecom.TelecomManager#isInCall
640f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon         */
641f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        @Override
64209611181c665403a8d9e70d95b7e0e4361976122Svet Ganov        public boolean isInCall(String callingPackage) {
64311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            try {
64411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.startSession("TSI.iIC");
64511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                if (!canReadPhoneState(callingPackage, "isInCall")) {
64611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    return false;
64711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                }
64809611181c665403a8d9e70d95b7e0e4361976122Svet Ganov
64911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                synchronized (mLock) {
6504a05d5cc0acedb616ff6d22151f4ccf0043f0810Tyler Gunn                    return mCallsManager.hasOngoingCalls();
65111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                }
65211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            } finally {
65311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.endSession();
6548d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad            }
65537e782b421f63a81bfae1efaa1eb01f0fbdd7abfTyler Gunn        }
65637e782b421f63a81bfae1efaa1eb01f0fbdd7abfTyler Gunn
65737e782b421f63a81bfae1efaa1eb01f0fbdd7abfTyler Gunn        /**
65837e782b421f63a81bfae1efaa1eb01f0fbdd7abfTyler Gunn         * @see android.telecom.TelecomManager#isInManagedCall
65937e782b421f63a81bfae1efaa1eb01f0fbdd7abfTyler Gunn         */
66037e782b421f63a81bfae1efaa1eb01f0fbdd7abfTyler Gunn        @Override
66137e782b421f63a81bfae1efaa1eb01f0fbdd7abfTyler Gunn        public boolean isInManagedCall(String callingPackage) {
66237e782b421f63a81bfae1efaa1eb01f0fbdd7abfTyler Gunn            try {
66337e782b421f63a81bfae1efaa1eb01f0fbdd7abfTyler Gunn                Log.startSession("TSI.iIMC");
66437e782b421f63a81bfae1efaa1eb01f0fbdd7abfTyler Gunn                if (!canReadPhoneState(callingPackage, "isInManagedCall")) {
66537e782b421f63a81bfae1efaa1eb01f0fbdd7abfTyler Gunn                    throw new SecurityException("Only the default dialer or caller with " +
66637e782b421f63a81bfae1efaa1eb01f0fbdd7abfTyler Gunn                            "READ_PHONE_STATE permission can use this method.");
66737e782b421f63a81bfae1efaa1eb01f0fbdd7abfTyler Gunn                }
66837e782b421f63a81bfae1efaa1eb01f0fbdd7abfTyler Gunn
66937e782b421f63a81bfae1efaa1eb01f0fbdd7abfTyler Gunn                synchronized (mLock) {
67037e782b421f63a81bfae1efaa1eb01f0fbdd7abfTyler Gunn                    return mCallsManager.hasOngoingManagedCalls();
67137e782b421f63a81bfae1efaa1eb01f0fbdd7abfTyler Gunn                }
67211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            } finally {
67311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.endSession();
6748d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad            }
675f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        }
676f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
677f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        /**
678f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon         * @see android.telecom.TelecomManager#isRinging
679f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon         */
680f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        @Override
68109611181c665403a8d9e70d95b7e0e4361976122Svet Ganov        public boolean isRinging(String callingPackage) {
68211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            try {
68311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.startSession("TSI.iR");
68411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                if (!canReadPhoneState(callingPackage, "isRinging")) {
68511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    return false;
68611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                }
68709611181c665403a8d9e70d95b7e0e4361976122Svet Ganov
68811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                synchronized (mLock) {
68911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    // Note: We are explicitly checking the calls telecom is tracking rather than
69011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    // relying on mCallsManager#getCallState(). Since getCallState() relies on the
69111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    // current state as tracked by PhoneStateBroadcaster, any failure to properly
69211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    // track the current call state there could result in the wrong ringing state
69311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    // being reported by this API.
69411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    return mCallsManager.hasRingingCall();
69511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                }
69611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            } finally {
69711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.endSession();
6988d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad            }
699f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        }
700f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
701f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        /**
702f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon         * @see TelecomManager#getCallState
703f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon         */
704f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        @Override
705f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        public int getCallState() {
70611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            try {
70711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.startSession("TSI.getCallState");
70811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                synchronized (mLock) {
70911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    return mCallsManager.getCallState();
71011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                }
71111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            } finally {
71211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.endSession();
7138d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad            }
714f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        }
715f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
716f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        /**
717f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon         * @see android.telecom.TelecomManager#endCall
718f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon         */
719f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        @Override
720f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        public boolean endCall() {
72111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            try {
72211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.startSession("TSI.eC");
72311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                synchronized (mLock) {
72411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    enforceModifyPermission();
725ebf2d0f2b4f17e958b0b23d94edc6b0d05334e43Santos Cordon
72611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    long token = Binder.clearCallingIdentity();
72711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    try {
72811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        return endCallInternal();
72911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    } finally {
73011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        Binder.restoreCallingIdentity(token);
73111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    }
732ebf2d0f2b4f17e958b0b23d94edc6b0d05334e43Santos Cordon                }
73311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            } finally {
73411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.endSession();
7358d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad            }
736f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        }
737f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
738f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        /**
739f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon         * @see android.telecom.TelecomManager#acceptRingingCall
740f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon         */
741f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        @Override
742ccba720d2496060078a6551ffd1609c2dc7ce95cEugene Susla        public void acceptRingingCall(String packageName) {
74311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            try {
74411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.startSession("TSI.aRC");
74511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                synchronized (mLock) {
746ccba720d2496060078a6551ffd1609c2dc7ce95cEugene Susla                    if (!enforceAnswerCallPermission(packageName, Binder.getCallingUid())) return;
747ebf2d0f2b4f17e958b0b23d94edc6b0d05334e43Santos Cordon
74811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    long token = Binder.clearCallingIdentity();
74911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    try {
75011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        acceptRingingCallInternal(DEFAULT_VIDEO_STATE);
75111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    } finally {
75211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        Binder.restoreCallingIdentity(token);
75311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    }
75442ef808c284791f21be8675174acc7297418fa45Tyler Gunn                }
75511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            } finally {
75611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.endSession();
75742ef808c284791f21be8675174acc7297418fa45Tyler Gunn            }
75842ef808c284791f21be8675174acc7297418fa45Tyler Gunn        }
75942ef808c284791f21be8675174acc7297418fa45Tyler Gunn
76042ef808c284791f21be8675174acc7297418fa45Tyler Gunn        /**
76142ef808c284791f21be8675174acc7297418fa45Tyler Gunn         * @see android.telecom.TelecomManager#acceptRingingCall(int)
76242ef808c284791f21be8675174acc7297418fa45Tyler Gunn         *
76342ef808c284791f21be8675174acc7297418fa45Tyler Gunn         */
76442ef808c284791f21be8675174acc7297418fa45Tyler Gunn        @Override
765ccba720d2496060078a6551ffd1609c2dc7ce95cEugene Susla        public void acceptRingingCallWithVideoState(String packageName, int videoState) {
76611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            try {
76711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.startSession("TSI.aRCWVS");
76811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                synchronized (mLock) {
769ccba720d2496060078a6551ffd1609c2dc7ce95cEugene Susla                    if (!enforceAnswerCallPermission(packageName, Binder.getCallingUid())) return;
77042ef808c284791f21be8675174acc7297418fa45Tyler Gunn
77111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    long token = Binder.clearCallingIdentity();
77211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    try {
77311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        acceptRingingCallInternal(videoState);
77411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    } finally {
77511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        Binder.restoreCallingIdentity(token);
77611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    }
777ebf2d0f2b4f17e958b0b23d94edc6b0d05334e43Santos Cordon                }
77811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            } finally {
77911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.endSession();
7808d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad            }
781f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        }
782f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
783f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        /**
784f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon         * @see android.telecom.TelecomManager#showInCallScreen
785f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon         */
786f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        @Override
78709611181c665403a8d9e70d95b7e0e4361976122Svet Ganov        public void showInCallScreen(boolean showDialpad, String callingPackage) {
78811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            try {
78911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.startSession("TSI.sICS");
79011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                if (!canReadPhoneState(callingPackage, "showInCallScreen")) {
79111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    return;
79211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                }
79309611181c665403a8d9e70d95b7e0e4361976122Svet Ganov
79411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                synchronized (mLock) {
795ebf2d0f2b4f17e958b0b23d94edc6b0d05334e43Santos Cordon
79611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    long token = Binder.clearCallingIdentity();
79711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    try {
79811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        mCallsManager.getInCallController().bringToForeground(showDialpad);
79911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    } finally {
80011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        Binder.restoreCallingIdentity(token);
80111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    }
802ebf2d0f2b4f17e958b0b23d94edc6b0d05334e43Santos Cordon                }
80311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            } finally {
80411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.endSession();
8058d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad            }
806f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        }
807f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
808f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        /**
809f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon         * @see android.telecom.TelecomManager#cancelMissedCallsNotification
810f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon         */
811f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        @Override
8125310196deda80ace064a7d5bc672dbe1974906b9Yorke Lee        public void cancelMissedCallsNotification(String callingPackage) {
81311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            try {
81411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.startSession("TSI.cMCN");
81511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                synchronized (mLock) {
81611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    enforcePermissionOrPrivilegedDialer(MODIFY_PHONE_STATE, callingPackage);
817a993094840386163e9c2aa65a05e14b49d122318Tony Mak                    UserHandle userHandle = Binder.getCallingUserHandle();
81811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    long token = Binder.clearCallingIdentity();
81911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    try {
820a993094840386163e9c2aa65a05e14b49d122318Tony Mak                        mCallsManager.getMissedCallNotifier().clearMissedCalls(userHandle);
82111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    } finally {
82211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        Binder.restoreCallingIdentity(token);
82311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    }
824ebf2d0f2b4f17e958b0b23d94edc6b0d05334e43Santos Cordon                }
82511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            } finally {
82611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.endSession();
8278d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad            }
828f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        }
829f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        /**
830f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon         * @see android.telecom.TelecomManager#handleMmi
831f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon         */
832f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        @Override
8335310196deda80ace064a7d5bc672dbe1974906b9Yorke Lee        public boolean handlePinMmi(String dialString, String callingPackage) {
83411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            try {
83511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.startSession("TSI.hPM");
83611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                synchronized (mLock) {
83711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    enforcePermissionOrPrivilegedDialer(MODIFY_PHONE_STATE, callingPackage);
838f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
83911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    // Switch identity so that TelephonyManager checks Telecom's permissions
84011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    // instead.
84111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    long token = Binder.clearCallingIdentity();
84211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    boolean retval = false;
84311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    try {
84411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        retval = getTelephonyManager().handlePinMmi(dialString);
84511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    } finally {
84611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        Binder.restoreCallingIdentity(token);
84711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    }
848f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
84911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    return retval;
85011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                }
85111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            }finally {
85211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.endSession();
8538d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad            }
854f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        }
855f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
856f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        /**
857f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon         * @see android.telecom.TelecomManager#handleMmi
858f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon         */
859f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        @Override
86011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger        public boolean handlePinMmiForPhoneAccount(PhoneAccountHandle accountHandle,
86111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                String dialString, String callingPackage) {
86211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            try {
86311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.startSession("TSI.hPMFPA");
86411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                synchronized (mLock) {
86511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    enforcePermissionOrPrivilegedDialer(MODIFY_PHONE_STATE, callingPackage);
86611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger
86711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    UserHandle callingUserHandle = Binder.getCallingUserHandle();
86811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    if (!isPhoneAccountHandleVisibleToCallingUser(accountHandle,
86911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                            callingUserHandle)) {
87011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        Log.d(this, "%s is not visible for the calling user [hMMI]", accountHandle);
87111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        return false;
87211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    }
873f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
87411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    // Switch identity so that TelephonyManager checks Telecom's permissions
87511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    // instead.
87611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    long token = Binder.clearCallingIdentity();
87711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    boolean retval = false;
87811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    try {
87911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        int subId = mPhoneAccountRegistrar.getSubscriptionIdForPhoneAccount(
88011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                                accountHandle);
88111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        retval = getTelephonyManager().handlePinMmiForSubscriber(subId, dialString);
88211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    } finally {
88311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        Binder.restoreCallingIdentity(token);
88411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    }
88511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    return retval;
8868d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                }
88711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            }finally {
88811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.endSession();
8898d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad            }
890f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        }
891f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
892f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        /**
893f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon         * @see android.telecom.TelecomManager#getAdnUriForPhoneAccount
894f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon         */
895f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        @Override
8965310196deda80ace064a7d5bc672dbe1974906b9Yorke Lee        public Uri getAdnUriForPhoneAccount(PhoneAccountHandle accountHandle,
8975310196deda80ace064a7d5bc672dbe1974906b9Yorke Lee                String callingPackage) {
89811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            try {
89911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.startSession("TSI.aAUFPA");
90011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                synchronized (mLock) {
90111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    enforcePermissionOrPrivilegedDialer(MODIFY_PHONE_STATE, callingPackage);
90211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    if (!isPhoneAccountHandleVisibleToCallingUser(accountHandle,
90311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                            Binder.getCallingUserHandle())) {
90411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        Log.d(this, "%s is not visible for the calling user [gA4PA]",
90511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                                accountHandle);
90611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        return null;
90711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    }
90811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    // Switch identity so that TelephonyManager checks Telecom's permissions
90911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    // instead.
91011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    long token = Binder.clearCallingIdentity();
91111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    String retval = "content://icc/adn/";
91211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    try {
91311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        long subId = mPhoneAccountRegistrar
91411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                                .getSubscriptionIdForPhoneAccount(accountHandle);
91511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        retval = retval + "subId/" + subId;
91611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    } finally {
91711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        Binder.restoreCallingIdentity(token);
91811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    }
919f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
92011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    return Uri.parse(retval);
9218d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                }
92211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            } finally {
92311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.endSession();
9248d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad            }
925f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        }
926f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
927f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        /**
928f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon         * @see android.telecom.TelecomManager#isTtySupported
929f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon         */
930f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        @Override
93109611181c665403a8d9e70d95b7e0e4361976122Svet Ganov        public boolean isTtySupported(String callingPackage) {
93211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            try {
93311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.startSession("TSI.iTS");
93411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                if (!canReadPhoneState(callingPackage, "hasVoiceMailNumber")) {
93511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    return false;
93611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                }
93709611181c665403a8d9e70d95b7e0e4361976122Svet Ganov
93811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                synchronized (mLock) {
93911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    return mCallsManager.isTtySupported();
94011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                }
94111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            } finally {
94211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.endSession();
9438d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad            }
944f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        }
945f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
946f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        /**
947f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon         * @see android.telecom.TelecomManager#getCurrentTtyMode
948f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon         */
949f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        @Override
95009611181c665403a8d9e70d95b7e0e4361976122Svet Ganov        public int getCurrentTtyMode(String callingPackage) {
95111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            try {
95211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.startSession("TSI.gCTM");
95311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                if (!canReadPhoneState(callingPackage, "getCurrentTtyMode")) {
95411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    return TelecomManager.TTY_MODE_OFF;
95511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                }
95609611181c665403a8d9e70d95b7e0e4361976122Svet Ganov
95711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                synchronized (mLock) {
95811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    return mCallsManager.getCurrentTtyMode();
95911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                }
96011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            } finally {
96111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.endSession();
9628d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad            }
963f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        }
964f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
965f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        /**
966f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon         * @see android.telecom.TelecomManager#addNewIncomingCall
967f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon         */
968f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        @Override
969f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        public void addNewIncomingCall(PhoneAccountHandle phoneAccountHandle, Bundle extras) {
97011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            try {
97111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.startSession("TSI.aNIC");
97211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                synchronized (mLock) {
97311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    Log.i(this, "Adding new incoming call with phoneAccountHandle %s",
9746d3efb475b495722b32976fe60c1ea5a9838ae53Sharvil Nanavati                            phoneAccountHandle);
97511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    if (phoneAccountHandle != null &&
97611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                            phoneAccountHandle.getComponentName() != null) {
97711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        // TODO(sail): Add unit tests for adding incoming calls from a SIM call
97811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        // manager.
97911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        if (isCallerSimCallManager() && TelephonyUtil.isPstnComponentName(
98011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                                phoneAccountHandle.getComponentName())) {
98111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                            Log.v(this, "Allowing call manager to add incoming call with PSTN" +
98211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                                    " handle");
98311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        } else {
98411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                            mAppOpsManager.checkPackage(
98511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                                    Binder.getCallingUid(),
98611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                                    phoneAccountHandle.getComponentName().getPackageName());
98711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                            // Make sure it doesn't cross the UserHandle boundary
98811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                            enforceUserHandleMatchesCaller(phoneAccountHandle);
9895851fa014a0c6a245f8da96083674622bfce0d9cTony Mak                            enforcePhoneAccountIsRegisteredEnabled(phoneAccountHandle,
9905851fa014a0c6a245f8da96083674622bfce0d9cTony Mak                                    Binder.getCallingUserHandle());
991a90ba73e6ca2e7e3ef88e41477bf595e03f9359fTyler Gunn                            if (isSelfManagedConnectionService(phoneAccountHandle)) {
992a90ba73e6ca2e7e3ef88e41477bf595e03f9359fTyler Gunn                                // Self-managed phone account, ensure it has MANAGE_OWN_CALLS.
993a90ba73e6ca2e7e3ef88e41477bf595e03f9359fTyler Gunn                                mContext.enforceCallingOrSelfPermission(
994a90ba73e6ca2e7e3ef88e41477bf595e03f9359fTyler Gunn                                        android.Manifest.permission.MANAGE_OWN_CALLS,
995a90ba73e6ca2e7e3ef88e41477bf595e03f9359fTyler Gunn                                        "Self-managed phone accounts must have MANAGE_OWN_CALLS " +
996a90ba73e6ca2e7e3ef88e41477bf595e03f9359fTyler Gunn                                                "permission.");
9971172a0112f3641d1a73681fe6a0bdeef3455bc6cTyler Gunn
9981172a0112f3641d1a73681fe6a0bdeef3455bc6cTyler Gunn                                // Self-managed ConnectionServices can ONLY add new incoming calls
9991172a0112f3641d1a73681fe6a0bdeef3455bc6cTyler Gunn                                // using their own PhoneAccounts.  The checkPackage(..) app opps
10001172a0112f3641d1a73681fe6a0bdeef3455bc6cTyler Gunn                                // check above ensures this.
1001a90ba73e6ca2e7e3ef88e41477bf595e03f9359fTyler Gunn                            }
10026d3efb475b495722b32976fe60c1ea5a9838ae53Sharvil Nanavati                        }
100311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        long token = Binder.clearCallingIdentity();
100411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        try {
100511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                            Intent intent = new Intent(TelecomManager.ACTION_INCOMING_CALL);
100611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                            intent.putExtra(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE,
100711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                                    phoneAccountHandle);
100811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                            intent.putExtra(CallIntentProcessor.KEY_IS_INCOMING_CALL, true);
100911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                            if (extras != null) {
1010e2e4cdff6dd167ea1ede3eb6ee53468b9a32f0afJeff Sharkey                                extras.setDefusable(true);
101111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                                intent.putExtra(TelecomManager.EXTRA_INCOMING_CALL_EXTRAS, extras);
101211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                            }
1013ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                            mCallIntentProcessorAdapter.processIncomingCallIntent(
1014ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                                    mCallsManager, intent);
101511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        } finally {
101611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                            Binder.restoreCallingIdentity(token);
101711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        }
101811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    } else {
101911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        Log.w(this, "Null phoneAccountHandle. Ignoring request to add new" +
102011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                                " incoming call");
10218d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                    }
1022f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon                }
102311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            } finally {
102411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.endSession();
1025f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon            }
1026f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        }
1027f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
1028f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        /**
1029f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon         * @see android.telecom.TelecomManager#addNewUnknownCall
1030f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon         */
1031f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        @Override
1032f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        public void addNewUnknownCall(PhoneAccountHandle phoneAccountHandle, Bundle extras) {
103311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            try {
103411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.startSession("TSI.aNUC");
103511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                synchronized (mLock) {
103611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    if (phoneAccountHandle != null &&
103711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                            phoneAccountHandle.getComponentName() != null) {
103811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        mAppOpsManager.checkPackage(
103911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                                Binder.getCallingUid(),
104011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                                phoneAccountHandle.getComponentName().getPackageName());
10418d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad
104211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        // Make sure it doesn't cross the UserHandle boundary
104311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        enforceUserHandleMatchesCaller(phoneAccountHandle);
10445851fa014a0c6a245f8da96083674622bfce0d9cTony Mak                        enforcePhoneAccountIsRegisteredEnabled(phoneAccountHandle,
10455851fa014a0c6a245f8da96083674622bfce0d9cTony Mak                                Binder.getCallingUserHandle());
104611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        long token = Binder.clearCallingIdentity();
104711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger
104811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        try {
104911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                            Intent intent = new Intent(TelecomManager.ACTION_NEW_UNKNOWN_CALL);
1050e2e4cdff6dd167ea1ede3eb6ee53468b9a32f0afJeff Sharkey                            if (extras != null) {
1051e2e4cdff6dd167ea1ede3eb6ee53468b9a32f0afJeff Sharkey                                extras.setDefusable(true);
1052e2e4cdff6dd167ea1ede3eb6ee53468b9a32f0afJeff Sharkey                                intent.putExtras(extras);
1053e2e4cdff6dd167ea1ede3eb6ee53468b9a32f0afJeff Sharkey                            }
105411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                            intent.putExtra(CallIntentProcessor.KEY_IS_UNKNOWN_CALL, true);
105511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                            intent.putExtra(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE,
105611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                                    phoneAccountHandle);
1057ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                            mCallIntentProcessorAdapter.processUnknownCallIntent(mCallsManager, intent);
105811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        } finally {
105911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                            Binder.restoreCallingIdentity(token);
106011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        }
106111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    } else {
106211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        Log.i(this,
106311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                                "Null phoneAccountHandle or not initiated by Telephony. " +
106411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                                        "Ignoring request to add new unknown call.");
10656d3efb475b495722b32976fe60c1ea5a9838ae53Sharvil Nanavati                    }
10668d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                }
106711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            } finally {
106811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.endSession();
1069f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon            }
1070f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        }
1071476898696befd384e92532aabb45be5c81efa9f6Tyler Gunn
1072476898696befd384e92532aabb45be5c81efa9f6Tyler Gunn        /**
1073a3a3adc39441d3c206400ff26fc117fae2ead5edYorke Lee         * @see android.telecom.TelecomManager#placeCall
1074a3a3adc39441d3c206400ff26fc117fae2ead5edYorke Lee         */
1075a3a3adc39441d3c206400ff26fc117fae2ead5edYorke Lee        @Override
1076a3a3adc39441d3c206400ff26fc117fae2ead5edYorke Lee        public void placeCall(Uri handle, Bundle extras, String callingPackage) {
107711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            try {
107811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.startSession("TSI.pC");
107911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                enforceCallingPackage(callingPackage);
1080a90ba73e6ca2e7e3ef88e41477bf595e03f9359fTyler Gunn
1081a90ba73e6ca2e7e3ef88e41477bf595e03f9359fTyler Gunn                PhoneAccountHandle phoneAccountHandle = null;
1082a90ba73e6ca2e7e3ef88e41477bf595e03f9359fTyler Gunn                if (extras != null) {
1083a90ba73e6ca2e7e3ef88e41477bf595e03f9359fTyler Gunn                    phoneAccountHandle = extras.getParcelable(
1084a90ba73e6ca2e7e3ef88e41477bf595e03f9359fTyler Gunn                            TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE);
1085a90ba73e6ca2e7e3ef88e41477bf595e03f9359fTyler Gunn                }
1086a90ba73e6ca2e7e3ef88e41477bf595e03f9359fTyler Gunn                boolean isSelfManaged = phoneAccountHandle != null &&
1087a90ba73e6ca2e7e3ef88e41477bf595e03f9359fTyler Gunn                        isSelfManagedConnectionService(phoneAccountHandle);
1088a90ba73e6ca2e7e3ef88e41477bf595e03f9359fTyler Gunn                if (isSelfManaged) {
1089a90ba73e6ca2e7e3ef88e41477bf595e03f9359fTyler Gunn                    mContext.enforceCallingOrSelfPermission(Manifest.permission.MANAGE_OWN_CALLS,
1090a90ba73e6ca2e7e3ef88e41477bf595e03f9359fTyler Gunn                            "Self-managed ConnectionServices require MANAGE_OWN_CALLS permission.");
10911172a0112f3641d1a73681fe6a0bdeef3455bc6cTyler Gunn
10921172a0112f3641d1a73681fe6a0bdeef3455bc6cTyler Gunn                    if (!callingPackage.equals(
10931172a0112f3641d1a73681fe6a0bdeef3455bc6cTyler Gunn                            phoneAccountHandle.getComponentName().getPackageName())
10941172a0112f3641d1a73681fe6a0bdeef3455bc6cTyler Gunn                            && !canCallPhone(callingPackage,
10951172a0112f3641d1a73681fe6a0bdeef3455bc6cTyler Gunn                            "CALL_PHONE permission required to place calls.")) {
10961172a0112f3641d1a73681fe6a0bdeef3455bc6cTyler Gunn                        // The caller is not allowed to place calls, so we want to ensure that it
10971172a0112f3641d1a73681fe6a0bdeef3455bc6cTyler Gunn                        // can only place calls through itself.
10981172a0112f3641d1a73681fe6a0bdeef3455bc6cTyler Gunn                        throw new SecurityException("Self-managed ConnectionServices can only "
10991172a0112f3641d1a73681fe6a0bdeef3455bc6cTyler Gunn                                + "place calls through their own ConnectionService.");
11001172a0112f3641d1a73681fe6a0bdeef3455bc6cTyler Gunn                    }
1101a90ba73e6ca2e7e3ef88e41477bf595e03f9359fTyler Gunn                } else if (!canCallPhone(callingPackage, "placeCall")) {
110211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    throw new SecurityException("Package " + callingPackage
110311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                            + " is not allowed to place phone calls");
110411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                }
1105cb0bd8a807c0b7d0c4db9fe9a48ea8cbf2efa97eYorke Lee
110611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                // Note: we can still get here for the default/system dialer, even if the Phone
110711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                // permission is turned off. This is because the default/system dialer is always
110811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                // allowed to attempt to place a call (regardless of permission state), in case
110911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                // it turns out to be an emergency call. If the permission is denied and the
111011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                // call is being made to a non-emergency number, the call will be denied later on
111111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                // by {@link UserCallIntentProcessor}.
1112cf497c9f72d3f7bac609ca6d5a64ddf2e28f6dbeYorke Lee
111311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                final boolean hasCallAppOp = mAppOpsManager.noteOp(AppOpsManager.OP_CALL_PHONE,
111411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        Binder.getCallingUid(), callingPackage) == AppOpsManager.MODE_ALLOWED;
11155dc42ee62c21ee81d51a411a0cfb61653fdf2858Yorke Lee
111611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                final boolean hasCallPermission = mContext.checkCallingPermission(CALL_PHONE) ==
111711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        PackageManager.PERMISSION_GRANTED;
1118cf497c9f72d3f7bac609ca6d5a64ddf2e28f6dbeYorke Lee
111911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                synchronized (mLock) {
112011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    final UserHandle userHandle = Binder.getCallingUserHandle();
112111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    long token = Binder.clearCallingIdentity();
112211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    try {
112311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        final Intent intent = new Intent(Intent.ACTION_CALL, handle);
1124e2e4cdff6dd167ea1ede3eb6ee53468b9a32f0afJeff Sharkey                        if (extras != null) {
1125e2e4cdff6dd167ea1ede3eb6ee53468b9a32f0afJeff Sharkey                            extras.setDefusable(true);
1126e2e4cdff6dd167ea1ede3eb6ee53468b9a32f0afJeff Sharkey                            intent.putExtras(extras);
1127e2e4cdff6dd167ea1ede3eb6ee53468b9a32f0afJeff Sharkey                        }
1128ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                        mUserCallIntentProcessorFactory.create(mContext, userHandle)
1129ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu                                .processIntent(
1130a90ba73e6ca2e7e3ef88e41477bf595e03f9359fTyler Gunn                                        intent, callingPackage, isSelfManaged ||
1131a90ba73e6ca2e7e3ef88e41477bf595e03f9359fTyler Gunn                                                (hasCallAppOp && hasCallPermission));
113211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    } finally {
113311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        Binder.restoreCallingIdentity(token);
113411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    }
113558061751ecd5d302f57436582fcff82689e2bb6cYorke Lee                }
113611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            } finally {
113711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.endSession();
1138a3a3adc39441d3c206400ff26fc117fae2ead5edYorke Lee            }
1139a3a3adc39441d3c206400ff26fc117fae2ead5edYorke Lee        }
1140a3a3adc39441d3c206400ff26fc117fae2ead5edYorke Lee
1141a3a3adc39441d3c206400ff26fc117fae2ead5edYorke Lee        /**
1142ea5cb93d81099f17654e0fdf9b8eda3bfa89f081Santos Cordon         * @see android.telecom.TelecomManager#enablePhoneAccount
1143ea5cb93d81099f17654e0fdf9b8eda3bfa89f081Santos Cordon         */
1144ea5cb93d81099f17654e0fdf9b8eda3bfa89f081Santos Cordon        @Override
114571734c2db8a4e412d833b267777dd011e04cc942Yorke Lee        public boolean enablePhoneAccount(PhoneAccountHandle accountHandle, boolean isEnabled) {
114611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            try {
114711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.startSession("TSI.ePA");
114811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                enforceModifyPermission();
114911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                synchronized (mLock) {
115011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    long token = Binder.clearCallingIdentity();
115111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    try {
115211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        // enable/disable phone account
115311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        return mPhoneAccountRegistrar.enablePhoneAccount(accountHandle, isEnabled);
115411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    } finally {
115511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        Binder.restoreCallingIdentity(token);
115611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    }
115771734c2db8a4e412d833b267777dd011e04cc942Yorke Lee                }
115811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            } finally {
115911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.endSession();
116071734c2db8a4e412d833b267777dd011e04cc942Yorke Lee            }
116171734c2db8a4e412d833b267777dd011e04cc942Yorke Lee        }
116271734c2db8a4e412d833b267777dd011e04cc942Yorke Lee
116371734c2db8a4e412d833b267777dd011e04cc942Yorke Lee        @Override
116471734c2db8a4e412d833b267777dd011e04cc942Yorke Lee        public boolean setDefaultDialer(String packageName) {
116511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            try {
116611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.startSession("TSI.sDD");
116711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                enforcePermission(MODIFY_PHONE_STATE);
116811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                enforcePermission(WRITE_SECURE_SETTINGS);
116911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                synchronized (mLock) {
117011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    long token = Binder.clearCallingIdentity();
117111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    try {
11727c9283261ad4fdbc5ebbb74257671388f9c758c7Hall Liu                        final boolean result = mDefaultDialerCache.setDefaultDialer(
11737c9283261ad4fdbc5ebbb74257671388f9c758c7Hall Liu                                packageName, ActivityManager.getCurrentUser());
117411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        if (result) {
117511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                            final Intent intent =
117611623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                                    new Intent(TelecomManager.ACTION_DEFAULT_DIALER_CHANGED);
117711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                            intent.putExtra(TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME,
117811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                                    packageName);
117911623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                            mContext.sendBroadcastAsUser(intent,
118011623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                                    new UserHandle(ActivityManager.getCurrentUser()));
118111623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        }
118211623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        return result;
118311623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    } finally {
118411623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                        Binder.restoreCallingIdentity(token);
118511623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                    }
1186ea5cb93d81099f17654e0fdf9b8eda3bfa89f081Santos Cordon                }
118711623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger            } finally {
118811623a354be47205bf3bc686ed8fdfc278958983Brad Ebinger                Log.endSession();
1189ea5cb93d81099f17654e0fdf9b8eda3bfa89f081Santos Cordon            }
1190ea5cb93d81099f17654e0fdf9b8eda3bfa89f081Santos Cordon        }
1191ea5cb93d81099f17654e0fdf9b8eda3bfa89f081Santos Cordon
1192ecd74a56dbce2d15ff46ad3e64a16dfe8b6c734fHall Liu        @Override
1193874c0f8fa95a5da5a82e67c1fe39697883d753ebHall Liu        public TelecomAnalytics dumpCallAnalytics() {
1194ecd74a56dbce2d15ff46ad3e64a16dfe8b6c734fHall Liu            try {
1195ecd74a56dbce2d15ff46ad3e64a16dfe8b6c734fHall Liu                Log.startSession("TSI.dCA");
1196ecd74a56dbce2d15ff46ad3e64a16dfe8b6c734fHall Liu                enforcePermission(DUMP);
1197874c0f8fa95a5da5a82e67c1fe39697883d753ebHall Liu                return Analytics.dumpToParcelableAnalytics();
1198ecd74a56dbce2d15ff46ad3e64a16dfe8b6c734fHall Liu            } finally {
1199ecd74a56dbce2d15ff46ad3e64a16dfe8b6c734fHall Liu                Log.endSession();
1200ecd74a56dbce2d15ff46ad3e64a16dfe8b6c734fHall Liu            }
1201ecd74a56dbce2d15ff46ad3e64a16dfe8b6c734fHall Liu        }
1202ecd74a56dbce2d15ff46ad3e64a16dfe8b6c734fHall Liu
1203ea5cb93d81099f17654e0fdf9b8eda3bfa89f081Santos Cordon        /**
1204476898696befd384e92532aabb45be5c81efa9f6Tyler Gunn         * Dumps the current state of the TelecomService.  Used when generating problem reports.
1205476898696befd384e92532aabb45be5c81efa9f6Tyler Gunn         *
1206476898696befd384e92532aabb45be5c81efa9f6Tyler Gunn         * @param fd The file descriptor.
1207476898696befd384e92532aabb45be5c81efa9f6Tyler Gunn         * @param writer The print writer to dump the state to.
1208476898696befd384e92532aabb45be5c81efa9f6Tyler Gunn         * @param args Optional dump arguments.
1209476898696befd384e92532aabb45be5c81efa9f6Tyler Gunn         */
1210476898696befd384e92532aabb45be5c81efa9f6Tyler Gunn        @Override
1211476898696befd384e92532aabb45be5c81efa9f6Tyler Gunn        protected void dump(FileDescriptor fd, final PrintWriter writer, String[] args) {
1212476898696befd384e92532aabb45be5c81efa9f6Tyler Gunn            if (mContext.checkCallingOrSelfPermission(
1213476898696befd384e92532aabb45be5c81efa9f6Tyler Gunn                    android.Manifest.permission.DUMP)
1214476898696befd384e92532aabb45be5c81efa9f6Tyler Gunn                    != PackageManager.PERMISSION_GRANTED) {
1215476898696befd384e92532aabb45be5c81efa9f6Tyler Gunn                writer.println("Permission Denial: can't dump TelecomService " +
1216476898696befd384e92532aabb45be5c81efa9f6Tyler Gunn                        "from from pid=" + Binder.getCallingPid() + ", uid=" +
1217476898696befd384e92532aabb45be5c81efa9f6Tyler Gunn                        Binder.getCallingUid());
1218476898696befd384e92532aabb45be5c81efa9f6Tyler Gunn                return;
1219476898696befd384e92532aabb45be5c81efa9f6Tyler Gunn            }
1220476898696befd384e92532aabb45be5c81efa9f6Tyler Gunn
12215bbbcf772ceb961d8252c003dfbed240ded98cb9Hall Liu            if (args.length > 0 && Analytics.ANALYTICS_DUMPSYS_ARG.equals(args[0])) {
12225bbbcf772ceb961d8252c003dfbed240ded98cb9Hall Liu                Analytics.dumpToEncodedProto(writer, args);
12235bbbcf772ceb961d8252c003dfbed240ded98cb9Hall Liu                return;
12245bbbcf772ceb961d8252c003dfbed240ded98cb9Hall Liu            }
12255bbbcf772ceb961d8252c003dfbed240ded98cb9Hall Liu
1226476898696befd384e92532aabb45be5c81efa9f6Tyler Gunn            final IndentingPrintWriter pw = new IndentingPrintWriter(writer, "  ");
12278de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            if (mCallsManager != null) {
122878a5e6b9c1595c81f72d7a822617cb78db224e48Ihab Awad                pw.println("CallsManager: ");
1229476898696befd384e92532aabb45be5c81efa9f6Tyler Gunn                pw.increaseIndent();
12308de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                mCallsManager.dump(pw);
1231476898696befd384e92532aabb45be5c81efa9f6Tyler Gunn                pw.decreaseIndent();
1232476898696befd384e92532aabb45be5c81efa9f6Tyler Gunn
123378a5e6b9c1595c81f72d7a822617cb78db224e48Ihab Awad                pw.println("PhoneAccountRegistrar: ");
1234476898696befd384e92532aabb45be5c81efa9f6Tyler Gunn                pw.increaseIndent();
12358d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                mPhoneAccountRegistrar.dump(pw);
1236476898696befd384e92532aabb45be5c81efa9f6Tyler Gunn                pw.decreaseIndent();
12373258720f5526f766aa26c19cf01b32ac20d19d1dHall Liu
12383258720f5526f766aa26c19cf01b32ac20d19d1dHall Liu                pw.println("Analytics:");
12393258720f5526f766aa26c19cf01b32ac20d19d1dHall Liu                pw.increaseIndent();
12403258720f5526f766aa26c19cf01b32ac20d19d1dHall Liu                Analytics.dump(pw);
12413258720f5526f766aa26c19cf01b32ac20d19d1dHall Liu                pw.decreaseIndent();
1242476898696befd384e92532aabb45be5c81efa9f6Tyler Gunn            }
12432685dabdb656f72dfe851215f2e99f82896f052fSantos Cordon
1244a3eccfee788c3ac3c831a443b085b141b39bb63dBrad Ebinger            Log.dumpEvents(pw);
1245476898696befd384e92532aabb45be5c81efa9f6Tyler Gunn        }
12467a846f5378046320799238dd974606daccfbcbbbAbhijith Shastry
1247c926185584d458323465431c296c51fe52f87945Mohamed        /**
1248b1308ec228d8517caddaf0b09d57aacf67c8dcabAbhijith Shastry         * @see android.telecom.TelecomManager#createManageBlockedNumbersIntent
1249b1308ec228d8517caddaf0b09d57aacf67c8dcabAbhijith Shastry         */
1250ebe7bbeb63816c69189c7e0b6c5f42139b2f1544Abhijith Shastry        @Override
1251ebe7bbeb63816c69189c7e0b6c5f42139b2f1544Abhijith Shastry        public Intent createManageBlockedNumbersIntent() {
1252b1308ec228d8517caddaf0b09d57aacf67c8dcabAbhijith Shastry            return BlockedNumbersActivity.getIntentForStartingActivity();
1253ebe7bbeb63816c69189c7e0b6c5f42139b2f1544Abhijith Shastry        }
1254acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn
1255acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn        /**
1256acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn         * @see android.telecom.TelecomManager#isIncomingCallPermitted(PhoneAccountHandle)
1257acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn         */
1258acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn        @Override
1259acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn        public boolean isIncomingCallPermitted(PhoneAccountHandle phoneAccountHandle) {
1260acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn            try {
1261acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn                Log.startSession("TSI.iICP");
1262acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn                enforcePermission(android.Manifest.permission.MANAGE_OWN_CALLS);
1263acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn                synchronized (mLock) {
1264acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn                    long token = Binder.clearCallingIdentity();
1265acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn                    try {
1266a90ba73e6ca2e7e3ef88e41477bf595e03f9359fTyler Gunn                        return mCallsManager.isIncomingCallPermitted(phoneAccountHandle);
1267acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn                    } finally {
1268acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn                        Binder.restoreCallingIdentity(token);
1269acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn                    }
1270acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn                }
1271acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn            } finally {
1272acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn                Log.endSession();
1273acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn            }
1274acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn        }
1275acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn
1276acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn        /**
1277acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn         * @see android.telecom.TelecomManager#isOutgoingCallPermitted(PhoneAccountHandle)
1278acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn         */
1279acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn        @Override
1280acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn        public boolean isOutgoingCallPermitted(PhoneAccountHandle phoneAccountHandle) {
1281acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn            try {
1282acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn                Log.startSession("TSI.iOCP");
1283acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn                enforcePermission(android.Manifest.permission.MANAGE_OWN_CALLS);
1284acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn                synchronized (mLock) {
1285acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn                    long token = Binder.clearCallingIdentity();
1286acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn                    try {
1287a90ba73e6ca2e7e3ef88e41477bf595e03f9359fTyler Gunn                        return mCallsManager.isOutgoingCallPermitted(phoneAccountHandle);
1288acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn                    } finally {
1289acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn                        Binder.restoreCallingIdentity(token);
1290acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn                    }
1291acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn                }
1292acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn            } finally {
1293acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn                Log.endSession();
1294acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn            }
1295acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn        }
12969e806ee181a8422040f51b06effd433c9675a66fTyler Gunn
12979e806ee181a8422040f51b06effd433c9675a66fTyler Gunn        /**
12989e806ee181a8422040f51b06effd433c9675a66fTyler Gunn         * Blocks until all Telecom handlers have completed their current work.
12999e806ee181a8422040f51b06effd433c9675a66fTyler Gunn         *
13009e806ee181a8422040f51b06effd433c9675a66fTyler Gunn         * See {@link com.android.commands.telecom.Telecom}.
13019e806ee181a8422040f51b06effd433c9675a66fTyler Gunn         */
13029e806ee181a8422040f51b06effd433c9675a66fTyler Gunn        @Override
13039e806ee181a8422040f51b06effd433c9675a66fTyler Gunn        public void waitOnHandlers() {
13049e806ee181a8422040f51b06effd433c9675a66fTyler Gunn            try {
13059e806ee181a8422040f51b06effd433c9675a66fTyler Gunn                Log.startSession("TSI.wOH");
13069e806ee181a8422040f51b06effd433c9675a66fTyler Gunn                enforceModifyPermission();
13079e806ee181a8422040f51b06effd433c9675a66fTyler Gunn                synchronized (mLock) {
13089e806ee181a8422040f51b06effd433c9675a66fTyler Gunn                    long token = Binder.clearCallingIdentity();
13099e806ee181a8422040f51b06effd433c9675a66fTyler Gunn                    try {
13109e806ee181a8422040f51b06effd433c9675a66fTyler Gunn                        Log.i(this, "waitOnHandlers");
13119e806ee181a8422040f51b06effd433c9675a66fTyler Gunn                        mCallsManager.waitOnHandlers();
13129e806ee181a8422040f51b06effd433c9675a66fTyler Gunn                    } finally {
13139e806ee181a8422040f51b06effd433c9675a66fTyler Gunn                        Binder.restoreCallingIdentity(token);
13149e806ee181a8422040f51b06effd433c9675a66fTyler Gunn                    }
13159e806ee181a8422040f51b06effd433c9675a66fTyler Gunn                }
13169e806ee181a8422040f51b06effd433c9675a66fTyler Gunn            } finally {
13179e806ee181a8422040f51b06effd433c9675a66fTyler Gunn                Log.endSession();
13189e806ee181a8422040f51b06effd433c9675a66fTyler Gunn            }
13199e806ee181a8422040f51b06effd433c9675a66fTyler Gunn        }
13208d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad    };
13218d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad
1322ccba720d2496060078a6551ffd1609c2dc7ce95cEugene Susla    /**
1323ccba720d2496060078a6551ffd1609c2dc7ce95cEugene Susla     * @return whether to return early without doing the action/throwing
1324ccba720d2496060078a6551ffd1609c2dc7ce95cEugene Susla     * @throws SecurityException same as {@link Context#enforceCallingOrSelfPermission}
1325ccba720d2496060078a6551ffd1609c2dc7ce95cEugene Susla     */
1326ccba720d2496060078a6551ffd1609c2dc7ce95cEugene Susla    private boolean enforceAnswerCallPermission(String packageName, int uid) {
1327ccba720d2496060078a6551ffd1609c2dc7ce95cEugene Susla        try {
1328ccba720d2496060078a6551ffd1609c2dc7ce95cEugene Susla            enforceModifyPermission();
1329ccba720d2496060078a6551ffd1609c2dc7ce95cEugene Susla        } catch (SecurityException e) {
1330ccba720d2496060078a6551ffd1609c2dc7ce95cEugene Susla            final String permission = Manifest.permission.ANSWER_PHONE_CALLS;
1331ccba720d2496060078a6551ffd1609c2dc7ce95cEugene Susla            enforcePermission(permission);
1332ccba720d2496060078a6551ffd1609c2dc7ce95cEugene Susla
1333ccba720d2496060078a6551ffd1609c2dc7ce95cEugene Susla            final int opCode = AppOpsManager.permissionToOpCode(permission);
1334ccba720d2496060078a6551ffd1609c2dc7ce95cEugene Susla            if (opCode != AppOpsManager.OP_NONE
1335ccba720d2496060078a6551ffd1609c2dc7ce95cEugene Susla                    && mAppOpsManager.checkOp(opCode, uid, packageName)
1336ccba720d2496060078a6551ffd1609c2dc7ce95cEugene Susla                        != AppOpsManager.MODE_ALLOWED) {
1337ccba720d2496060078a6551ffd1609c2dc7ce95cEugene Susla                return false;
1338ccba720d2496060078a6551ffd1609c2dc7ce95cEugene Susla            }
1339ccba720d2496060078a6551ffd1609c2dc7ce95cEugene Susla        }
1340ccba720d2496060078a6551ffd1609c2dc7ce95cEugene Susla        return true;
1341ccba720d2496060078a6551ffd1609c2dc7ce95cEugene Susla    }
1342ccba720d2496060078a6551ffd1609c2dc7ce95cEugene Susla
13438d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad    private Context mContext;
13448d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad    private AppOpsManager mAppOpsManager;
13458d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad    private PackageManager mPackageManager;
13468d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad    private CallsManager mCallsManager;
13478d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad    private final PhoneAccountRegistrar mPhoneAccountRegistrar;
1348ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private final CallIntentProcessor.Adapter mCallIntentProcessorAdapter;
1349ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu    private final UserCallIntentProcessorFactory mUserCallIntentProcessorFactory;
13507c9283261ad4fdbc5ebbb74257671388f9c758c7Hall Liu    private final DefaultDialerCache mDefaultDialerCache;
13510a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu    private final SubscriptionManagerAdapter mSubscriptionManagerAdapter;
13528d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad    private final TelecomSystem.SyncRoot mLock;
13538d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad
13548d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad    public TelecomServiceImpl(
13558d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad            Context context,
13568d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad            CallsManager callsManager,
13578d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad            PhoneAccountRegistrar phoneAccountRegistrar,
1358ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            CallIntentProcessor.Adapter callIntentProcessorAdapter,
1359ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            UserCallIntentProcessorFactory userCallIntentProcessorFactory,
13607c9283261ad4fdbc5ebbb74257671388f9c758c7Hall Liu            DefaultDialerCache defaultDialerCache,
13610a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu            SubscriptionManagerAdapter subscriptionManagerAdapter,
13628d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad            TelecomSystem.SyncRoot lock) {
13638d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad        mContext = context;
13648d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad        mAppOpsManager = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE);
13658d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad
13668d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad        mPackageManager = mContext.getPackageManager();
13678d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad
13688d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad        mCallsManager = callsManager;
13698d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad        mLock = lock;
13708d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad        mPhoneAccountRegistrar = phoneAccountRegistrar;
1371ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        mUserCallIntentProcessorFactory = userCallIntentProcessorFactory;
13727c9283261ad4fdbc5ebbb74257671388f9c758c7Hall Liu        mDefaultDialerCache = defaultDialerCache;
1373ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        mCallIntentProcessorAdapter = callIntentProcessorAdapter;
13740a6dd30f0f7acab586db9933bd4836148cd91c89Hall Liu        mSubscriptionManagerAdapter = subscriptionManagerAdapter;
13758d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad    }
13768d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad
1377aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    public ITelecomService.Stub getBinder() {
13788d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad        return mBinderImpl;
1379f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon    }
1380f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
1381f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon    //
1382f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon    // Supporting methods for the ITelecomService interface implementation.
1383f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon    //
1384f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
1385240656f19c078b4f703d0502ce29114de0d45a50Tony Mak    private boolean isPhoneAccountHandleVisibleToCallingUser(
1386240656f19c078b4f703d0502ce29114de0d45a50Tony Mak            PhoneAccountHandle phoneAccountUserHandle, UserHandle callingUser) {
1387240656f19c078b4f703d0502ce29114de0d45a50Tony Mak        return mPhoneAccountRegistrar.getPhoneAccount(phoneAccountUserHandle, callingUser) != null;
1388f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon    }
1389f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
1390f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon    private boolean isCallerSystemApp() {
1391f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        int uid = Binder.getCallingUid();
1392f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        String[] packages = mPackageManager.getPackagesForUid(uid);
1393f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        for (String packageName : packages) {
1394f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon            if (isPackageSystemApp(packageName)) {
1395f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon                return true;
1396f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon            }
1397f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        }
1398f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        return false;
1399f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon    }
1400f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
1401f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon    private boolean isPackageSystemApp(String packageName) {
1402f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        try {
1403f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon            ApplicationInfo applicationInfo = mPackageManager.getApplicationInfo(packageName,
1404f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon                    PackageManager.GET_META_DATA);
1405f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon            if ((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
1406f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon                return true;
1407f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon            }
1408f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        } catch (PackageManager.NameNotFoundException e) {
1409f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        }
1410f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        return false;
1411f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon    }
1412f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
141342ef808c284791f21be8675174acc7297418fa45Tyler Gunn    private void acceptRingingCallInternal(int videoState) {
14148de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        Call call = mCallsManager.getFirstCallWithState(CallState.RINGING);
1415f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        if (call != null) {
141642ef808c284791f21be8675174acc7297418fa45Tyler Gunn            if (videoState == DEFAULT_VIDEO_STATE || !isValidAcceptVideoState(videoState)) {
141742ef808c284791f21be8675174acc7297418fa45Tyler Gunn                videoState = call.getVideoState();
141842ef808c284791f21be8675174acc7297418fa45Tyler Gunn            }
141942ef808c284791f21be8675174acc7297418fa45Tyler Gunn            call.answer(videoState);
1420f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        }
1421f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon    }
1422f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
1423f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon    private boolean endCallInternal() {
1424f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        // Always operate on the foreground call if one exists, otherwise get the first call in
1425f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        // priority order by call-state.
14268de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        Call call = mCallsManager.getForegroundCall();
1427f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        if (call == null) {
14288de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            call = mCallsManager.getFirstCallWithState(
1429f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon                    CallState.ACTIVE,
1430f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon                    CallState.DIALING,
14311e37be5dd86a51b90e461f09dc8a89effe4aee21Tyler Gunn                    CallState.PULLING,
1432f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon                    CallState.RINGING,
1433f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon                    CallState.ON_HOLD);
1434f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        }
1435f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
1436f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        if (call != null) {
1437f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon            if (call.getState() == CallState.RINGING) {
1438f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon                call.reject(false /* rejectWithMessage */, null);
1439f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon            } else {
1440f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon                call.disconnect();
1441f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon            }
1442f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon            return true;
1443f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        }
1444f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
1445f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        return false;
1446f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon    }
1447f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
144862da8e1505f887838dcd4895ebdb23a40b409515Brad Ebinger    // Enforce that the PhoneAccountHandle being passed in is both registered to the current user
144962da8e1505f887838dcd4895ebdb23a40b409515Brad Ebinger    // and enabled.
14505851fa014a0c6a245f8da96083674622bfce0d9cTony Mak    private void enforcePhoneAccountIsRegisteredEnabled(PhoneAccountHandle phoneAccountHandle,
14515851fa014a0c6a245f8da96083674622bfce0d9cTony Mak                                                        UserHandle callingUserHandle) {
14525851fa014a0c6a245f8da96083674622bfce0d9cTony Mak        PhoneAccount phoneAccount = mPhoneAccountRegistrar.getPhoneAccount(phoneAccountHandle,
14535851fa014a0c6a245f8da96083674622bfce0d9cTony Mak                callingUserHandle);
145462da8e1505f887838dcd4895ebdb23a40b409515Brad Ebinger        if(phoneAccount == null) {
145562da8e1505f887838dcd4895ebdb23a40b409515Brad Ebinger            EventLog.writeEvent(0x534e4554, "26864502", Binder.getCallingUid(), "R");
145662da8e1505f887838dcd4895ebdb23a40b409515Brad Ebinger            throw new SecurityException("This PhoneAccountHandle is not registered for this user!");
145762da8e1505f887838dcd4895ebdb23a40b409515Brad Ebinger        }
145862da8e1505f887838dcd4895ebdb23a40b409515Brad Ebinger        if(!phoneAccount.isEnabled()) {
145962da8e1505f887838dcd4895ebdb23a40b409515Brad Ebinger            EventLog.writeEvent(0x534e4554, "26864502", Binder.getCallingUid(), "E");
146062da8e1505f887838dcd4895ebdb23a40b409515Brad Ebinger            throw new SecurityException("This PhoneAccountHandle is not enabled for this user!");
146162da8e1505f887838dcd4895ebdb23a40b409515Brad Ebinger        }
146262da8e1505f887838dcd4895ebdb23a40b409515Brad Ebinger    }
146362da8e1505f887838dcd4895ebdb23a40b409515Brad Ebinger
1464f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon    private void enforcePhoneAccountModificationForPackage(String packageName) {
1465f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        // TODO: Use a new telecomm permission for this instead of reusing modify.
1466f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
1467cb0bd8a807c0b7d0c4db9fe9a48ea8cbf2efa97eYorke Lee        int result = mContext.checkCallingOrSelfPermission(MODIFY_PHONE_STATE);
1468f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
1469f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        // Callers with MODIFY_PHONE_STATE can use the PhoneAccount mechanism to implement
1470f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        // built-in behavior even when PhoneAccounts are not exposed as a third-part API. They
1471f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        // may also modify PhoneAccounts on behalf of any 'packageName'.
1472f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
1473f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        if (result != PackageManager.PERMISSION_GRANTED) {
1474f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon            // Other callers are only allowed to modify PhoneAccounts if the relevant system
1475f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon            // feature is enabled ...
1476f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon            enforceConnectionServiceFeature();
1477f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon            // ... and the PhoneAccounts they refer to are for their own package.
1478f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon            enforceCallingPackage(packageName);
1479f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        }
1480f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon    }
1481f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
1482cb0bd8a807c0b7d0c4db9fe9a48ea8cbf2efa97eYorke Lee    private void enforcePermissionOrPrivilegedDialer(String permission, String packageName) {
14835310196deda80ace064a7d5bc672dbe1974906b9Yorke Lee        if (!isPrivilegedDialerCalling(packageName)) {
14845310196deda80ace064a7d5bc672dbe1974906b9Yorke Lee            try {
1485cb0bd8a807c0b7d0c4db9fe9a48ea8cbf2efa97eYorke Lee                enforcePermission(permission);
14865310196deda80ace064a7d5bc672dbe1974906b9Yorke Lee            } catch (SecurityException e) {
1487cb0bd8a807c0b7d0c4db9fe9a48ea8cbf2efa97eYorke Lee                Log.e(this, e, "Caller must be the default or system dialer, or have the permission"
1488cb0bd8a807c0b7d0c4db9fe9a48ea8cbf2efa97eYorke Lee                        + " %s to perform this operation.", permission);
14895310196deda80ace064a7d5bc672dbe1974906b9Yorke Lee                throw e;
14905310196deda80ace064a7d5bc672dbe1974906b9Yorke Lee            }
1491f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        }
1492f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon    }
1493f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
1494f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon    private void enforceCallingPackage(String packageName) {
1495f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        mAppOpsManager.checkPackage(Binder.getCallingUid(), packageName);
1496f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon    }
1497f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
1498f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon    private void enforceConnectionServiceFeature() {
1499f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        enforceFeature(PackageManager.FEATURE_CONNECTION_SERVICE);
1500f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon    }
1501f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
1502f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon    private void enforceRegisterSimSubscriptionPermission() {
1503cb0bd8a807c0b7d0c4db9fe9a48ea8cbf2efa97eYorke Lee        enforcePermission(REGISTER_SIM_SUBSCRIPTION);
1504f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon    }
1505f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
1506f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon    private void enforceModifyPermission() {
1507cb0bd8a807c0b7d0c4db9fe9a48ea8cbf2efa97eYorke Lee        enforcePermission(MODIFY_PHONE_STATE);
1508f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon    }
1509f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
1510f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon    private void enforcePermission(String permission) {
1511f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        mContext.enforceCallingOrSelfPermission(permission, null);
1512f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon    }
1513f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
1514acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn    private void enforceRegisterSelfManaged() {
1515acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn        mContext.enforceCallingPermission(android.Manifest.permission.MANAGE_OWN_CALLS, null);
1516acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn    }
1517acb3bc8474e7cdb9c6ef4f0b23c227f6ed55d356Tyler Gunn
1518f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon    private void enforceRegisterMultiUser() {
1519f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        if (!isCallerSystemApp()) {
1520f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon            throw new SecurityException("CAPABILITY_MULTI_USER is only available to system apps.");
1521f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        }
1522f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon    }
1523f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
1524f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon    private void enforceUserHandleMatchesCaller(PhoneAccountHandle accountHandle) {
1525f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        if (!Binder.getCallingUserHandle().equals(accountHandle.getUserHandle())) {
1526f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon            throw new SecurityException("Calling UserHandle does not match PhoneAccountHandle's");
1527f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        }
1528f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon    }
1529f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
1530240656f19c078b4f703d0502ce29114de0d45a50Tony Mak    private void enforceCrossUserPermission(int callingUid) {
1531240656f19c078b4f703d0502ce29114de0d45a50Tony Mak        if (callingUid != Process.SYSTEM_UID && callingUid != 0) {
1532240656f19c078b4f703d0502ce29114de0d45a50Tony Mak            mContext.enforceCallingOrSelfPermission(
1533240656f19c078b4f703d0502ce29114de0d45a50Tony Mak                    android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, "Must be system or have"
1534240656f19c078b4f703d0502ce29114de0d45a50Tony Mak                            + " INTERACT_ACROSS_USERS_FULL permission");
1535240656f19c078b4f703d0502ce29114de0d45a50Tony Mak        }
1536240656f19c078b4f703d0502ce29114de0d45a50Tony Mak    }
1537240656f19c078b4f703d0502ce29114de0d45a50Tony Mak
1538f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon    private void enforceFeature(String feature) {
1539f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        PackageManager pm = mContext.getPackageManager();
1540f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        if (!pm.hasSystemFeature(feature)) {
1541f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon            throw new UnsupportedOperationException(
1542f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon                    "System does not support feature " + feature);
1543f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon        }
1544f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon    }
1545f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
154638f1a4d91fbf8d97e3acca5bb9ea3622cfb3d0e0Svet Ganov    private boolean canReadPhoneState(String callingPackage, String message) {
154757138a6916678747e585564c691144f781d173cdYorke Lee        // The system/default dialer can always read phone state - so that emergency calls will
154857138a6916678747e585564c691144f781d173cdYorke Lee        // still work.
154957138a6916678747e585564c691144f781d173cdYorke Lee        if (isPrivilegedDialerCalling(callingPackage)) {
155057138a6916678747e585564c691144f781d173cdYorke Lee            return true;
155157138a6916678747e585564c691144f781d173cdYorke Lee        }
155257138a6916678747e585564c691144f781d173cdYorke Lee
15533c2969304cf130119af613a37c50582bcfbf7921Amit Mahajan        try {
155486b8e33e74b859427b51651c76c8ec58f57b5f65Amit Mahajan            mContext.enforceCallingOrSelfPermission(READ_PRIVILEGED_PHONE_STATE, message);
155586b8e33e74b859427b51651c76c8ec58f57b5f65Amit Mahajan            // SKIP checking run-time OP_READ_PHONE_STATE since caller or self has PRIVILEGED
155686b8e33e74b859427b51651c76c8ec58f57b5f65Amit Mahajan            // permission
15573c2969304cf130119af613a37c50582bcfbf7921Amit Mahajan            return true;
15583c2969304cf130119af613a37c50582bcfbf7921Amit Mahajan        } catch (SecurityException e) {
15593c2969304cf130119af613a37c50582bcfbf7921Amit Mahajan            // Accessing phone state is gated by a special permission.
15603c2969304cf130119af613a37c50582bcfbf7921Amit Mahajan            mContext.enforceCallingOrSelfPermission(READ_PHONE_STATE, message);
156109611181c665403a8d9e70d95b7e0e4361976122Svet Ganov
15623c2969304cf130119af613a37c50582bcfbf7921Amit Mahajan            // Some apps that have the permission can be restricted via app ops.
15633c2969304cf130119af613a37c50582bcfbf7921Amit Mahajan            return mAppOpsManager.noteOp(AppOpsManager.OP_READ_PHONE_STATE,
15643c2969304cf130119af613a37c50582bcfbf7921Amit Mahajan                    Binder.getCallingUid(), callingPackage) == AppOpsManager.MODE_ALLOWED;
15653c2969304cf130119af613a37c50582bcfbf7921Amit Mahajan        }
156609611181c665403a8d9e70d95b7e0e4361976122Svet Ganov    }
156709611181c665403a8d9e70d95b7e0e4361976122Svet Ganov
1568a90ba73e6ca2e7e3ef88e41477bf595e03f9359fTyler Gunn    private boolean isSelfManagedConnectionService(PhoneAccountHandle phoneAccountHandle) {
1569a90ba73e6ca2e7e3ef88e41477bf595e03f9359fTyler Gunn        if (phoneAccountHandle != null) {
1570a90ba73e6ca2e7e3ef88e41477bf595e03f9359fTyler Gunn                PhoneAccount phoneAccount = mPhoneAccountRegistrar.getPhoneAccountUnchecked(
1571a90ba73e6ca2e7e3ef88e41477bf595e03f9359fTyler Gunn                        phoneAccountHandle);
15729e806ee181a8422040f51b06effd433c9675a66fTyler Gunn                return phoneAccount != null && phoneAccount.isSelfManaged();
1573a90ba73e6ca2e7e3ef88e41477bf595e03f9359fTyler Gunn        }
1574a90ba73e6ca2e7e3ef88e41477bf595e03f9359fTyler Gunn        return false;
1575a90ba73e6ca2e7e3ef88e41477bf595e03f9359fTyler Gunn    }
1576a90ba73e6ca2e7e3ef88e41477bf595e03f9359fTyler Gunn
1577a3a3adc39441d3c206400ff26fc117fae2ead5edYorke Lee    private boolean canCallPhone(String callingPackage, String message) {
157857138a6916678747e585564c691144f781d173cdYorke Lee        // The system/default dialer can always read phone state - so that emergency calls will
157957138a6916678747e585564c691144f781d173cdYorke Lee        // still work.
158057138a6916678747e585564c691144f781d173cdYorke Lee        if (isPrivilegedDialerCalling(callingPackage)) {
158157138a6916678747e585564c691144f781d173cdYorke Lee            return true;
158257138a6916678747e585564c691144f781d173cdYorke Lee        }
158357138a6916678747e585564c691144f781d173cdYorke Lee
1584a3a3adc39441d3c206400ff26fc117fae2ead5edYorke Lee        // Accessing phone state is gated by a special permission.
1585cb0bd8a807c0b7d0c4db9fe9a48ea8cbf2efa97eYorke Lee        mContext.enforceCallingOrSelfPermission(CALL_PHONE, message);
1586a3a3adc39441d3c206400ff26fc117fae2ead5edYorke Lee
1587a3a3adc39441d3c206400ff26fc117fae2ead5edYorke Lee        // Some apps that have the permission can be restricted via app ops.
1588a3a3adc39441d3c206400ff26fc117fae2ead5edYorke Lee        return mAppOpsManager.noteOp(AppOpsManager.OP_CALL_PHONE,
1589a3a3adc39441d3c206400ff26fc117fae2ead5edYorke Lee                Binder.getCallingUid(), callingPackage) == AppOpsManager.MODE_ALLOWED;
1590a3a3adc39441d3c206400ff26fc117fae2ead5edYorke Lee    }
1591a3a3adc39441d3c206400ff26fc117fae2ead5edYorke Lee
15922a98c97ee6e30e30d9378a1be030a05cab71c109Sailesh Nepal    private boolean isCallerSimCallManager() {
15939427c0fc29869b76116776b1643c208ef3a031c4Yorke Lee        long token = Binder.clearCallingIdentity();
1594240656f19c078b4f703d0502ce29114de0d45a50Tony Mak        PhoneAccountHandle accountHandle = null;
15959427c0fc29869b76116776b1643c208ef3a031c4Yorke Lee        try {
1596240656f19c078b4f703d0502ce29114de0d45a50Tony Mak             accountHandle = mPhoneAccountRegistrar.getSimCallManagerOfCurrentUser();
15979427c0fc29869b76116776b1643c208ef3a031c4Yorke Lee        } finally {
15989427c0fc29869b76116776b1643c208ef3a031c4Yorke Lee            Binder.restoreCallingIdentity(token);
15999427c0fc29869b76116776b1643c208ef3a031c4Yorke Lee        }
16009427c0fc29869b76116776b1643c208ef3a031c4Yorke Lee
16012a98c97ee6e30e30d9378a1be030a05cab71c109Sailesh Nepal        if (accountHandle != null) {
16022a98c97ee6e30e30d9378a1be030a05cab71c109Sailesh Nepal            try {
16032a98c97ee6e30e30d9378a1be030a05cab71c109Sailesh Nepal                mAppOpsManager.checkPackage(
16042a98c97ee6e30e30d9378a1be030a05cab71c109Sailesh Nepal                        Binder.getCallingUid(), accountHandle.getComponentName().getPackageName());
16052a98c97ee6e30e30d9378a1be030a05cab71c109Sailesh Nepal                return true;
16062a98c97ee6e30e30d9378a1be030a05cab71c109Sailesh Nepal            } catch (SecurityException e) {
16072a98c97ee6e30e30d9378a1be030a05cab71c109Sailesh Nepal            }
16082a98c97ee6e30e30d9378a1be030a05cab71c109Sailesh Nepal        }
16092a98c97ee6e30e30d9378a1be030a05cab71c109Sailesh Nepal        return false;
16102a98c97ee6e30e30d9378a1be030a05cab71c109Sailesh Nepal    }
16112a98c97ee6e30e30d9378a1be030a05cab71c109Sailesh Nepal
16125310196deda80ace064a7d5bc672dbe1974906b9Yorke Lee    private boolean isPrivilegedDialerCalling(String callingPackage) {
16135310196deda80ace064a7d5bc672dbe1974906b9Yorke Lee        mAppOpsManager.checkPackage(Binder.getCallingUid(), callingPackage);
16147c9283261ad4fdbc5ebbb74257671388f9c758c7Hall Liu        return mDefaultDialerCache.isDefaultOrSystemDialer(
16157c9283261ad4fdbc5ebbb74257671388f9c758c7Hall Liu                callingPackage, Binder.getCallingUserHandle().getIdentifier());
1616f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon    }
1617f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon
1618f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon    private TelephonyManager getTelephonyManager() {
1619ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        return (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
1620f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon    }
162142ef808c284791f21be8675174acc7297418fa45Tyler Gunn
162242ef808c284791f21be8675174acc7297418fa45Tyler Gunn    /**
162342ef808c284791f21be8675174acc7297418fa45Tyler Gunn     * Determines if a video state is valid for accepting an incoming call.
162442ef808c284791f21be8675174acc7297418fa45Tyler Gunn     * For the purpose of accepting a call, states {@link VideoProfile#STATE_AUDIO_ONLY}, and
162542ef808c284791f21be8675174acc7297418fa45Tyler Gunn     * any combination of {@link VideoProfile#STATE_RX_ENABLED} and
162642ef808c284791f21be8675174acc7297418fa45Tyler Gunn     * {@link VideoProfile#STATE_TX_ENABLED} are considered valid.
162742ef808c284791f21be8675174acc7297418fa45Tyler Gunn     *
162842ef808c284791f21be8675174acc7297418fa45Tyler Gunn     * @param videoState The video state.
162942ef808c284791f21be8675174acc7297418fa45Tyler Gunn     * @return {@code true} if the video state is valid, {@code false} otherwise.
163042ef808c284791f21be8675174acc7297418fa45Tyler Gunn     */
163142ef808c284791f21be8675174acc7297418fa45Tyler Gunn    private boolean isValidAcceptVideoState(int videoState) {
163242ef808c284791f21be8675174acc7297418fa45Tyler Gunn        // Given a video state input, turn off TX and RX so that we can determine if those were the
163342ef808c284791f21be8675174acc7297418fa45Tyler Gunn        // only bits set.
163442ef808c284791f21be8675174acc7297418fa45Tyler Gunn        int remainingState = videoState & ~VideoProfile.STATE_TX_ENABLED;
163542ef808c284791f21be8675174acc7297418fa45Tyler Gunn        remainingState = remainingState & ~VideoProfile.STATE_RX_ENABLED;
163642ef808c284791f21be8675174acc7297418fa45Tyler Gunn
163742ef808c284791f21be8675174acc7297418fa45Tyler Gunn        // If only TX or RX were set (or neither), the video state is valid.
163842ef808c284791f21be8675174acc7297418fa45Tyler Gunn        return remainingState == 0;
163942ef808c284791f21be8675174acc7297418fa45Tyler Gunn    }
1640f987d1a6f1d02164210a70b417db2bc14576236cSantos Cordon}
1641