1 /* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.server.telecom; 18 19 import static android.Manifest.permission.CALL_PHONE; 20 import static android.Manifest.permission.CALL_PRIVILEGED; 21 import static android.Manifest.permission.DUMP; 22 import static android.Manifest.permission.MODIFY_PHONE_STATE; 23 import static android.Manifest.permission.READ_PHONE_STATE; 24 import static android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE; 25 import static android.Manifest.permission.REGISTER_SIM_SUBSCRIPTION; 26 import static android.Manifest.permission.WRITE_SECURE_SETTINGS; 27 28 import android.Manifest; 29 import android.app.ActivityManager; 30 import android.app.AppOpsManager; 31 import android.content.ComponentName; 32 import android.content.Context; 33 import android.content.Intent; 34 import android.content.pm.ApplicationInfo; 35 import android.content.pm.PackageManager; 36 import android.content.res.Resources; 37 import android.net.Uri; 38 import android.os.Binder; 39 import android.os.Bundle; 40 import android.os.Process; 41 import android.os.UserHandle; 42 import android.telecom.Log; 43 import android.telecom.PhoneAccount; 44 import android.telecom.PhoneAccountHandle; 45 import android.telecom.TelecomAnalytics; 46 import android.telecom.TelecomManager; 47 import android.telecom.VideoProfile; 48 import android.telephony.SubscriptionManager; 49 import android.telephony.TelephonyManager; 50 import android.text.TextUtils; 51 import android.util.EventLog; 52 53 import com.android.internal.telecom.ITelecomService; 54 import com.android.internal.util.IndentingPrintWriter; 55 import com.android.server.telecom.components.UserCallIntentProcessorFactory; 56 import com.android.server.telecom.settings.BlockedNumbersActivity; 57 58 import java.io.FileDescriptor; 59 import java.io.PrintWriter; 60 import java.util.Collections; 61 import java.util.List; 62 63 // TODO: Needed for move to system service: import com.android.internal.R; 64 65 /** 66 * Implementation of the ITelecom interface. 67 */ 68 public class TelecomServiceImpl { 69 70 public interface SubscriptionManagerAdapter { getDefaultVoiceSubId()71 int getDefaultVoiceSubId(); 72 } 73 74 static class SubscriptionManagerAdapterImpl implements SubscriptionManagerAdapter { 75 @Override getDefaultVoiceSubId()76 public int getDefaultVoiceSubId() { 77 return SubscriptionManager.getDefaultVoiceSubscriptionId(); 78 } 79 } 80 81 private static final String TIME_LINE_ARG = "timeline"; 82 private static final int DEFAULT_VIDEO_STATE = -1; 83 84 private final ITelecomService.Stub mBinderImpl = new ITelecomService.Stub() { 85 @Override 86 public PhoneAccountHandle getDefaultOutgoingPhoneAccount(String uriScheme, 87 String callingPackage) { 88 try { 89 Log.startSession("TSI.gDOPA"); 90 synchronized (mLock) { 91 if (!canReadPhoneState(callingPackage, "getDefaultOutgoingPhoneAccount")) { 92 return null; 93 } 94 95 final UserHandle callingUserHandle = Binder.getCallingUserHandle(); 96 long token = Binder.clearCallingIdentity(); 97 try { 98 return mPhoneAccountRegistrar 99 .getOutgoingPhoneAccountForScheme(uriScheme, callingUserHandle); 100 } catch (Exception e) { 101 Log.e(this, e, "getDefaultOutgoingPhoneAccount"); 102 throw e; 103 } finally { 104 Binder.restoreCallingIdentity(token); 105 } 106 } 107 } finally { 108 Log.endSession(); 109 } 110 } 111 112 @Override 113 public PhoneAccountHandle getUserSelectedOutgoingPhoneAccount() { 114 synchronized (mLock) { 115 try { 116 Log.startSession("TSI.gUSOPA"); 117 final UserHandle callingUserHandle = Binder.getCallingUserHandle(); 118 return mPhoneAccountRegistrar.getUserSelectedOutgoingPhoneAccount( 119 callingUserHandle); 120 } catch (Exception e) { 121 Log.e(this, e, "getUserSelectedOutgoingPhoneAccount"); 122 throw e; 123 } finally { 124 Log.endSession(); 125 } 126 } 127 } 128 129 @Override 130 public void setUserSelectedOutgoingPhoneAccount(PhoneAccountHandle accountHandle) { 131 try { 132 Log.startSession("TSI.sUSOPA"); 133 synchronized (mLock) { 134 enforceModifyPermission(); 135 UserHandle callingUserHandle = Binder.getCallingUserHandle(); 136 long token = Binder.clearCallingIdentity(); 137 try { 138 mPhoneAccountRegistrar.setUserSelectedOutgoingPhoneAccount( 139 accountHandle, callingUserHandle); 140 } catch (Exception e) { 141 Log.e(this, e, "setUserSelectedOutgoingPhoneAccount"); 142 throw e; 143 } finally { 144 Binder.restoreCallingIdentity(token); 145 } 146 } 147 } finally { 148 Log.endSession(); 149 } 150 } 151 152 @Override 153 public List<PhoneAccountHandle> getCallCapablePhoneAccounts( 154 boolean includeDisabledAccounts, String callingPackage) { 155 try { 156 Log.startSession("TSI.gCCPA"); 157 if (!canReadPhoneState(callingPackage, "getDefaultOutgoingPhoneAccount")) { 158 return Collections.emptyList(); 159 } 160 synchronized (mLock) { 161 final UserHandle callingUserHandle = Binder.getCallingUserHandle(); 162 long token = Binder.clearCallingIdentity(); 163 try { 164 return mPhoneAccountRegistrar.getCallCapablePhoneAccounts(null, 165 includeDisabledAccounts, callingUserHandle); 166 } catch (Exception e) { 167 Log.e(this, e, "getCallCapablePhoneAccounts"); 168 throw e; 169 } finally { 170 Binder.restoreCallingIdentity(token); 171 } 172 } 173 } finally { 174 Log.endSession(); 175 } 176 } 177 178 @Override 179 public List<PhoneAccountHandle> getSelfManagedPhoneAccounts(String callingPackage) { 180 try { 181 Log.startSession("TSI.gSMPA"); 182 if (!canReadPhoneState(callingPackage, "Requires READ_PHONE_STATE permission.")) { 183 throw new SecurityException("Requires READ_PHONE_STATE permission."); 184 } 185 synchronized (mLock) { 186 final UserHandle callingUserHandle = Binder.getCallingUserHandle(); 187 long token = Binder.clearCallingIdentity(); 188 try { 189 return mPhoneAccountRegistrar.getSelfManagedPhoneAccounts( 190 callingUserHandle); 191 } catch (Exception e) { 192 Log.e(this, e, "getSelfManagedPhoneAccounts"); 193 throw e; 194 } finally { 195 Binder.restoreCallingIdentity(token); 196 } 197 } 198 } finally { 199 Log.endSession(); 200 } 201 } 202 203 @Override 204 public List<PhoneAccountHandle> getPhoneAccountsSupportingScheme(String uriScheme, 205 String callingPackage) { 206 try { 207 Log.startSession("TSI.gPASS"); 208 try { 209 enforceModifyPermission( 210 "getPhoneAccountsSupportingScheme requires MODIFY_PHONE_STATE"); 211 } catch (SecurityException e) { 212 EventLog.writeEvent(0x534e4554, "62347125", Binder.getCallingUid(), 213 "getPhoneAccountsSupportingScheme: " + callingPackage); 214 return Collections.emptyList(); 215 } 216 217 synchronized (mLock) { 218 final UserHandle callingUserHandle = Binder.getCallingUserHandle(); 219 long token = Binder.clearCallingIdentity(); 220 try { 221 return mPhoneAccountRegistrar.getCallCapablePhoneAccounts(uriScheme, false, 222 callingUserHandle); 223 } catch (Exception e) { 224 Log.e(this, e, "getPhoneAccountsSupportingScheme %s", uriScheme); 225 throw e; 226 } finally { 227 Binder.restoreCallingIdentity(token); 228 } 229 } 230 } finally { 231 Log.endSession(); 232 } 233 } 234 235 @Override 236 public List<PhoneAccountHandle> getPhoneAccountsForPackage(String packageName) { 237 synchronized (mLock) { 238 final UserHandle callingUserHandle = Binder.getCallingUserHandle(); 239 long token = Binder.clearCallingIdentity(); 240 try { 241 Log.startSession("TSI.gPAFP"); 242 return mPhoneAccountRegistrar.getPhoneAccountsForPackage(packageName, 243 callingUserHandle); 244 } catch (Exception e) { 245 Log.e(this, e, "getPhoneAccountsForPackage %s", packageName); 246 throw e; 247 } finally { 248 Binder.restoreCallingIdentity(token); 249 Log.endSession(); 250 } 251 } 252 } 253 254 @Override 255 public PhoneAccount getPhoneAccount(PhoneAccountHandle accountHandle) { 256 synchronized (mLock) { 257 final UserHandle callingUserHandle = Binder.getCallingUserHandle(); 258 long token = Binder.clearCallingIdentity(); 259 try { 260 Log.startSession("TSI.gPA"); 261 // In ideal case, we should not resolve the handle across profiles. But given 262 // the fact that profile's call is handled by its parent user's in-call UI, 263 // parent user's in call UI need to be able to get phone account from the 264 // profile's phone account handle. 265 return mPhoneAccountRegistrar 266 .getPhoneAccount(accountHandle, callingUserHandle, 267 /* acrossProfiles */ true); 268 } catch (Exception e) { 269 Log.e(this, e, "getPhoneAccount %s", accountHandle); 270 throw e; 271 } finally { 272 Binder.restoreCallingIdentity(token); 273 Log.endSession(); 274 } 275 } 276 } 277 278 @Override 279 public int getAllPhoneAccountsCount() { 280 try { 281 Log.startSession("TSI.gAPAC"); 282 try { 283 enforceModifyPermission( 284 "getAllPhoneAccountsCount requires MODIFY_PHONE_STATE permission."); 285 } catch (SecurityException e) { 286 EventLog.writeEvent(0x534e4554, "62347125", Binder.getCallingUid(), 287 "getAllPhoneAccountsCount"); 288 throw e; 289 } 290 291 synchronized (mLock) { 292 try { 293 // This list is pre-filtered for the calling user. 294 return getAllPhoneAccounts().size(); 295 } catch (Exception e) { 296 Log.e(this, e, "getAllPhoneAccountsCount"); 297 throw e; 298 299 } 300 } 301 } finally { 302 Log.endSession(); 303 } 304 } 305 306 @Override 307 public List<PhoneAccount> getAllPhoneAccounts() { 308 synchronized (mLock) { 309 try { 310 Log.startSession("TSI.gAPA"); 311 try { 312 enforceModifyPermission( 313 "getAllPhoneAccounts requires MODIFY_PHONE_STATE permission."); 314 } catch (SecurityException e) { 315 EventLog.writeEvent(0x534e4554, "62347125", Binder.getCallingUid(), 316 "getAllPhoneAccounts"); 317 throw e; 318 } 319 320 final UserHandle callingUserHandle = Binder.getCallingUserHandle(); 321 long token = Binder.clearCallingIdentity(); 322 try { 323 return mPhoneAccountRegistrar.getAllPhoneAccounts(callingUserHandle); 324 } catch (Exception e) { 325 Log.e(this, e, "getAllPhoneAccounts"); 326 throw e; 327 } finally { 328 Binder.restoreCallingIdentity(token); 329 } 330 } finally { 331 Log.endSession(); 332 } 333 } 334 } 335 336 @Override 337 public List<PhoneAccountHandle> getAllPhoneAccountHandles() { 338 try { 339 Log.startSession("TSI.gAPAH"); 340 try { 341 enforceModifyPermission( 342 "getAllPhoneAccountHandles requires MODIFY_PHONE_STATE permission."); 343 } catch (SecurityException e) { 344 EventLog.writeEvent(0x534e4554, "62347125", Binder.getCallingUid(), 345 "getAllPhoneAccountHandles"); 346 throw e; 347 } 348 349 synchronized (mLock) { 350 final UserHandle callingUserHandle = Binder.getCallingUserHandle(); 351 long token = Binder.clearCallingIdentity(); 352 try { 353 return mPhoneAccountRegistrar.getAllPhoneAccountHandles(callingUserHandle); 354 } catch (Exception e) { 355 Log.e(this, e, "getAllPhoneAccounts"); 356 throw e; 357 } finally { 358 Binder.restoreCallingIdentity(token); 359 } 360 } 361 } finally { 362 Log.endSession(); 363 } 364 } 365 366 @Override 367 public PhoneAccountHandle getSimCallManager() { 368 try { 369 Log.startSession("TSI.gSCM"); 370 long token = Binder.clearCallingIdentity(); 371 int user; 372 try { 373 user = ActivityManager.getCurrentUser(); 374 return getSimCallManagerForUser(user); 375 } finally { 376 Binder.restoreCallingIdentity(token); 377 } 378 } finally { 379 Log.endSession(); 380 } 381 } 382 383 @Override 384 public PhoneAccountHandle getSimCallManagerForUser(int user) { 385 synchronized (mLock) { 386 try { 387 Log.startSession("TSI.gSCMFU"); 388 final int callingUid = Binder.getCallingUid(); 389 long token = Binder.clearCallingIdentity(); 390 try { 391 if (user != ActivityManager.getCurrentUser()) { 392 enforceCrossUserPermission(callingUid); 393 } 394 return mPhoneAccountRegistrar.getSimCallManager(UserHandle.of(user)); 395 } finally { 396 Binder.restoreCallingIdentity(token); 397 } 398 } catch (Exception e) { 399 Log.e(this, e, "getSimCallManager"); 400 throw e; 401 } finally { 402 Log.endSession(); 403 } 404 } 405 } 406 407 @Override 408 public void registerPhoneAccount(PhoneAccount account) { 409 try { 410 Log.startSession("TSI.rPA"); 411 synchronized (mLock) { 412 if (!mContext.getApplicationContext().getResources().getBoolean( 413 com.android.internal.R.bool.config_voice_capable)) { 414 Log.w(this, 415 "registerPhoneAccount not allowed on non-voice capable device."); 416 return; 417 } 418 try { 419 enforcePhoneAccountModificationForPackage( 420 account.getAccountHandle().getComponentName().getPackageName()); 421 if (account.hasCapabilities(PhoneAccount.CAPABILITY_SELF_MANAGED)) { 422 enforceRegisterSelfManaged(); 423 if (account.hasCapabilities(PhoneAccount.CAPABILITY_CALL_PROVIDER) || 424 account.hasCapabilities( 425 PhoneAccount.CAPABILITY_CONNECTION_MANAGER) || 426 account.hasCapabilities( 427 PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION)) { 428 throw new SecurityException("Self-managed ConnectionServices " + 429 "cannot also be call capable, connection managers, or " + 430 "SIM accounts."); 431 } 432 433 // For self-managed CS, the phone account registrar will override the 434 // label the user has set for the phone account. This ensures the 435 // self-managed cs implementation can't spoof their app name. 436 } 437 if (account.hasCapabilities(PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION)) { 438 enforceRegisterSimSubscriptionPermission(); 439 } 440 if (account.hasCapabilities(PhoneAccount.CAPABILITY_MULTI_USER)) { 441 enforceRegisterMultiUser(); 442 } 443 enforceUserHandleMatchesCaller(account.getAccountHandle()); 444 final long token = Binder.clearCallingIdentity(); 445 try { 446 mPhoneAccountRegistrar.registerPhoneAccount(account); 447 } finally { 448 Binder.restoreCallingIdentity(token); 449 } 450 } catch (Exception e) { 451 Log.e(this, e, "registerPhoneAccount %s", account); 452 throw e; 453 } 454 } 455 } finally { 456 Log.endSession(); 457 } 458 } 459 460 @Override 461 public void unregisterPhoneAccount(PhoneAccountHandle accountHandle) { 462 synchronized (mLock) { 463 try { 464 Log.startSession("TSI.uPA"); 465 enforcePhoneAccountModificationForPackage( 466 accountHandle.getComponentName().getPackageName()); 467 enforceUserHandleMatchesCaller(accountHandle); 468 final long token = Binder.clearCallingIdentity(); 469 try { 470 mPhoneAccountRegistrar.unregisterPhoneAccount(accountHandle); 471 } finally { 472 Binder.restoreCallingIdentity(token); 473 } 474 } catch (Exception e) { 475 Log.e(this, e, "unregisterPhoneAccount %s", accountHandle); 476 throw e; 477 } finally { 478 Log.endSession(); 479 } 480 } 481 } 482 483 @Override 484 public void clearAccounts(String packageName) { 485 synchronized (mLock) { 486 try { 487 Log.startSession("TSI.cA"); 488 enforcePhoneAccountModificationForPackage(packageName); 489 mPhoneAccountRegistrar 490 .clearAccounts(packageName, Binder.getCallingUserHandle()); 491 } catch (Exception e) { 492 Log.e(this, e, "clearAccounts %s", packageName); 493 throw e; 494 } finally { 495 Log.endSession(); 496 } 497 } 498 } 499 500 /** 501 * @see android.telecom.TelecomManager#isVoiceMailNumber 502 */ 503 @Override 504 public boolean isVoiceMailNumber(PhoneAccountHandle accountHandle, String number, 505 String callingPackage) { 506 try { 507 Log.startSession("TSI.iVMN"); 508 synchronized (mLock) { 509 if (!canReadPhoneState(callingPackage, "isVoiceMailNumber")) { 510 return false; 511 } 512 final UserHandle callingUserHandle = Binder.getCallingUserHandle(); 513 if (!isPhoneAccountHandleVisibleToCallingUser(accountHandle, 514 callingUserHandle)) { 515 Log.d(this, "%s is not visible for the calling user [iVMN]", accountHandle); 516 return false; 517 } 518 long token = Binder.clearCallingIdentity(); 519 try { 520 return mPhoneAccountRegistrar.isVoiceMailNumber(accountHandle, number); 521 } catch (Exception e) { 522 Log.e(this, e, "getSubscriptionIdForPhoneAccount"); 523 throw e; 524 } finally { 525 Binder.restoreCallingIdentity(token); 526 } 527 } 528 } finally { 529 Log.endSession(); 530 } 531 } 532 533 /** 534 * @see android.telecom.TelecomManager#getVoiceMailNumber 535 */ 536 @Override 537 public String getVoiceMailNumber(PhoneAccountHandle accountHandle, String callingPackage) { 538 try { 539 Log.startSession("TSI.gVMN"); 540 synchronized (mLock) { 541 if (!canReadPhoneState(callingPackage, "getVoiceMailNumber")) { 542 return null; 543 } 544 try { 545 final UserHandle callingUserHandle = Binder.getCallingUserHandle(); 546 if (!isPhoneAccountHandleVisibleToCallingUser(accountHandle, 547 callingUserHandle)) { 548 Log.d(this, "%s is not visible for the calling user [gVMN]", 549 accountHandle); 550 return null; 551 } 552 int subId = mSubscriptionManagerAdapter.getDefaultVoiceSubId(); 553 if (accountHandle != null) { 554 subId = mPhoneAccountRegistrar 555 .getSubscriptionIdForPhoneAccount(accountHandle); 556 } 557 return getTelephonyManager().getVoiceMailNumber(subId); 558 } catch (Exception e) { 559 Log.e(this, e, "getSubscriptionIdForPhoneAccount"); 560 throw e; 561 } 562 } 563 } finally { 564 Log.endSession(); 565 } 566 } 567 568 /** 569 * @see android.telecom.TelecomManager#getLine1Number 570 */ 571 @Override 572 public String getLine1Number(PhoneAccountHandle accountHandle, String callingPackage) { 573 try { 574 Log.startSession("getL1N"); 575 if (!canReadPhoneState(callingPackage, "getLine1Number")) { 576 return null; 577 } 578 579 synchronized (mLock) { 580 final UserHandle callingUserHandle = Binder.getCallingUserHandle(); 581 if (!isPhoneAccountHandleVisibleToCallingUser(accountHandle, 582 callingUserHandle)) { 583 Log.d(this, "%s is not visible for the calling user [gL1N]", accountHandle); 584 return null; 585 } 586 587 long token = Binder.clearCallingIdentity(); 588 try { 589 int subId = mPhoneAccountRegistrar.getSubscriptionIdForPhoneAccount( 590 accountHandle); 591 return getTelephonyManager().getLine1Number(subId); 592 } catch (Exception e) { 593 Log.e(this, e, "getSubscriptionIdForPhoneAccount"); 594 throw e; 595 } finally { 596 Binder.restoreCallingIdentity(token); 597 } 598 } 599 } finally { 600 Log.endSession(); 601 } 602 } 603 604 /** 605 * @see android.telecom.TelecomManager#silenceRinger 606 */ 607 @Override 608 public void silenceRinger(String callingPackage) { 609 try { 610 Log.startSession("TSI.sR"); 611 synchronized (mLock) { 612 enforcePermissionOrPrivilegedDialer(MODIFY_PHONE_STATE, callingPackage); 613 614 long token = Binder.clearCallingIdentity(); 615 try { 616 Log.i(this, "Silence Ringer requested by %s", callingPackage); 617 mCallsManager.getCallAudioManager().silenceRingers(); 618 mCallsManager.getInCallController().silenceRinger(); 619 } finally { 620 Binder.restoreCallingIdentity(token); 621 } 622 } 623 } finally { 624 Log.endSession(); 625 } 626 } 627 628 /** 629 * @see android.telecom.TelecomManager#getDefaultPhoneApp 630 * @deprecated - Use {@link android.telecom.TelecomManager#getDefaultDialerPackage()} 631 * instead. 632 */ 633 @Override 634 public ComponentName getDefaultPhoneApp() { 635 try { 636 Log.startSession("TSI.gDPA"); 637 // No need to synchronize 638 Resources resources = mContext.getResources(); 639 return new ComponentName( 640 resources.getString(R.string.ui_default_package), 641 resources.getString(R.string.dialer_default_class)); 642 } finally { 643 Log.endSession(); 644 } 645 } 646 647 /** 648 * @return the package name of the current user-selected default dialer. If no default 649 * has been selected, the package name of the system dialer is returned. If 650 * neither exists, then {@code null} is returned. 651 * @see android.telecom.TelecomManager#getDefaultDialerPackage 652 */ 653 @Override 654 public String getDefaultDialerPackage() { 655 try { 656 Log.startSession("TSI.gDDP"); 657 final long token = Binder.clearCallingIdentity(); 658 try { 659 return mDefaultDialerCache.getDefaultDialerApplication( 660 ActivityManager.getCurrentUser()); 661 } finally { 662 Binder.restoreCallingIdentity(token); 663 } 664 } finally { 665 Log.endSession(); 666 } 667 } 668 669 /** 670 * @see android.telecom.TelecomManager#getSystemDialerPackage 671 */ 672 @Override 673 public String getSystemDialerPackage() { 674 try { 675 Log.startSession("TSI.gSDP"); 676 return mContext.getResources().getString(R.string.ui_default_package); 677 } finally { 678 Log.endSession(); 679 } 680 } 681 682 /** 683 * @see android.telecom.TelecomManager#isInCall 684 */ 685 @Override 686 public boolean isInCall(String callingPackage) { 687 try { 688 Log.startSession("TSI.iIC"); 689 if (!canReadPhoneState(callingPackage, "isInCall")) { 690 return false; 691 } 692 693 synchronized (mLock) { 694 return mCallsManager.hasOngoingCalls(); 695 } 696 } finally { 697 Log.endSession(); 698 } 699 } 700 701 /** 702 * @see android.telecom.TelecomManager#isInManagedCall 703 */ 704 @Override 705 public boolean isInManagedCall(String callingPackage) { 706 try { 707 Log.startSession("TSI.iIMC"); 708 if (!canReadPhoneState(callingPackage, "isInManagedCall")) { 709 throw new SecurityException("Only the default dialer or caller with " + 710 "READ_PHONE_STATE permission can use this method."); 711 } 712 713 synchronized (mLock) { 714 return mCallsManager.hasOngoingManagedCalls(); 715 } 716 } finally { 717 Log.endSession(); 718 } 719 } 720 721 /** 722 * @see android.telecom.TelecomManager#isRinging 723 */ 724 @Override 725 public boolean isRinging(String callingPackage) { 726 try { 727 Log.startSession("TSI.iR"); 728 if (!isPrivilegedDialerCalling(callingPackage)) { 729 try { 730 enforceModifyPermission( 731 "isRinging requires MODIFY_PHONE_STATE permission."); 732 } catch (SecurityException e) { 733 EventLog.writeEvent(0x534e4554, "62347125", "isRinging: " + callingPackage); 734 throw e; 735 } 736 } 737 738 synchronized (mLock) { 739 // Note: We are explicitly checking the calls telecom is tracking rather than 740 // relying on mCallsManager#getCallState(). Since getCallState() relies on the 741 // current state as tracked by PhoneStateBroadcaster, any failure to properly 742 // track the current call state there could result in the wrong ringing state 743 // being reported by this API. 744 return mCallsManager.hasRingingCall(); 745 } 746 } finally { 747 Log.endSession(); 748 } 749 } 750 751 /** 752 * @see TelecomManager#getCallState 753 */ 754 @Override 755 public int getCallState() { 756 try { 757 Log.startSession("TSI.getCallState"); 758 synchronized (mLock) { 759 return mCallsManager.getCallState(); 760 } 761 } finally { 762 Log.endSession(); 763 } 764 } 765 766 /** 767 * @see android.telecom.TelecomManager#endCall 768 */ 769 @Override 770 public boolean endCall(String callingPackage) { 771 try { 772 Log.startSession("TSI.eC"); 773 synchronized (mLock) { 774 if (!enforceAnswerCallPermission(callingPackage, Binder.getCallingUid())) { 775 throw new SecurityException("requires ANSWER_PHONE_CALLS permission"); 776 } 777 778 long token = Binder.clearCallingIdentity(); 779 try { 780 return endCallInternal(callingPackage); 781 } finally { 782 Binder.restoreCallingIdentity(token); 783 } 784 } 785 } finally { 786 Log.endSession(); 787 } 788 } 789 790 /** 791 * @see android.telecom.TelecomManager#acceptRingingCall 792 */ 793 @Override 794 public void acceptRingingCall(String packageName) { 795 try { 796 Log.startSession("TSI.aRC"); 797 synchronized (mLock) { 798 if (!enforceAnswerCallPermission(packageName, Binder.getCallingUid())) return; 799 800 long token = Binder.clearCallingIdentity(); 801 try { 802 acceptRingingCallInternal(DEFAULT_VIDEO_STATE); 803 } finally { 804 Binder.restoreCallingIdentity(token); 805 } 806 } 807 } finally { 808 Log.endSession(); 809 } 810 } 811 812 /** 813 * @see android.telecom.TelecomManager#acceptRingingCall(int) 814 * 815 */ 816 @Override 817 public void acceptRingingCallWithVideoState(String packageName, int videoState) { 818 try { 819 Log.startSession("TSI.aRCWVS"); 820 synchronized (mLock) { 821 if (!enforceAnswerCallPermission(packageName, Binder.getCallingUid())) return; 822 823 long token = Binder.clearCallingIdentity(); 824 try { 825 acceptRingingCallInternal(videoState); 826 } finally { 827 Binder.restoreCallingIdentity(token); 828 } 829 } 830 } finally { 831 Log.endSession(); 832 } 833 } 834 835 /** 836 * @see android.telecom.TelecomManager#showInCallScreen 837 */ 838 @Override 839 public void showInCallScreen(boolean showDialpad, String callingPackage) { 840 try { 841 Log.startSession("TSI.sICS"); 842 if (!canReadPhoneState(callingPackage, "showInCallScreen")) { 843 return; 844 } 845 846 synchronized (mLock) { 847 848 long token = Binder.clearCallingIdentity(); 849 try { 850 mCallsManager.getInCallController().bringToForeground(showDialpad); 851 } finally { 852 Binder.restoreCallingIdentity(token); 853 } 854 } 855 } finally { 856 Log.endSession(); 857 } 858 } 859 860 /** 861 * @see android.telecom.TelecomManager#cancelMissedCallsNotification 862 */ 863 @Override 864 public void cancelMissedCallsNotification(String callingPackage) { 865 try { 866 Log.startSession("TSI.cMCN"); 867 synchronized (mLock) { 868 enforcePermissionOrPrivilegedDialer(MODIFY_PHONE_STATE, callingPackage); 869 UserHandle userHandle = Binder.getCallingUserHandle(); 870 long token = Binder.clearCallingIdentity(); 871 try { 872 mCallsManager.getMissedCallNotifier().clearMissedCalls(userHandle); 873 } finally { 874 Binder.restoreCallingIdentity(token); 875 } 876 } 877 } finally { 878 Log.endSession(); 879 } 880 } 881 /** 882 * @see android.telecom.TelecomManager#handleMmi 883 */ 884 @Override 885 public boolean handlePinMmi(String dialString, String callingPackage) { 886 try { 887 Log.startSession("TSI.hPM"); 888 synchronized (mLock) { 889 enforcePermissionOrPrivilegedDialer(MODIFY_PHONE_STATE, callingPackage); 890 891 // Switch identity so that TelephonyManager checks Telecom's permissions 892 // instead. 893 long token = Binder.clearCallingIdentity(); 894 boolean retval = false; 895 try { 896 retval = getTelephonyManager().handlePinMmi(dialString); 897 } finally { 898 Binder.restoreCallingIdentity(token); 899 } 900 901 return retval; 902 } 903 }finally { 904 Log.endSession(); 905 } 906 } 907 908 /** 909 * @see android.telecom.TelecomManager#handleMmi 910 */ 911 @Override 912 public boolean handlePinMmiForPhoneAccount(PhoneAccountHandle accountHandle, 913 String dialString, String callingPackage) { 914 try { 915 Log.startSession("TSI.hPMFPA"); 916 synchronized (mLock) { 917 enforcePermissionOrPrivilegedDialer(MODIFY_PHONE_STATE, callingPackage); 918 919 UserHandle callingUserHandle = Binder.getCallingUserHandle(); 920 if (!isPhoneAccountHandleVisibleToCallingUser(accountHandle, 921 callingUserHandle)) { 922 Log.d(this, "%s is not visible for the calling user [hMMI]", accountHandle); 923 return false; 924 } 925 926 // Switch identity so that TelephonyManager checks Telecom's permissions 927 // instead. 928 long token = Binder.clearCallingIdentity(); 929 boolean retval = false; 930 try { 931 int subId = mPhoneAccountRegistrar.getSubscriptionIdForPhoneAccount( 932 accountHandle); 933 retval = getTelephonyManager().handlePinMmiForSubscriber(subId, dialString); 934 } finally { 935 Binder.restoreCallingIdentity(token); 936 } 937 return retval; 938 } 939 }finally { 940 Log.endSession(); 941 } 942 } 943 944 /** 945 * @see android.telecom.TelecomManager#getAdnUriForPhoneAccount 946 */ 947 @Override 948 public Uri getAdnUriForPhoneAccount(PhoneAccountHandle accountHandle, 949 String callingPackage) { 950 try { 951 Log.startSession("TSI.aAUFPA"); 952 synchronized (mLock) { 953 enforcePermissionOrPrivilegedDialer(MODIFY_PHONE_STATE, callingPackage); 954 if (!isPhoneAccountHandleVisibleToCallingUser(accountHandle, 955 Binder.getCallingUserHandle())) { 956 Log.d(this, "%s is not visible for the calling user [gA4PA]", 957 accountHandle); 958 return null; 959 } 960 // Switch identity so that TelephonyManager checks Telecom's permissions 961 // instead. 962 long token = Binder.clearCallingIdentity(); 963 String retval = "content://icc/adn/"; 964 try { 965 long subId = mPhoneAccountRegistrar 966 .getSubscriptionIdForPhoneAccount(accountHandle); 967 retval = retval + "subId/" + subId; 968 } finally { 969 Binder.restoreCallingIdentity(token); 970 } 971 972 return Uri.parse(retval); 973 } 974 } finally { 975 Log.endSession(); 976 } 977 } 978 979 /** 980 * @see android.telecom.TelecomManager#isTtySupported 981 */ 982 @Override 983 public boolean isTtySupported(String callingPackage) { 984 try { 985 Log.startSession("TSI.iTS"); 986 if (!canReadPhoneState(callingPackage, "isTtySupported")) { 987 throw new SecurityException("Only default dialer or an app with" + 988 "READ_PRIVILEGED_PHONE_STATE or READ_PHONE_STATE can call this api"); 989 } 990 991 synchronized (mLock) { 992 return mCallsManager.isTtySupported(); 993 } 994 } finally { 995 Log.endSession(); 996 } 997 } 998 999 /** 1000 * @see android.telecom.TelecomManager#getCurrentTtyMode 1001 */ 1002 @Override 1003 public int getCurrentTtyMode(String callingPackage) { 1004 try { 1005 Log.startSession("TSI.gCTM"); 1006 if (!canReadPhoneState(callingPackage, "getCurrentTtyMode")) { 1007 return TelecomManager.TTY_MODE_OFF; 1008 } 1009 1010 synchronized (mLock) { 1011 return mCallsManager.getCurrentTtyMode(); 1012 } 1013 } finally { 1014 Log.endSession(); 1015 } 1016 } 1017 1018 /** 1019 * @see android.telecom.TelecomManager#addNewIncomingCall 1020 */ 1021 @Override 1022 public void addNewIncomingCall(PhoneAccountHandle phoneAccountHandle, Bundle extras) { 1023 try { 1024 Log.startSession("TSI.aNIC"); 1025 synchronized (mLock) { 1026 Log.i(this, "Adding new incoming call with phoneAccountHandle %s", 1027 phoneAccountHandle); 1028 if (phoneAccountHandle != null && 1029 phoneAccountHandle.getComponentName() != null) { 1030 // TODO(sail): Add unit tests for adding incoming calls from a SIM call 1031 // manager. 1032 if (isCallerSimCallManager() && TelephonyUtil.isPstnComponentName( 1033 phoneAccountHandle.getComponentName())) { 1034 Log.v(this, "Allowing call manager to add incoming call with PSTN" + 1035 " handle"); 1036 } else { 1037 mAppOpsManager.checkPackage( 1038 Binder.getCallingUid(), 1039 phoneAccountHandle.getComponentName().getPackageName()); 1040 // Make sure it doesn't cross the UserHandle boundary 1041 enforceUserHandleMatchesCaller(phoneAccountHandle); 1042 enforcePhoneAccountIsRegisteredEnabled(phoneAccountHandle, 1043 Binder.getCallingUserHandle()); 1044 if (isSelfManagedConnectionService(phoneAccountHandle)) { 1045 // Self-managed phone account, ensure it has MANAGE_OWN_CALLS. 1046 mContext.enforceCallingOrSelfPermission( 1047 android.Manifest.permission.MANAGE_OWN_CALLS, 1048 "Self-managed phone accounts must have MANAGE_OWN_CALLS " + 1049 "permission."); 1050 1051 // Self-managed ConnectionServices can ONLY add new incoming calls 1052 // using their own PhoneAccounts. The checkPackage(..) app opps 1053 // check above ensures this. 1054 } 1055 } 1056 long token = Binder.clearCallingIdentity(); 1057 try { 1058 Intent intent = new Intent(TelecomManager.ACTION_INCOMING_CALL); 1059 intent.putExtra(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, 1060 phoneAccountHandle); 1061 intent.putExtra(CallIntentProcessor.KEY_IS_INCOMING_CALL, true); 1062 if (extras != null) { 1063 extras.setDefusable(true); 1064 intent.putExtra(TelecomManager.EXTRA_INCOMING_CALL_EXTRAS, extras); 1065 } 1066 mCallIntentProcessorAdapter.processIncomingCallIntent( 1067 mCallsManager, intent); 1068 } finally { 1069 Binder.restoreCallingIdentity(token); 1070 } 1071 } else { 1072 Log.w(this, "Null phoneAccountHandle. Ignoring request to add new" + 1073 " incoming call"); 1074 } 1075 } 1076 } finally { 1077 Log.endSession(); 1078 } 1079 } 1080 1081 /** 1082 * @see android.telecom.TelecomManager#acceptHandover 1083 */ 1084 @Override 1085 public void acceptHandover(Uri srcAddr, int videoState, PhoneAccountHandle destAcct) { 1086 try { 1087 Log.startSession("TSI.aHO"); 1088 synchronized (mLock) { 1089 Log.i(this, "acceptHandover; srcAddr=%s, videoState=%s, dest=%s", 1090 Log.pii(srcAddr), VideoProfile.videoStateToString(videoState), 1091 destAcct); 1092 1093 if (destAcct != null && destAcct.getComponentName() != null) { 1094 mAppOpsManager.checkPackage( 1095 Binder.getCallingUid(), 1096 destAcct.getComponentName().getPackageName()); 1097 enforceUserHandleMatchesCaller(destAcct); 1098 enforcePhoneAccountIsRegisteredEnabled(destAcct, 1099 Binder.getCallingUserHandle()); 1100 if (isSelfManagedConnectionService(destAcct)) { 1101 // Self-managed phone account, ensure it has MANAGE_OWN_CALLS. 1102 mContext.enforceCallingOrSelfPermission( 1103 android.Manifest.permission.MANAGE_OWN_CALLS, 1104 "Self-managed phone accounts must have MANAGE_OWN_CALLS " + 1105 "permission."); 1106 } 1107 if (!enforceAcceptHandoverPermission( 1108 destAcct.getComponentName().getPackageName(), 1109 Binder.getCallingUid())) { 1110 throw new SecurityException("App must be granted runtime " 1111 + "ACCEPT_HANDOVER permission."); 1112 } 1113 1114 long token = Binder.clearCallingIdentity(); 1115 try { 1116 mCallsManager.acceptHandover(srcAddr, videoState, destAcct); 1117 } finally { 1118 Binder.restoreCallingIdentity(token); 1119 } 1120 } else { 1121 Log.w(this, "Null phoneAccountHandle. Ignoring request " + 1122 "to handover the call"); 1123 } 1124 } 1125 } finally { 1126 Log.endSession(); 1127 } 1128 } 1129 1130 /** 1131 * @see android.telecom.TelecomManager#addNewUnknownCall 1132 */ 1133 @Override 1134 public void addNewUnknownCall(PhoneAccountHandle phoneAccountHandle, Bundle extras) { 1135 try { 1136 Log.startSession("TSI.aNUC"); 1137 try { 1138 enforceModifyPermission( 1139 "addNewUnknownCall requires MODIFY_PHONE_STATE permission."); 1140 } catch (SecurityException e) { 1141 EventLog.writeEvent(0x534e4554, "62347125", Binder.getCallingUid(), 1142 "addNewUnknownCall"); 1143 throw e; 1144 } 1145 1146 synchronized (mLock) { 1147 if (phoneAccountHandle != null && 1148 phoneAccountHandle.getComponentName() != null) { 1149 mAppOpsManager.checkPackage( 1150 Binder.getCallingUid(), 1151 phoneAccountHandle.getComponentName().getPackageName()); 1152 1153 // Make sure it doesn't cross the UserHandle boundary 1154 enforceUserHandleMatchesCaller(phoneAccountHandle); 1155 enforcePhoneAccountIsRegisteredEnabled(phoneAccountHandle, 1156 Binder.getCallingUserHandle()); 1157 long token = Binder.clearCallingIdentity(); 1158 1159 try { 1160 Intent intent = new Intent(TelecomManager.ACTION_NEW_UNKNOWN_CALL); 1161 if (extras != null) { 1162 extras.setDefusable(true); 1163 intent.putExtras(extras); 1164 } 1165 intent.putExtra(CallIntentProcessor.KEY_IS_UNKNOWN_CALL, true); 1166 intent.putExtra(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, 1167 phoneAccountHandle); 1168 mCallIntentProcessorAdapter.processUnknownCallIntent(mCallsManager, intent); 1169 } finally { 1170 Binder.restoreCallingIdentity(token); 1171 } 1172 } else { 1173 Log.i(this, 1174 "Null phoneAccountHandle or not initiated by Telephony. " + 1175 "Ignoring request to add new unknown call."); 1176 } 1177 } 1178 } finally { 1179 Log.endSession(); 1180 } 1181 } 1182 1183 /** 1184 * @see android.telecom.TelecomManager#placeCall 1185 */ 1186 @Override 1187 public void placeCall(Uri handle, Bundle extras, String callingPackage) { 1188 try { 1189 Log.startSession("TSI.pC"); 1190 enforceCallingPackage(callingPackage); 1191 1192 PhoneAccountHandle phoneAccountHandle = null; 1193 if (extras != null) { 1194 phoneAccountHandle = extras.getParcelable( 1195 TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE); 1196 if (extras.containsKey(TelecomManager.EXTRA_IS_HANDOVER)) { 1197 // This extra is for Telecom use only so should never be passed in. 1198 extras.remove(TelecomManager.EXTRA_IS_HANDOVER); 1199 } 1200 } 1201 boolean isSelfManaged = phoneAccountHandle != null && 1202 isSelfManagedConnectionService(phoneAccountHandle); 1203 if (isSelfManaged) { 1204 mContext.enforceCallingOrSelfPermission(Manifest.permission.MANAGE_OWN_CALLS, 1205 "Self-managed ConnectionServices require MANAGE_OWN_CALLS permission."); 1206 1207 if (!callingPackage.equals( 1208 phoneAccountHandle.getComponentName().getPackageName()) 1209 && !canCallPhone(callingPackage, 1210 "CALL_PHONE permission required to place calls.")) { 1211 // The caller is not allowed to place calls, so we want to ensure that it 1212 // can only place calls through itself. 1213 throw new SecurityException("Self-managed ConnectionServices can only " 1214 + "place calls through their own ConnectionService."); 1215 } 1216 } else if (!canCallPhone(callingPackage, "placeCall")) { 1217 throw new SecurityException("Package " + callingPackage 1218 + " is not allowed to place phone calls"); 1219 } 1220 1221 // Note: we can still get here for the default/system dialer, even if the Phone 1222 // permission is turned off. This is because the default/system dialer is always 1223 // allowed to attempt to place a call (regardless of permission state), in case 1224 // it turns out to be an emergency call. If the permission is denied and the 1225 // call is being made to a non-emergency number, the call will be denied later on 1226 // by {@link UserCallIntentProcessor}. 1227 1228 final boolean hasCallAppOp = mAppOpsManager.noteOp(AppOpsManager.OP_CALL_PHONE, 1229 Binder.getCallingUid(), callingPackage) == AppOpsManager.MODE_ALLOWED; 1230 1231 final boolean hasCallPermission = mContext.checkCallingPermission(CALL_PHONE) == 1232 PackageManager.PERMISSION_GRANTED; 1233 // The Emergency Dialer has call privileged permission and uses this to place 1234 // emergency calls. We ensure permission checks in 1235 // NewOutgoingCallIntentBroadcaster#process pass by sending this to 1236 // Telecom as an ACTION_CALL_PRIVILEGED intent (which makes sense since the 1237 // com.android.phone process has that permission). 1238 final boolean hasCallPrivilegedPermission = mContext.checkCallingPermission( 1239 CALL_PRIVILEGED) == PackageManager.PERMISSION_GRANTED; 1240 1241 synchronized (mLock) { 1242 final UserHandle userHandle = Binder.getCallingUserHandle(); 1243 long token = Binder.clearCallingIdentity(); 1244 try { 1245 final Intent intent = new Intent(hasCallPrivilegedPermission ? 1246 Intent.ACTION_CALL_PRIVILEGED : Intent.ACTION_CALL, handle); 1247 if (extras != null) { 1248 extras.setDefusable(true); 1249 intent.putExtras(extras); 1250 } 1251 mUserCallIntentProcessorFactory.create(mContext, userHandle) 1252 .processIntent( 1253 intent, callingPackage, isSelfManaged || 1254 (hasCallAppOp && hasCallPermission), 1255 true /* isLocalInvocation */); 1256 } finally { 1257 Binder.restoreCallingIdentity(token); 1258 } 1259 } 1260 } finally { 1261 Log.endSession(); 1262 } 1263 } 1264 1265 /** 1266 * @see android.telecom.TelecomManager#enablePhoneAccount 1267 */ 1268 @Override 1269 public boolean enablePhoneAccount(PhoneAccountHandle accountHandle, boolean isEnabled) { 1270 try { 1271 Log.startSession("TSI.ePA"); 1272 enforceModifyPermission(); 1273 synchronized (mLock) { 1274 long token = Binder.clearCallingIdentity(); 1275 try { 1276 // enable/disable phone account 1277 return mPhoneAccountRegistrar.enablePhoneAccount(accountHandle, isEnabled); 1278 } finally { 1279 Binder.restoreCallingIdentity(token); 1280 } 1281 } 1282 } finally { 1283 Log.endSession(); 1284 } 1285 } 1286 1287 @Override 1288 public boolean setDefaultDialer(String packageName) { 1289 try { 1290 Log.startSession("TSI.sDD"); 1291 enforcePermission(MODIFY_PHONE_STATE); 1292 enforcePermission(WRITE_SECURE_SETTINGS); 1293 synchronized (mLock) { 1294 long token = Binder.clearCallingIdentity(); 1295 try { 1296 final boolean result = mDefaultDialerCache.setDefaultDialer( 1297 packageName, ActivityManager.getCurrentUser()); 1298 if (result) { 1299 final Intent intent = 1300 new Intent(TelecomManager.ACTION_DEFAULT_DIALER_CHANGED); 1301 intent.putExtra(TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME, 1302 packageName); 1303 mContext.sendBroadcastAsUser(intent, 1304 new UserHandle(ActivityManager.getCurrentUser())); 1305 } 1306 return result; 1307 } finally { 1308 Binder.restoreCallingIdentity(token); 1309 } 1310 } 1311 } finally { 1312 Log.endSession(); 1313 } 1314 } 1315 1316 @Override 1317 public TelecomAnalytics dumpCallAnalytics() { 1318 try { 1319 Log.startSession("TSI.dCA"); 1320 enforcePermission(DUMP); 1321 return Analytics.dumpToParcelableAnalytics(); 1322 } finally { 1323 Log.endSession(); 1324 } 1325 } 1326 1327 /** 1328 * Dumps the current state of the TelecomService. Used when generating problem reports. 1329 * 1330 * @param fd The file descriptor. 1331 * @param writer The print writer to dump the state to. 1332 * @param args Optional dump arguments. 1333 */ 1334 @Override 1335 protected void dump(FileDescriptor fd, final PrintWriter writer, String[] args) { 1336 if (mContext.checkCallingOrSelfPermission( 1337 android.Manifest.permission.DUMP) 1338 != PackageManager.PERMISSION_GRANTED) { 1339 writer.println("Permission Denial: can't dump TelecomService " + 1340 "from from pid=" + Binder.getCallingPid() + ", uid=" + 1341 Binder.getCallingUid()); 1342 return; 1343 } 1344 1345 if (args.length > 0 && Analytics.ANALYTICS_DUMPSYS_ARG.equals(args[0])) { 1346 Analytics.dumpToEncodedProto(writer, args); 1347 return; 1348 } 1349 boolean isTimeLineView = (args.length > 0 && TIME_LINE_ARG.equalsIgnoreCase(args[0])); 1350 1351 final IndentingPrintWriter pw = new IndentingPrintWriter(writer, " "); 1352 if (mCallsManager != null) { 1353 pw.println("CallsManager: "); 1354 pw.increaseIndent(); 1355 mCallsManager.dump(pw); 1356 pw.decreaseIndent(); 1357 1358 pw.println("PhoneAccountRegistrar: "); 1359 pw.increaseIndent(); 1360 mPhoneAccountRegistrar.dump(pw); 1361 pw.decreaseIndent(); 1362 1363 pw.println("Analytics:"); 1364 pw.increaseIndent(); 1365 Analytics.dump(pw); 1366 pw.decreaseIndent(); 1367 } 1368 if (isTimeLineView) { 1369 Log.dumpEventsTimeline(pw); 1370 } else { 1371 Log.dumpEvents(pw); 1372 } 1373 } 1374 1375 /** 1376 * @see android.telecom.TelecomManager#createManageBlockedNumbersIntent 1377 */ 1378 @Override 1379 public Intent createManageBlockedNumbersIntent() { 1380 return BlockedNumbersActivity.getIntentForStartingActivity(); 1381 } 1382 1383 /** 1384 * @see android.telecom.TelecomManager#isIncomingCallPermitted(PhoneAccountHandle) 1385 */ 1386 @Override 1387 public boolean isIncomingCallPermitted(PhoneAccountHandle phoneAccountHandle) { 1388 try { 1389 Log.startSession("TSI.iICP"); 1390 enforcePermission(android.Manifest.permission.MANAGE_OWN_CALLS); 1391 synchronized (mLock) { 1392 long token = Binder.clearCallingIdentity(); 1393 try { 1394 return mCallsManager.isIncomingCallPermitted(phoneAccountHandle); 1395 } finally { 1396 Binder.restoreCallingIdentity(token); 1397 } 1398 } 1399 } finally { 1400 Log.endSession(); 1401 } 1402 } 1403 1404 /** 1405 * @see android.telecom.TelecomManager#isOutgoingCallPermitted(PhoneAccountHandle) 1406 */ 1407 @Override 1408 public boolean isOutgoingCallPermitted(PhoneAccountHandle phoneAccountHandle) { 1409 try { 1410 Log.startSession("TSI.iOCP"); 1411 enforcePermission(android.Manifest.permission.MANAGE_OWN_CALLS); 1412 synchronized (mLock) { 1413 long token = Binder.clearCallingIdentity(); 1414 try { 1415 return mCallsManager.isOutgoingCallPermitted(phoneAccountHandle); 1416 } finally { 1417 Binder.restoreCallingIdentity(token); 1418 } 1419 } 1420 } finally { 1421 Log.endSession(); 1422 } 1423 } 1424 1425 /** 1426 * Blocks until all Telecom handlers have completed their current work. 1427 * 1428 * See {@link com.android.commands.telecom.Telecom}. 1429 */ 1430 @Override 1431 public void waitOnHandlers() { 1432 try { 1433 Log.startSession("TSI.wOH"); 1434 enforceModifyPermission(); 1435 synchronized (mLock) { 1436 long token = Binder.clearCallingIdentity(); 1437 try { 1438 Log.i(this, "waitOnHandlers"); 1439 mCallsManager.waitOnHandlers(); 1440 } finally { 1441 Binder.restoreCallingIdentity(token); 1442 } 1443 } 1444 } finally { 1445 Log.endSession(); 1446 } 1447 } 1448 }; 1449 1450 /** 1451 * @return whether to return early without doing the action/throwing 1452 * @throws SecurityException same as {@link Context#enforceCallingOrSelfPermission} 1453 */ enforceAnswerCallPermission(String packageName, int uid)1454 private boolean enforceAnswerCallPermission(String packageName, int uid) { 1455 try { 1456 enforceModifyPermission(); 1457 } catch (SecurityException e) { 1458 final String permission = Manifest.permission.ANSWER_PHONE_CALLS; 1459 enforcePermission(permission); 1460 1461 final int opCode = AppOpsManager.permissionToOpCode(permission); 1462 if (opCode != AppOpsManager.OP_NONE 1463 && mAppOpsManager.checkOp(opCode, uid, packageName) 1464 != AppOpsManager.MODE_ALLOWED) { 1465 return false; 1466 } 1467 } 1468 return true; 1469 } 1470 1471 /** 1472 * @return {@code true} if the app has the handover permission and has received runtime 1473 * permission to perform that operation, {@code false}. 1474 * @throws SecurityException same as {@link Context#enforceCallingOrSelfPermission} 1475 */ enforceAcceptHandoverPermission(String packageName, int uid)1476 private boolean enforceAcceptHandoverPermission(String packageName, int uid) { 1477 mContext.enforceCallingOrSelfPermission(Manifest.permission.ACCEPT_HANDOVER, 1478 "App requires ACCEPT_HANDOVER permission to accept handovers."); 1479 1480 final int opCode = AppOpsManager.permissionToOpCode(Manifest.permission.ACCEPT_HANDOVER); 1481 if (opCode != AppOpsManager.OP_ACCEPT_HANDOVER || ( 1482 mAppOpsManager.checkOp(opCode, uid, packageName) 1483 != AppOpsManager.MODE_ALLOWED)) { 1484 return false; 1485 } 1486 return true; 1487 } 1488 1489 private Context mContext; 1490 private AppOpsManager mAppOpsManager; 1491 private PackageManager mPackageManager; 1492 private CallsManager mCallsManager; 1493 private final PhoneAccountRegistrar mPhoneAccountRegistrar; 1494 private final CallIntentProcessor.Adapter mCallIntentProcessorAdapter; 1495 private final UserCallIntentProcessorFactory mUserCallIntentProcessorFactory; 1496 private final DefaultDialerCache mDefaultDialerCache; 1497 private final SubscriptionManagerAdapter mSubscriptionManagerAdapter; 1498 private final TelecomSystem.SyncRoot mLock; 1499 TelecomServiceImpl( Context context, CallsManager callsManager, PhoneAccountRegistrar phoneAccountRegistrar, CallIntentProcessor.Adapter callIntentProcessorAdapter, UserCallIntentProcessorFactory userCallIntentProcessorFactory, DefaultDialerCache defaultDialerCache, SubscriptionManagerAdapter subscriptionManagerAdapter, TelecomSystem.SyncRoot lock)1500 public TelecomServiceImpl( 1501 Context context, 1502 CallsManager callsManager, 1503 PhoneAccountRegistrar phoneAccountRegistrar, 1504 CallIntentProcessor.Adapter callIntentProcessorAdapter, 1505 UserCallIntentProcessorFactory userCallIntentProcessorFactory, 1506 DefaultDialerCache defaultDialerCache, 1507 SubscriptionManagerAdapter subscriptionManagerAdapter, 1508 TelecomSystem.SyncRoot lock) { 1509 mContext = context; 1510 mAppOpsManager = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE); 1511 1512 mPackageManager = mContext.getPackageManager(); 1513 1514 mCallsManager = callsManager; 1515 mLock = lock; 1516 mPhoneAccountRegistrar = phoneAccountRegistrar; 1517 mUserCallIntentProcessorFactory = userCallIntentProcessorFactory; 1518 mDefaultDialerCache = defaultDialerCache; 1519 mCallIntentProcessorAdapter = callIntentProcessorAdapter; 1520 mSubscriptionManagerAdapter = subscriptionManagerAdapter; 1521 } 1522 getBinder()1523 public ITelecomService.Stub getBinder() { 1524 return mBinderImpl; 1525 } 1526 1527 // 1528 // Supporting methods for the ITelecomService interface implementation. 1529 // 1530 isPhoneAccountHandleVisibleToCallingUser( PhoneAccountHandle phoneAccountUserHandle, UserHandle callingUser)1531 private boolean isPhoneAccountHandleVisibleToCallingUser( 1532 PhoneAccountHandle phoneAccountUserHandle, UserHandle callingUser) { 1533 return mPhoneAccountRegistrar.getPhoneAccount(phoneAccountUserHandle, callingUser) != null; 1534 } 1535 isCallerSystemApp()1536 private boolean isCallerSystemApp() { 1537 int uid = Binder.getCallingUid(); 1538 String[] packages = mPackageManager.getPackagesForUid(uid); 1539 for (String packageName : packages) { 1540 if (isPackageSystemApp(packageName)) { 1541 return true; 1542 } 1543 } 1544 return false; 1545 } 1546 isPackageSystemApp(String packageName)1547 private boolean isPackageSystemApp(String packageName) { 1548 try { 1549 ApplicationInfo applicationInfo = mPackageManager.getApplicationInfo(packageName, 1550 PackageManager.GET_META_DATA); 1551 if ((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { 1552 return true; 1553 } 1554 } catch (PackageManager.NameNotFoundException e) { 1555 } 1556 return false; 1557 } 1558 acceptRingingCallInternal(int videoState)1559 private void acceptRingingCallInternal(int videoState) { 1560 Call call = mCallsManager.getFirstCallWithState(CallState.RINGING); 1561 if (call != null) { 1562 if (videoState == DEFAULT_VIDEO_STATE || !isValidAcceptVideoState(videoState)) { 1563 videoState = call.getVideoState(); 1564 } 1565 call.answer(videoState); 1566 } 1567 } 1568 endCallInternal(String callingPackage)1569 private boolean endCallInternal(String callingPackage) { 1570 // Always operate on the foreground call if one exists, otherwise get the first call in 1571 // priority order by call-state. 1572 Call call = mCallsManager.getForegroundCall(); 1573 if (call == null) { 1574 call = mCallsManager.getFirstCallWithState( 1575 CallState.ACTIVE, 1576 CallState.DIALING, 1577 CallState.PULLING, 1578 CallState.RINGING, 1579 CallState.ON_HOLD); 1580 } 1581 1582 if (call != null) { 1583 if (call.isEmergencyCall()) { 1584 android.util.EventLog.writeEvent(0x534e4554, "132438333", -1, ""); 1585 return false; 1586 } 1587 1588 if (call.getState() == CallState.RINGING) { 1589 call.reject(false /* rejectWithMessage */, null, callingPackage); 1590 } else { 1591 call.disconnect(0 /* disconnectionTimeout */, callingPackage); 1592 } 1593 return true; 1594 } 1595 1596 return false; 1597 } 1598 1599 // Enforce that the PhoneAccountHandle being passed in is both registered to the current user 1600 // and enabled. enforcePhoneAccountIsRegisteredEnabled(PhoneAccountHandle phoneAccountHandle, UserHandle callingUserHandle)1601 private void enforcePhoneAccountIsRegisteredEnabled(PhoneAccountHandle phoneAccountHandle, 1602 UserHandle callingUserHandle) { 1603 PhoneAccount phoneAccount = mPhoneAccountRegistrar.getPhoneAccount(phoneAccountHandle, 1604 callingUserHandle); 1605 if(phoneAccount == null) { 1606 EventLog.writeEvent(0x534e4554, "26864502", Binder.getCallingUid(), "R"); 1607 throw new SecurityException("This PhoneAccountHandle is not registered for this user!"); 1608 } 1609 if(!phoneAccount.isEnabled()) { 1610 EventLog.writeEvent(0x534e4554, "26864502", Binder.getCallingUid(), "E"); 1611 throw new SecurityException("This PhoneAccountHandle is not enabled for this user!"); 1612 } 1613 } 1614 enforcePhoneAccountModificationForPackage(String packageName)1615 private void enforcePhoneAccountModificationForPackage(String packageName) { 1616 // TODO: Use a new telecomm permission for this instead of reusing modify. 1617 1618 int result = mContext.checkCallingOrSelfPermission(MODIFY_PHONE_STATE); 1619 1620 // Callers with MODIFY_PHONE_STATE can use the PhoneAccount mechanism to implement 1621 // built-in behavior even when PhoneAccounts are not exposed as a third-part API. They 1622 // may also modify PhoneAccounts on behalf of any 'packageName'. 1623 1624 if (result != PackageManager.PERMISSION_GRANTED) { 1625 // Other callers are only allowed to modify PhoneAccounts if the relevant system 1626 // feature is enabled ... 1627 enforceConnectionServiceFeature(); 1628 // ... and the PhoneAccounts they refer to are for their own package. 1629 enforceCallingPackage(packageName); 1630 } 1631 } 1632 enforcePermissionOrPrivilegedDialer(String permission, String packageName)1633 private void enforcePermissionOrPrivilegedDialer(String permission, String packageName) { 1634 if (!isPrivilegedDialerCalling(packageName)) { 1635 try { 1636 enforcePermission(permission); 1637 } catch (SecurityException e) { 1638 Log.e(this, e, "Caller must be the default or system dialer, or have the permission" 1639 + " %s to perform this operation.", permission); 1640 throw e; 1641 } 1642 } 1643 } 1644 enforceCallingPackage(String packageName)1645 private void enforceCallingPackage(String packageName) { 1646 mAppOpsManager.checkPackage(Binder.getCallingUid(), packageName); 1647 } 1648 enforceConnectionServiceFeature()1649 private void enforceConnectionServiceFeature() { 1650 enforceFeature(PackageManager.FEATURE_CONNECTION_SERVICE); 1651 } 1652 enforceRegisterSimSubscriptionPermission()1653 private void enforceRegisterSimSubscriptionPermission() { 1654 enforcePermission(REGISTER_SIM_SUBSCRIPTION); 1655 } 1656 enforceModifyPermission()1657 private void enforceModifyPermission() { 1658 enforcePermission(MODIFY_PHONE_STATE); 1659 } 1660 enforceModifyPermission(String message)1661 private void enforceModifyPermission(String message) { 1662 mContext.enforceCallingOrSelfPermission(MODIFY_PHONE_STATE, message); 1663 } 1664 enforcePermission(String permission)1665 private void enforcePermission(String permission) { 1666 mContext.enforceCallingOrSelfPermission(permission, null); 1667 } 1668 enforceRegisterSelfManaged()1669 private void enforceRegisterSelfManaged() { 1670 mContext.enforceCallingPermission(android.Manifest.permission.MANAGE_OWN_CALLS, null); 1671 } 1672 enforceRegisterMultiUser()1673 private void enforceRegisterMultiUser() { 1674 if (!isCallerSystemApp()) { 1675 throw new SecurityException("CAPABILITY_MULTI_USER is only available to system apps."); 1676 } 1677 } 1678 enforceUserHandleMatchesCaller(PhoneAccountHandle accountHandle)1679 private void enforceUserHandleMatchesCaller(PhoneAccountHandle accountHandle) { 1680 if (!Binder.getCallingUserHandle().equals(accountHandle.getUserHandle())) { 1681 throw new SecurityException("Calling UserHandle does not match PhoneAccountHandle's"); 1682 } 1683 } 1684 enforceCrossUserPermission(int callingUid)1685 private void enforceCrossUserPermission(int callingUid) { 1686 if (callingUid != Process.SYSTEM_UID && callingUid != 0) { 1687 mContext.enforceCallingOrSelfPermission( 1688 android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, "Must be system or have" 1689 + " INTERACT_ACROSS_USERS_FULL permission"); 1690 } 1691 } 1692 enforceFeature(String feature)1693 private void enforceFeature(String feature) { 1694 PackageManager pm = mContext.getPackageManager(); 1695 if (!pm.hasSystemFeature(feature)) { 1696 throw new UnsupportedOperationException( 1697 "System does not support feature " + feature); 1698 } 1699 } 1700 canReadPhoneState(String callingPackage, String message)1701 private boolean canReadPhoneState(String callingPackage, String message) { 1702 // The system/default dialer can always read phone state - so that emergency calls will 1703 // still work. 1704 if (isPrivilegedDialerCalling(callingPackage)) { 1705 return true; 1706 } 1707 1708 try { 1709 mContext.enforceCallingOrSelfPermission(READ_PRIVILEGED_PHONE_STATE, message); 1710 // SKIP checking run-time OP_READ_PHONE_STATE since caller or self has PRIVILEGED 1711 // permission 1712 return true; 1713 } catch (SecurityException e) { 1714 // Accessing phone state is gated by a special permission. 1715 mContext.enforceCallingOrSelfPermission(READ_PHONE_STATE, message); 1716 1717 // Some apps that have the permission can be restricted via app ops. 1718 return mAppOpsManager.noteOp(AppOpsManager.OP_READ_PHONE_STATE, 1719 Binder.getCallingUid(), callingPackage) == AppOpsManager.MODE_ALLOWED; 1720 } 1721 } 1722 isSelfManagedConnectionService(PhoneAccountHandle phoneAccountHandle)1723 private boolean isSelfManagedConnectionService(PhoneAccountHandle phoneAccountHandle) { 1724 if (phoneAccountHandle != null) { 1725 PhoneAccount phoneAccount = mPhoneAccountRegistrar.getPhoneAccountUnchecked( 1726 phoneAccountHandle); 1727 return phoneAccount != null && phoneAccount.isSelfManaged(); 1728 } 1729 return false; 1730 } 1731 canCallPhone(String callingPackage, String message)1732 private boolean canCallPhone(String callingPackage, String message) { 1733 // The system/default dialer can always read phone state - so that emergency calls will 1734 // still work. 1735 if (isPrivilegedDialerCalling(callingPackage)) { 1736 return true; 1737 } 1738 1739 // Accessing phone state is gated by a special permission. 1740 mContext.enforceCallingOrSelfPermission(CALL_PHONE, message); 1741 1742 // Some apps that have the permission can be restricted via app ops. 1743 return mAppOpsManager.noteOp(AppOpsManager.OP_CALL_PHONE, 1744 Binder.getCallingUid(), callingPackage) == AppOpsManager.MODE_ALLOWED; 1745 } 1746 isCallerSimCallManager()1747 private boolean isCallerSimCallManager() { 1748 long token = Binder.clearCallingIdentity(); 1749 PhoneAccountHandle accountHandle = null; 1750 try { 1751 accountHandle = mPhoneAccountRegistrar.getSimCallManagerOfCurrentUser(); 1752 } finally { 1753 Binder.restoreCallingIdentity(token); 1754 } 1755 1756 if (accountHandle != null) { 1757 try { 1758 mAppOpsManager.checkPackage( 1759 Binder.getCallingUid(), accountHandle.getComponentName().getPackageName()); 1760 return true; 1761 } catch (SecurityException e) { 1762 } 1763 } 1764 return false; 1765 } 1766 isPrivilegedDialerCalling(String callingPackage)1767 private boolean isPrivilegedDialerCalling(String callingPackage) { 1768 mAppOpsManager.checkPackage(Binder.getCallingUid(), callingPackage); 1769 return mDefaultDialerCache.isDefaultOrSystemDialer( 1770 callingPackage, Binder.getCallingUserHandle().getIdentifier()); 1771 } 1772 getTelephonyManager()1773 private TelephonyManager getTelephonyManager() { 1774 return (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE); 1775 } 1776 1777 /** 1778 * Determines if a video state is valid for accepting an incoming call. 1779 * For the purpose of accepting a call, states {@link VideoProfile#STATE_AUDIO_ONLY}, and 1780 * any combination of {@link VideoProfile#STATE_RX_ENABLED} and 1781 * {@link VideoProfile#STATE_TX_ENABLED} are considered valid. 1782 * 1783 * @param videoState The video state. 1784 * @return {@code true} if the video state is valid, {@code false} otherwise. 1785 */ isValidAcceptVideoState(int videoState)1786 private boolean isValidAcceptVideoState(int videoState) { 1787 // Given a video state input, turn off TX and RX so that we can determine if those were the 1788 // only bits set. 1789 int remainingState = videoState & ~VideoProfile.STATE_TX_ENABLED; 1790 remainingState = remainingState & ~VideoProfile.STATE_RX_ENABLED; 1791 1792 // If only TX or RX were set (or neither), the video state is valid. 1793 return remainingState == 0; 1794 } 1795 } 1796