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