TelephonyManager.java revision dae67ef3439a91f58ccf4844a6b0e1d48be1a6f6
1/* 2 * Copyright (C) 2008 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 17package android.telephony; 18 19import android.annotation.Nullable; 20import android.annotation.SystemApi; 21import android.annotation.SdkConstant; 22import android.annotation.SdkConstant.SdkConstantType; 23import android.content.ContentResolver; 24import android.content.Context; 25import android.content.Intent; 26import android.provider.Settings; 27import android.provider.Settings.SettingNotFoundException; 28import android.os.Bundle; 29import android.os.RemoteException; 30import android.os.ServiceManager; 31import android.os.SystemProperties; 32import android.telecom.PhoneAccount; 33import android.util.Log; 34 35import com.android.internal.telecom.ITelecomService; 36import com.android.internal.telephony.IPhoneSubInfo; 37import com.android.internal.telephony.ITelephony; 38import com.android.internal.telephony.ITelephonyRegistry; 39import com.android.internal.telephony.PhoneConstants; 40import com.android.internal.telephony.RILConstants; 41import com.android.internal.telephony.TelephonyProperties; 42 43import java.io.FileInputStream; 44import java.io.IOException; 45import java.util.List; 46import java.util.regex.Matcher; 47import java.util.regex.Pattern; 48 49/** 50 * Provides access to information about the telephony services on 51 * the device. Applications can use the methods in this class to 52 * determine telephony services and states, as well as to access some 53 * types of subscriber information. Applications can also register 54 * a listener to receive notification of telephony state changes. 55 * <p> 56 * You do not instantiate this class directly; instead, you retrieve 57 * a reference to an instance through 58 * {@link android.content.Context#getSystemService 59 * Context.getSystemService(Context.TELEPHONY_SERVICE)}. 60 * <p> 61 * Note that access to some telephony information is 62 * permission-protected. Your application cannot access the protected 63 * information unless it has the appropriate permissions declared in 64 * its manifest file. Where permissions apply, they are noted in the 65 * the methods through which you access the protected information. 66 */ 67public class TelephonyManager { 68 private static final String TAG = "TelephonyManager"; 69 70 private static ITelephonyRegistry sRegistry; 71 72 /** 73 * The allowed states of Wi-Fi calling. 74 * 75 * @hide 76 */ 77 public interface WifiCallingChoices { 78 /** Always use Wi-Fi calling */ 79 static final int ALWAYS_USE = 0; 80 /** Ask the user whether to use Wi-Fi on every call */ 81 static final int ASK_EVERY_TIME = 1; 82 /** Never use Wi-Fi calling */ 83 static final int NEVER_USE = 2; 84 } 85 86 private final Context mContext; 87 private SubscriptionManager mSubscriptionManager; 88 89 private static String multiSimConfig = 90 SystemProperties.get(TelephonyProperties.PROPERTY_MULTI_SIM_CONFIG); 91 92 /** Enum indicating multisim variants 93 * DSDS - Dual SIM Dual Standby 94 * DSDA - Dual SIM Dual Active 95 * TSTS - Triple SIM Triple Standby 96 **/ 97 /** @hide */ 98 public enum MultiSimVariants { 99 DSDS, 100 DSDA, 101 TSTS, 102 UNKNOWN 103 }; 104 105 /** @hide */ 106 public TelephonyManager(Context context) { 107 Context appContext = context.getApplicationContext(); 108 if (appContext != null) { 109 mContext = appContext; 110 } else { 111 mContext = context; 112 } 113 mSubscriptionManager = SubscriptionManager.from(mContext); 114 115 if (sRegistry == null) { 116 sRegistry = ITelephonyRegistry.Stub.asInterface(ServiceManager.getService( 117 "telephony.registry")); 118 } 119 } 120 121 /** @hide */ 122 private TelephonyManager() { 123 mContext = null; 124 } 125 126 private static TelephonyManager sInstance = new TelephonyManager(); 127 128 /** @hide 129 /* @deprecated - use getSystemService as described above */ 130 public static TelephonyManager getDefault() { 131 return sInstance; 132 } 133 134 135 /** 136 * Returns the multi SIM variant 137 * Returns DSDS for Dual SIM Dual Standby 138 * Returns DSDA for Dual SIM Dual Active 139 * Returns TSTS for Triple SIM Triple Standby 140 * Returns UNKNOWN for others 141 */ 142 /** {@hide} */ 143 public MultiSimVariants getMultiSimConfiguration() { 144 String mSimConfig = 145 SystemProperties.get(TelephonyProperties.PROPERTY_MULTI_SIM_CONFIG); 146 if (mSimConfig.equals("dsds")) { 147 return MultiSimVariants.DSDS; 148 } else if (mSimConfig.equals("dsda")) { 149 return MultiSimVariants.DSDA; 150 } else if (mSimConfig.equals("tsts")) { 151 return MultiSimVariants.TSTS; 152 } else { 153 return MultiSimVariants.UNKNOWN; 154 } 155 } 156 157 158 /** 159 * Returns the number of phones available. 160 * Returns 1 for Single standby mode (Single SIM functionality) 161 * Returns 2 for Dual standby mode.(Dual SIM functionality) 162 */ 163 public int getPhoneCount() { 164 int phoneCount = 1; 165 switch (getMultiSimConfiguration()) { 166 case UNKNOWN: 167 phoneCount = 1; 168 break; 169 case DSDS: 170 case DSDA: 171 phoneCount = PhoneConstants.MAX_PHONE_COUNT_DUAL_SIM; 172 break; 173 case TSTS: 174 phoneCount = PhoneConstants.MAX_PHONE_COUNT_TRI_SIM; 175 break; 176 } 177 return phoneCount; 178 } 179 180 /** {@hide} */ 181 public static TelephonyManager from(Context context) { 182 return (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 183 } 184 185 /** {@hide} */ 186 public boolean isMultiSimEnabled() { 187 return (multiSimConfig.equals("dsds") || multiSimConfig.equals("dsda") || 188 multiSimConfig.equals("tsts")); 189 } 190 191 // 192 // Broadcast Intent actions 193 // 194 195 /** 196 * Broadcast intent action indicating that the call state (cellular) 197 * on the device has changed. 198 * 199 * <p> 200 * The {@link #EXTRA_STATE} extra indicates the new call state. 201 * If the new state is RINGING, a second extra 202 * {@link #EXTRA_INCOMING_NUMBER} provides the incoming phone number as 203 * a String. 204 * 205 * <p class="note"> 206 * Requires the READ_PHONE_STATE permission. 207 * 208 * <p class="note"> 209 * This was a {@link android.content.Context#sendStickyBroadcast sticky} 210 * broadcast in version 1.0, but it is no longer sticky. 211 * Instead, use {@link #getCallState} to synchronously query the current call state. 212 * 213 * @see #EXTRA_STATE 214 * @see #EXTRA_INCOMING_NUMBER 215 * @see #getCallState 216 */ 217 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 218 public static final String ACTION_PHONE_STATE_CHANGED = 219 "android.intent.action.PHONE_STATE"; 220 221 /** 222 * The Phone app sends this intent when a user opts to respond-via-message during an incoming 223 * call. By default, the device's default SMS app consumes this message and sends a text message 224 * to the caller. A third party app can also provide this functionality by consuming this Intent 225 * with a {@link android.app.Service} and sending the message using its own messaging system. 226 * <p>The intent contains a URI (available from {@link android.content.Intent#getData}) 227 * describing the recipient, using either the {@code sms:}, {@code smsto:}, {@code mms:}, 228 * or {@code mmsto:} URI schema. Each of these URI schema carry the recipient information the 229 * same way: the path part of the URI contains the recipient's phone number or a comma-separated 230 * set of phone numbers if there are multiple recipients. For example, {@code 231 * smsto:2065551234}.</p> 232 * 233 * <p>The intent may also contain extras for the message text (in {@link 234 * android.content.Intent#EXTRA_TEXT}) and a message subject 235 * (in {@link android.content.Intent#EXTRA_SUBJECT}).</p> 236 * 237 * <p class="note"><strong>Note:</strong> 238 * The intent-filter that consumes this Intent needs to be in a {@link android.app.Service} 239 * that requires the 240 * permission {@link android.Manifest.permission#SEND_RESPOND_VIA_MESSAGE}.</p> 241 * <p>For example, the service that receives this intent can be declared in the manifest file 242 * with an intent filter like this:</p> 243 * <pre> 244 * <!-- Service that delivers SMS messages received from the phone "quick response" --> 245 * <service android:name=".HeadlessSmsSendService" 246 * android:permission="android.permission.SEND_RESPOND_VIA_MESSAGE" 247 * android:exported="true" > 248 * <intent-filter> 249 * <action android:name="android.intent.action.RESPOND_VIA_MESSAGE" /> 250 * <category android:name="android.intent.category.DEFAULT" /> 251 * <data android:scheme="sms" /> 252 * <data android:scheme="smsto" /> 253 * <data android:scheme="mms" /> 254 * <data android:scheme="mmsto" /> 255 * </intent-filter> 256 * </service></pre> 257 * <p> 258 * Output: nothing. 259 */ 260 @SdkConstant(SdkConstantType.SERVICE_ACTION) 261 public static final String ACTION_RESPOND_VIA_MESSAGE = 262 "android.intent.action.RESPOND_VIA_MESSAGE"; 263 264 /** 265 * The emergency dialer may choose to present activities with intent filters for this 266 * action as emergency assistance buttons that launch the activity when clicked. 267 */ 268 @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) 269 public static final String ACTION_EMERGENCY_ASSISTANCE = 270 "android.telephony.action.EMERGENCY_ASSISTANCE"; 271 272 /** 273 * The lookup key used with the {@link #ACTION_PHONE_STATE_CHANGED} broadcast 274 * for a String containing the new call state. 275 * 276 * @see #EXTRA_STATE_IDLE 277 * @see #EXTRA_STATE_RINGING 278 * @see #EXTRA_STATE_OFFHOOK 279 * 280 * <p class="note"> 281 * Retrieve with 282 * {@link android.content.Intent#getStringExtra(String)}. 283 */ 284 public static final String EXTRA_STATE = PhoneConstants.STATE_KEY; 285 286 /** 287 * Value used with {@link #EXTRA_STATE} corresponding to 288 * {@link #CALL_STATE_IDLE}. 289 */ 290 public static final String EXTRA_STATE_IDLE = PhoneConstants.State.IDLE.toString(); 291 292 /** 293 * Value used with {@link #EXTRA_STATE} corresponding to 294 * {@link #CALL_STATE_RINGING}. 295 */ 296 public static final String EXTRA_STATE_RINGING = PhoneConstants.State.RINGING.toString(); 297 298 /** 299 * Value used with {@link #EXTRA_STATE} corresponding to 300 * {@link #CALL_STATE_OFFHOOK}. 301 */ 302 public static final String EXTRA_STATE_OFFHOOK = PhoneConstants.State.OFFHOOK.toString(); 303 304 /** 305 * The lookup key used with the {@link #ACTION_PHONE_STATE_CHANGED} broadcast 306 * for a String containing the incoming phone number. 307 * Only valid when the new call state is RINGING. 308 * 309 * <p class="note"> 310 * Retrieve with 311 * {@link android.content.Intent#getStringExtra(String)}. 312 */ 313 public static final String EXTRA_INCOMING_NUMBER = "incoming_number"; 314 315 /** 316 * Broadcast intent action indicating that a precise call state 317 * (cellular) on the device has changed. 318 * 319 * <p> 320 * The {@link #EXTRA_RINGING_CALL_STATE} extra indicates the ringing call state. 321 * The {@link #EXTRA_FOREGROUND_CALL_STATE} extra indicates the foreground call state. 322 * The {@link #EXTRA_BACKGROUND_CALL_STATE} extra indicates the background call state. 323 * The {@link #EXTRA_DISCONNECT_CAUSE} extra indicates the disconnect cause. 324 * The {@link #EXTRA_PRECISE_DISCONNECT_CAUSE} extra indicates the precise disconnect cause. 325 * 326 * <p class="note"> 327 * Requires the READ_PRECISE_PHONE_STATE permission. 328 * 329 * @see #EXTRA_RINGING_CALL_STATE 330 * @see #EXTRA_FOREGROUND_CALL_STATE 331 * @see #EXTRA_BACKGROUND_CALL_STATE 332 * @see #EXTRA_DISCONNECT_CAUSE 333 * @see #EXTRA_PRECISE_DISCONNECT_CAUSE 334 * 335 * <p class="note"> 336 * Requires the READ_PRECISE_PHONE_STATE permission. 337 * 338 * @hide 339 */ 340 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 341 public static final String ACTION_PRECISE_CALL_STATE_CHANGED = 342 "android.intent.action.PRECISE_CALL_STATE"; 343 344 /** 345 * The lookup key used with the {@link #ACTION_PRECISE_CALL_STATE_CHANGED} broadcast 346 * for an integer containing the state of the current ringing call. 347 * 348 * @see PreciseCallState#PRECISE_CALL_STATE_NOT_VALID 349 * @see PreciseCallState#PRECISE_CALL_STATE_IDLE 350 * @see PreciseCallState#PRECISE_CALL_STATE_ACTIVE 351 * @see PreciseCallState#PRECISE_CALL_STATE_HOLDING 352 * @see PreciseCallState#PRECISE_CALL_STATE_DIALING 353 * @see PreciseCallState#PRECISE_CALL_STATE_ALERTING 354 * @see PreciseCallState#PRECISE_CALL_STATE_INCOMING 355 * @see PreciseCallState#PRECISE_CALL_STATE_WAITING 356 * @see PreciseCallState#PRECISE_CALL_STATE_DISCONNECTED 357 * @see PreciseCallState#PRECISE_CALL_STATE_DISCONNECTING 358 * 359 * <p class="note"> 360 * Retrieve with 361 * {@link android.content.Intent#getIntExtra(String name, int defaultValue)}. 362 * 363 * @hide 364 */ 365 public static final String EXTRA_RINGING_CALL_STATE = "ringing_state"; 366 367 /** 368 * The lookup key used with the {@link #ACTION_PRECISE_CALL_STATE_CHANGED} broadcast 369 * for an integer containing the state of the current foreground call. 370 * 371 * @see PreciseCallState#PRECISE_CALL_STATE_NOT_VALID 372 * @see PreciseCallState#PRECISE_CALL_STATE_IDLE 373 * @see PreciseCallState#PRECISE_CALL_STATE_ACTIVE 374 * @see PreciseCallState#PRECISE_CALL_STATE_HOLDING 375 * @see PreciseCallState#PRECISE_CALL_STATE_DIALING 376 * @see PreciseCallState#PRECISE_CALL_STATE_ALERTING 377 * @see PreciseCallState#PRECISE_CALL_STATE_INCOMING 378 * @see PreciseCallState#PRECISE_CALL_STATE_WAITING 379 * @see PreciseCallState#PRECISE_CALL_STATE_DISCONNECTED 380 * @see PreciseCallState#PRECISE_CALL_STATE_DISCONNECTING 381 * 382 * <p class="note"> 383 * Retrieve with 384 * {@link android.content.Intent#getIntExtra(String name, int defaultValue)}. 385 * 386 * @hide 387 */ 388 public static final String EXTRA_FOREGROUND_CALL_STATE = "foreground_state"; 389 390 /** 391 * The lookup key used with the {@link #ACTION_PRECISE_CALL_STATE_CHANGED} broadcast 392 * for an integer containing the state of the current background call. 393 * 394 * @see PreciseCallState#PRECISE_CALL_STATE_NOT_VALID 395 * @see PreciseCallState#PRECISE_CALL_STATE_IDLE 396 * @see PreciseCallState#PRECISE_CALL_STATE_ACTIVE 397 * @see PreciseCallState#PRECISE_CALL_STATE_HOLDING 398 * @see PreciseCallState#PRECISE_CALL_STATE_DIALING 399 * @see PreciseCallState#PRECISE_CALL_STATE_ALERTING 400 * @see PreciseCallState#PRECISE_CALL_STATE_INCOMING 401 * @see PreciseCallState#PRECISE_CALL_STATE_WAITING 402 * @see PreciseCallState#PRECISE_CALL_STATE_DISCONNECTED 403 * @see PreciseCallState#PRECISE_CALL_STATE_DISCONNECTING 404 * 405 * <p class="note"> 406 * Retrieve with 407 * {@link android.content.Intent#getIntExtra(String name, int defaultValue)}. 408 * 409 * @hide 410 */ 411 public static final String EXTRA_BACKGROUND_CALL_STATE = "background_state"; 412 413 /** 414 * The lookup key used with the {@link #ACTION_PRECISE_CALL_STATE_CHANGED} broadcast 415 * for an integer containing the disconnect cause. 416 * 417 * @see DisconnectCause 418 * 419 * <p class="note"> 420 * Retrieve with 421 * {@link android.content.Intent#getIntExtra(String name, int defaultValue)}. 422 * 423 * @hide 424 */ 425 public static final String EXTRA_DISCONNECT_CAUSE = "disconnect_cause"; 426 427 /** 428 * The lookup key used with the {@link #ACTION_PRECISE_CALL_STATE_CHANGED} broadcast 429 * for an integer containing the disconnect cause provided by the RIL. 430 * 431 * @see PreciseDisconnectCause 432 * 433 * <p class="note"> 434 * Retrieve with 435 * {@link android.content.Intent#getIntExtra(String name, int defaultValue)}. 436 * 437 * @hide 438 */ 439 public static final String EXTRA_PRECISE_DISCONNECT_CAUSE = "precise_disconnect_cause"; 440 441 /** 442 * Broadcast intent action indicating a data connection has changed, 443 * providing precise information about the connection. 444 * 445 * <p> 446 * The {@link #EXTRA_DATA_STATE} extra indicates the connection state. 447 * The {@link #EXTRA_DATA_NETWORK_TYPE} extra indicates the connection network type. 448 * The {@link #EXTRA_DATA_APN_TYPE} extra indicates the APN type. 449 * The {@link #EXTRA_DATA_APN} extra indicates the APN. 450 * The {@link #EXTRA_DATA_CHANGE_REASON} extra indicates the connection change reason. 451 * The {@link #EXTRA_DATA_IFACE_PROPERTIES} extra indicates the connection interface. 452 * The {@link #EXTRA_DATA_FAILURE_CAUSE} extra indicates the connection fail cause. 453 * 454 * <p class="note"> 455 * Requires the READ_PRECISE_PHONE_STATE permission. 456 * 457 * @see #EXTRA_DATA_STATE 458 * @see #EXTRA_DATA_NETWORK_TYPE 459 * @see #EXTRA_DATA_APN_TYPE 460 * @see #EXTRA_DATA_APN 461 * @see #EXTRA_DATA_CHANGE_REASON 462 * @see #EXTRA_DATA_IFACE 463 * @see #EXTRA_DATA_FAILURE_CAUSE 464 * @hide 465 */ 466 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 467 public static final String ACTION_PRECISE_DATA_CONNECTION_STATE_CHANGED = 468 "android.intent.action.PRECISE_DATA_CONNECTION_STATE_CHANGED"; 469 470 /** 471 * The lookup key used with the {@link #ACTION_PRECISE_DATA_CONNECTION_STATE_CHANGED} broadcast 472 * for an integer containing the state of the current data connection. 473 * 474 * @see TelephonyManager#DATA_UNKNOWN 475 * @see TelephonyManager#DATA_DISCONNECTED 476 * @see TelephonyManager#DATA_CONNECTING 477 * @see TelephonyManager#DATA_CONNECTED 478 * @see TelephonyManager#DATA_SUSPENDED 479 * 480 * <p class="note"> 481 * Retrieve with 482 * {@link android.content.Intent#getIntExtra(String name, int defaultValue)}. 483 * 484 * @hide 485 */ 486 public static final String EXTRA_DATA_STATE = PhoneConstants.STATE_KEY; 487 488 /** 489 * The lookup key used with the {@link #ACTION_PRECISE_DATA_CONNECTION_STATE_CHANGED} broadcast 490 * for an integer containing the network type. 491 * 492 * @see TelephonyManager#NETWORK_TYPE_UNKNOWN 493 * @see TelephonyManager#NETWORK_TYPE_GPRS 494 * @see TelephonyManager#NETWORK_TYPE_EDGE 495 * @see TelephonyManager#NETWORK_TYPE_UMTS 496 * @see TelephonyManager#NETWORK_TYPE_CDMA 497 * @see TelephonyManager#NETWORK_TYPE_EVDO_0 498 * @see TelephonyManager#NETWORK_TYPE_EVDO_A 499 * @see TelephonyManager#NETWORK_TYPE_1xRTT 500 * @see TelephonyManager#NETWORK_TYPE_HSDPA 501 * @see TelephonyManager#NETWORK_TYPE_HSUPA 502 * @see TelephonyManager#NETWORK_TYPE_HSPA 503 * @see TelephonyManager#NETWORK_TYPE_IDEN 504 * @see TelephonyManager#NETWORK_TYPE_EVDO_B 505 * @see TelephonyManager#NETWORK_TYPE_LTE 506 * @see TelephonyManager#NETWORK_TYPE_EHRPD 507 * @see TelephonyManager#NETWORK_TYPE_HSPAP 508 * 509 * <p class="note"> 510 * Retrieve with 511 * {@link android.content.Intent#getIntExtra(String name, int defaultValue)}. 512 * 513 * @hide 514 */ 515 public static final String EXTRA_DATA_NETWORK_TYPE = PhoneConstants.DATA_NETWORK_TYPE_KEY; 516 517 /** 518 * The lookup key used with the {@link #ACTION_PRECISE_DATA_CONNECTION_STATE_CHANGED} broadcast 519 * for an String containing the data APN type. 520 * 521 * <p class="note"> 522 * Retrieve with 523 * {@link android.content.Intent#getStringExtra(String name)}. 524 * 525 * @hide 526 */ 527 public static final String EXTRA_DATA_APN_TYPE = PhoneConstants.DATA_APN_TYPE_KEY; 528 529 /** 530 * The lookup key used with the {@link #ACTION_PRECISE_DATA_CONNECTION_STATE_CHANGED} broadcast 531 * for an String containing the data APN. 532 * 533 * <p class="note"> 534 * Retrieve with 535 * {@link android.content.Intent#getStringExtra(String name)}. 536 * 537 * @hide 538 */ 539 public static final String EXTRA_DATA_APN = PhoneConstants.DATA_APN_KEY; 540 541 /** 542 * The lookup key used with the {@link #ACTION_PRECISE_DATA_CONNECTION_STATE_CHANGED} broadcast 543 * for an String representation of the change reason. 544 * 545 * <p class="note"> 546 * Retrieve with 547 * {@link android.content.Intent#getStringExtra(String name)}. 548 * 549 * @hide 550 */ 551 public static final String EXTRA_DATA_CHANGE_REASON = PhoneConstants.STATE_CHANGE_REASON_KEY; 552 553 /** 554 * The lookup key used with the {@link #ACTION_PRECISE_DATA_CONNECTION_STATE_CHANGED} broadcast 555 * for an String representation of the data interface. 556 * 557 * <p class="note"> 558 * Retrieve with 559 * {@link android.content.Intent#getParcelableExtra(String name)}. 560 * 561 * @hide 562 */ 563 public static final String EXTRA_DATA_LINK_PROPERTIES_KEY = PhoneConstants.DATA_LINK_PROPERTIES_KEY; 564 565 /** 566 * The lookup key used with the {@link #ACTION_PRECISE_DATA_CONNECTION_STATE_CHANGED} broadcast 567 * for the data connection fail cause. 568 * 569 * <p class="note"> 570 * Retrieve with 571 * {@link android.content.Intent#getStringExtra(String name)}. 572 * 573 * @hide 574 */ 575 public static final String EXTRA_DATA_FAILURE_CAUSE = PhoneConstants.DATA_FAILURE_CAUSE_KEY; 576 577 /** 578 * Response codes for sim activation. Activation completed successfully. 579 * @hide 580 */ 581 @SystemApi 582 public static final int SIM_ACTIVATION_RESULT_COMPLETE = 0; 583 /** 584 * Response codes for sim activation. Activation not supported (device has no SIM). 585 * @hide 586 */ 587 @SystemApi 588 public static final int SIM_ACTIVATION_RESULT_NOT_SUPPORTED = 1; 589 /** 590 * Response codes for sim activation. Activation is in progress. 591 * @hide 592 */ 593 @SystemApi 594 public static final int SIM_ACTIVATION_RESULT_IN_PROGRESS = 2; 595 /** 596 * Response codes for sim activation. Activation failed to complete. 597 * @hide 598 */ 599 @SystemApi 600 public static final int SIM_ACTIVATION_RESULT_FAILED = 3; 601 /** 602 * Response codes for sim activation. Activation canceled by user. 603 * @hide 604 */ 605 @SystemApi 606 public static final int SIM_ACTIVATION_RESULT_CANCELED = 4; 607 608 // 609 // 610 // Device Info 611 // 612 // 613 614 /** 615 * Returns the software version number for the device, for example, 616 * the IMEI/SV for GSM phones. Return null if the software version is 617 * not available. 618 * 619 * <p>Requires Permission: 620 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 621 */ 622 public String getDeviceSoftwareVersion() { 623 return getDeviceSoftwareVersion(getDefaultSim()); 624 } 625 626 /** 627 * Returns the software version number for the device, for example, 628 * the IMEI/SV for GSM phones. Return null if the software version is 629 * not available. 630 * 631 * <p>Requires Permission: 632 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 633 * 634 * @param slotId of which deviceID is returned 635 */ 636 /** {@hide} */ 637 public String getDeviceSoftwareVersion(int slotId) { 638 // FIXME methods taking slot id should not use subscription, instead us Uicc directly 639 int[] subId = SubscriptionManager.getSubId(slotId); 640 if (subId == null || subId.length == 0) { 641 return null; 642 } 643 try { 644 IPhoneSubInfo info = getSubscriberInfo(); 645 if (info == null) 646 return null; 647 return info.getDeviceSvnUsingSubId(subId[0]); 648 } catch (RemoteException ex) { 649 return null; 650 } catch (NullPointerException ex) { 651 return null; 652 } 653 } 654 655 /** 656 * Returns the unique device ID, for example, the IMEI for GSM and the MEID 657 * or ESN for CDMA phones. Return null if device ID is not available. 658 * 659 * <p>Requires Permission: 660 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 661 */ 662 public String getDeviceId() { 663 try { 664 ITelephony telephony = getITelephony(); 665 if (telephony == null) 666 return null; 667 return telephony.getDeviceId(); 668 } catch (RemoteException ex) { 669 return null; 670 } catch (NullPointerException ex) { 671 return null; 672 } 673 } 674 675 /** 676 * Returns the unique device ID of a subscription, for example, the IMEI for 677 * GSM and the MEID for CDMA phones. Return null if device ID is not available. 678 * 679 * <p>Requires Permission: 680 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 681 * 682 * @param slotId of which deviceID is returned 683 */ 684 public String getDeviceId(int slotId) { 685 // FIXME this assumes phoneId == slotId 686 try { 687 IPhoneSubInfo info = getSubscriberInfo(); 688 if (info == null) 689 return null; 690 return info.getDeviceIdForPhone(slotId); 691 } catch (RemoteException ex) { 692 return null; 693 } catch (NullPointerException ex) { 694 return null; 695 } 696 } 697 698 /** 699 * Returns the IMEI. Return null if IMEI is not available. 700 * 701 * <p>Requires Permission: 702 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 703 */ 704 /** {@hide} */ 705 public String getImei() { 706 return getImei(getDefaultSim()); 707 } 708 709 /** 710 * Returns the IMEI. Return null if IMEI is not available. 711 * 712 * <p>Requires Permission: 713 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 714 * 715 * @param slotId of which deviceID is returned 716 */ 717 /** {@hide} */ 718 public String getImei(int slotId) { 719 int[] subId = SubscriptionManager.getSubId(slotId); 720 try { 721 IPhoneSubInfo info = getSubscriberInfo(); 722 if (info == null) 723 return null; 724 return info.getImeiForSubscriber(subId[0]); 725 } catch (RemoteException ex) { 726 return null; 727 } catch (NullPointerException ex) { 728 return null; 729 } 730 } 731 732 /** 733 * Returns the NAI. Return null if NAI is not available. 734 * 735 */ 736 /** {@hide}*/ 737 public String getNai() { 738 return getNai(getDefaultSim()); 739 } 740 741 /** 742 * Returns the NAI. Return null if NAI is not available. 743 * 744 * @param slotId of which Nai is returned 745 */ 746 /** {@hide}*/ 747 public String getNai(int slotId) { 748 int[] subId = SubscriptionManager.getSubId(slotId); 749 try { 750 IPhoneSubInfo info = getSubscriberInfo(); 751 if (info == null) 752 return null; 753 String nai = info.getNaiForSubscriber(subId[0]); 754 if (Log.isLoggable(TAG, Log.VERBOSE)) { 755 Rlog.v(TAG, "Nai = " + nai); 756 } 757 return nai; 758 } catch (RemoteException ex) { 759 return null; 760 } catch (NullPointerException ex) { 761 return null; 762 } 763 } 764 765 /** 766 * Returns the current location of the device. 767 *<p> 768 * If there is only one radio in the device and that radio has an LTE connection, 769 * this method will return null. The implementation must not to try add LTE 770 * identifiers into the existing cdma/gsm classes. 771 *<p> 772 * In the future this call will be deprecated. 773 *<p> 774 * @return Current location of the device or null if not available. 775 * 776 * <p>Requires Permission: 777 * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION ACCESS_COARSE_LOCATION} or 778 * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION ACCESS_FINE_LOCATION}. 779 */ 780 public CellLocation getCellLocation() { 781 try { 782 ITelephony telephony = getITelephony(); 783 if (telephony == null) 784 return null; 785 Bundle bundle = telephony.getCellLocation(); 786 if (bundle.isEmpty()) return null; 787 CellLocation cl = CellLocation.newFromBundle(bundle); 788 if (cl.isEmpty()) 789 return null; 790 return cl; 791 } catch (RemoteException ex) { 792 return null; 793 } catch (NullPointerException ex) { 794 return null; 795 } 796 } 797 798 /** 799 * Enables location update notifications. {@link PhoneStateListener#onCellLocationChanged 800 * PhoneStateListener.onCellLocationChanged} will be called on location updates. 801 * 802 * <p>Requires Permission: {@link android.Manifest.permission#CONTROL_LOCATION_UPDATES 803 * CONTROL_LOCATION_UPDATES} 804 * 805 * @hide 806 */ 807 public void enableLocationUpdates() { 808 enableLocationUpdates(getDefaultSubscription()); 809 } 810 811 /** 812 * Enables location update notifications for a subscription. 813 * {@link PhoneStateListener#onCellLocationChanged 814 * PhoneStateListener.onCellLocationChanged} will be called on location updates. 815 * 816 * <p>Requires Permission: {@link android.Manifest.permission#CONTROL_LOCATION_UPDATES 817 * CONTROL_LOCATION_UPDATES} 818 * 819 * @param subId for which the location updates are enabled 820 */ 821 /** @hide */ 822 public void enableLocationUpdates(int subId) { 823 try { 824 ITelephony telephony = getITelephony(); 825 if (telephony != null) 826 telephony.enableLocationUpdatesForSubscriber(subId); 827 } catch (RemoteException ex) { 828 } catch (NullPointerException ex) { 829 } 830 } 831 832 /** 833 * Disables location update notifications. {@link PhoneStateListener#onCellLocationChanged 834 * PhoneStateListener.onCellLocationChanged} will be called on location updates. 835 * 836 * <p>Requires Permission: {@link android.Manifest.permission#CONTROL_LOCATION_UPDATES 837 * CONTROL_LOCATION_UPDATES} 838 * 839 * @hide 840 */ 841 public void disableLocationUpdates() { 842 disableLocationUpdates(getDefaultSubscription()); 843 } 844 845 /** @hide */ 846 public void disableLocationUpdates(int subId) { 847 try { 848 ITelephony telephony = getITelephony(); 849 if (telephony != null) 850 telephony.disableLocationUpdatesForSubscriber(subId); 851 } catch (RemoteException ex) { 852 } catch (NullPointerException ex) { 853 } 854 } 855 856 /** 857 * Returns the neighboring cell information of the device. The getAllCellInfo is preferred 858 * and use this only if getAllCellInfo return nulls or an empty list. 859 *<p> 860 * In the future this call will be deprecated. 861 *<p> 862 * @return List of NeighboringCellInfo or null if info unavailable. 863 * 864 * <p>Requires Permission: 865 * (@link android.Manifest.permission#ACCESS_COARSE_UPDATES} 866 */ 867 public List<NeighboringCellInfo> getNeighboringCellInfo() { 868 try { 869 ITelephony telephony = getITelephony(); 870 if (telephony == null) 871 return null; 872 return telephony.getNeighboringCellInfo(mContext.getOpPackageName()); 873 } catch (RemoteException ex) { 874 return null; 875 } catch (NullPointerException ex) { 876 return null; 877 } 878 } 879 880 /** No phone radio. */ 881 public static final int PHONE_TYPE_NONE = PhoneConstants.PHONE_TYPE_NONE; 882 /** Phone radio is GSM. */ 883 public static final int PHONE_TYPE_GSM = PhoneConstants.PHONE_TYPE_GSM; 884 /** Phone radio is CDMA. */ 885 public static final int PHONE_TYPE_CDMA = PhoneConstants.PHONE_TYPE_CDMA; 886 /** Phone is via SIP. */ 887 public static final int PHONE_TYPE_SIP = PhoneConstants.PHONE_TYPE_SIP; 888 889 /** 890 * Returns the current phone type. 891 * TODO: This is a last minute change and hence hidden. 892 * 893 * @see #PHONE_TYPE_NONE 894 * @see #PHONE_TYPE_GSM 895 * @see #PHONE_TYPE_CDMA 896 * @see #PHONE_TYPE_SIP 897 * 898 * {@hide} 899 */ 900 @SystemApi 901 public int getCurrentPhoneType() { 902 return getCurrentPhoneType(getDefaultSubscription()); 903 } 904 905 /** 906 * Returns a constant indicating the device phone type for a subscription. 907 * 908 * @see #PHONE_TYPE_NONE 909 * @see #PHONE_TYPE_GSM 910 * @see #PHONE_TYPE_CDMA 911 * 912 * @param subId for which phone type is returned 913 */ 914 /** {@hide} */ 915 @SystemApi 916 public int getCurrentPhoneType(int subId) { 917 int phoneId = SubscriptionManager.getPhoneId(subId); 918 try{ 919 ITelephony telephony = getITelephony(); 920 if (telephony != null) { 921 return telephony.getActivePhoneTypeForSubscriber(subId); 922 } else { 923 // This can happen when the ITelephony interface is not up yet. 924 return getPhoneTypeFromProperty(phoneId); 925 } 926 } catch (RemoteException ex) { 927 // This shouldn't happen in the normal case, as a backup we 928 // read from the system property. 929 return getPhoneTypeFromProperty(phoneId); 930 } catch (NullPointerException ex) { 931 // This shouldn't happen in the normal case, as a backup we 932 // read from the system property. 933 return getPhoneTypeFromProperty(phoneId); 934 } 935 } 936 937 /** 938 * Returns a constant indicating the device phone type. This 939 * indicates the type of radio used to transmit voice calls. 940 * 941 * @see #PHONE_TYPE_NONE 942 * @see #PHONE_TYPE_GSM 943 * @see #PHONE_TYPE_CDMA 944 * @see #PHONE_TYPE_SIP 945 */ 946 public int getPhoneType() { 947 if (!isVoiceCapable()) { 948 return PHONE_TYPE_NONE; 949 } 950 return getCurrentPhoneType(); 951 } 952 953 private int getPhoneTypeFromProperty() { 954 return getPhoneTypeFromProperty(getDefaultPhone()); 955 } 956 957 /** {@hide} */ 958 private int getPhoneTypeFromProperty(int phoneId) { 959 String type = getTelephonyProperty(phoneId, 960 TelephonyProperties.CURRENT_ACTIVE_PHONE, null); 961 if (type == null || type.equals("")) { 962 return getPhoneTypeFromNetworkType(phoneId); 963 } 964 return Integer.parseInt(type); 965 } 966 967 private int getPhoneTypeFromNetworkType() { 968 return getPhoneTypeFromNetworkType(getDefaultPhone()); 969 } 970 971 /** {@hide} */ 972 private int getPhoneTypeFromNetworkType(int phoneId) { 973 // When the system property CURRENT_ACTIVE_PHONE, has not been set, 974 // use the system property for default network type. 975 // This is a fail safe, and can only happen at first boot. 976 String mode = getTelephonyProperty(phoneId, "ro.telephony.default_network", null); 977 if (mode != null) { 978 return TelephonyManager.getPhoneType(Integer.parseInt(mode)); 979 } 980 return TelephonyManager.PHONE_TYPE_NONE; 981 } 982 983 /** 984 * This function returns the type of the phone, depending 985 * on the network mode. 986 * 987 * @param networkMode 988 * @return Phone Type 989 * 990 * @hide 991 */ 992 public static int getPhoneType(int networkMode) { 993 switch(networkMode) { 994 case RILConstants.NETWORK_MODE_CDMA: 995 case RILConstants.NETWORK_MODE_CDMA_NO_EVDO: 996 case RILConstants.NETWORK_MODE_EVDO_NO_CDMA: 997 return PhoneConstants.PHONE_TYPE_CDMA; 998 999 case RILConstants.NETWORK_MODE_WCDMA_PREF: 1000 case RILConstants.NETWORK_MODE_GSM_ONLY: 1001 case RILConstants.NETWORK_MODE_WCDMA_ONLY: 1002 case RILConstants.NETWORK_MODE_GSM_UMTS: 1003 case RILConstants.NETWORK_MODE_LTE_GSM_WCDMA: 1004 case RILConstants.NETWORK_MODE_LTE_WCDMA: 1005 case RILConstants.NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA: 1006 return PhoneConstants.PHONE_TYPE_GSM; 1007 1008 // Use CDMA Phone for the global mode including CDMA 1009 case RILConstants.NETWORK_MODE_GLOBAL: 1010 case RILConstants.NETWORK_MODE_LTE_CDMA_EVDO: 1011 return PhoneConstants.PHONE_TYPE_CDMA; 1012 1013 case RILConstants.NETWORK_MODE_LTE_ONLY: 1014 if (getLteOnCdmaModeStatic() == PhoneConstants.LTE_ON_CDMA_TRUE) { 1015 return PhoneConstants.PHONE_TYPE_CDMA; 1016 } else { 1017 return PhoneConstants.PHONE_TYPE_GSM; 1018 } 1019 default: 1020 return PhoneConstants.PHONE_TYPE_GSM; 1021 } 1022 } 1023 1024 /** 1025 * The contents of the /proc/cmdline file 1026 */ 1027 private static String getProcCmdLine() 1028 { 1029 String cmdline = ""; 1030 FileInputStream is = null; 1031 try { 1032 is = new FileInputStream("/proc/cmdline"); 1033 byte [] buffer = new byte[2048]; 1034 int count = is.read(buffer); 1035 if (count > 0) { 1036 cmdline = new String(buffer, 0, count); 1037 } 1038 } catch (IOException e) { 1039 Rlog.d(TAG, "No /proc/cmdline exception=" + e); 1040 } finally { 1041 if (is != null) { 1042 try { 1043 is.close(); 1044 } catch (IOException e) { 1045 } 1046 } 1047 } 1048 Rlog.d(TAG, "/proc/cmdline=" + cmdline); 1049 return cmdline; 1050 } 1051 1052 /** Kernel command line */ 1053 private static final String sKernelCmdLine = getProcCmdLine(); 1054 1055 /** Pattern for selecting the product type from the kernel command line */ 1056 private static final Pattern sProductTypePattern = 1057 Pattern.compile("\\sproduct_type\\s*=\\s*(\\w+)"); 1058 1059 /** The ProductType used for LTE on CDMA devices */ 1060 private static final String sLteOnCdmaProductType = 1061 SystemProperties.get(TelephonyProperties.PROPERTY_LTE_ON_CDMA_PRODUCT_TYPE, ""); 1062 1063 /** 1064 * Return if the current radio is LTE on CDMA. This 1065 * is a tri-state return value as for a period of time 1066 * the mode may be unknown. 1067 * 1068 * @return {@link PhoneConstants#LTE_ON_CDMA_UNKNOWN}, {@link PhoneConstants#LTE_ON_CDMA_FALSE} 1069 * or {@link PhoneConstants#LTE_ON_CDMA_TRUE} 1070 * 1071 * @hide 1072 */ 1073 public static int getLteOnCdmaModeStatic() { 1074 int retVal; 1075 int curVal; 1076 String productType = ""; 1077 1078 curVal = SystemProperties.getInt(TelephonyProperties.PROPERTY_LTE_ON_CDMA_DEVICE, 1079 PhoneConstants.LTE_ON_CDMA_UNKNOWN); 1080 retVal = curVal; 1081 if (retVal == PhoneConstants.LTE_ON_CDMA_UNKNOWN) { 1082 Matcher matcher = sProductTypePattern.matcher(sKernelCmdLine); 1083 if (matcher.find()) { 1084 productType = matcher.group(1); 1085 if (sLteOnCdmaProductType.equals(productType)) { 1086 retVal = PhoneConstants.LTE_ON_CDMA_TRUE; 1087 } else { 1088 retVal = PhoneConstants.LTE_ON_CDMA_FALSE; 1089 } 1090 } else { 1091 retVal = PhoneConstants.LTE_ON_CDMA_FALSE; 1092 } 1093 } 1094 1095 Rlog.d(TAG, "getLteOnCdmaMode=" + retVal + " curVal=" + curVal + 1096 " product_type='" + productType + 1097 "' lteOnCdmaProductType='" + sLteOnCdmaProductType + "'"); 1098 return retVal; 1099 } 1100 1101 // 1102 // 1103 // Current Network 1104 // 1105 // 1106 1107 /** 1108 * Returns the alphabetic name of current registered operator. 1109 * <p> 1110 * Availability: Only when user is registered to a network. Result may be 1111 * unreliable on CDMA networks (use {@link #getPhoneType()} to determine if 1112 * on a CDMA network). 1113 */ 1114 public String getNetworkOperatorName() { 1115 return getNetworkOperatorName(getDefaultSubscription()); 1116 } 1117 1118 /** 1119 * Returns the alphabetic name of current registered operator 1120 * for a particular subscription. 1121 * <p> 1122 * Availability: Only when user is registered to a network. Result may be 1123 * unreliable on CDMA networks (use {@link #getPhoneType()} to determine if 1124 * on a CDMA network). 1125 * @param subId 1126 */ 1127 /** {@hide} */ 1128 public String getNetworkOperatorName(int subId) { 1129 int phoneId = SubscriptionManager.getPhoneId(subId); 1130 return getTelephonyProperty(phoneId, TelephonyProperties.PROPERTY_OPERATOR_ALPHA, ""); 1131 } 1132 1133 /** 1134 * Returns the numeric name (MCC+MNC) of current registered operator. 1135 * <p> 1136 * Availability: Only when user is registered to a network. Result may be 1137 * unreliable on CDMA networks (use {@link #getPhoneType()} to determine if 1138 * on a CDMA network). 1139 */ 1140 public String getNetworkOperator() { 1141 return getNetworkOperatorForPhone(getDefaultPhone()); 1142 } 1143 1144 /** 1145 * Returns the numeric name (MCC+MNC) of current registered operator 1146 * for a particular subscription. 1147 * <p> 1148 * Availability: Only when user is registered to a network. Result may be 1149 * unreliable on CDMA networks (use {@link #getPhoneType()} to determine if 1150 * on a CDMA network). 1151 * 1152 * @param subId 1153 */ 1154 /** {@hide} */ 1155 public String getNetworkOperatorForSubscription(int subId) { 1156 int phoneId = SubscriptionManager.getPhoneId(subId); 1157 return getNetworkOperatorForPhone(phoneId); 1158 } 1159 1160 /** 1161 * Returns the numeric name (MCC+MNC) of current registered operator 1162 * for a particular subscription. 1163 * <p> 1164 * Availability: Only when user is registered to a network. Result may be 1165 * unreliable on CDMA networks (use {@link #getPhoneType()} to determine if 1166 * on a CDMA network). 1167 * 1168 * @param phoneId 1169 * @hide 1170 **/ 1171 public String getNetworkOperatorForPhone(int phoneId) { 1172 return getTelephonyProperty(phoneId, TelephonyProperties.PROPERTY_OPERATOR_NUMERIC, ""); 1173 } 1174 1175 /** 1176 * Returns true if the device is considered roaming on the current 1177 * network, for GSM purposes. 1178 * <p> 1179 * Availability: Only when user registered to a network. 1180 */ 1181 public boolean isNetworkRoaming() { 1182 return isNetworkRoaming(getDefaultSubscription()); 1183 } 1184 1185 /** 1186 * Returns true if the device is considered roaming on the current 1187 * network for a subscription. 1188 * <p> 1189 * Availability: Only when user registered to a network. 1190 * 1191 * @param subId 1192 */ 1193 /** {@hide} */ 1194 public boolean isNetworkRoaming(int subId) { 1195 int phoneId = SubscriptionManager.getPhoneId(subId); 1196 return Boolean.parseBoolean(getTelephonyProperty(phoneId, 1197 TelephonyProperties.PROPERTY_OPERATOR_ISROAMING, null)); 1198 } 1199 1200 /** 1201 * Returns the ISO country code equivalent of the current registered 1202 * operator's MCC (Mobile Country Code). 1203 * <p> 1204 * Availability: Only when user is registered to a network. Result may be 1205 * unreliable on CDMA networks (use {@link #getPhoneType()} to determine if 1206 * on a CDMA network). 1207 */ 1208 public String getNetworkCountryIso() { 1209 return getNetworkCountryIsoForPhone(getDefaultPhone()); 1210 } 1211 1212 /** 1213 * Returns the ISO country code equivalent of the current registered 1214 * operator's MCC (Mobile Country Code) of a subscription. 1215 * <p> 1216 * Availability: Only when user is registered to a network. Result may be 1217 * unreliable on CDMA networks (use {@link #getPhoneType()} to determine if 1218 * on a CDMA network). 1219 * 1220 * @param subId for which Network CountryIso is returned 1221 */ 1222 /** {@hide} */ 1223 public String getNetworkCountryIsoForSubscription(int subId) { 1224 int phoneId = SubscriptionManager.getPhoneId(subId); 1225 return getNetworkCountryIsoForPhone(phoneId); 1226 } 1227 1228 /** 1229 * Returns the ISO country code equivalent of the current registered 1230 * operator's MCC (Mobile Country Code) of a subscription. 1231 * <p> 1232 * Availability: Only when user is registered to a network. Result may be 1233 * unreliable on CDMA networks (use {@link #getPhoneType()} to determine if 1234 * on a CDMA network). 1235 * 1236 * @param phoneId for which Network CountryIso is returned 1237 */ 1238 /** {@hide} */ 1239 public String getNetworkCountryIsoForPhone(int phoneId) { 1240 return getTelephonyProperty(phoneId, TelephonyProperties.PROPERTY_OPERATOR_ISO_COUNTRY, ""); 1241 } 1242 1243 /** Network type is unknown */ 1244 public static final int NETWORK_TYPE_UNKNOWN = 0; 1245 /** Current network is GPRS */ 1246 public static final int NETWORK_TYPE_GPRS = 1; 1247 /** Current network is EDGE */ 1248 public static final int NETWORK_TYPE_EDGE = 2; 1249 /** Current network is UMTS */ 1250 public static final int NETWORK_TYPE_UMTS = 3; 1251 /** Current network is CDMA: Either IS95A or IS95B*/ 1252 public static final int NETWORK_TYPE_CDMA = 4; 1253 /** Current network is EVDO revision 0*/ 1254 public static final int NETWORK_TYPE_EVDO_0 = 5; 1255 /** Current network is EVDO revision A*/ 1256 public static final int NETWORK_TYPE_EVDO_A = 6; 1257 /** Current network is 1xRTT*/ 1258 public static final int NETWORK_TYPE_1xRTT = 7; 1259 /** Current network is HSDPA */ 1260 public static final int NETWORK_TYPE_HSDPA = 8; 1261 /** Current network is HSUPA */ 1262 public static final int NETWORK_TYPE_HSUPA = 9; 1263 /** Current network is HSPA */ 1264 public static final int NETWORK_TYPE_HSPA = 10; 1265 /** Current network is iDen */ 1266 public static final int NETWORK_TYPE_IDEN = 11; 1267 /** Current network is EVDO revision B*/ 1268 public static final int NETWORK_TYPE_EVDO_B = 12; 1269 /** Current network is LTE */ 1270 public static final int NETWORK_TYPE_LTE = 13; 1271 /** Current network is eHRPD */ 1272 public static final int NETWORK_TYPE_EHRPD = 14; 1273 /** Current network is HSPA+ */ 1274 public static final int NETWORK_TYPE_HSPAP = 15; 1275 /** Current network is GSM {@hide} */ 1276 public static final int NETWORK_TYPE_GSM = 16; 1277 /** Current network is TD_SCDMA {@hide} */ 1278 public static final int NETWORK_TYPE_TD_SCDMA = 17; 1279 /** Current network is IWLAN {@hide} */ 1280 public static final int NETWORK_TYPE_IWLAN = 18; 1281 1282 /** 1283 * @return the NETWORK_TYPE_xxxx for current data connection. 1284 */ 1285 public int getNetworkType() { 1286 return getDataNetworkType(); 1287 } 1288 1289 /** 1290 * Returns a constant indicating the radio technology (network type) 1291 * currently in use on the device for a subscription. 1292 * @return the network type 1293 * 1294 * @param subId for which network type is returned 1295 * 1296 * @see #NETWORK_TYPE_UNKNOWN 1297 * @see #NETWORK_TYPE_GPRS 1298 * @see #NETWORK_TYPE_EDGE 1299 * @see #NETWORK_TYPE_UMTS 1300 * @see #NETWORK_TYPE_HSDPA 1301 * @see #NETWORK_TYPE_HSUPA 1302 * @see #NETWORK_TYPE_HSPA 1303 * @see #NETWORK_TYPE_CDMA 1304 * @see #NETWORK_TYPE_EVDO_0 1305 * @see #NETWORK_TYPE_EVDO_A 1306 * @see #NETWORK_TYPE_EVDO_B 1307 * @see #NETWORK_TYPE_1xRTT 1308 * @see #NETWORK_TYPE_IDEN 1309 * @see #NETWORK_TYPE_LTE 1310 * @see #NETWORK_TYPE_EHRPD 1311 * @see #NETWORK_TYPE_HSPAP 1312 */ 1313 /** {@hide} */ 1314 public int getNetworkType(int subId) { 1315 try { 1316 ITelephony telephony = getITelephony(); 1317 if (telephony != null) { 1318 return telephony.getNetworkTypeForSubscriber(subId); 1319 } else { 1320 // This can happen when the ITelephony interface is not up yet. 1321 return NETWORK_TYPE_UNKNOWN; 1322 } 1323 } catch(RemoteException ex) { 1324 // This shouldn't happen in the normal case 1325 return NETWORK_TYPE_UNKNOWN; 1326 } catch (NullPointerException ex) { 1327 // This could happen before phone restarts due to crashing 1328 return NETWORK_TYPE_UNKNOWN; 1329 } 1330 } 1331 1332 /** 1333 * Returns a constant indicating the radio technology (network type) 1334 * currently in use on the device for data transmission. 1335 * @return the network type 1336 * 1337 * @see #NETWORK_TYPE_UNKNOWN 1338 * @see #NETWORK_TYPE_GPRS 1339 * @see #NETWORK_TYPE_EDGE 1340 * @see #NETWORK_TYPE_UMTS 1341 * @see #NETWORK_TYPE_HSDPA 1342 * @see #NETWORK_TYPE_HSUPA 1343 * @see #NETWORK_TYPE_HSPA 1344 * @see #NETWORK_TYPE_CDMA 1345 * @see #NETWORK_TYPE_EVDO_0 1346 * @see #NETWORK_TYPE_EVDO_A 1347 * @see #NETWORK_TYPE_EVDO_B 1348 * @see #NETWORK_TYPE_1xRTT 1349 * @see #NETWORK_TYPE_IDEN 1350 * @see #NETWORK_TYPE_LTE 1351 * @see #NETWORK_TYPE_EHRPD 1352 * @see #NETWORK_TYPE_HSPAP 1353 * 1354 * @hide 1355 */ 1356 public int getDataNetworkType() { 1357 return getDataNetworkType(getDefaultSubscription()); 1358 } 1359 1360 /** 1361 * Returns a constant indicating the radio technology (network type) 1362 * currently in use on the device for data transmission for a subscription 1363 * @return the network type 1364 * 1365 * @param subId for which network type is returned 1366 */ 1367 /** {@hide} */ 1368 public int getDataNetworkType(int subId) { 1369 try{ 1370 ITelephony telephony = getITelephony(); 1371 if (telephony != null) { 1372 return telephony.getDataNetworkTypeForSubscriber(subId); 1373 } else { 1374 // This can happen when the ITelephony interface is not up yet. 1375 return NETWORK_TYPE_UNKNOWN; 1376 } 1377 } catch(RemoteException ex) { 1378 // This shouldn't happen in the normal case 1379 return NETWORK_TYPE_UNKNOWN; 1380 } catch (NullPointerException ex) { 1381 // This could happen before phone restarts due to crashing 1382 return NETWORK_TYPE_UNKNOWN; 1383 } 1384 } 1385 1386 /** 1387 * Returns the NETWORK_TYPE_xxxx for voice 1388 * 1389 * @hide 1390 */ 1391 public int getVoiceNetworkType() { 1392 return getVoiceNetworkType(getDefaultSubscription()); 1393 } 1394 1395 /** 1396 * Returns the NETWORK_TYPE_xxxx for voice for a subId 1397 * 1398 */ 1399 /** {@hide} */ 1400 public int getVoiceNetworkType(int subId) { 1401 try{ 1402 ITelephony telephony = getITelephony(); 1403 if (telephony != null) { 1404 return telephony.getVoiceNetworkTypeForSubscriber(subId); 1405 } else { 1406 // This can happen when the ITelephony interface is not up yet. 1407 return NETWORK_TYPE_UNKNOWN; 1408 } 1409 } catch(RemoteException ex) { 1410 // This shouldn't happen in the normal case 1411 return NETWORK_TYPE_UNKNOWN; 1412 } catch (NullPointerException ex) { 1413 // This could happen before phone restarts due to crashing 1414 return NETWORK_TYPE_UNKNOWN; 1415 } 1416 } 1417 1418 /** Unknown network class. {@hide} */ 1419 public static final int NETWORK_CLASS_UNKNOWN = 0; 1420 /** Class of broadly defined "2G" networks. {@hide} */ 1421 public static final int NETWORK_CLASS_2_G = 1; 1422 /** Class of broadly defined "3G" networks. {@hide} */ 1423 public static final int NETWORK_CLASS_3_G = 2; 1424 /** Class of broadly defined "4G" networks. {@hide} */ 1425 public static final int NETWORK_CLASS_4_G = 3; 1426 1427 /** 1428 * Return general class of network type, such as "3G" or "4G". In cases 1429 * where classification is contentious, this method is conservative. 1430 * 1431 * @hide 1432 */ 1433 public static int getNetworkClass(int networkType) { 1434 switch (networkType) { 1435 case NETWORK_TYPE_GPRS: 1436 case NETWORK_TYPE_GSM: 1437 case NETWORK_TYPE_EDGE: 1438 case NETWORK_TYPE_CDMA: 1439 case NETWORK_TYPE_1xRTT: 1440 case NETWORK_TYPE_IDEN: 1441 return NETWORK_CLASS_2_G; 1442 case NETWORK_TYPE_UMTS: 1443 case NETWORK_TYPE_EVDO_0: 1444 case NETWORK_TYPE_EVDO_A: 1445 case NETWORK_TYPE_HSDPA: 1446 case NETWORK_TYPE_HSUPA: 1447 case NETWORK_TYPE_HSPA: 1448 case NETWORK_TYPE_EVDO_B: 1449 case NETWORK_TYPE_EHRPD: 1450 case NETWORK_TYPE_HSPAP: 1451 case NETWORK_TYPE_TD_SCDMA: 1452 return NETWORK_CLASS_3_G; 1453 case NETWORK_TYPE_LTE: 1454 case NETWORK_TYPE_IWLAN: 1455 return NETWORK_CLASS_4_G; 1456 default: 1457 return NETWORK_CLASS_UNKNOWN; 1458 } 1459 } 1460 1461 /** 1462 * Returns a string representation of the radio technology (network type) 1463 * currently in use on the device. 1464 * @return the name of the radio technology 1465 * 1466 * @hide pending API council review 1467 */ 1468 public String getNetworkTypeName() { 1469 return getNetworkTypeName(getNetworkType()); 1470 } 1471 1472 /** 1473 * Returns a string representation of the radio technology (network type) 1474 * currently in use on the device. 1475 * @param subId for which network type is returned 1476 * @return the name of the radio technology 1477 * 1478 */ 1479 /** {@hide} */ 1480 public static String getNetworkTypeName(int type) { 1481 switch (type) { 1482 case NETWORK_TYPE_GPRS: 1483 return "GPRS"; 1484 case NETWORK_TYPE_EDGE: 1485 return "EDGE"; 1486 case NETWORK_TYPE_UMTS: 1487 return "UMTS"; 1488 case NETWORK_TYPE_HSDPA: 1489 return "HSDPA"; 1490 case NETWORK_TYPE_HSUPA: 1491 return "HSUPA"; 1492 case NETWORK_TYPE_HSPA: 1493 return "HSPA"; 1494 case NETWORK_TYPE_CDMA: 1495 return "CDMA"; 1496 case NETWORK_TYPE_EVDO_0: 1497 return "CDMA - EvDo rev. 0"; 1498 case NETWORK_TYPE_EVDO_A: 1499 return "CDMA - EvDo rev. A"; 1500 case NETWORK_TYPE_EVDO_B: 1501 return "CDMA - EvDo rev. B"; 1502 case NETWORK_TYPE_1xRTT: 1503 return "CDMA - 1xRTT"; 1504 case NETWORK_TYPE_LTE: 1505 return "LTE"; 1506 case NETWORK_TYPE_EHRPD: 1507 return "CDMA - eHRPD"; 1508 case NETWORK_TYPE_IDEN: 1509 return "iDEN"; 1510 case NETWORK_TYPE_HSPAP: 1511 return "HSPA+"; 1512 case NETWORK_TYPE_GSM: 1513 return "GSM"; 1514 case NETWORK_TYPE_TD_SCDMA: 1515 return "TD_SCDMA"; 1516 case NETWORK_TYPE_IWLAN: 1517 return "IWLAN"; 1518 default: 1519 return "UNKNOWN"; 1520 } 1521 } 1522 1523 // 1524 // 1525 // SIM Card 1526 // 1527 // 1528 1529 /** 1530 * SIM card state: Unknown. Signifies that the SIM is in transition 1531 * between states. For example, when the user inputs the SIM pin 1532 * under PIN_REQUIRED state, a query for sim status returns 1533 * this state before turning to SIM_STATE_READY. 1534 * 1535 * These are the ordinal value of IccCardConstants.State. 1536 */ 1537 public static final int SIM_STATE_UNKNOWN = 0; 1538 /** SIM card state: no SIM card is available in the device */ 1539 public static final int SIM_STATE_ABSENT = 1; 1540 /** SIM card state: Locked: requires the user's SIM PIN to unlock */ 1541 public static final int SIM_STATE_PIN_REQUIRED = 2; 1542 /** SIM card state: Locked: requires the user's SIM PUK to unlock */ 1543 public static final int SIM_STATE_PUK_REQUIRED = 3; 1544 /** SIM card state: Locked: requires a network PIN to unlock */ 1545 public static final int SIM_STATE_NETWORK_LOCKED = 4; 1546 /** SIM card state: Ready */ 1547 public static final int SIM_STATE_READY = 5; 1548 /** SIM card state: SIM Card is NOT READY 1549 *@hide 1550 */ 1551 public static final int SIM_STATE_NOT_READY = 6; 1552 /** SIM card state: SIM Card Error, permanently disabled 1553 *@hide 1554 */ 1555 public static final int SIM_STATE_PERM_DISABLED = 7; 1556 /** SIM card state: SIM Card Error, present but faulty 1557 *@hide 1558 */ 1559 public static final int SIM_STATE_CARD_IO_ERROR = 8; 1560 1561 /** 1562 * @return true if a ICC card is present 1563 */ 1564 public boolean hasIccCard() { 1565 return hasIccCard(getDefaultSim()); 1566 } 1567 1568 /** 1569 * @return true if a ICC card is present for a subscription 1570 * 1571 * @param slotId for which icc card presence is checked 1572 */ 1573 /** {@hide} */ 1574 // FIXME Input argument slotId should be of type int 1575 public boolean hasIccCard(int slotId) { 1576 1577 try { 1578 ITelephony telephony = getITelephony(); 1579 if (telephony == null) 1580 return false; 1581 return telephony.hasIccCardUsingSlotId(slotId); 1582 } catch (RemoteException ex) { 1583 // Assume no ICC card if remote exception which shouldn't happen 1584 return false; 1585 } catch (NullPointerException ex) { 1586 // This could happen before phone restarts due to crashing 1587 return false; 1588 } 1589 } 1590 1591 /** 1592 * Returns a constant indicating the state of the default SIM card. 1593 * 1594 * @see #SIM_STATE_UNKNOWN 1595 * @see #SIM_STATE_ABSENT 1596 * @see #SIM_STATE_PIN_REQUIRED 1597 * @see #SIM_STATE_PUK_REQUIRED 1598 * @see #SIM_STATE_NETWORK_LOCKED 1599 * @see #SIM_STATE_READY 1600 * @see #SIM_STATE_NOT_READY 1601 * @see #SIM_STATE_PERM_DISABLED 1602 * @see #SIM_STATE_CARD_IO_ERROR 1603 */ 1604 public int getSimState() { 1605 return getSimState(getDefaultSim()); 1606 } 1607 1608 /** 1609 * Returns a constant indicating the state of the device SIM card in a slot. 1610 * 1611 * @param slotIdx 1612 * 1613 * @see #SIM_STATE_UNKNOWN 1614 * @see #SIM_STATE_ABSENT 1615 * @see #SIM_STATE_PIN_REQUIRED 1616 * @see #SIM_STATE_PUK_REQUIRED 1617 * @see #SIM_STATE_NETWORK_LOCKED 1618 * @see #SIM_STATE_READY 1619 * @see #SIM_STATE_NOT_READY 1620 * @see #SIM_STATE_PERM_DISABLED 1621 * @see #SIM_STATE_CARD_IO_ERROR 1622 */ 1623 /** {@hide} */ 1624 public int getSimState(int slotIdx) { 1625 int[] subId = SubscriptionManager.getSubId(slotIdx); 1626 if (subId == null || subId.length == 0) { 1627 Rlog.d(TAG, "getSimState:- empty subId return SIM_STATE_ABSENT"); 1628 return SIM_STATE_UNKNOWN; 1629 } 1630 int simState = SubscriptionManager.getSimStateForSubscriber(subId[0]); 1631 Rlog.d(TAG, "getSimState: simState=" + simState + " slotIdx=" + slotIdx); 1632 return simState; 1633 } 1634 1635 /** 1636 * Returns the MCC+MNC (mobile country code + mobile network code) of the 1637 * provider of the SIM. 5 or 6 decimal digits. 1638 * <p> 1639 * Availability: SIM state must be {@link #SIM_STATE_READY} 1640 * 1641 * @see #getSimState 1642 */ 1643 public String getSimOperator() { 1644 return getSimOperatorNumeric(); 1645 } 1646 1647 /** 1648 * Returns the MCC+MNC (mobile country code + mobile network code) of the 1649 * provider of the SIM. 5 or 6 decimal digits. 1650 * <p> 1651 * Availability: SIM state must be {@link #SIM_STATE_READY} 1652 * 1653 * @see #getSimState 1654 * 1655 * @param subId for which SimOperator is returned 1656 * @hide 1657 */ 1658 public String getSimOperator(int subId) { 1659 return getSimOperatorNumericForSubscription(subId); 1660 } 1661 1662 /** 1663 * Returns the MCC+MNC (mobile country code + mobile network code) of the 1664 * provider of the SIM. 5 or 6 decimal digits. 1665 * <p> 1666 * Availability: SIM state must be {@link #SIM_STATE_READY} 1667 * 1668 * @see #getSimState 1669 * @hide 1670 */ 1671 public String getSimOperatorNumeric() { 1672 int subId = SubscriptionManager.getDefaultDataSubId(); 1673 if (!SubscriptionManager.isUsableSubIdValue(subId)) { 1674 subId = SubscriptionManager.getDefaultSmsSubId(); 1675 if (!SubscriptionManager.isUsableSubIdValue(subId)) { 1676 subId = SubscriptionManager.getDefaultVoiceSubId(); 1677 if (!SubscriptionManager.isUsableSubIdValue(subId)) { 1678 subId = SubscriptionManager.getDefaultSubId(); 1679 } 1680 } 1681 } 1682 Rlog.d(TAG, "getSimOperatorNumeric(): default subId=" + subId); 1683 return getSimOperatorNumericForSubscription(subId); 1684 } 1685 1686 /** 1687 * Returns the MCC+MNC (mobile country code + mobile network code) of the 1688 * provider of the SIM for a particular subscription. 5 or 6 decimal digits. 1689 * <p> 1690 * Availability: SIM state must be {@link #SIM_STATE_READY} 1691 * 1692 * @see #getSimState 1693 * 1694 * @param subId for which SimOperator is returned 1695 * @hide 1696 */ 1697 public String getSimOperatorNumericForSubscription(int subId) { 1698 int phoneId = SubscriptionManager.getPhoneId(subId); 1699 return getSimOperatorNumericForPhone(phoneId); 1700 } 1701 1702 /** 1703 * Returns the MCC+MNC (mobile country code + mobile network code) of the 1704 * provider of the SIM for a particular subscription. 5 or 6 decimal digits. 1705 * <p> 1706 * 1707 * @param phoneId for which SimOperator is returned 1708 * @hide 1709 */ 1710 public String getSimOperatorNumericForPhone(int phoneId) { 1711 return getTelephonyProperty(phoneId, 1712 TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC, ""); 1713 } 1714 1715 /** 1716 * Returns the Service Provider Name (SPN). 1717 * <p> 1718 * Availability: SIM state must be {@link #SIM_STATE_READY} 1719 * 1720 * @see #getSimState 1721 */ 1722 public String getSimOperatorName() { 1723 return getSimOperatorNameForPhone(getDefaultPhone()); 1724 } 1725 1726 /** 1727 * Returns the Service Provider Name (SPN). 1728 * <p> 1729 * Availability: SIM state must be {@link #SIM_STATE_READY} 1730 * 1731 * @see #getSimState 1732 * 1733 * @param subId for which SimOperatorName is returned 1734 * @hide 1735 */ 1736 public String getSimOperatorNameForSubscription(int subId) { 1737 int phoneId = SubscriptionManager.getPhoneId(subId); 1738 return getSimOperatorNameForPhone(phoneId); 1739 } 1740 1741 /** 1742 * Returns the Service Provider Name (SPN). 1743 * 1744 * @hide 1745 */ 1746 public String getSimOperatorNameForPhone(int phoneId) { 1747 return getTelephonyProperty(phoneId, 1748 TelephonyProperties.PROPERTY_ICC_OPERATOR_ALPHA, ""); 1749 } 1750 1751 /** 1752 * Returns the ISO country code equivalent for the SIM provider's country code. 1753 */ 1754 public String getSimCountryIso() { 1755 return getSimCountryIsoForPhone(getDefaultPhone()); 1756 } 1757 1758 /** 1759 * Returns the ISO country code equivalent for the SIM provider's country code. 1760 * 1761 * @param subId for which SimCountryIso is returned 1762 * 1763 * @hide 1764 */ 1765 public String getSimCountryIso(int subId) { 1766 return getSimCountryIsoForSubscription(subId); 1767 } 1768 1769 /** 1770 * Returns the ISO country code equivalent for the SIM provider's country code. 1771 * 1772 * @param subId for which SimCountryIso is returned 1773 * 1774 * @hide 1775 */ 1776 public String getSimCountryIsoForSubscription(int subId) { 1777 int phoneId = SubscriptionManager.getPhoneId(subId); 1778 return getSimCountryIsoForPhone(phoneId); 1779 } 1780 1781 /** 1782 * Returns the ISO country code equivalent for the SIM provider's country code. 1783 * 1784 * @hide 1785 */ 1786 public String getSimCountryIsoForPhone(int phoneId) { 1787 return getTelephonyProperty(phoneId, 1788 TelephonyProperties.PROPERTY_ICC_OPERATOR_ISO_COUNTRY, ""); 1789 } 1790 1791 /** 1792 * Returns the serial number of the SIM, if applicable. Return null if it is 1793 * unavailable. 1794 * <p> 1795 * Requires Permission: 1796 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 1797 */ 1798 public String getSimSerialNumber() { 1799 return getSimSerialNumber(getDefaultSubscription()); 1800 } 1801 1802 /** 1803 * Returns the serial number for the given subscription, if applicable. Return null if it is 1804 * unavailable. 1805 * <p> 1806 * @param subId for which Sim Serial number is returned 1807 * Requires Permission: 1808 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 1809 */ 1810 /** {@hide} */ 1811 public String getSimSerialNumber(int subId) { 1812 try { 1813 IPhoneSubInfo info = getSubscriberInfo(); 1814 if (info == null) 1815 return null; 1816 return info.getIccSerialNumberForSubscriber(subId); 1817 } catch (RemoteException ex) { 1818 return null; 1819 } catch (NullPointerException ex) { 1820 // This could happen before phone restarts due to crashing 1821 return null; 1822 } 1823 } 1824 1825 /** 1826 * Return if the current radio is LTE on CDMA. This 1827 * is a tri-state return value as for a period of time 1828 * the mode may be unknown. 1829 * 1830 * @return {@link PhoneConstants#LTE_ON_CDMA_UNKNOWN}, {@link PhoneConstants#LTE_ON_CDMA_FALSE} 1831 * or {@link PhoneConstants#LTE_ON_CDMA_TRUE} 1832 * 1833 * @hide 1834 */ 1835 public int getLteOnCdmaMode() { 1836 return getLteOnCdmaMode(getDefaultSubscription()); 1837 } 1838 1839 /** 1840 * Return if the current radio is LTE on CDMA for Subscription. This 1841 * is a tri-state return value as for a period of time 1842 * the mode may be unknown. 1843 * 1844 * @param subId for which radio is LTE on CDMA is returned 1845 * @return {@link PhoneConstants#LTE_ON_CDMA_UNKNOWN}, {@link PhoneConstants#LTE_ON_CDMA_FALSE} 1846 * or {@link PhoneConstants#LTE_ON_CDMA_TRUE} 1847 * 1848 */ 1849 /** {@hide} */ 1850 public int getLteOnCdmaMode(int subId) { 1851 try { 1852 ITelephony telephony = getITelephony(); 1853 if (telephony == null) 1854 return PhoneConstants.LTE_ON_CDMA_UNKNOWN; 1855 return telephony.getLteOnCdmaModeForSubscriber(subId); 1856 } catch (RemoteException ex) { 1857 // Assume no ICC card if remote exception which shouldn't happen 1858 return PhoneConstants.LTE_ON_CDMA_UNKNOWN; 1859 } catch (NullPointerException ex) { 1860 // This could happen before phone restarts due to crashing 1861 return PhoneConstants.LTE_ON_CDMA_UNKNOWN; 1862 } 1863 } 1864 1865 // 1866 // 1867 // Subscriber Info 1868 // 1869 // 1870 1871 /** 1872 * Returns the unique subscriber ID, for example, the IMSI for a GSM phone. 1873 * Return null if it is unavailable. 1874 * <p> 1875 * Requires Permission: 1876 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 1877 */ 1878 public String getSubscriberId() { 1879 return getSubscriberId(getDefaultSubscription()); 1880 } 1881 1882 /** 1883 * Returns the unique subscriber ID, for example, the IMSI for a GSM phone 1884 * for a subscription. 1885 * Return null if it is unavailable. 1886 * <p> 1887 * Requires Permission: 1888 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 1889 * 1890 * @param subId whose subscriber id is returned 1891 */ 1892 /** {@hide} */ 1893 public String getSubscriberId(int subId) { 1894 try { 1895 IPhoneSubInfo info = getSubscriberInfo(); 1896 if (info == null) 1897 return null; 1898 return info.getSubscriberIdForSubscriber(subId); 1899 } catch (RemoteException ex) { 1900 return null; 1901 } catch (NullPointerException ex) { 1902 // This could happen before phone restarts due to crashing 1903 return null; 1904 } 1905 } 1906 1907 /** 1908 * Returns the Group Identifier Level1 for a GSM phone. 1909 * Return null if it is unavailable. 1910 * <p> 1911 * Requires Permission: 1912 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 1913 */ 1914 public String getGroupIdLevel1() { 1915 try { 1916 IPhoneSubInfo info = getSubscriberInfo(); 1917 if (info == null) 1918 return null; 1919 return info.getGroupIdLevel1(); 1920 } catch (RemoteException ex) { 1921 return null; 1922 } catch (NullPointerException ex) { 1923 // This could happen before phone restarts due to crashing 1924 return null; 1925 } 1926 } 1927 1928 /** 1929 * Returns the Group Identifier Level1 for a GSM phone for a particular subscription. 1930 * Return null if it is unavailable. 1931 * <p> 1932 * Requires Permission: 1933 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 1934 * 1935 * @param subscription whose subscriber id is returned 1936 */ 1937 /** {@hide} */ 1938 public String getGroupIdLevel1(int subId) { 1939 try { 1940 IPhoneSubInfo info = getSubscriberInfo(); 1941 if (info == null) 1942 return null; 1943 return info.getGroupIdLevel1ForSubscriber(subId); 1944 } catch (RemoteException ex) { 1945 return null; 1946 } catch (NullPointerException ex) { 1947 // This could happen before phone restarts due to crashing 1948 return null; 1949 } 1950 } 1951 1952 /** 1953 * Returns the phone number string for line 1, for example, the MSISDN 1954 * for a GSM phone. Return null if it is unavailable. 1955 * <p> 1956 * Requires Permission: 1957 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 1958 */ 1959 public String getLine1Number() { 1960 return getLine1NumberForSubscriber(getDefaultSubscription()); 1961 } 1962 1963 /** 1964 * Returns the phone number string for line 1, for example, the MSISDN 1965 * for a GSM phone for a particular subscription. Return null if it is unavailable. 1966 * <p> 1967 * Requires Permission: 1968 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 1969 * 1970 * @param subId whose phone number for line 1 is returned 1971 */ 1972 /** {@hide} */ 1973 public String getLine1NumberForSubscriber(int subId) { 1974 String number = null; 1975 try { 1976 ITelephony telephony = getITelephony(); 1977 if (telephony != null) 1978 number = telephony.getLine1NumberForDisplay(subId); 1979 } catch (RemoteException ex) { 1980 } catch (NullPointerException ex) { 1981 } 1982 if (number != null) { 1983 return number; 1984 } 1985 try { 1986 IPhoneSubInfo info = getSubscriberInfo(); 1987 if (info == null) 1988 return null; 1989 return info.getLine1NumberForSubscriber(subId); 1990 } catch (RemoteException ex) { 1991 return null; 1992 } catch (NullPointerException ex) { 1993 // This could happen before phone restarts due to crashing 1994 return null; 1995 } 1996 } 1997 1998 /** 1999 * Set the line 1 phone number string and its alphatag for the current ICCID 2000 * for display purpose only, for example, displayed in Phone Status. It won't 2001 * change the actual MSISDN/MDN. To unset alphatag or number, pass in a null 2002 * value. 2003 * 2004 * <p>Requires that the calling app has carrier privileges. 2005 * @see #hasCarrierPrivileges 2006 * 2007 * @param alphaTag alpha-tagging of the dailing nubmer 2008 * @param number The dialing number 2009 * @return true if the operation was executed correctly. 2010 */ 2011 public boolean setLine1NumberForDisplay(String alphaTag, String number) { 2012 return setLine1NumberForDisplayForSubscriber(getDefaultSubscription(), alphaTag, number); 2013 } 2014 2015 /** 2016 * Set the line 1 phone number string and its alphatag for the current ICCID 2017 * for display purpose only, for example, displayed in Phone Status. It won't 2018 * change the actual MSISDN/MDN. To unset alphatag or number, pass in a null 2019 * value. 2020 * 2021 * <p>Requires that the calling app has carrier privileges. 2022 * @see #hasCarrierPrivileges 2023 * 2024 * @param subId the subscriber that the alphatag and dialing number belongs to. 2025 * @param alphaTag alpha-tagging of the dailing nubmer 2026 * @param number The dialing number 2027 * @return true if the operation was executed correctly. 2028 * @hide 2029 */ 2030 public boolean setLine1NumberForDisplayForSubscriber(int subId, String alphaTag, String number) { 2031 try { 2032 ITelephony telephony = getITelephony(); 2033 if (telephony != null) 2034 return telephony.setLine1NumberForDisplayForSubscriber(subId, alphaTag, number); 2035 } catch (RemoteException ex) { 2036 } catch (NullPointerException ex) { 2037 } 2038 return false; 2039 } 2040 2041 /** 2042 * Informs the system of an intentional upcoming carrier network change by 2043 * a carrier app. This call is optional and is only used to allow the 2044 * system to provide alternative UI while telephony is performing an action 2045 * that may result in intentional, temporary network lack of connectivity. 2046 * <p> 2047 * Based on the active parameter passed in, this method will either show or 2048 * hide the alternative UI. There is no timeout associated with showing 2049 * this UX, so a carrier app must be sure to call with active set to false 2050 * sometime after calling with it set to true. 2051 * <p> 2052 * Requires Permission: 2053 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 2054 * Or the calling app has carrier privileges. 2055 * @see #hasCarrierPrivileges 2056 * 2057 * @param active Whether the carrier network change is or shortly will be 2058 * active. Set this value to true to begin showing 2059 * alternative UI and false to stop. 2060 */ 2061 public void notifyCarrierNetworkChange(boolean active) { 2062 try { 2063 if (sRegistry != null) 2064 sRegistry.notifyCarrierNetworkChange(active); 2065 } catch (RemoteException ex) { 2066 } catch (NullPointerException ex) { 2067 } 2068 } 2069 2070 /** 2071 * Returns the alphabetic identifier associated with the line 1 number. 2072 * Return null if it is unavailable. 2073 * <p> 2074 * Requires Permission: 2075 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 2076 * @hide 2077 * nobody seems to call this. 2078 */ 2079 public String getLine1AlphaTag() { 2080 return getLine1AlphaTagForSubscriber(getDefaultSubscription()); 2081 } 2082 2083 /** 2084 * Returns the alphabetic identifier associated with the line 1 number 2085 * for a subscription. 2086 * Return null if it is unavailable. 2087 * <p> 2088 * Requires Permission: 2089 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 2090 * @param subId whose alphabetic identifier associated with line 1 is returned 2091 * nobody seems to call this. 2092 */ 2093 /** {@hide} */ 2094 public String getLine1AlphaTagForSubscriber(int subId) { 2095 String alphaTag = null; 2096 try { 2097 ITelephony telephony = getITelephony(); 2098 if (telephony != null) 2099 alphaTag = telephony.getLine1AlphaTagForDisplay(subId); 2100 } catch (RemoteException ex) { 2101 } catch (NullPointerException ex) { 2102 } 2103 if (alphaTag != null) { 2104 return alphaTag; 2105 } 2106 try { 2107 IPhoneSubInfo info = getSubscriberInfo(); 2108 if (info == null) 2109 return null; 2110 return info.getLine1AlphaTagForSubscriber(subId); 2111 } catch (RemoteException ex) { 2112 return null; 2113 } catch (NullPointerException ex) { 2114 // This could happen before phone restarts due to crashing 2115 return null; 2116 } 2117 } 2118 2119 /** 2120 * Return the set of subscriber IDs that should be considered as "merged 2121 * together" for data usage purposes. This is commonly {@code null} to 2122 * indicate no merging is required. Any returned subscribers are sorted in a 2123 * deterministic order. 2124 * 2125 * @hide 2126 */ 2127 public @Nullable String[] getMergedSubscriberIds() { 2128 try { 2129 ITelephony telephony = getITelephony(); 2130 if (telephony != null) 2131 return telephony.getMergedSubscriberIds(); 2132 } catch (RemoteException ex) { 2133 } catch (NullPointerException ex) { 2134 } 2135 return null; 2136 } 2137 2138 /** 2139 * Returns the MSISDN string. 2140 * for a GSM phone. Return null if it is unavailable. 2141 * <p> 2142 * Requires Permission: 2143 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 2144 * 2145 * @hide 2146 */ 2147 public String getMsisdn() { 2148 return getMsisdn(getDefaultSubscription()); 2149 } 2150 2151 /** 2152 * Returns the MSISDN string. 2153 * for a GSM phone. Return null if it is unavailable. 2154 * <p> 2155 * Requires Permission: 2156 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 2157 * 2158 * @param subId for which msisdn is returned 2159 */ 2160 /** {@hide} */ 2161 public String getMsisdn(int subId) { 2162 try { 2163 IPhoneSubInfo info = getSubscriberInfo(); 2164 if (info == null) 2165 return null; 2166 return info.getMsisdnForSubscriber(subId); 2167 } catch (RemoteException ex) { 2168 return null; 2169 } catch (NullPointerException ex) { 2170 // This could happen before phone restarts due to crashing 2171 return null; 2172 } 2173 } 2174 2175 /** 2176 * Returns the voice mail number. Return null if it is unavailable. 2177 * <p> 2178 * Requires Permission: 2179 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 2180 */ 2181 public String getVoiceMailNumber() { 2182 return getVoiceMailNumber(getDefaultSubscription()); 2183 } 2184 2185 /** 2186 * Returns the voice mail number for a subscription. 2187 * Return null if it is unavailable. 2188 * <p> 2189 * Requires Permission: 2190 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 2191 * @param subId whose voice mail number is returned 2192 */ 2193 /** {@hide} */ 2194 public String getVoiceMailNumber(int subId) { 2195 try { 2196 IPhoneSubInfo info = getSubscriberInfo(); 2197 if (info == null) 2198 return null; 2199 return info.getVoiceMailNumberForSubscriber(subId); 2200 } catch (RemoteException ex) { 2201 return null; 2202 } catch (NullPointerException ex) { 2203 // This could happen before phone restarts due to crashing 2204 return null; 2205 } 2206 } 2207 2208 /** 2209 * Returns the complete voice mail number. Return null if it is unavailable. 2210 * <p> 2211 * Requires Permission: 2212 * {@link android.Manifest.permission#CALL_PRIVILEGED CALL_PRIVILEGED} 2213 * 2214 * @hide 2215 */ 2216 public String getCompleteVoiceMailNumber() { 2217 return getCompleteVoiceMailNumber(getDefaultSubscription()); 2218 } 2219 2220 /** 2221 * Returns the complete voice mail number. Return null if it is unavailable. 2222 * <p> 2223 * Requires Permission: 2224 * {@link android.Manifest.permission#CALL_PRIVILEGED CALL_PRIVILEGED} 2225 * 2226 * @param subId 2227 */ 2228 /** {@hide} */ 2229 public String getCompleteVoiceMailNumber(int subId) { 2230 try { 2231 IPhoneSubInfo info = getSubscriberInfo(); 2232 if (info == null) 2233 return null; 2234 return info.getCompleteVoiceMailNumberForSubscriber(subId); 2235 } catch (RemoteException ex) { 2236 return null; 2237 } catch (NullPointerException ex) { 2238 // This could happen before phone restarts due to crashing 2239 return null; 2240 } 2241 } 2242 2243 /** 2244 * Sets the voice mail number. 2245 * 2246 * <p>Requires that the calling app has carrier privileges. 2247 * @see #hasCarrierPrivileges 2248 * 2249 * @param alphaTag The alpha tag to display. 2250 * @param number The voicemail number. 2251 */ 2252 public boolean setVoiceMailNumber(String alphaTag, String number) { 2253 return setVoiceMailNumber(getDefaultSubscription(), alphaTag, number); 2254 } 2255 2256 /** 2257 * Sets the voicemail number for the given subscriber. 2258 * 2259 * <p>Requires that the calling app has carrier privileges. 2260 * @see #hasCarrierPrivileges 2261 * 2262 * @param subId The subscription id. 2263 * @param alphaTag The alpha tag to display. 2264 * @param number The voicemail number. 2265 */ 2266 /** {@hide} */ 2267 public boolean setVoiceMailNumber(int subId, String alphaTag, String number) { 2268 try { 2269 ITelephony telephony = getITelephony(); 2270 if (telephony != null) 2271 return telephony.setVoiceMailNumber(subId, alphaTag, number); 2272 } catch (RemoteException ex) { 2273 } catch (NullPointerException ex) { 2274 } 2275 return false; 2276 } 2277 2278 /** 2279 * Returns the voice mail count. Return 0 if unavailable. 2280 * <p> 2281 * Requires Permission: 2282 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 2283 * @hide 2284 */ 2285 public int getVoiceMessageCount() { 2286 return getVoiceMessageCount(getDefaultSubscription()); 2287 } 2288 2289 /** 2290 * Returns the voice mail count for a subscription. Return 0 if unavailable. 2291 * <p> 2292 * Requires Permission: 2293 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 2294 * @param subId whose voice message count is returned 2295 */ 2296 /** {@hide} */ 2297 public int getVoiceMessageCount(int subId) { 2298 try { 2299 ITelephony telephony = getITelephony(); 2300 if (telephony == null) 2301 return 0; 2302 return telephony.getVoiceMessageCountForSubscriber(subId); 2303 } catch (RemoteException ex) { 2304 return 0; 2305 } catch (NullPointerException ex) { 2306 // This could happen before phone restarts due to crashing 2307 return 0; 2308 } 2309 } 2310 2311 /** 2312 * Retrieves the alphabetic identifier associated with the voice 2313 * mail number. 2314 * <p> 2315 * Requires Permission: 2316 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 2317 */ 2318 public String getVoiceMailAlphaTag() { 2319 return getVoiceMailAlphaTag(getDefaultSubscription()); 2320 } 2321 2322 /** 2323 * Retrieves the alphabetic identifier associated with the voice 2324 * mail number for a subscription. 2325 * <p> 2326 * Requires Permission: 2327 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 2328 * @param subId whose alphabetic identifier associated with the 2329 * voice mail number is returned 2330 */ 2331 /** {@hide} */ 2332 public String getVoiceMailAlphaTag(int subId) { 2333 try { 2334 IPhoneSubInfo info = getSubscriberInfo(); 2335 if (info == null) 2336 return null; 2337 return info.getVoiceMailAlphaTagForSubscriber(subId); 2338 } catch (RemoteException ex) { 2339 return null; 2340 } catch (NullPointerException ex) { 2341 // This could happen before phone restarts due to crashing 2342 return null; 2343 } 2344 } 2345 2346 /** 2347 * Returns the IMS private user identity (IMPI) that was loaded from the ISIM. 2348 * @return the IMPI, or null if not present or not loaded 2349 * @hide 2350 */ 2351 public String getIsimImpi() { 2352 try { 2353 IPhoneSubInfo info = getSubscriberInfo(); 2354 if (info == null) 2355 return null; 2356 return info.getIsimImpi(); 2357 } catch (RemoteException ex) { 2358 return null; 2359 } catch (NullPointerException ex) { 2360 // This could happen before phone restarts due to crashing 2361 return null; 2362 } 2363 } 2364 2365 /** 2366 * Returns the IMS home network domain name that was loaded from the ISIM. 2367 * @return the IMS domain name, or null if not present or not loaded 2368 * @hide 2369 */ 2370 public String getIsimDomain() { 2371 try { 2372 IPhoneSubInfo info = getSubscriberInfo(); 2373 if (info == null) 2374 return null; 2375 return info.getIsimDomain(); 2376 } catch (RemoteException ex) { 2377 return null; 2378 } catch (NullPointerException ex) { 2379 // This could happen before phone restarts due to crashing 2380 return null; 2381 } 2382 } 2383 2384 /** 2385 * Returns the IMS public user identities (IMPU) that were loaded from the ISIM. 2386 * @return an array of IMPU strings, with one IMPU per string, or null if 2387 * not present or not loaded 2388 * @hide 2389 */ 2390 public String[] getIsimImpu() { 2391 try { 2392 IPhoneSubInfo info = getSubscriberInfo(); 2393 if (info == null) 2394 return null; 2395 return info.getIsimImpu(); 2396 } catch (RemoteException ex) { 2397 return null; 2398 } catch (NullPointerException ex) { 2399 // This could happen before phone restarts due to crashing 2400 return null; 2401 } 2402 } 2403 2404 /** 2405 * @hide 2406 */ 2407 private IPhoneSubInfo getSubscriberInfo() { 2408 // get it each time because that process crashes a lot 2409 return IPhoneSubInfo.Stub.asInterface(ServiceManager.getService("iphonesubinfo")); 2410 } 2411 2412 /** Device call state: No activity. */ 2413 public static final int CALL_STATE_IDLE = 0; 2414 /** Device call state: Ringing. A new call arrived and is 2415 * ringing or waiting. In the latter case, another call is 2416 * already active. */ 2417 public static final int CALL_STATE_RINGING = 1; 2418 /** Device call state: Off-hook. At least one call exists 2419 * that is dialing, active, or on hold, and no calls are ringing 2420 * or waiting. */ 2421 public static final int CALL_STATE_OFFHOOK = 2; 2422 2423 /** 2424 * Returns a constant indicating the call state (cellular) on the device. 2425 */ 2426 public int getCallState() { 2427 return getCallState(getDefaultSubscription()); 2428 } 2429 2430 /** 2431 * Returns a constant indicating the call state (cellular) on the device 2432 * for a subscription. 2433 * 2434 * @param subId whose call state is returned 2435 */ 2436 /** {@hide} */ 2437 public int getCallState(int subId) { 2438 try { 2439 ITelephony telephony = getITelephony(); 2440 if (telephony == null) 2441 return CALL_STATE_IDLE; 2442 return telephony.getCallStateForSubscriber(subId); 2443 } catch (RemoteException ex) { 2444 // the phone process is restarting. 2445 return CALL_STATE_IDLE; 2446 } catch (NullPointerException ex) { 2447 // the phone process is restarting. 2448 return CALL_STATE_IDLE; 2449 } 2450 } 2451 2452 /** Data connection activity: No traffic. */ 2453 public static final int DATA_ACTIVITY_NONE = 0x00000000; 2454 /** Data connection activity: Currently receiving IP PPP traffic. */ 2455 public static final int DATA_ACTIVITY_IN = 0x00000001; 2456 /** Data connection activity: Currently sending IP PPP traffic. */ 2457 public static final int DATA_ACTIVITY_OUT = 0x00000002; 2458 /** Data connection activity: Currently both sending and receiving 2459 * IP PPP traffic. */ 2460 public static final int DATA_ACTIVITY_INOUT = DATA_ACTIVITY_IN | DATA_ACTIVITY_OUT; 2461 /** 2462 * Data connection is active, but physical link is down 2463 */ 2464 public static final int DATA_ACTIVITY_DORMANT = 0x00000004; 2465 2466 /** 2467 * Returns a constant indicating the type of activity on a data connection 2468 * (cellular). 2469 * 2470 * @see #DATA_ACTIVITY_NONE 2471 * @see #DATA_ACTIVITY_IN 2472 * @see #DATA_ACTIVITY_OUT 2473 * @see #DATA_ACTIVITY_INOUT 2474 * @see #DATA_ACTIVITY_DORMANT 2475 */ 2476 public int getDataActivity() { 2477 try { 2478 ITelephony telephony = getITelephony(); 2479 if (telephony == null) 2480 return DATA_ACTIVITY_NONE; 2481 return telephony.getDataActivity(); 2482 } catch (RemoteException ex) { 2483 // the phone process is restarting. 2484 return DATA_ACTIVITY_NONE; 2485 } catch (NullPointerException ex) { 2486 // the phone process is restarting. 2487 return DATA_ACTIVITY_NONE; 2488 } 2489 } 2490 2491 /** Data connection state: Unknown. Used before we know the state. 2492 * @hide 2493 */ 2494 public static final int DATA_UNKNOWN = -1; 2495 /** Data connection state: Disconnected. IP traffic not available. */ 2496 public static final int DATA_DISCONNECTED = 0; 2497 /** Data connection state: Currently setting up a data connection. */ 2498 public static final int DATA_CONNECTING = 1; 2499 /** Data connection state: Connected. IP traffic should be available. */ 2500 public static final int DATA_CONNECTED = 2; 2501 /** Data connection state: Suspended. The connection is up, but IP 2502 * traffic is temporarily unavailable. For example, in a 2G network, 2503 * data activity may be suspended when a voice call arrives. */ 2504 public static final int DATA_SUSPENDED = 3; 2505 2506 /** 2507 * Returns a constant indicating the current data connection state 2508 * (cellular). 2509 * 2510 * @see #DATA_DISCONNECTED 2511 * @see #DATA_CONNECTING 2512 * @see #DATA_CONNECTED 2513 * @see #DATA_SUSPENDED 2514 */ 2515 public int getDataState() { 2516 try { 2517 ITelephony telephony = getITelephony(); 2518 if (telephony == null) 2519 return DATA_DISCONNECTED; 2520 return telephony.getDataState(); 2521 } catch (RemoteException ex) { 2522 // the phone process is restarting. 2523 return DATA_DISCONNECTED; 2524 } catch (NullPointerException ex) { 2525 return DATA_DISCONNECTED; 2526 } 2527 } 2528 2529 /** 2530 * @hide 2531 */ 2532 private ITelephony getITelephony() { 2533 return ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE)); 2534 } 2535 2536 /** 2537 * @hide 2538 */ 2539 private ITelecomService getTelecomService() { 2540 return ITelecomService.Stub.asInterface(ServiceManager.getService(Context.TELECOM_SERVICE)); 2541 } 2542 2543 // 2544 // 2545 // PhoneStateListener 2546 // 2547 // 2548 2549 /** 2550 * Registers a listener object to receive notification of changes 2551 * in specified telephony states. 2552 * <p> 2553 * To register a listener, pass a {@link PhoneStateListener} 2554 * and specify at least one telephony state of interest in 2555 * the events argument. 2556 * 2557 * At registration, and when a specified telephony state 2558 * changes, the telephony manager invokes the appropriate 2559 * callback method on the listener object and passes the 2560 * current (updated) values. 2561 * <p> 2562 * To unregister a listener, pass the listener object and set the 2563 * events argument to 2564 * {@link PhoneStateListener#LISTEN_NONE LISTEN_NONE} (0). 2565 * 2566 * @param listener The {@link PhoneStateListener} object to register 2567 * (or unregister) 2568 * @param events The telephony state(s) of interest to the listener, 2569 * as a bitwise-OR combination of {@link PhoneStateListener} 2570 * LISTEN_ flags. 2571 */ 2572 public void listen(PhoneStateListener listener, int events) { 2573 String pkgForDebug = mContext != null ? mContext.getPackageName() : "<unknown>"; 2574 try { 2575 Boolean notifyNow = (getITelephony() != null); 2576 sRegistry.listenForSubscriber(listener.mSubId, pkgForDebug, listener.callback, events, notifyNow); 2577 } catch (RemoteException ex) { 2578 // system process dead 2579 } catch (NullPointerException ex) { 2580 // system process dead 2581 } 2582 } 2583 2584 /** 2585 * Returns the CDMA ERI icon index to display 2586 * 2587 * @hide 2588 */ 2589 public int getCdmaEriIconIndex() { 2590 return getCdmaEriIconIndex(getDefaultSubscription()); 2591 } 2592 2593 /** 2594 * Returns the CDMA ERI icon index to display for a subscription 2595 */ 2596 /** {@hide} */ 2597 public int getCdmaEriIconIndex(int subId) { 2598 try { 2599 ITelephony telephony = getITelephony(); 2600 if (telephony == null) 2601 return -1; 2602 return telephony.getCdmaEriIconIndexForSubscriber(subId); 2603 } catch (RemoteException ex) { 2604 // the phone process is restarting. 2605 return -1; 2606 } catch (NullPointerException ex) { 2607 return -1; 2608 } 2609 } 2610 2611 /** 2612 * Returns the CDMA ERI icon mode, 2613 * 0 - ON 2614 * 1 - FLASHING 2615 * 2616 * @hide 2617 */ 2618 public int getCdmaEriIconMode() { 2619 return getCdmaEriIconMode(getDefaultSubscription()); 2620 } 2621 2622 /** 2623 * Returns the CDMA ERI icon mode for a subscription. 2624 * 0 - ON 2625 * 1 - FLASHING 2626 */ 2627 /** {@hide} */ 2628 public int getCdmaEriIconMode(int subId) { 2629 try { 2630 ITelephony telephony = getITelephony(); 2631 if (telephony == null) 2632 return -1; 2633 return telephony.getCdmaEriIconModeForSubscriber(subId); 2634 } catch (RemoteException ex) { 2635 // the phone process is restarting. 2636 return -1; 2637 } catch (NullPointerException ex) { 2638 return -1; 2639 } 2640 } 2641 2642 /** 2643 * Returns the CDMA ERI text, 2644 * 2645 * @hide 2646 */ 2647 public String getCdmaEriText() { 2648 return getCdmaEriText(getDefaultSubscription()); 2649 } 2650 2651 /** 2652 * Returns the CDMA ERI text, of a subscription 2653 * 2654 */ 2655 /** {@hide} */ 2656 public String getCdmaEriText(int subId) { 2657 try { 2658 ITelephony telephony = getITelephony(); 2659 if (telephony == null) 2660 return null; 2661 return telephony.getCdmaEriTextForSubscriber(subId); 2662 } catch (RemoteException ex) { 2663 // the phone process is restarting. 2664 return null; 2665 } catch (NullPointerException ex) { 2666 return null; 2667 } 2668 } 2669 2670 /** 2671 * @return true if the current device is "voice capable". 2672 * <p> 2673 * "Voice capable" means that this device supports circuit-switched 2674 * (i.e. voice) phone calls over the telephony network, and is allowed 2675 * to display the in-call UI while a cellular voice call is active. 2676 * This will be false on "data only" devices which can't make voice 2677 * calls and don't support any in-call UI. 2678 * <p> 2679 * Note: the meaning of this flag is subtly different from the 2680 * PackageManager.FEATURE_TELEPHONY system feature, which is available 2681 * on any device with a telephony radio, even if the device is 2682 * data-only. 2683 */ 2684 public boolean isVoiceCapable() { 2685 if (mContext == null) return true; 2686 return mContext.getResources().getBoolean( 2687 com.android.internal.R.bool.config_voice_capable); 2688 } 2689 2690 /** 2691 * @return true if the current device supports sms service. 2692 * <p> 2693 * If true, this means that the device supports both sending and 2694 * receiving sms via the telephony network. 2695 * <p> 2696 * Note: Voicemail waiting sms, cell broadcasting sms, and MMS are 2697 * disabled when device doesn't support sms. 2698 */ 2699 public boolean isSmsCapable() { 2700 if (mContext == null) return true; 2701 return mContext.getResources().getBoolean( 2702 com.android.internal.R.bool.config_sms_capable); 2703 } 2704 2705 /** 2706 * Returns all observed cell information from all radios on the 2707 * device including the primary and neighboring cells. This does 2708 * not cause or change the rate of PhoneStateListner#onCellInfoChanged. 2709 *<p> 2710 * The list can include one or more of {@link android.telephony.CellInfoGsm CellInfoGsm}, 2711 * {@link android.telephony.CellInfoCdma CellInfoCdma}, 2712 * {@link android.telephony.CellInfoLte CellInfoLte} and 2713 * {@link android.telephony.CellInfoWcdma CellInfoCdma} in any combination. 2714 * Specifically on devices with multiple radios it is typical to see instances of 2715 * one or more of any these in the list. In addition 0, 1 or more CellInfo 2716 * objects may return isRegistered() true. 2717 *<p> 2718 * This is preferred over using getCellLocation although for older 2719 * devices this may return null in which case getCellLocation should 2720 * be called. 2721 *<p> 2722 * @return List of CellInfo or null if info unavailable. 2723 * 2724 * <p>Requires Permission: {@link android.Manifest.permission#ACCESS_COARSE_LOCATION} 2725 */ 2726 public List<CellInfo> getAllCellInfo() { 2727 try { 2728 ITelephony telephony = getITelephony(); 2729 if (telephony == null) 2730 return null; 2731 return telephony.getAllCellInfo(); 2732 } catch (RemoteException ex) { 2733 return null; 2734 } catch (NullPointerException ex) { 2735 return null; 2736 } 2737 } 2738 2739 /** 2740 * Sets the minimum time in milli-seconds between {@link PhoneStateListener#onCellInfoChanged 2741 * PhoneStateListener.onCellInfoChanged} will be invoked. 2742 *<p> 2743 * The default, 0, means invoke onCellInfoChanged when any of the reported 2744 * information changes. Setting the value to INT_MAX(0x7fffffff) means never issue 2745 * A onCellInfoChanged. 2746 *<p> 2747 * @param rateInMillis the rate 2748 * 2749 * @hide 2750 */ 2751 public void setCellInfoListRate(int rateInMillis) { 2752 try { 2753 ITelephony telephony = getITelephony(); 2754 if (telephony != null) 2755 telephony.setCellInfoListRate(rateInMillis); 2756 } catch (RemoteException ex) { 2757 } catch (NullPointerException ex) { 2758 } 2759 } 2760 2761 /** 2762 * Returns the MMS user agent. 2763 */ 2764 public String getMmsUserAgent() { 2765 if (mContext == null) return null; 2766 return mContext.getResources().getString( 2767 com.android.internal.R.string.config_mms_user_agent); 2768 } 2769 2770 /** 2771 * Returns the MMS user agent profile URL. 2772 */ 2773 public String getMmsUAProfUrl() { 2774 if (mContext == null) return null; 2775 return mContext.getResources().getString( 2776 com.android.internal.R.string.config_mms_user_agent_profile_url); 2777 } 2778 2779 /** 2780 * Opens a logical channel to the ICC card. 2781 * 2782 * Input parameters equivalent to TS 27.007 AT+CCHO command. 2783 * 2784 * <p>Requires Permission: 2785 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 2786 * Or the calling app has carrier privileges. @see #hasCarrierPrivileges 2787 * 2788 * @param AID Application id. See ETSI 102.221 and 101.220. 2789 * @return an IccOpenLogicalChannelResponse object. 2790 */ 2791 public IccOpenLogicalChannelResponse iccOpenLogicalChannel(String AID) { 2792 try { 2793 ITelephony telephony = getITelephony(); 2794 if (telephony != null) 2795 return telephony.iccOpenLogicalChannel(AID); 2796 } catch (RemoteException ex) { 2797 } catch (NullPointerException ex) { 2798 } 2799 return null; 2800 } 2801 2802 /** 2803 * Closes a previously opened logical channel to the ICC card. 2804 * 2805 * Input parameters equivalent to TS 27.007 AT+CCHC command. 2806 * 2807 * <p>Requires Permission: 2808 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 2809 * Or the calling app has carrier privileges. @see #hasCarrierPrivileges 2810 * 2811 * @param channel is the channel id to be closed as retruned by a successful 2812 * iccOpenLogicalChannel. 2813 * @return true if the channel was closed successfully. 2814 */ 2815 public boolean iccCloseLogicalChannel(int channel) { 2816 try { 2817 ITelephony telephony = getITelephony(); 2818 if (telephony != null) 2819 return telephony.iccCloseLogicalChannel(channel); 2820 } catch (RemoteException ex) { 2821 } catch (NullPointerException ex) { 2822 } 2823 return false; 2824 } 2825 2826 /** 2827 * Transmit an APDU to the ICC card over a logical channel. 2828 * 2829 * Input parameters equivalent to TS 27.007 AT+CGLA command. 2830 * 2831 * <p>Requires Permission: 2832 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 2833 * Or the calling app has carrier privileges. @see #hasCarrierPrivileges 2834 * 2835 * @param channel is the channel id to be closed as returned by a successful 2836 * iccOpenLogicalChannel. 2837 * @param cla Class of the APDU command. 2838 * @param instruction Instruction of the APDU command. 2839 * @param p1 P1 value of the APDU command. 2840 * @param p2 P2 value of the APDU command. 2841 * @param p3 P3 value of the APDU command. If p3 is negative a 4 byte APDU 2842 * is sent to the SIM. 2843 * @param data Data to be sent with the APDU. 2844 * @return The APDU response from the ICC card with the status appended at 2845 * the end. 2846 */ 2847 public String iccTransmitApduLogicalChannel(int channel, int cla, 2848 int instruction, int p1, int p2, int p3, String data) { 2849 try { 2850 ITelephony telephony = getITelephony(); 2851 if (telephony != null) 2852 return telephony.iccTransmitApduLogicalChannel(channel, cla, 2853 instruction, p1, p2, p3, data); 2854 } catch (RemoteException ex) { 2855 } catch (NullPointerException ex) { 2856 } 2857 return ""; 2858 } 2859 2860 /** 2861 * Transmit an APDU to the ICC card over the basic channel. 2862 * 2863 * Input parameters equivalent to TS 27.007 AT+CSIM command. 2864 * 2865 * <p>Requires Permission: 2866 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 2867 * Or the calling app has carrier privileges. @see #hasCarrierPrivileges 2868 * 2869 * @param cla Class of the APDU command. 2870 * @param instruction Instruction of the APDU command. 2871 * @param p1 P1 value of the APDU command. 2872 * @param p2 P2 value of the APDU command. 2873 * @param p3 P3 value of the APDU command. If p3 is negative a 4 byte APDU 2874 * is sent to the SIM. 2875 * @param data Data to be sent with the APDU. 2876 * @return The APDU response from the ICC card with the status appended at 2877 * the end. 2878 */ 2879 public String iccTransmitApduBasicChannel(int cla, 2880 int instruction, int p1, int p2, int p3, String data) { 2881 try { 2882 ITelephony telephony = getITelephony(); 2883 if (telephony != null) 2884 return telephony.iccTransmitApduBasicChannel(cla, 2885 instruction, p1, p2, p3, data); 2886 } catch (RemoteException ex) { 2887 } catch (NullPointerException ex) { 2888 } 2889 return ""; 2890 } 2891 2892 /** 2893 * Returns the response APDU for a command APDU sent through SIM_IO. 2894 * 2895 * <p>Requires Permission: 2896 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 2897 * Or the calling app has carrier privileges. @see #hasCarrierPrivileges 2898 * 2899 * @param fileID 2900 * @param command 2901 * @param p1 P1 value of the APDU command. 2902 * @param p2 P2 value of the APDU command. 2903 * @param p3 P3 value of the APDU command. 2904 * @param filePath 2905 * @return The APDU response. 2906 */ 2907 public byte[] iccExchangeSimIO(int fileID, int command, int p1, int p2, int p3, 2908 String filePath) { 2909 try { 2910 ITelephony telephony = getITelephony(); 2911 if (telephony != null) 2912 return telephony.iccExchangeSimIO(fileID, command, p1, p2, p3, filePath); 2913 } catch (RemoteException ex) { 2914 } catch (NullPointerException ex) { 2915 } 2916 return null; 2917 } 2918 2919 /** 2920 * Send ENVELOPE to the SIM and return the response. 2921 * 2922 * <p>Requires Permission: 2923 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 2924 * Or the calling app has carrier privileges. @see #hasCarrierPrivileges 2925 * 2926 * @param content String containing SAT/USAT response in hexadecimal 2927 * format starting with command tag. See TS 102 223 for 2928 * details. 2929 * @return The APDU response from the ICC card in hexadecimal format 2930 * with the last 4 bytes being the status word. If the command fails, 2931 * returns an empty string. 2932 */ 2933 public String sendEnvelopeWithStatus(String content) { 2934 try { 2935 ITelephony telephony = getITelephony(); 2936 if (telephony != null) 2937 return telephony.sendEnvelopeWithStatus(content); 2938 } catch (RemoteException ex) { 2939 } catch (NullPointerException ex) { 2940 } 2941 return ""; 2942 } 2943 2944 /** 2945 * Read one of the NV items defined in com.android.internal.telephony.RadioNVItems. 2946 * Used for device configuration by some CDMA operators. 2947 * <p> 2948 * Requires Permission: 2949 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 2950 * Or the calling app has carrier privileges. @see #hasCarrierPrivileges 2951 * 2952 * @param itemID the ID of the item to read. 2953 * @return the NV item as a String, or null on any failure. 2954 * 2955 * @hide 2956 */ 2957 public String nvReadItem(int itemID) { 2958 try { 2959 ITelephony telephony = getITelephony(); 2960 if (telephony != null) 2961 return telephony.nvReadItem(itemID); 2962 } catch (RemoteException ex) { 2963 Rlog.e(TAG, "nvReadItem RemoteException", ex); 2964 } catch (NullPointerException ex) { 2965 Rlog.e(TAG, "nvReadItem NPE", ex); 2966 } 2967 return ""; 2968 } 2969 2970 /** 2971 * Write one of the NV items defined in com.android.internal.telephony.RadioNVItems. 2972 * Used for device configuration by some CDMA operators. 2973 * <p> 2974 * Requires Permission: 2975 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 2976 * Or the calling app has carrier privileges. @see #hasCarrierPrivileges 2977 * 2978 * @param itemID the ID of the item to read. 2979 * @param itemValue the value to write, as a String. 2980 * @return true on success; false on any failure. 2981 * 2982 * @hide 2983 */ 2984 public boolean nvWriteItem(int itemID, String itemValue) { 2985 try { 2986 ITelephony telephony = getITelephony(); 2987 if (telephony != null) 2988 return telephony.nvWriteItem(itemID, itemValue); 2989 } catch (RemoteException ex) { 2990 Rlog.e(TAG, "nvWriteItem RemoteException", ex); 2991 } catch (NullPointerException ex) { 2992 Rlog.e(TAG, "nvWriteItem NPE", ex); 2993 } 2994 return false; 2995 } 2996 2997 /** 2998 * Update the CDMA Preferred Roaming List (PRL) in the radio NV storage. 2999 * Used for device configuration by some CDMA operators. 3000 * <p> 3001 * Requires Permission: 3002 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 3003 * Or the calling app has carrier privileges. @see #hasCarrierPrivileges 3004 * 3005 * @param preferredRoamingList byte array containing the new PRL. 3006 * @return true on success; false on any failure. 3007 * 3008 * @hide 3009 */ 3010 public boolean nvWriteCdmaPrl(byte[] preferredRoamingList) { 3011 try { 3012 ITelephony telephony = getITelephony(); 3013 if (telephony != null) 3014 return telephony.nvWriteCdmaPrl(preferredRoamingList); 3015 } catch (RemoteException ex) { 3016 Rlog.e(TAG, "nvWriteCdmaPrl RemoteException", ex); 3017 } catch (NullPointerException ex) { 3018 Rlog.e(TAG, "nvWriteCdmaPrl NPE", ex); 3019 } 3020 return false; 3021 } 3022 3023 /** 3024 * Perform the specified type of NV config reset. The radio will be taken offline 3025 * and the device must be rebooted after the operation. Used for device 3026 * configuration by some CDMA operators. 3027 * <p> 3028 * Requires Permission: 3029 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 3030 * Or the calling app has carrier privileges. @see #hasCarrierPrivileges 3031 * 3032 * @param resetType reset type: 1: reload NV reset, 2: erase NV reset, 3: factory NV reset 3033 * @return true on success; false on any failure. 3034 * 3035 * @hide 3036 */ 3037 public boolean nvResetConfig(int resetType) { 3038 try { 3039 ITelephony telephony = getITelephony(); 3040 if (telephony != null) 3041 return telephony.nvResetConfig(resetType); 3042 } catch (RemoteException ex) { 3043 Rlog.e(TAG, "nvResetConfig RemoteException", ex); 3044 } catch (NullPointerException ex) { 3045 Rlog.e(TAG, "nvResetConfig NPE", ex); 3046 } 3047 return false; 3048 } 3049 3050 /** 3051 * Returns Default subscription. 3052 */ 3053 private static int getDefaultSubscription() { 3054 return SubscriptionManager.getDefaultSubId(); 3055 } 3056 3057 /** 3058 * Returns Default phone. 3059 */ 3060 private static int getDefaultPhone() { 3061 return SubscriptionManager.getPhoneId(SubscriptionManager.getDefaultSubId()); 3062 } 3063 3064 /** {@hide} */ 3065 public int getDefaultSim() { 3066 return SubscriptionManager.getSlotId(SubscriptionManager.getDefaultSubId()); 3067 } 3068 3069 /** 3070 * Sets the telephony property with the value specified. 3071 * 3072 * @hide 3073 */ 3074 public static void setTelephonyProperty(int phoneId, String property, String value) { 3075 String propVal = ""; 3076 String p[] = null; 3077 String prop = SystemProperties.get(property); 3078 3079 if (value == null) { 3080 value = ""; 3081 } 3082 3083 if (prop != null) { 3084 p = prop.split(","); 3085 } 3086 3087 if (!SubscriptionManager.isValidPhoneId(phoneId)) { 3088 Rlog.d(TAG, "setTelephonyProperty: invalid phoneId=" + phoneId + 3089 " property=" + property + " value: " + value + " prop=" + prop); 3090 return; 3091 } 3092 3093 for (int i = 0; i < phoneId; i++) { 3094 String str = ""; 3095 if ((p != null) && (i < p.length)) { 3096 str = p[i]; 3097 } 3098 propVal = propVal + str + ","; 3099 } 3100 3101 propVal = propVal + value; 3102 if (p != null) { 3103 for (int i = phoneId + 1; i < p.length; i++) { 3104 propVal = propVal + "," + p[i]; 3105 } 3106 } 3107 3108 if (property.length() > SystemProperties.PROP_NAME_MAX 3109 || propVal.length() > SystemProperties.PROP_VALUE_MAX) { 3110 Rlog.d(TAG, "setTelephonyProperty: property to long phoneId=" + phoneId + 3111 " property=" + property + " value: " + value + " propVal=" + propVal); 3112 return; 3113 } 3114 3115 Rlog.d(TAG, "setTelephonyProperty: success phoneId=" + phoneId + 3116 " property=" + property + " value: " + value + " propVal=" + propVal); 3117 SystemProperties.set(property, propVal); 3118 } 3119 3120 /** 3121 * Convenience function for retrieving a value from the secure settings 3122 * value list as an integer. Note that internally setting values are 3123 * always stored as strings; this function converts the string to an 3124 * integer for you. 3125 * <p> 3126 * This version does not take a default value. If the setting has not 3127 * been set, or the string value is not a number, 3128 * it throws {@link SettingNotFoundException}. 3129 * 3130 * @param cr The ContentResolver to access. 3131 * @param name The name of the setting to retrieve. 3132 * @param index The index of the list 3133 * 3134 * @throws SettingNotFoundException Thrown if a setting by the given 3135 * name can't be found or the setting value is not an integer. 3136 * 3137 * @return The value at the given index of settings. 3138 * @hide 3139 */ 3140 public static int getIntAtIndex(android.content.ContentResolver cr, 3141 String name, int index) 3142 throws android.provider.Settings.SettingNotFoundException { 3143 String v = android.provider.Settings.Global.getString(cr, name); 3144 if (v != null) { 3145 String valArray[] = v.split(","); 3146 if ((index >= 0) && (index < valArray.length) && (valArray[index] != null)) { 3147 try { 3148 return Integer.parseInt(valArray[index]); 3149 } catch (NumberFormatException e) { 3150 //Log.e(TAG, "Exception while parsing Integer: ", e); 3151 } 3152 } 3153 } 3154 throw new android.provider.Settings.SettingNotFoundException(name); 3155 } 3156 3157 /** 3158 * Convenience function for updating settings value as coma separated 3159 * integer values. This will either create a new entry in the table if the 3160 * given name does not exist, or modify the value of the existing row 3161 * with that name. Note that internally setting values are always 3162 * stored as strings, so this function converts the given value to a 3163 * string before storing it. 3164 * 3165 * @param cr The ContentResolver to access. 3166 * @param name The name of the setting to modify. 3167 * @param index The index of the list 3168 * @param value The new value for the setting to be added to the list. 3169 * @return true if the value was set, false on database errors 3170 * @hide 3171 */ 3172 public static boolean putIntAtIndex(android.content.ContentResolver cr, 3173 String name, int index, int value) { 3174 String data = ""; 3175 String valArray[] = null; 3176 String v = android.provider.Settings.Global.getString(cr, name); 3177 3178 if (index == Integer.MAX_VALUE) { 3179 throw new RuntimeException("putIntAtIndex index == MAX_VALUE index=" + index); 3180 } 3181 if (index < 0) { 3182 throw new RuntimeException("putIntAtIndex index < 0 index=" + index); 3183 } 3184 if (v != null) { 3185 valArray = v.split(","); 3186 } 3187 3188 // Copy the elements from valArray till index 3189 for (int i = 0; i < index; i++) { 3190 String str = ""; 3191 if ((valArray != null) && (i < valArray.length)) { 3192 str = valArray[i]; 3193 } 3194 data = data + str + ","; 3195 } 3196 3197 data = data + value; 3198 3199 // Copy the remaining elements from valArray if any. 3200 if (valArray != null) { 3201 for (int i = index+1; i < valArray.length; i++) { 3202 data = data + "," + valArray[i]; 3203 } 3204 } 3205 return android.provider.Settings.Global.putString(cr, name, data); 3206 } 3207 3208 /** 3209 * Gets the telephony property. 3210 * 3211 * @hide 3212 */ 3213 public static String getTelephonyProperty(int phoneId, String property, String defaultVal) { 3214 String propVal = null; 3215 String prop = SystemProperties.get(property); 3216 if ((prop != null) && (prop.length() > 0)) { 3217 String values[] = prop.split(","); 3218 if ((phoneId >= 0) && (phoneId < values.length) && (values[phoneId] != null)) { 3219 propVal = values[phoneId]; 3220 } 3221 } 3222 Rlog.d(TAG, "getTelephonyProperty: return propVal='" + propVal + "' phoneId=" + phoneId 3223 + " property='" + property + "' defaultVal='" + defaultVal + "' prop=" + prop); 3224 return propVal == null ? defaultVal : propVal; 3225 } 3226 3227 /** @hide */ 3228 public int getSimCount() { 3229 // FIXME Need to get it from Telephony Dev Controller when that gets implemented! 3230 // and then this method shouldn't be used at all! 3231 if(isMultiSimEnabled()) { 3232 return 2; 3233 } else { 3234 return 1; 3235 } 3236 } 3237 3238 /** 3239 * Returns the IMS Service Table (IST) that was loaded from the ISIM. 3240 * @return IMS Service Table or null if not present or not loaded 3241 * @hide 3242 */ 3243 public String getIsimIst() { 3244 try { 3245 IPhoneSubInfo info = getSubscriberInfo(); 3246 if (info == null) 3247 return null; 3248 return info.getIsimIst(); 3249 } catch (RemoteException ex) { 3250 return null; 3251 } catch (NullPointerException ex) { 3252 // This could happen before phone restarts due to crashing 3253 return null; 3254 } 3255 } 3256 3257 /** 3258 * Returns the IMS Proxy Call Session Control Function(PCSCF) that were loaded from the ISIM. 3259 * @return an array of PCSCF strings with one PCSCF per string, or null if 3260 * not present or not loaded 3261 * @hide 3262 */ 3263 public String[] getIsimPcscf() { 3264 try { 3265 IPhoneSubInfo info = getSubscriberInfo(); 3266 if (info == null) 3267 return null; 3268 return info.getIsimPcscf(); 3269 } catch (RemoteException ex) { 3270 return null; 3271 } catch (NullPointerException ex) { 3272 // This could happen before phone restarts due to crashing 3273 return null; 3274 } 3275 } 3276 3277 /** 3278 * Returns the response of ISIM Authetification through RIL. 3279 * Returns null if the Authentification hasn't been successed or isn't present iphonesubinfo. 3280 * @return the response of ISIM Authetification, or null if not available 3281 * @hide 3282 * @deprecated 3283 * @see getIccSimChallengeResponse with appType=PhoneConstants.APPTYPE_ISIM 3284 */ 3285 public String getIsimChallengeResponse(String nonce){ 3286 try { 3287 IPhoneSubInfo info = getSubscriberInfo(); 3288 if (info == null) 3289 return null; 3290 return info.getIsimChallengeResponse(nonce); 3291 } catch (RemoteException ex) { 3292 return null; 3293 } catch (NullPointerException ex) { 3294 // This could happen before phone restarts due to crashing 3295 return null; 3296 } 3297 } 3298 3299 /** 3300 * Returns the response of SIM Authentication through RIL. 3301 * Returns null if the Authentication hasn't been successful 3302 * @param subId subscription ID to be queried 3303 * @param appType ICC application type (@see com.android.internal.telephony.PhoneConstants#APPTYPE_xxx) 3304 * @param data authentication challenge data 3305 * @return the response of SIM Authentication, or null if not available 3306 * @hide 3307 */ 3308 public String getIccSimChallengeResponse(int subId, int appType, String data) { 3309 try { 3310 IPhoneSubInfo info = getSubscriberInfo(); 3311 if (info == null) 3312 return null; 3313 return info.getIccSimChallengeResponse(subId, appType, data); 3314 } catch (RemoteException ex) { 3315 return null; 3316 } catch (NullPointerException ex) { 3317 // This could happen before phone starts 3318 return null; 3319 } 3320 } 3321 3322 /** 3323 * Returns the response of SIM Authentication through RIL for the default subscription. 3324 * Returns null if the Authentication hasn't been successful 3325 * @param appType ICC application type (@see com.android.internal.telephony.PhoneConstants#APPTYPE_xxx) 3326 * @param data authentication challenge data 3327 * @return the response of SIM Authentication, or null if not available 3328 * @hide 3329 */ 3330 public String getIccSimChallengeResponse(int appType, String data) { 3331 return getIccSimChallengeResponse(getDefaultSubscription(), appType, data); 3332 } 3333 3334 /** 3335 * Get P-CSCF address from PCO after data connection is established or modified. 3336 * @param apnType the apnType, "ims" for IMS APN, "emergency" for EMERGENCY APN 3337 * @return array of P-CSCF address 3338 * @hide 3339 */ 3340 public String[] getPcscfAddress(String apnType) { 3341 try { 3342 ITelephony telephony = getITelephony(); 3343 if (telephony == null) 3344 return new String[0]; 3345 return telephony.getPcscfAddress(apnType); 3346 } catch (RemoteException e) { 3347 return new String[0]; 3348 } 3349 } 3350 3351 /** 3352 * Set IMS registration state 3353 * 3354 * @param Registration state 3355 * @hide 3356 */ 3357 public void setImsRegistrationState(boolean registered) { 3358 try { 3359 ITelephony telephony = getITelephony(); 3360 if (telephony != null) 3361 telephony.setImsRegistrationState(registered); 3362 } catch (RemoteException e) { 3363 } 3364 } 3365 3366 /** 3367 * Get the preferred network type. 3368 * Used for device configuration by some CDMA operators. 3369 * <p> 3370 * Requires Permission: 3371 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 3372 * Or the calling app has carrier privileges. @see #hasCarrierPrivileges 3373 * 3374 * @return the preferred network type, defined in RILConstants.java. 3375 * @hide 3376 */ 3377 public int getPreferredNetworkType(int subId) { 3378 try { 3379 ITelephony telephony = getITelephony(); 3380 if (telephony != null) 3381 return telephony.getPreferredNetworkType(subId); 3382 } catch (RemoteException ex) { 3383 Rlog.e(TAG, "getPreferredNetworkType RemoteException", ex); 3384 } catch (NullPointerException ex) { 3385 Rlog.e(TAG, "getPreferredNetworkType NPE", ex); 3386 } 3387 return -1; 3388 } 3389 3390 /** 3391 * Sets the network selection mode to automatic. 3392 * <p> 3393 * Requires Permission: 3394 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 3395 * Or the calling app has carrier privileges. @see #hasCarrierPrivileges 3396 * 3397 * @hide 3398 */ 3399 public void setNetworkSelectionModeAutomatic(int subId) { 3400 try { 3401 ITelephony telephony = getITelephony(); 3402 if (telephony != null) 3403 telephony.setNetworkSelectionModeAutomatic(subId); 3404 } catch (RemoteException ex) { 3405 Rlog.e(TAG, "setNetworkSelectionModeAutomatic RemoteException", ex); 3406 } catch (NullPointerException ex) { 3407 Rlog.e(TAG, "setNetworkSelectionModeAutomatic NPE", ex); 3408 } 3409 } 3410 3411 /** 3412 * Set the preferred network type. 3413 * Used for device configuration by some CDMA operators. 3414 * <p> 3415 * Requires Permission: 3416 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 3417 * Or the calling app has carrier privileges. @see #hasCarrierPrivileges 3418 * 3419 * @param subId the id of the subscription to set the preferred network type for. 3420 * @param networkType the preferred network type, defined in RILConstants.java. 3421 * @return true on success; false on any failure. 3422 * @hide 3423 */ 3424 public boolean setPreferredNetworkType(int subId, int networkType) { 3425 try { 3426 ITelephony telephony = getITelephony(); 3427 if (telephony != null) 3428 return telephony.setPreferredNetworkType(subId, networkType); 3429 } catch (RemoteException ex) { 3430 Rlog.e(TAG, "setPreferredNetworkType RemoteException", ex); 3431 } catch (NullPointerException ex) { 3432 Rlog.e(TAG, "setPreferredNetworkType NPE", ex); 3433 } 3434 return false; 3435 } 3436 3437 /** 3438 * Set the preferred network type to global mode which includes LTE, CDMA, EvDo and GSM/WCDMA. 3439 * 3440 * <p> 3441 * Requires that the calling app has carrier privileges. 3442 * @see #hasCarrierPrivileges 3443 * 3444 * @return true on success; false on any failure. 3445 */ 3446 public boolean setPreferredNetworkTypeToGlobal() { 3447 return setPreferredNetworkType(getDefaultSubscription(), 3448 RILConstants.NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA); 3449 } 3450 3451 /** 3452 * Check TETHER_DUN_REQUIRED and TETHER_DUN_APN settings, net.tethering.noprovisioning 3453 * SystemProperty, and config_tether_apndata to decide whether DUN APN is required for 3454 * tethering. 3455 * 3456 * @return 0: Not required. 1: required. 2: Not set. 3457 * @hide 3458 */ 3459 public int getTetherApnRequired() { 3460 try { 3461 ITelephony telephony = getITelephony(); 3462 if (telephony != null) 3463 return telephony.getTetherApnRequired(); 3464 } catch (RemoteException ex) { 3465 Rlog.e(TAG, "hasMatchedTetherApnSetting RemoteException", ex); 3466 } catch (NullPointerException ex) { 3467 Rlog.e(TAG, "hasMatchedTetherApnSetting NPE", ex); 3468 } 3469 return 2; 3470 } 3471 3472 3473 /** 3474 * Values used to return status for hasCarrierPrivileges call. 3475 */ 3476 /** @hide */ 3477 public static final int CARRIER_PRIVILEGE_STATUS_HAS_ACCESS = 1; 3478 /** @hide */ 3479 public static final int CARRIER_PRIVILEGE_STATUS_NO_ACCESS = 0; 3480 /** @hide */ 3481 public static final int CARRIER_PRIVILEGE_STATUS_RULES_NOT_LOADED = -1; 3482 /** @hide */ 3483 public static final int CARRIER_PRIVILEGE_STATUS_ERROR_LOADING_RULES = -2; 3484 3485 /** 3486 * Has the calling application been granted carrier privileges by the carrier. 3487 * 3488 * If any of the packages in the calling UID has carrier privileges, the 3489 * call will return true. This access is granted by the owner of the UICC 3490 * card and does not depend on the registered carrier. 3491 * 3492 * @return true if the app has carrier privileges. 3493 */ 3494 public boolean hasCarrierPrivileges() { 3495 try { 3496 ITelephony telephony = getITelephony(); 3497 if (telephony != null) 3498 return telephony.getCarrierPrivilegeStatus() == CARRIER_PRIVILEGE_STATUS_HAS_ACCESS; 3499 } catch (RemoteException ex) { 3500 Rlog.e(TAG, "hasCarrierPrivileges RemoteException", ex); 3501 } catch (NullPointerException ex) { 3502 Rlog.e(TAG, "hasCarrierPrivileges NPE", ex); 3503 } 3504 return false; 3505 } 3506 3507 /** 3508 * Override the branding for the current ICCID. 3509 * 3510 * Once set, whenever the SIM is present in the device, the service 3511 * provider name (SPN) and the operator name will both be replaced by the 3512 * brand value input. To unset the value, the same function should be 3513 * called with a null brand value. 3514 * 3515 * <p>Requires that the calling app has carrier privileges. 3516 * @see #hasCarrierPrivileges 3517 * 3518 * @param brand The brand name to display/set. 3519 * @return true if the operation was executed correctly. 3520 */ 3521 public boolean setOperatorBrandOverride(String brand) { 3522 try { 3523 ITelephony telephony = getITelephony(); 3524 if (telephony != null) 3525 return telephony.setOperatorBrandOverride(brand); 3526 } catch (RemoteException ex) { 3527 Rlog.e(TAG, "setOperatorBrandOverride RemoteException", ex); 3528 } catch (NullPointerException ex) { 3529 Rlog.e(TAG, "setOperatorBrandOverride NPE", ex); 3530 } 3531 return false; 3532 } 3533 3534 /** 3535 * Override the roaming preference for the current ICCID. 3536 * 3537 * Using this call, the carrier app (see #hasCarrierPrivileges) can override 3538 * the platform's notion of a network operator being considered roaming or not. 3539 * The change only affects the ICCID that was active when this call was made. 3540 * 3541 * If null is passed as any of the input, the corresponding value is deleted. 3542 * 3543 * <p>Requires that the caller have carrier privilege. See #hasCarrierPrivileges. 3544 * 3545 * @param gsmRoamingList - List of MCCMNCs to be considered roaming for 3GPP RATs. 3546 * @param gsmNonRoamingList - List of MCCMNCs to be considered not roaming for 3GPP RATs. 3547 * @param cdmaRoamingList - List of SIDs to be considered roaming for 3GPP2 RATs. 3548 * @param cdmaNonRoamingList - List of SIDs to be considered not roaming for 3GPP2 RATs. 3549 * @return true if the operation was executed correctly. 3550 * 3551 * @hide 3552 */ 3553 public boolean setRoamingOverride(List<String> gsmRoamingList, 3554 List<String> gsmNonRoamingList, List<String> cdmaRoamingList, 3555 List<String> cdmaNonRoamingList) { 3556 try { 3557 ITelephony telephony = getITelephony(); 3558 if (telephony != null) 3559 return telephony.setRoamingOverride(gsmRoamingList, gsmNonRoamingList, 3560 cdmaRoamingList, cdmaNonRoamingList); 3561 } catch (RemoteException ex) { 3562 Rlog.e(TAG, "setRoamingOverride RemoteException", ex); 3563 } catch (NullPointerException ex) { 3564 Rlog.e(TAG, "setRoamingOverride NPE", ex); 3565 } 3566 return false; 3567 } 3568 3569 /** 3570 * Expose the rest of ITelephony to @SystemApi 3571 */ 3572 3573 /** @hide */ 3574 @SystemApi 3575 public String getCdmaMdn() { 3576 return getCdmaMdn(getDefaultSubscription()); 3577 } 3578 3579 /** @hide */ 3580 @SystemApi 3581 public String getCdmaMdn(int subId) { 3582 try { 3583 ITelephony telephony = getITelephony(); 3584 if (telephony == null) 3585 return null; 3586 return telephony.getCdmaMdn(subId); 3587 } catch (RemoteException ex) { 3588 return null; 3589 } catch (NullPointerException ex) { 3590 return null; 3591 } 3592 } 3593 3594 /** @hide */ 3595 @SystemApi 3596 public String getCdmaMin() { 3597 return getCdmaMin(getDefaultSubscription()); 3598 } 3599 3600 /** @hide */ 3601 @SystemApi 3602 public String getCdmaMin(int subId) { 3603 try { 3604 ITelephony telephony = getITelephony(); 3605 if (telephony == null) 3606 return null; 3607 return telephony.getCdmaMin(subId); 3608 } catch (RemoteException ex) { 3609 return null; 3610 } catch (NullPointerException ex) { 3611 return null; 3612 } 3613 } 3614 3615 /** @hide */ 3616 @SystemApi 3617 public int checkCarrierPrivilegesForPackage(String pkgname) { 3618 try { 3619 ITelephony telephony = getITelephony(); 3620 if (telephony != null) 3621 return telephony.checkCarrierPrivilegesForPackage(pkgname); 3622 } catch (RemoteException ex) { 3623 Rlog.e(TAG, "checkCarrierPrivilegesForPackage RemoteException", ex); 3624 } catch (NullPointerException ex) { 3625 Rlog.e(TAG, "checkCarrierPrivilegesForPackage NPE", ex); 3626 } 3627 return CARRIER_PRIVILEGE_STATUS_NO_ACCESS; 3628 } 3629 3630 /** @hide */ 3631 @SystemApi 3632 public List<String> getCarrierPackageNamesForIntent(Intent intent) { 3633 try { 3634 ITelephony telephony = getITelephony(); 3635 if (telephony != null) 3636 return telephony.getCarrierPackageNamesForIntent(intent); 3637 } catch (RemoteException ex) { 3638 Rlog.e(TAG, "getCarrierPackageNamesForIntent RemoteException", ex); 3639 } catch (NullPointerException ex) { 3640 Rlog.e(TAG, "getCarrierPackageNamesForIntent NPE", ex); 3641 } 3642 return null; 3643 } 3644 3645 /** @hide */ 3646 @SystemApi 3647 public void dial(String number) { 3648 try { 3649 ITelephony telephony = getITelephony(); 3650 if (telephony != null) 3651 telephony.dial(number); 3652 } catch (RemoteException e) { 3653 Log.e(TAG, "Error calling ITelephony#dial", e); 3654 } 3655 } 3656 3657 /** @hide */ 3658 @SystemApi 3659 public void call(String callingPackage, String number) { 3660 try { 3661 ITelephony telephony = getITelephony(); 3662 if (telephony != null) 3663 telephony.call(callingPackage, number); 3664 } catch (RemoteException e) { 3665 Log.e(TAG, "Error calling ITelephony#call", e); 3666 } 3667 } 3668 3669 /** @hide */ 3670 @SystemApi 3671 public boolean endCall() { 3672 try { 3673 ITelephony telephony = getITelephony(); 3674 if (telephony != null) 3675 return telephony.endCall(); 3676 } catch (RemoteException e) { 3677 Log.e(TAG, "Error calling ITelephony#endCall", e); 3678 } 3679 return false; 3680 } 3681 3682 /** @hide */ 3683 @SystemApi 3684 public void answerRingingCall() { 3685 try { 3686 ITelephony telephony = getITelephony(); 3687 if (telephony != null) 3688 telephony.answerRingingCall(); 3689 } catch (RemoteException e) { 3690 Log.e(TAG, "Error calling ITelephony#answerRingingCall", e); 3691 } 3692 } 3693 3694 /** @hide */ 3695 @SystemApi 3696 public void silenceRinger() { 3697 try { 3698 getTelecomService().silenceRinger(); 3699 } catch (RemoteException e) { 3700 Log.e(TAG, "Error calling ITelecomService#silenceRinger", e); 3701 } 3702 } 3703 3704 /** @hide */ 3705 @SystemApi 3706 public boolean isOffhook() { 3707 try { 3708 ITelephony telephony = getITelephony(); 3709 if (telephony != null) 3710 return telephony.isOffhook(); 3711 } catch (RemoteException e) { 3712 Log.e(TAG, "Error calling ITelephony#isOffhook", e); 3713 } 3714 return false; 3715 } 3716 3717 /** @hide */ 3718 @SystemApi 3719 public boolean isRinging() { 3720 try { 3721 ITelephony telephony = getITelephony(); 3722 if (telephony != null) 3723 return telephony.isRinging(); 3724 } catch (RemoteException e) { 3725 Log.e(TAG, "Error calling ITelephony#isRinging", e); 3726 } 3727 return false; 3728 } 3729 3730 /** @hide */ 3731 @SystemApi 3732 public boolean isIdle() { 3733 try { 3734 ITelephony telephony = getITelephony(); 3735 if (telephony != null) 3736 return telephony.isIdle(); 3737 } catch (RemoteException e) { 3738 Log.e(TAG, "Error calling ITelephony#isIdle", e); 3739 } 3740 return true; 3741 } 3742 3743 /** @hide */ 3744 @SystemApi 3745 public boolean isRadioOn() { 3746 try { 3747 ITelephony telephony = getITelephony(); 3748 if (telephony != null) 3749 return telephony.isRadioOn(); 3750 } catch (RemoteException e) { 3751 Log.e(TAG, "Error calling ITelephony#isRadioOn", e); 3752 } 3753 return false; 3754 } 3755 3756 /** @hide */ 3757 @SystemApi 3758 public boolean isSimPinEnabled() { 3759 try { 3760 ITelephony telephony = getITelephony(); 3761 if (telephony != null) 3762 return telephony.isSimPinEnabled(); 3763 } catch (RemoteException e) { 3764 Log.e(TAG, "Error calling ITelephony#isSimPinEnabled", e); 3765 } 3766 return false; 3767 } 3768 3769 /** @hide */ 3770 @SystemApi 3771 public boolean supplyPin(String pin) { 3772 try { 3773 ITelephony telephony = getITelephony(); 3774 if (telephony != null) 3775 return telephony.supplyPin(pin); 3776 } catch (RemoteException e) { 3777 Log.e(TAG, "Error calling ITelephony#supplyPin", e); 3778 } 3779 return false; 3780 } 3781 3782 /** @hide */ 3783 @SystemApi 3784 public boolean supplyPuk(String puk, String pin) { 3785 try { 3786 ITelephony telephony = getITelephony(); 3787 if (telephony != null) 3788 return telephony.supplyPuk(puk, pin); 3789 } catch (RemoteException e) { 3790 Log.e(TAG, "Error calling ITelephony#supplyPuk", e); 3791 } 3792 return false; 3793 } 3794 3795 /** @hide */ 3796 @SystemApi 3797 public int[] supplyPinReportResult(String pin) { 3798 try { 3799 ITelephony telephony = getITelephony(); 3800 if (telephony != null) 3801 return telephony.supplyPinReportResult(pin); 3802 } catch (RemoteException e) { 3803 Log.e(TAG, "Error calling ITelephony#supplyPinReportResult", e); 3804 } 3805 return new int[0]; 3806 } 3807 3808 /** @hide */ 3809 @SystemApi 3810 public int[] supplyPukReportResult(String puk, String pin) { 3811 try { 3812 ITelephony telephony = getITelephony(); 3813 if (telephony != null) 3814 return telephony.supplyPukReportResult(puk, pin); 3815 } catch (RemoteException e) { 3816 Log.e(TAG, "Error calling ITelephony#]", e); 3817 } 3818 return new int[0]; 3819 } 3820 3821 /** @hide */ 3822 @SystemApi 3823 public boolean handlePinMmi(String dialString) { 3824 try { 3825 ITelephony telephony = getITelephony(); 3826 if (telephony != null) 3827 return telephony.handlePinMmi(dialString); 3828 } catch (RemoteException e) { 3829 Log.e(TAG, "Error calling ITelephony#handlePinMmi", e); 3830 } 3831 return false; 3832 } 3833 3834 /** @hide */ 3835 @SystemApi 3836 public boolean handlePinMmiForSubscriber(int subId, String dialString) { 3837 try { 3838 ITelephony telephony = getITelephony(); 3839 if (telephony != null) 3840 return telephony.handlePinMmiForSubscriber(subId, dialString); 3841 } catch (RemoteException e) { 3842 Log.e(TAG, "Error calling ITelephony#handlePinMmi", e); 3843 } 3844 return false; 3845 } 3846 3847 /** @hide */ 3848 @SystemApi 3849 public void toggleRadioOnOff() { 3850 try { 3851 ITelephony telephony = getITelephony(); 3852 if (telephony != null) 3853 telephony.toggleRadioOnOff(); 3854 } catch (RemoteException e) { 3855 Log.e(TAG, "Error calling ITelephony#toggleRadioOnOff", e); 3856 } 3857 } 3858 3859 /** @hide */ 3860 @SystemApi 3861 public boolean setRadio(boolean turnOn) { 3862 try { 3863 ITelephony telephony = getITelephony(); 3864 if (telephony != null) 3865 return telephony.setRadio(turnOn); 3866 } catch (RemoteException e) { 3867 Log.e(TAG, "Error calling ITelephony#setRadio", e); 3868 } 3869 return false; 3870 } 3871 3872 /** @hide */ 3873 @SystemApi 3874 public boolean setRadioPower(boolean turnOn) { 3875 try { 3876 ITelephony telephony = getITelephony(); 3877 if (telephony != null) 3878 return telephony.setRadioPower(turnOn); 3879 } catch (RemoteException e) { 3880 Log.e(TAG, "Error calling ITelephony#setRadioPower", e); 3881 } 3882 return false; 3883 } 3884 3885 /** @hide */ 3886 @SystemApi 3887 public void updateServiceLocation() { 3888 try { 3889 ITelephony telephony = getITelephony(); 3890 if (telephony != null) 3891 telephony.updateServiceLocation(); 3892 } catch (RemoteException e) { 3893 Log.e(TAG, "Error calling ITelephony#updateServiceLocation", e); 3894 } 3895 } 3896 3897 /** @hide */ 3898 @SystemApi 3899 public boolean enableDataConnectivity() { 3900 try { 3901 ITelephony telephony = getITelephony(); 3902 if (telephony != null) 3903 return telephony.enableDataConnectivity(); 3904 } catch (RemoteException e) { 3905 Log.e(TAG, "Error calling ITelephony#enableDataConnectivity", e); 3906 } 3907 return false; 3908 } 3909 3910 /** @hide */ 3911 @SystemApi 3912 public boolean disableDataConnectivity() { 3913 try { 3914 ITelephony telephony = getITelephony(); 3915 if (telephony != null) 3916 return telephony.disableDataConnectivity(); 3917 } catch (RemoteException e) { 3918 Log.e(TAG, "Error calling ITelephony#disableDataConnectivity", e); 3919 } 3920 return false; 3921 } 3922 3923 /** @hide */ 3924 @SystemApi 3925 public boolean isDataConnectivityPossible() { 3926 try { 3927 ITelephony telephony = getITelephony(); 3928 if (telephony != null) 3929 return telephony.isDataConnectivityPossible(); 3930 } catch (RemoteException e) { 3931 Log.e(TAG, "Error calling ITelephony#isDataConnectivityPossible", e); 3932 } 3933 return false; 3934 } 3935 3936 /** @hide */ 3937 @SystemApi 3938 public boolean needsOtaServiceProvisioning() { 3939 try { 3940 ITelephony telephony = getITelephony(); 3941 if (telephony != null) 3942 return telephony.needsOtaServiceProvisioning(); 3943 } catch (RemoteException e) { 3944 Log.e(TAG, "Error calling ITelephony#needsOtaServiceProvisioning", e); 3945 } 3946 return false; 3947 } 3948 3949 /** @hide */ 3950 @SystemApi 3951 public void setDataEnabled(boolean enable) { 3952 setDataEnabled(SubscriptionManager.getDefaultDataSubId(), enable); 3953 } 3954 3955 /** @hide */ 3956 @SystemApi 3957 public void setDataEnabled(int subId, boolean enable) { 3958 try { 3959 Log.d(TAG, "setDataEnabled: enabled=" + enable); 3960 ITelephony telephony = getITelephony(); 3961 if (telephony != null) 3962 telephony.setDataEnabled(subId, enable); 3963 } catch (RemoteException e) { 3964 Log.e(TAG, "Error calling ITelephony#setDataEnabled", e); 3965 } 3966 } 3967 3968 /** @hide */ 3969 @SystemApi 3970 public boolean getDataEnabled() { 3971 return getDataEnabled(SubscriptionManager.getDefaultDataSubId()); 3972 } 3973 3974 /** @hide */ 3975 @SystemApi 3976 public boolean getDataEnabled(int subId) { 3977 boolean retVal = false; 3978 try { 3979 ITelephony telephony = getITelephony(); 3980 if (telephony != null) 3981 retVal = telephony.getDataEnabled(subId); 3982 } catch (RemoteException e) { 3983 Log.e(TAG, "Error calling ITelephony#getDataEnabled", e); 3984 } catch (NullPointerException e) { 3985 } 3986 Log.d(TAG, "getDataEnabled: retVal=" + retVal); 3987 return retVal; 3988 } 3989 3990 /** 3991 * Returns the result and response from RIL for oem request 3992 * 3993 * @param oemReq the data is sent to ril. 3994 * @param oemResp the respose data from RIL. 3995 * @return negative value request was not handled or get error 3996 * 0 request was handled succesfully, but no response data 3997 * positive value success, data length of response 3998 * @hide 3999 */ 4000 public int invokeOemRilRequestRaw(byte[] oemReq, byte[] oemResp) { 4001 try { 4002 ITelephony telephony = getITelephony(); 4003 if (telephony != null) 4004 return telephony.invokeOemRilRequestRaw(oemReq, oemResp); 4005 } catch (RemoteException ex) { 4006 } catch (NullPointerException ex) { 4007 } 4008 return -1; 4009 } 4010 4011 /** @hide */ 4012 @SystemApi 4013 public void enableVideoCalling(boolean enable) { 4014 try { 4015 ITelephony telephony = getITelephony(); 4016 if (telephony != null) 4017 telephony.enableVideoCalling(enable); 4018 } catch (RemoteException e) { 4019 Log.e(TAG, "Error calling ITelephony#enableVideoCalling", e); 4020 } 4021 } 4022 4023 /** @hide */ 4024 @SystemApi 4025 public boolean isVideoCallingEnabled() { 4026 try { 4027 ITelephony telephony = getITelephony(); 4028 if (telephony != null) 4029 return telephony.isVideoCallingEnabled(); 4030 } catch (RemoteException e) { 4031 Log.e(TAG, "Error calling ITelephony#isVideoCallingEnabled", e); 4032 } 4033 return false; 4034 } 4035 4036 /** 4037 * Whether the device supports configuring the DTMF tone length. 4038 * 4039 * @return {@code true} if the DTMF tone length can be changed, and {@code false} otherwise. 4040 */ 4041 public boolean canChangeDtmfToneLength() { 4042 try { 4043 ITelephony telephony = getITelephony(); 4044 if (telephony != null) { 4045 return telephony.canChangeDtmfToneLength(); 4046 } 4047 } catch (RemoteException e) { 4048 Log.e(TAG, "Error calling ITelephony#canChangeDtmfToneLength", e); 4049 } 4050 return false; 4051 } 4052 4053 /** 4054 * Whether the device is a world phone. 4055 * 4056 * @return {@code true} if the device is a world phone, and {@code false} otherwise. 4057 */ 4058 public boolean isWorldPhone() { 4059 try { 4060 ITelephony telephony = getITelephony(); 4061 if (telephony != null) { 4062 return telephony.isWorldPhone(); 4063 } 4064 } catch (RemoteException e) { 4065 Log.e(TAG, "Error calling ITelephony#isWorldPhone", e); 4066 } 4067 return false; 4068 } 4069 4070 /** 4071 * Whether the phone supports TTY mode. 4072 * 4073 * @return {@code true} if the device supports TTY mode, and {@code false} otherwise. 4074 */ 4075 public boolean isTtyModeSupported() { 4076 try { 4077 ITelephony telephony = getITelephony(); 4078 if (telephony != null) { 4079 return telephony.isTtyModeSupported(); 4080 } 4081 } catch (RemoteException e) { 4082 Log.e(TAG, "Error calling ITelephony#isTtyModeSupported", e); 4083 } 4084 return false; 4085 } 4086 4087 /** 4088 * Whether the phone supports hearing aid compatibility. 4089 * 4090 * @return {@code true} if the device supports hearing aid compatibility, and {@code false} 4091 * otherwise. 4092 */ 4093 public boolean isHearingAidCompatibilitySupported() { 4094 try { 4095 ITelephony telephony = getITelephony(); 4096 if (telephony != null) { 4097 return telephony.isHearingAidCompatibilitySupported(); 4098 } 4099 } catch (RemoteException e) { 4100 Log.e(TAG, "Error calling ITelephony#isHearingAidCompatibilitySupported", e); 4101 } 4102 return false; 4103 } 4104 4105 /** 4106 * This function retrieves value for setting "name+subId", and if that is not found 4107 * retrieves value for setting "name", and if that is not found throws 4108 * SettingNotFoundException 4109 * 4110 * @hide */ 4111 public static int getIntWithSubId(ContentResolver cr, String name, int subId) 4112 throws SettingNotFoundException { 4113 try { 4114 return Settings.Global.getInt(cr, name + subId); 4115 } catch (SettingNotFoundException e) { 4116 try { 4117 int val = Settings.Global.getInt(cr, name); 4118 Settings.Global.putInt(cr, name + subId, val); 4119 4120 /* We are now moving from 'setting' to 'setting+subId', and using the value stored 4121 * for 'setting' as default. Reset the default (since it may have a user set 4122 * value). */ 4123 int default_val = val; 4124 if (name.equals(Settings.Global.MOBILE_DATA)) { 4125 default_val = "true".equalsIgnoreCase( 4126 SystemProperties.get("ro.com.android.mobiledata", "true")) ? 1 : 0; 4127 } else if (name.equals(Settings.Global.DATA_ROAMING)) { 4128 default_val = "true".equalsIgnoreCase( 4129 SystemProperties.get("ro.com.android.dataroaming", "false")) ? 1 : 0; 4130 } 4131 4132 if (default_val != val) { 4133 Settings.Global.putInt(cr, name, default_val); 4134 } 4135 4136 return val; 4137 } catch (SettingNotFoundException exc) { 4138 throw new SettingNotFoundException(name); 4139 } 4140 } 4141 } 4142 4143 /** 4144 * Returns the IMS Registration Status 4145 * @hide 4146 */ 4147 public boolean isImsRegistered() { 4148 try { 4149 ITelephony telephony = getITelephony(); 4150 if (telephony == null) 4151 return false; 4152 return telephony.isImsRegistered(); 4153 } catch (RemoteException ex) { 4154 return false; 4155 } catch (NullPointerException ex) { 4156 return false; 4157 } 4158 } 4159 4160 /** 4161 * Returns the Status of Volte 4162 *@hide 4163 */ 4164 public boolean isVolteEnabled() { 4165 try { 4166 return getITelephony().isVolteEnabled(); 4167 } catch (RemoteException ex) { 4168 return false; 4169 } catch (NullPointerException ex) { 4170 return false; 4171 } 4172 } 4173 4174 /** 4175 * Returns the Status of Wi-Fi Calling 4176 *@hide 4177 */ 4178 public boolean isWifiCallingEnabled() { 4179 try { 4180 return getITelephony().isWifiCallingEnabled(); 4181 } catch (RemoteException ex) { 4182 return false; 4183 } catch (NullPointerException ex) { 4184 return false; 4185 } 4186 } 4187 4188 /** 4189 * Set TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC for the default phone. 4190 * 4191 * @hide 4192 */ 4193 public void setSimOperatorNumeric(String numeric) { 4194 int phoneId = getDefaultPhone(); 4195 setSimOperatorNumericForPhone(phoneId, numeric); 4196 } 4197 4198 /** 4199 * Set TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC for the given phone. 4200 * 4201 * @hide 4202 */ 4203 public void setSimOperatorNumericForPhone(int phoneId, String numeric) { 4204 setTelephonyProperty(phoneId, 4205 TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC, numeric); 4206 } 4207 4208 /** 4209 * Set TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC for the default phone. 4210 * 4211 * @hide 4212 */ 4213 public void setSimOperatorName(String name) { 4214 int phoneId = getDefaultPhone(); 4215 setSimOperatorNameForPhone(phoneId, name); 4216 } 4217 4218 /** 4219 * Set TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC for the given phone. 4220 * 4221 * @hide 4222 */ 4223 public void setSimOperatorNameForPhone(int phoneId, String name) { 4224 setTelephonyProperty(phoneId, 4225 TelephonyProperties.PROPERTY_ICC_OPERATOR_ALPHA, name); 4226 } 4227 4228 /** 4229 * Set TelephonyProperties.PROPERTY_ICC_OPERATOR_ISO_COUNTRY for the default phone. 4230 * 4231 * @hide 4232 */ 4233 public void setSimCountryIso(String iso) { 4234 int phoneId = getDefaultPhone(); 4235 setSimCountryIsoForPhone(phoneId, iso); 4236 } 4237 4238 /** 4239 * Set TelephonyProperties.PROPERTY_ICC_OPERATOR_ISO_COUNTRY for the given phone. 4240 * 4241 * @hide 4242 */ 4243 public void setSimCountryIsoForPhone(int phoneId, String iso) { 4244 setTelephonyProperty(phoneId, 4245 TelephonyProperties.PROPERTY_ICC_OPERATOR_ISO_COUNTRY, iso); 4246 } 4247 4248 /** 4249 * Set TelephonyProperties.PROPERTY_SIM_STATE for the default phone. 4250 * 4251 * @hide 4252 */ 4253 public void setSimState(String state) { 4254 int phoneId = getDefaultPhone(); 4255 setSimStateForPhone(phoneId, state); 4256 } 4257 4258 /** 4259 * Set TelephonyProperties.PROPERTY_SIM_STATE for the given phone. 4260 * 4261 * @hide 4262 */ 4263 public void setSimStateForPhone(int phoneId, String state) { 4264 setTelephonyProperty(phoneId, 4265 TelephonyProperties.PROPERTY_SIM_STATE, state); 4266 } 4267 4268 /** 4269 * Set baseband version for the default phone. 4270 * 4271 * @param version baseband version 4272 * @hide 4273 */ 4274 public void setBasebandVersion(String version) { 4275 int phoneId = getDefaultPhone(); 4276 setBasebandVersionForPhone(phoneId, version); 4277 } 4278 4279 /** 4280 * Set baseband version by phone id. 4281 * 4282 * @param phoneId for which baseband version is set 4283 * @param version baseband version 4284 * @hide 4285 */ 4286 public void setBasebandVersionForPhone(int phoneId, String version) { 4287 if (SubscriptionManager.isValidPhoneId(phoneId)) { 4288 String prop = TelephonyProperties.PROPERTY_BASEBAND_VERSION + 4289 ((phoneId == 0) ? "" : Integer.toString(phoneId)); 4290 SystemProperties.set(prop, version); 4291 } 4292 } 4293 4294 /** 4295 * Set phone type for the default phone. 4296 * 4297 * @param type phone type 4298 * 4299 * @hide 4300 */ 4301 public void setPhoneType(int type) { 4302 int phoneId = getDefaultPhone(); 4303 setPhoneType(phoneId, type); 4304 } 4305 4306 /** 4307 * Set phone type by phone id. 4308 * 4309 * @param phoneId for which phone type is set 4310 * @param type phone type 4311 * 4312 * @hide 4313 */ 4314 public void setPhoneType(int phoneId, int type) { 4315 if (SubscriptionManager.isValidPhoneId(phoneId)) { 4316 TelephonyManager.setTelephonyProperty(phoneId, 4317 TelephonyProperties.CURRENT_ACTIVE_PHONE, String.valueOf(type)); 4318 } 4319 } 4320 4321 /** 4322 * Get OTASP number schema for the default phone. 4323 * 4324 * @param defaultValue default value 4325 * @return OTA SP number schema 4326 * 4327 * @hide 4328 */ 4329 public String getOtaSpNumberSchema(String defaultValue) { 4330 int phoneId = getDefaultPhone(); 4331 return getOtaSpNumberSchemaForPhone(phoneId, defaultValue); 4332 } 4333 4334 /** 4335 * Get OTASP number schema by phone id. 4336 * 4337 * @param phoneId for which OTA SP number schema is get 4338 * @param defaultValue default value 4339 * @return OTA SP number schema 4340 * 4341 * @hide 4342 */ 4343 public String getOtaSpNumberSchemaForPhone(int phoneId, String defaultValue) { 4344 if (SubscriptionManager.isValidPhoneId(phoneId)) { 4345 return TelephonyManager.getTelephonyProperty(phoneId, 4346 TelephonyProperties.PROPERTY_OTASP_NUM_SCHEMA, defaultValue); 4347 } 4348 4349 return defaultValue; 4350 } 4351 4352 /** 4353 * Get SMS receive capable from system property for the default phone. 4354 * 4355 * @param defaultValue default value 4356 * @return SMS receive capable 4357 * 4358 * @hide 4359 */ 4360 public boolean getSmsReceiveCapable(boolean defaultValue) { 4361 int phoneId = getDefaultPhone(); 4362 return getSmsReceiveCapableForPhone(phoneId, defaultValue); 4363 } 4364 4365 /** 4366 * Get SMS receive capable from system property by phone id. 4367 * 4368 * @param phoneId for which SMS receive capable is get 4369 * @param defaultValue default value 4370 * @return SMS receive capable 4371 * 4372 * @hide 4373 */ 4374 public boolean getSmsReceiveCapableForPhone(int phoneId, boolean defaultValue) { 4375 if (SubscriptionManager.isValidPhoneId(phoneId)) { 4376 return Boolean.valueOf(TelephonyManager.getTelephonyProperty(phoneId, 4377 TelephonyProperties.PROPERTY_SMS_RECEIVE, String.valueOf(defaultValue))); 4378 } 4379 4380 return defaultValue; 4381 } 4382 4383 /** 4384 * Get SMS send capable from system property for the default phone. 4385 * 4386 * @param defaultValue default value 4387 * @return SMS send capable 4388 * 4389 * @hide 4390 */ 4391 public boolean getSmsSendCapable(boolean defaultValue) { 4392 int phoneId = getDefaultPhone(); 4393 return getSmsSendCapableForPhone(phoneId, defaultValue); 4394 } 4395 4396 /** 4397 * Get SMS send capable from system property by phone id. 4398 * 4399 * @param phoneId for which SMS send capable is get 4400 * @param defaultValue default value 4401 * @return SMS send capable 4402 * 4403 * @hide 4404 */ 4405 public boolean getSmsSendCapableForPhone(int phoneId, boolean defaultValue) { 4406 if (SubscriptionManager.isValidPhoneId(phoneId)) { 4407 return Boolean.valueOf(TelephonyManager.getTelephonyProperty(phoneId, 4408 TelephonyProperties.PROPERTY_SMS_SEND, String.valueOf(defaultValue))); 4409 } 4410 4411 return defaultValue; 4412 } 4413 4414 /** 4415 * Set the alphabetic name of current registered operator. 4416 * @param name the alphabetic name of current registered operator. 4417 * @hide 4418 */ 4419 public void setNetworkOperatorName(String name) { 4420 int phoneId = getDefaultPhone(); 4421 setNetworkOperatorNameForPhone(phoneId, name); 4422 } 4423 4424 /** 4425 * Set the alphabetic name of current registered operator. 4426 * @param phoneId which phone you want to set 4427 * @param name the alphabetic name of current registered operator. 4428 * @hide 4429 */ 4430 public void setNetworkOperatorNameForPhone(int phoneId, String name) { 4431 if (SubscriptionManager.isValidPhoneId(phoneId)) { 4432 setTelephonyProperty(phoneId, TelephonyProperties.PROPERTY_OPERATOR_ALPHA, name); 4433 } 4434 } 4435 4436 /** 4437 * Set the numeric name (MCC+MNC) of current registered operator. 4438 * @param operator the numeric name (MCC+MNC) of current registered operator 4439 * @hide 4440 */ 4441 public void setNetworkOperatorNumeric(String numeric) { 4442 int phoneId = getDefaultPhone(); 4443 setNetworkOperatorNumericForPhone(phoneId, numeric); 4444 } 4445 4446 /** 4447 * Set the numeric name (MCC+MNC) of current registered operator. 4448 * @param phoneId for which phone type is set 4449 * @param operator the numeric name (MCC+MNC) of current registered operator 4450 * @hide 4451 */ 4452 public void setNetworkOperatorNumericForPhone(int phoneId, String numeric) { 4453 setTelephonyProperty(phoneId, TelephonyProperties.PROPERTY_OPERATOR_NUMERIC, numeric); 4454 } 4455 4456 /** 4457 * Set roaming state of the current network, for GSM purposes. 4458 * @param isRoaming is network in romaing state or not 4459 * @hide 4460 */ 4461 public void setNetworkRoaming(boolean isRoaming) { 4462 int phoneId = getDefaultPhone(); 4463 setNetworkRoamingForPhone(phoneId, isRoaming); 4464 } 4465 4466 /** 4467 * Set roaming state of the current network, for GSM purposes. 4468 * @param phoneId which phone you want to set 4469 * @param isRoaming is network in romaing state or not 4470 * @hide 4471 */ 4472 public void setNetworkRoamingForPhone(int phoneId, boolean isRoaming) { 4473 if (SubscriptionManager.isValidPhoneId(phoneId)) { 4474 setTelephonyProperty(phoneId, TelephonyProperties.PROPERTY_OPERATOR_ISROAMING, 4475 isRoaming ? "true" : "false"); 4476 } 4477 } 4478 4479 /** 4480 * Set the ISO country code equivalent of the current registered 4481 * operator's MCC (Mobile Country Code). 4482 * @param iso the ISO country code equivalent of the current registered 4483 * @hide 4484 */ 4485 public void setNetworkCountryIso(String iso) { 4486 int phoneId = getDefaultPhone(); 4487 setNetworkCountryIsoForPhone(phoneId, iso); 4488 } 4489 4490 /** 4491 * Set the ISO country code equivalent of the current registered 4492 * operator's MCC (Mobile Country Code). 4493 * @param phoneId which phone you want to set 4494 * @param iso the ISO country code equivalent of the current registered 4495 * @hide 4496 */ 4497 public void setNetworkCountryIsoForPhone(int phoneId, String iso) { 4498 if (SubscriptionManager.isValidPhoneId(phoneId)) { 4499 setTelephonyProperty(phoneId, 4500 TelephonyProperties.PROPERTY_OPERATOR_ISO_COUNTRY, iso); 4501 } 4502 } 4503 4504 /** 4505 * Set the network type currently in use on the device for data transmission. 4506 * @param type the network type currently in use on the device for data transmission 4507 * @hide 4508 */ 4509 public void setDataNetworkType(int type) { 4510 int phoneId = getDefaultPhone(); 4511 setDataNetworkTypeForPhone(phoneId, type); 4512 } 4513 4514 /** 4515 * Set the network type currently in use on the device for data transmission. 4516 * @param phoneId which phone you want to set 4517 * @param type the network type currently in use on the device for data transmission 4518 * @hide 4519 */ 4520 public void setDataNetworkTypeForPhone(int phoneId, int type) { 4521 if (SubscriptionManager.isValidPhoneId(phoneId)) { 4522 setTelephonyProperty(phoneId, 4523 TelephonyProperties.PROPERTY_DATA_NETWORK_TYPE, 4524 ServiceState.rilRadioTechnologyToString(type)); 4525 } 4526 } 4527 4528 /** 4529 * Returns the subscription ID for the given phone account. 4530 * @hide 4531 */ 4532 public int getSubIdForPhoneAccount(PhoneAccount phoneAccount) { 4533 int retval = SubscriptionManager.INVALID_SUBSCRIPTION_ID; 4534 try { 4535 ITelephony service = getITelephony(); 4536 if (service != null) { 4537 retval = service.getSubIdForPhoneAccount(phoneAccount); 4538 } 4539 } catch (RemoteException e) { 4540 } 4541 4542 return retval; 4543 } 4544 4545 /** 4546 * Resets telephony manager settings back to factory defaults. 4547 * 4548 * @hide 4549 */ 4550 public void factoryReset(int subId) { 4551 if (SubscriptionManager.isUsableSubIdValue(subId)) { 4552 // Enable data 4553 setDataEnabled(subId, true); 4554 // Set network selection mode to automatic 4555 setNetworkSelectionModeAutomatic(subId); 4556 // Set preferred mobile network type to the best available 4557 setPreferredNetworkType(subId, RILConstants.PREFERRED_NETWORK_MODE); 4558 // Turn off roaming 4559 SubscriptionManager.from(mContext).setDataRoaming(0, subId); 4560 } 4561 } 4562} 4563