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