TelephonyManager.java revision 56548d578c05100d87ee7480fe61bc4815a0dacb
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(mContext.getOpPackageName()); 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(mContext.getOpPackageName()); 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 return simState; 1632 } 1633 1634 /** 1635 * Returns the MCC+MNC (mobile country code + mobile network code) of the 1636 * provider of the SIM. 5 or 6 decimal digits. 1637 * <p> 1638 * Availability: SIM state must be {@link #SIM_STATE_READY} 1639 * 1640 * @see #getSimState 1641 */ 1642 public String getSimOperator() { 1643 return getSimOperatorNumeric(); 1644 } 1645 1646 /** 1647 * Returns the MCC+MNC (mobile country code + mobile network code) of the 1648 * provider of the SIM. 5 or 6 decimal digits. 1649 * <p> 1650 * Availability: SIM state must be {@link #SIM_STATE_READY} 1651 * 1652 * @see #getSimState 1653 * 1654 * @param subId for which SimOperator is returned 1655 * @hide 1656 */ 1657 public String getSimOperator(int subId) { 1658 return getSimOperatorNumericForSubscription(subId); 1659 } 1660 1661 /** 1662 * Returns the MCC+MNC (mobile country code + mobile network code) of the 1663 * provider of the SIM. 5 or 6 decimal digits. 1664 * <p> 1665 * Availability: SIM state must be {@link #SIM_STATE_READY} 1666 * 1667 * @see #getSimState 1668 * @hide 1669 */ 1670 public String getSimOperatorNumeric() { 1671 int subId = SubscriptionManager.getDefaultDataSubId(); 1672 if (!SubscriptionManager.isUsableSubIdValue(subId)) { 1673 subId = SubscriptionManager.getDefaultSmsSubId(); 1674 if (!SubscriptionManager.isUsableSubIdValue(subId)) { 1675 subId = SubscriptionManager.getDefaultVoiceSubId(); 1676 if (!SubscriptionManager.isUsableSubIdValue(subId)) { 1677 subId = SubscriptionManager.getDefaultSubId(); 1678 } 1679 } 1680 } 1681 return getSimOperatorNumericForSubscription(subId); 1682 } 1683 1684 /** 1685 * Returns the MCC+MNC (mobile country code + mobile network code) of the 1686 * provider of the SIM for a particular subscription. 5 or 6 decimal digits. 1687 * <p> 1688 * Availability: SIM state must be {@link #SIM_STATE_READY} 1689 * 1690 * @see #getSimState 1691 * 1692 * @param subId for which SimOperator is returned 1693 * @hide 1694 */ 1695 public String getSimOperatorNumericForSubscription(int subId) { 1696 int phoneId = SubscriptionManager.getPhoneId(subId); 1697 return getSimOperatorNumericForPhone(phoneId); 1698 } 1699 1700 /** 1701 * Returns the MCC+MNC (mobile country code + mobile network code) of the 1702 * provider of the SIM for a particular subscription. 5 or 6 decimal digits. 1703 * <p> 1704 * 1705 * @param phoneId for which SimOperator is returned 1706 * @hide 1707 */ 1708 public String getSimOperatorNumericForPhone(int phoneId) { 1709 return getTelephonyProperty(phoneId, 1710 TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC, ""); 1711 } 1712 1713 /** 1714 * Returns the Service Provider Name (SPN). 1715 * <p> 1716 * Availability: SIM state must be {@link #SIM_STATE_READY} 1717 * 1718 * @see #getSimState 1719 */ 1720 public String getSimOperatorName() { 1721 return getSimOperatorNameForPhone(getDefaultPhone()); 1722 } 1723 1724 /** 1725 * Returns the Service Provider Name (SPN). 1726 * <p> 1727 * Availability: SIM state must be {@link #SIM_STATE_READY} 1728 * 1729 * @see #getSimState 1730 * 1731 * @param subId for which SimOperatorName is returned 1732 * @hide 1733 */ 1734 public String getSimOperatorNameForSubscription(int subId) { 1735 int phoneId = SubscriptionManager.getPhoneId(subId); 1736 return getSimOperatorNameForPhone(phoneId); 1737 } 1738 1739 /** 1740 * Returns the Service Provider Name (SPN). 1741 * 1742 * @hide 1743 */ 1744 public String getSimOperatorNameForPhone(int phoneId) { 1745 return getTelephonyProperty(phoneId, 1746 TelephonyProperties.PROPERTY_ICC_OPERATOR_ALPHA, ""); 1747 } 1748 1749 /** 1750 * Returns the ISO country code equivalent for the SIM provider's country code. 1751 */ 1752 public String getSimCountryIso() { 1753 return getSimCountryIsoForPhone(getDefaultPhone()); 1754 } 1755 1756 /** 1757 * Returns the ISO country code equivalent for the SIM provider's country code. 1758 * 1759 * @param subId for which SimCountryIso is returned 1760 * 1761 * @hide 1762 */ 1763 public String getSimCountryIso(int subId) { 1764 return getSimCountryIsoForSubscription(subId); 1765 } 1766 1767 /** 1768 * Returns the ISO country code equivalent for the SIM provider's country code. 1769 * 1770 * @param subId for which SimCountryIso is returned 1771 * 1772 * @hide 1773 */ 1774 public String getSimCountryIsoForSubscription(int subId) { 1775 int phoneId = SubscriptionManager.getPhoneId(subId); 1776 return getSimCountryIsoForPhone(phoneId); 1777 } 1778 1779 /** 1780 * Returns the ISO country code equivalent for the SIM provider's country code. 1781 * 1782 * @hide 1783 */ 1784 public String getSimCountryIsoForPhone(int phoneId) { 1785 return getTelephonyProperty(phoneId, 1786 TelephonyProperties.PROPERTY_ICC_OPERATOR_ISO_COUNTRY, ""); 1787 } 1788 1789 /** 1790 * Returns the serial number of the SIM, if applicable. Return null if it is 1791 * unavailable. 1792 * <p> 1793 * Requires Permission: 1794 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 1795 */ 1796 public String getSimSerialNumber() { 1797 return getSimSerialNumber(getDefaultSubscription()); 1798 } 1799 1800 /** 1801 * Returns the serial number for the given subscription, if applicable. Return null if it is 1802 * unavailable. 1803 * <p> 1804 * @param subId for which Sim Serial number is returned 1805 * Requires Permission: 1806 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 1807 */ 1808 /** {@hide} */ 1809 public String getSimSerialNumber(int subId) { 1810 try { 1811 IPhoneSubInfo info = getSubscriberInfo(); 1812 if (info == null) 1813 return null; 1814 return info.getIccSerialNumberForSubscriber(subId); 1815 } catch (RemoteException ex) { 1816 return null; 1817 } catch (NullPointerException ex) { 1818 // This could happen before phone restarts due to crashing 1819 return null; 1820 } 1821 } 1822 1823 /** 1824 * Return if the current radio is LTE on CDMA. This 1825 * is a tri-state return value as for a period of time 1826 * the mode may be unknown. 1827 * 1828 * @return {@link PhoneConstants#LTE_ON_CDMA_UNKNOWN}, {@link PhoneConstants#LTE_ON_CDMA_FALSE} 1829 * or {@link PhoneConstants#LTE_ON_CDMA_TRUE} 1830 * 1831 * @hide 1832 */ 1833 public int getLteOnCdmaMode() { 1834 return getLteOnCdmaMode(getDefaultSubscription()); 1835 } 1836 1837 /** 1838 * Return if the current radio is LTE on CDMA for Subscription. This 1839 * is a tri-state return value as for a period of time 1840 * the mode may be unknown. 1841 * 1842 * @param subId for which radio is LTE on CDMA is returned 1843 * @return {@link PhoneConstants#LTE_ON_CDMA_UNKNOWN}, {@link PhoneConstants#LTE_ON_CDMA_FALSE} 1844 * or {@link PhoneConstants#LTE_ON_CDMA_TRUE} 1845 * 1846 */ 1847 /** {@hide} */ 1848 public int getLteOnCdmaMode(int subId) { 1849 try { 1850 ITelephony telephony = getITelephony(); 1851 if (telephony == null) 1852 return PhoneConstants.LTE_ON_CDMA_UNKNOWN; 1853 return telephony.getLteOnCdmaModeForSubscriber(subId); 1854 } catch (RemoteException ex) { 1855 // Assume no ICC card if remote exception which shouldn't happen 1856 return PhoneConstants.LTE_ON_CDMA_UNKNOWN; 1857 } catch (NullPointerException ex) { 1858 // This could happen before phone restarts due to crashing 1859 return PhoneConstants.LTE_ON_CDMA_UNKNOWN; 1860 } 1861 } 1862 1863 // 1864 // 1865 // Subscriber Info 1866 // 1867 // 1868 1869 /** 1870 * Returns the unique subscriber ID, for example, the IMSI for a GSM phone. 1871 * Return null if it is unavailable. 1872 * <p> 1873 * Requires Permission: 1874 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 1875 */ 1876 public String getSubscriberId() { 1877 return getSubscriberId(getDefaultSubscription()); 1878 } 1879 1880 /** 1881 * Returns the unique subscriber ID, for example, the IMSI for a GSM phone 1882 * for a subscription. 1883 * Return null if it is unavailable. 1884 * <p> 1885 * Requires Permission: 1886 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 1887 * 1888 * @param subId whose subscriber id is returned 1889 */ 1890 /** {@hide} */ 1891 public String getSubscriberId(int subId) { 1892 try { 1893 IPhoneSubInfo info = getSubscriberInfo(); 1894 if (info == null) 1895 return null; 1896 return info.getSubscriberIdForSubscriber(subId); 1897 } catch (RemoteException ex) { 1898 return null; 1899 } catch (NullPointerException ex) { 1900 // This could happen before phone restarts due to crashing 1901 return null; 1902 } 1903 } 1904 1905 /** 1906 * Returns the Group Identifier Level1 for a GSM phone. 1907 * Return null if it is unavailable. 1908 * <p> 1909 * Requires Permission: 1910 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 1911 */ 1912 public String getGroupIdLevel1() { 1913 try { 1914 IPhoneSubInfo info = getSubscriberInfo(); 1915 if (info == null) 1916 return null; 1917 return info.getGroupIdLevel1(); 1918 } catch (RemoteException ex) { 1919 return null; 1920 } catch (NullPointerException ex) { 1921 // This could happen before phone restarts due to crashing 1922 return null; 1923 } 1924 } 1925 1926 /** 1927 * Returns the Group Identifier Level1 for a GSM phone for a particular subscription. 1928 * Return null if it is unavailable. 1929 * <p> 1930 * Requires Permission: 1931 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 1932 * 1933 * @param subscription whose subscriber id is returned 1934 */ 1935 /** {@hide} */ 1936 public String getGroupIdLevel1(int subId) { 1937 try { 1938 IPhoneSubInfo info = getSubscriberInfo(); 1939 if (info == null) 1940 return null; 1941 return info.getGroupIdLevel1ForSubscriber(subId); 1942 } catch (RemoteException ex) { 1943 return null; 1944 } catch (NullPointerException ex) { 1945 // This could happen before phone restarts due to crashing 1946 return null; 1947 } 1948 } 1949 1950 /** 1951 * Returns the phone number string for line 1, for example, the MSISDN 1952 * for a GSM phone. Return null if it is unavailable. 1953 * <p> 1954 * Requires Permission: 1955 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 1956 */ 1957 public String getLine1Number() { 1958 return getLine1NumberForSubscriber(getDefaultSubscription()); 1959 } 1960 1961 /** 1962 * Returns the phone number string for line 1, for example, the MSISDN 1963 * for a GSM phone for a particular subscription. Return null if it is unavailable. 1964 * <p> 1965 * Requires Permission: 1966 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 1967 * 1968 * @param subId whose phone number for line 1 is returned 1969 */ 1970 /** {@hide} */ 1971 public String getLine1NumberForSubscriber(int subId) { 1972 String number = null; 1973 try { 1974 ITelephony telephony = getITelephony(); 1975 if (telephony != null) 1976 number = telephony.getLine1NumberForDisplay(subId, mContext.getOpPackageName()); 1977 } catch (RemoteException ex) { 1978 } catch (NullPointerException ex) { 1979 } 1980 if (number != null) { 1981 return number; 1982 } 1983 try { 1984 IPhoneSubInfo info = getSubscriberInfo(); 1985 if (info == null) 1986 return null; 1987 return info.getLine1NumberForSubscriber(subId); 1988 } catch (RemoteException ex) { 1989 return null; 1990 } catch (NullPointerException ex) { 1991 // This could happen before phone restarts due to crashing 1992 return null; 1993 } 1994 } 1995 1996 /** 1997 * Set the line 1 phone number string and its alphatag for the current ICCID 1998 * for display purpose only, for example, displayed in Phone Status. It won't 1999 * change the actual MSISDN/MDN. To unset alphatag or number, pass in a null 2000 * value. 2001 * 2002 * <p>Requires that the calling app has carrier privileges. 2003 * @see #hasCarrierPrivileges 2004 * 2005 * @param alphaTag alpha-tagging of the dailing nubmer 2006 * @param number The dialing number 2007 * @return true if the operation was executed correctly. 2008 */ 2009 public boolean setLine1NumberForDisplay(String alphaTag, String number) { 2010 return setLine1NumberForDisplayForSubscriber(getDefaultSubscription(), alphaTag, number); 2011 } 2012 2013 /** 2014 * Set the line 1 phone number string and its alphatag for the current ICCID 2015 * for display purpose only, for example, displayed in Phone Status. It won't 2016 * change the actual MSISDN/MDN. To unset alphatag or number, pass in a null 2017 * value. 2018 * 2019 * <p>Requires that the calling app has carrier privileges. 2020 * @see #hasCarrierPrivileges 2021 * 2022 * @param subId the subscriber that the alphatag and dialing number belongs to. 2023 * @param alphaTag alpha-tagging of the dailing nubmer 2024 * @param number The dialing number 2025 * @return true if the operation was executed correctly. 2026 * @hide 2027 */ 2028 public boolean setLine1NumberForDisplayForSubscriber(int subId, String alphaTag, String number) { 2029 try { 2030 ITelephony telephony = getITelephony(); 2031 if (telephony != null) 2032 return telephony.setLine1NumberForDisplayForSubscriber(subId, alphaTag, number); 2033 } catch (RemoteException ex) { 2034 } catch (NullPointerException ex) { 2035 } 2036 return false; 2037 } 2038 2039 /** 2040 * Informs the system of an intentional upcoming carrier network change by 2041 * a carrier app. This call is optional and is only used to allow the 2042 * system to provide alternative UI while telephony is performing an action 2043 * that may result in intentional, temporary network lack of connectivity. 2044 * <p> 2045 * Based on the active parameter passed in, this method will either show or 2046 * hide the alternative UI. There is no timeout associated with showing 2047 * this UX, so a carrier app must be sure to call with active set to false 2048 * sometime after calling with it set to true. 2049 * <p> 2050 * Requires Permission: 2051 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 2052 * Or the calling app has carrier privileges. 2053 * @see #hasCarrierPrivileges 2054 * 2055 * @param active Whether the carrier network change is or shortly will be 2056 * active. Set this value to true to begin showing 2057 * alternative UI and false to stop. 2058 */ 2059 public void notifyCarrierNetworkChange(boolean active) { 2060 try { 2061 if (sRegistry != null) 2062 sRegistry.notifyCarrierNetworkChange(active); 2063 } catch (RemoteException ex) { 2064 } catch (NullPointerException ex) { 2065 } 2066 } 2067 2068 /** 2069 * Returns the alphabetic identifier associated with the line 1 number. 2070 * Return null if it is unavailable. 2071 * <p> 2072 * Requires Permission: 2073 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 2074 * @hide 2075 * nobody seems to call this. 2076 */ 2077 public String getLine1AlphaTag() { 2078 return getLine1AlphaTagForSubscriber(getDefaultSubscription()); 2079 } 2080 2081 /** 2082 * Returns the alphabetic identifier associated with the line 1 number 2083 * for a subscription. 2084 * Return null if it is unavailable. 2085 * <p> 2086 * Requires Permission: 2087 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 2088 * @param subId whose alphabetic identifier associated with line 1 is returned 2089 * nobody seems to call this. 2090 */ 2091 /** {@hide} */ 2092 public String getLine1AlphaTagForSubscriber(int subId) { 2093 String alphaTag = null; 2094 try { 2095 ITelephony telephony = getITelephony(); 2096 if (telephony != null) 2097 alphaTag = telephony.getLine1AlphaTagForDisplay(subId, 2098 mContext.getOpPackageName()); 2099 } catch (RemoteException ex) { 2100 } catch (NullPointerException ex) { 2101 } 2102 if (alphaTag != null) { 2103 return alphaTag; 2104 } 2105 try { 2106 IPhoneSubInfo info = getSubscriberInfo(); 2107 if (info == null) 2108 return null; 2109 return info.getLine1AlphaTagForSubscriber(subId); 2110 } catch (RemoteException ex) { 2111 return null; 2112 } catch (NullPointerException ex) { 2113 // This could happen before phone restarts due to crashing 2114 return null; 2115 } 2116 } 2117 2118 /** 2119 * Return the set of subscriber IDs that should be considered as "merged 2120 * together" for data usage purposes. This is commonly {@code null} to 2121 * indicate no merging is required. Any returned subscribers are sorted in a 2122 * deterministic order. 2123 * 2124 * @hide 2125 */ 2126 public @Nullable String[] getMergedSubscriberIds() { 2127 try { 2128 ITelephony telephony = getITelephony(); 2129 if (telephony != null) 2130 return telephony.getMergedSubscriberIds(); 2131 } catch (RemoteException ex) { 2132 } catch (NullPointerException ex) { 2133 } 2134 return null; 2135 } 2136 2137 /** 2138 * Returns the MSISDN string. 2139 * for a GSM phone. Return null if it is unavailable. 2140 * <p> 2141 * Requires Permission: 2142 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 2143 * 2144 * @hide 2145 */ 2146 public String getMsisdn() { 2147 return getMsisdn(getDefaultSubscription()); 2148 } 2149 2150 /** 2151 * Returns the MSISDN string. 2152 * for a GSM phone. Return null if it is unavailable. 2153 * <p> 2154 * Requires Permission: 2155 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 2156 * 2157 * @param subId for which msisdn is returned 2158 */ 2159 /** {@hide} */ 2160 public String getMsisdn(int subId) { 2161 try { 2162 IPhoneSubInfo info = getSubscriberInfo(); 2163 if (info == null) 2164 return null; 2165 return info.getMsisdnForSubscriber(subId); 2166 } catch (RemoteException ex) { 2167 return null; 2168 } catch (NullPointerException ex) { 2169 // This could happen before phone restarts due to crashing 2170 return null; 2171 } 2172 } 2173 2174 /** 2175 * Returns the voice mail number. Return null if it is unavailable. 2176 * <p> 2177 * Requires Permission: 2178 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 2179 */ 2180 public String getVoiceMailNumber() { 2181 return getVoiceMailNumber(getDefaultSubscription()); 2182 } 2183 2184 /** 2185 * Returns the voice mail number for a subscription. 2186 * Return null if it is unavailable. 2187 * <p> 2188 * Requires Permission: 2189 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 2190 * @param subId whose voice mail number is returned 2191 */ 2192 /** {@hide} */ 2193 public String getVoiceMailNumber(int subId) { 2194 try { 2195 IPhoneSubInfo info = getSubscriberInfo(); 2196 if (info == null) 2197 return null; 2198 return info.getVoiceMailNumberForSubscriber(subId); 2199 } catch (RemoteException ex) { 2200 return null; 2201 } catch (NullPointerException ex) { 2202 // This could happen before phone restarts due to crashing 2203 return null; 2204 } 2205 } 2206 2207 /** 2208 * Returns the complete voice mail number. Return null if it is unavailable. 2209 * <p> 2210 * Requires Permission: 2211 * {@link android.Manifest.permission#CALL_PRIVILEGED CALL_PRIVILEGED} 2212 * 2213 * @hide 2214 */ 2215 public String getCompleteVoiceMailNumber() { 2216 return getCompleteVoiceMailNumber(getDefaultSubscription()); 2217 } 2218 2219 /** 2220 * Returns the complete voice mail number. Return null if it is unavailable. 2221 * <p> 2222 * Requires Permission: 2223 * {@link android.Manifest.permission#CALL_PRIVILEGED CALL_PRIVILEGED} 2224 * 2225 * @param subId 2226 */ 2227 /** {@hide} */ 2228 public String getCompleteVoiceMailNumber(int subId) { 2229 try { 2230 IPhoneSubInfo info = getSubscriberInfo(); 2231 if (info == null) 2232 return null; 2233 return info.getCompleteVoiceMailNumberForSubscriber(subId); 2234 } catch (RemoteException ex) { 2235 return null; 2236 } catch (NullPointerException ex) { 2237 // This could happen before phone restarts due to crashing 2238 return null; 2239 } 2240 } 2241 2242 /** 2243 * Sets the voice mail number. 2244 * 2245 * <p>Requires that the calling app has carrier privileges. 2246 * @see #hasCarrierPrivileges 2247 * 2248 * @param alphaTag The alpha tag to display. 2249 * @param number The voicemail number. 2250 */ 2251 public boolean setVoiceMailNumber(String alphaTag, String number) { 2252 return setVoiceMailNumber(getDefaultSubscription(), alphaTag, number); 2253 } 2254 2255 /** 2256 * Sets the voicemail number for the given subscriber. 2257 * 2258 * <p>Requires that the calling app has carrier privileges. 2259 * @see #hasCarrierPrivileges 2260 * 2261 * @param subId The subscription id. 2262 * @param alphaTag The alpha tag to display. 2263 * @param number The voicemail number. 2264 */ 2265 /** {@hide} */ 2266 public boolean setVoiceMailNumber(int subId, String alphaTag, String number) { 2267 try { 2268 ITelephony telephony = getITelephony(); 2269 if (telephony != null) 2270 return telephony.setVoiceMailNumber(subId, alphaTag, number); 2271 } catch (RemoteException ex) { 2272 } catch (NullPointerException ex) { 2273 } 2274 return false; 2275 } 2276 2277 /** 2278 * Returns the voice mail count. Return 0 if unavailable. 2279 * <p> 2280 * Requires Permission: 2281 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 2282 * @hide 2283 */ 2284 public int getVoiceMessageCount() { 2285 return getVoiceMessageCount(getDefaultSubscription()); 2286 } 2287 2288 /** 2289 * Returns the voice mail count for a subscription. Return 0 if unavailable. 2290 * <p> 2291 * Requires Permission: 2292 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 2293 * @param subId whose voice message count is returned 2294 */ 2295 /** {@hide} */ 2296 public int getVoiceMessageCount(int subId) { 2297 try { 2298 ITelephony telephony = getITelephony(); 2299 if (telephony == null) 2300 return 0; 2301 return telephony.getVoiceMessageCountForSubscriber(subId); 2302 } catch (RemoteException ex) { 2303 return 0; 2304 } catch (NullPointerException ex) { 2305 // This could happen before phone restarts due to crashing 2306 return 0; 2307 } 2308 } 2309 2310 /** 2311 * Retrieves the alphabetic identifier associated with the voice 2312 * mail number. 2313 * <p> 2314 * Requires Permission: 2315 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 2316 */ 2317 public String getVoiceMailAlphaTag() { 2318 return getVoiceMailAlphaTag(getDefaultSubscription()); 2319 } 2320 2321 /** 2322 * Retrieves the alphabetic identifier associated with the voice 2323 * mail number for a subscription. 2324 * <p> 2325 * Requires Permission: 2326 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 2327 * @param subId whose alphabetic identifier associated with the 2328 * voice mail number is returned 2329 */ 2330 /** {@hide} */ 2331 public String getVoiceMailAlphaTag(int subId) { 2332 try { 2333 IPhoneSubInfo info = getSubscriberInfo(); 2334 if (info == null) 2335 return null; 2336 return info.getVoiceMailAlphaTagForSubscriber(subId); 2337 } catch (RemoteException ex) { 2338 return null; 2339 } catch (NullPointerException ex) { 2340 // This could happen before phone restarts due to crashing 2341 return null; 2342 } 2343 } 2344 2345 /** 2346 * Returns the IMS private user identity (IMPI) that was loaded from the ISIM. 2347 * @return the IMPI, or null if not present or not loaded 2348 * @hide 2349 */ 2350 public String getIsimImpi() { 2351 try { 2352 IPhoneSubInfo info = getSubscriberInfo(); 2353 if (info == null) 2354 return null; 2355 return info.getIsimImpi(); 2356 } catch (RemoteException ex) { 2357 return null; 2358 } catch (NullPointerException ex) { 2359 // This could happen before phone restarts due to crashing 2360 return null; 2361 } 2362 } 2363 2364 /** 2365 * Returns the IMS home network domain name that was loaded from the ISIM. 2366 * @return the IMS domain name, or null if not present or not loaded 2367 * @hide 2368 */ 2369 public String getIsimDomain() { 2370 try { 2371 IPhoneSubInfo info = getSubscriberInfo(); 2372 if (info == null) 2373 return null; 2374 return info.getIsimDomain(); 2375 } catch (RemoteException ex) { 2376 return null; 2377 } catch (NullPointerException ex) { 2378 // This could happen before phone restarts due to crashing 2379 return null; 2380 } 2381 } 2382 2383 /** 2384 * Returns the IMS public user identities (IMPU) that were loaded from the ISIM. 2385 * @return an array of IMPU strings, with one IMPU per string, or null if 2386 * not present or not loaded 2387 * @hide 2388 */ 2389 public String[] getIsimImpu() { 2390 try { 2391 IPhoneSubInfo info = getSubscriberInfo(); 2392 if (info == null) 2393 return null; 2394 return info.getIsimImpu(); 2395 } catch (RemoteException ex) { 2396 return null; 2397 } catch (NullPointerException ex) { 2398 // This could happen before phone restarts due to crashing 2399 return null; 2400 } 2401 } 2402 2403 /** 2404 * @hide 2405 */ 2406 private IPhoneSubInfo getSubscriberInfo() { 2407 // get it each time because that process crashes a lot 2408 return IPhoneSubInfo.Stub.asInterface(ServiceManager.getService("iphonesubinfo")); 2409 } 2410 2411 /** Device call state: No activity. */ 2412 public static final int CALL_STATE_IDLE = 0; 2413 /** Device call state: Ringing. A new call arrived and is 2414 * ringing or waiting. In the latter case, another call is 2415 * already active. */ 2416 public static final int CALL_STATE_RINGING = 1; 2417 /** Device call state: Off-hook. At least one call exists 2418 * that is dialing, active, or on hold, and no calls are ringing 2419 * or waiting. */ 2420 public static final int CALL_STATE_OFFHOOK = 2; 2421 2422 /** 2423 * Returns a constant indicating the call state (cellular) on the device. 2424 */ 2425 public int getCallState() { 2426 return getCallState(getDefaultSubscription()); 2427 } 2428 2429 /** 2430 * Returns a constant indicating the call state (cellular) on the device 2431 * for a subscription. 2432 * 2433 * @param subId whose call state is returned 2434 */ 2435 /** {@hide} */ 2436 public int getCallState(int subId) { 2437 try { 2438 ITelephony telephony = getITelephony(); 2439 if (telephony == null) 2440 return CALL_STATE_IDLE; 2441 return telephony.getCallStateForSubscriber(subId); 2442 } catch (RemoteException ex) { 2443 // the phone process is restarting. 2444 return CALL_STATE_IDLE; 2445 } catch (NullPointerException ex) { 2446 // the phone process is restarting. 2447 return CALL_STATE_IDLE; 2448 } 2449 } 2450 2451 /** Data connection activity: No traffic. */ 2452 public static final int DATA_ACTIVITY_NONE = 0x00000000; 2453 /** Data connection activity: Currently receiving IP PPP traffic. */ 2454 public static final int DATA_ACTIVITY_IN = 0x00000001; 2455 /** Data connection activity: Currently sending IP PPP traffic. */ 2456 public static final int DATA_ACTIVITY_OUT = 0x00000002; 2457 /** Data connection activity: Currently both sending and receiving 2458 * IP PPP traffic. */ 2459 public static final int DATA_ACTIVITY_INOUT = DATA_ACTIVITY_IN | DATA_ACTIVITY_OUT; 2460 /** 2461 * Data connection is active, but physical link is down 2462 */ 2463 public static final int DATA_ACTIVITY_DORMANT = 0x00000004; 2464 2465 /** 2466 * Returns a constant indicating the type of activity on a data connection 2467 * (cellular). 2468 * 2469 * @see #DATA_ACTIVITY_NONE 2470 * @see #DATA_ACTIVITY_IN 2471 * @see #DATA_ACTIVITY_OUT 2472 * @see #DATA_ACTIVITY_INOUT 2473 * @see #DATA_ACTIVITY_DORMANT 2474 */ 2475 public int getDataActivity() { 2476 try { 2477 ITelephony telephony = getITelephony(); 2478 if (telephony == null) 2479 return DATA_ACTIVITY_NONE; 2480 return telephony.getDataActivity(); 2481 } catch (RemoteException ex) { 2482 // the phone process is restarting. 2483 return DATA_ACTIVITY_NONE; 2484 } catch (NullPointerException ex) { 2485 // the phone process is restarting. 2486 return DATA_ACTIVITY_NONE; 2487 } 2488 } 2489 2490 /** Data connection state: Unknown. Used before we know the state. 2491 * @hide 2492 */ 2493 public static final int DATA_UNKNOWN = -1; 2494 /** Data connection state: Disconnected. IP traffic not available. */ 2495 public static final int DATA_DISCONNECTED = 0; 2496 /** Data connection state: Currently setting up a data connection. */ 2497 public static final int DATA_CONNECTING = 1; 2498 /** Data connection state: Connected. IP traffic should be available. */ 2499 public static final int DATA_CONNECTED = 2; 2500 /** Data connection state: Suspended. The connection is up, but IP 2501 * traffic is temporarily unavailable. For example, in a 2G network, 2502 * data activity may be suspended when a voice call arrives. */ 2503 public static final int DATA_SUSPENDED = 3; 2504 2505 /** 2506 * Returns a constant indicating the current data connection state 2507 * (cellular). 2508 * 2509 * @see #DATA_DISCONNECTED 2510 * @see #DATA_CONNECTING 2511 * @see #DATA_CONNECTED 2512 * @see #DATA_SUSPENDED 2513 */ 2514 public int getDataState() { 2515 try { 2516 ITelephony telephony = getITelephony(); 2517 if (telephony == null) 2518 return DATA_DISCONNECTED; 2519 return telephony.getDataState(); 2520 } catch (RemoteException ex) { 2521 // the phone process is restarting. 2522 return DATA_DISCONNECTED; 2523 } catch (NullPointerException ex) { 2524 return DATA_DISCONNECTED; 2525 } 2526 } 2527 2528 /** 2529 * @hide 2530 */ 2531 private ITelephony getITelephony() { 2532 return ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE)); 2533 } 2534 2535 /** 2536 * @hide 2537 */ 2538 private ITelecomService getTelecomService() { 2539 return ITelecomService.Stub.asInterface(ServiceManager.getService(Context.TELECOM_SERVICE)); 2540 } 2541 2542 // 2543 // 2544 // PhoneStateListener 2545 // 2546 // 2547 2548 /** 2549 * Registers a listener object to receive notification of changes 2550 * in specified telephony states. 2551 * <p> 2552 * To register a listener, pass a {@link PhoneStateListener} 2553 * and specify at least one telephony state of interest in 2554 * the events argument. 2555 * 2556 * At registration, and when a specified telephony state 2557 * changes, the telephony manager invokes the appropriate 2558 * callback method on the listener object and passes the 2559 * current (updated) values. 2560 * <p> 2561 * To unregister a listener, pass the listener object and set the 2562 * events argument to 2563 * {@link PhoneStateListener#LISTEN_NONE LISTEN_NONE} (0). 2564 * 2565 * @param listener The {@link PhoneStateListener} object to register 2566 * (or unregister) 2567 * @param events The telephony state(s) of interest to the listener, 2568 * as a bitwise-OR combination of {@link PhoneStateListener} 2569 * LISTEN_ flags. 2570 */ 2571 public void listen(PhoneStateListener listener, int events) { 2572 if (mContext == null) return; 2573 try { 2574 Boolean notifyNow = (getITelephony() != null); 2575 sRegistry.listenForSubscriber(listener.mSubId, mContext.getOpPackageName(), 2576 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(mContext.getOpPackageName()); 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 return propVal == null ? defaultVal : propVal; 3223 } 3224 3225 /** @hide */ 3226 public int getSimCount() { 3227 // FIXME Need to get it from Telephony Dev Controller when that gets implemented! 3228 // and then this method shouldn't be used at all! 3229 if(isMultiSimEnabled()) { 3230 return 2; 3231 } else { 3232 return 1; 3233 } 3234 } 3235 3236 /** 3237 * Returns the IMS Service Table (IST) that was loaded from the ISIM. 3238 * @return IMS Service Table or null if not present or not loaded 3239 * @hide 3240 */ 3241 public String getIsimIst() { 3242 try { 3243 IPhoneSubInfo info = getSubscriberInfo(); 3244 if (info == null) 3245 return null; 3246 return info.getIsimIst(); 3247 } catch (RemoteException ex) { 3248 return null; 3249 } catch (NullPointerException ex) { 3250 // This could happen before phone restarts due to crashing 3251 return null; 3252 } 3253 } 3254 3255 /** 3256 * Returns the IMS Proxy Call Session Control Function(PCSCF) that were loaded from the ISIM. 3257 * @return an array of PCSCF strings with one PCSCF per string, or null if 3258 * not present or not loaded 3259 * @hide 3260 */ 3261 public String[] getIsimPcscf() { 3262 try { 3263 IPhoneSubInfo info = getSubscriberInfo(); 3264 if (info == null) 3265 return null; 3266 return info.getIsimPcscf(); 3267 } catch (RemoteException ex) { 3268 return null; 3269 } catch (NullPointerException ex) { 3270 // This could happen before phone restarts due to crashing 3271 return null; 3272 } 3273 } 3274 3275 /** 3276 * Returns the response of ISIM Authetification through RIL. 3277 * Returns null if the Authentification hasn't been successed or isn't present iphonesubinfo. 3278 * @return the response of ISIM Authetification, or null if not available 3279 * @hide 3280 * @deprecated 3281 * @see getIccSimChallengeResponse with appType=PhoneConstants.APPTYPE_ISIM 3282 */ 3283 public String getIsimChallengeResponse(String nonce){ 3284 try { 3285 IPhoneSubInfo info = getSubscriberInfo(); 3286 if (info == null) 3287 return null; 3288 return info.getIsimChallengeResponse(nonce); 3289 } catch (RemoteException ex) { 3290 return null; 3291 } catch (NullPointerException ex) { 3292 // This could happen before phone restarts due to crashing 3293 return null; 3294 } 3295 } 3296 3297 /** 3298 * Returns the response of SIM Authentication through RIL. 3299 * Returns null if the Authentication hasn't been successful 3300 * @param subId subscription ID to be queried 3301 * @param appType ICC application type (@see com.android.internal.telephony.PhoneConstants#APPTYPE_xxx) 3302 * @param data authentication challenge data 3303 * @return the response of SIM Authentication, or null if not available 3304 * @hide 3305 */ 3306 public String getIccSimChallengeResponse(int subId, int appType, String data) { 3307 try { 3308 IPhoneSubInfo info = getSubscriberInfo(); 3309 if (info == null) 3310 return null; 3311 return info.getIccSimChallengeResponse(subId, appType, data); 3312 } catch (RemoteException ex) { 3313 return null; 3314 } catch (NullPointerException ex) { 3315 // This could happen before phone starts 3316 return null; 3317 } 3318 } 3319 3320 /** 3321 * Returns the response of SIM Authentication through RIL for the default subscription. 3322 * Returns null if the Authentication hasn't been successful 3323 * @param appType ICC application type (@see com.android.internal.telephony.PhoneConstants#APPTYPE_xxx) 3324 * @param data authentication challenge data 3325 * @return the response of SIM Authentication, or null if not available 3326 * @hide 3327 */ 3328 public String getIccSimChallengeResponse(int appType, String data) { 3329 return getIccSimChallengeResponse(getDefaultSubscription(), appType, data); 3330 } 3331 3332 /** 3333 * Get P-CSCF address from PCO after data connection is established or modified. 3334 * @param apnType the apnType, "ims" for IMS APN, "emergency" for EMERGENCY APN 3335 * @return array of P-CSCF address 3336 * @hide 3337 */ 3338 public String[] getPcscfAddress(String apnType) { 3339 try { 3340 ITelephony telephony = getITelephony(); 3341 if (telephony == null) 3342 return new String[0]; 3343 return telephony.getPcscfAddress(apnType, mContext.getOpPackageName()); 3344 } catch (RemoteException e) { 3345 return new String[0]; 3346 } 3347 } 3348 3349 /** 3350 * Set IMS registration state 3351 * 3352 * @param Registration state 3353 * @hide 3354 */ 3355 public void setImsRegistrationState(boolean registered) { 3356 try { 3357 ITelephony telephony = getITelephony(); 3358 if (telephony != null) 3359 telephony.setImsRegistrationState(registered); 3360 } catch (RemoteException e) { 3361 } 3362 } 3363 3364 /** 3365 * Get the preferred network type. 3366 * Used for device configuration by some CDMA operators. 3367 * <p> 3368 * Requires Permission: 3369 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 3370 * Or the calling app has carrier privileges. @see #hasCarrierPrivileges 3371 * 3372 * @return the preferred network type, defined in RILConstants.java. 3373 * @hide 3374 */ 3375 public int getPreferredNetworkType(int subId) { 3376 try { 3377 ITelephony telephony = getITelephony(); 3378 if (telephony != null) 3379 return telephony.getPreferredNetworkType(subId); 3380 } catch (RemoteException ex) { 3381 Rlog.e(TAG, "getPreferredNetworkType RemoteException", ex); 3382 } catch (NullPointerException ex) { 3383 Rlog.e(TAG, "getPreferredNetworkType NPE", ex); 3384 } 3385 return -1; 3386 } 3387 3388 /** 3389 * Sets the network selection mode to automatic. 3390 * <p> 3391 * Requires Permission: 3392 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 3393 * Or the calling app has carrier privileges. @see #hasCarrierPrivileges 3394 * 3395 * @hide 3396 */ 3397 public void setNetworkSelectionModeAutomatic(int subId) { 3398 try { 3399 ITelephony telephony = getITelephony(); 3400 if (telephony != null) 3401 telephony.setNetworkSelectionModeAutomatic(subId); 3402 } catch (RemoteException ex) { 3403 Rlog.e(TAG, "setNetworkSelectionModeAutomatic RemoteException", ex); 3404 } catch (NullPointerException ex) { 3405 Rlog.e(TAG, "setNetworkSelectionModeAutomatic NPE", ex); 3406 } 3407 } 3408 3409 /** 3410 * Set the preferred network type. 3411 * Used for device configuration by some CDMA operators. 3412 * <p> 3413 * Requires Permission: 3414 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 3415 * Or the calling app has carrier privileges. @see #hasCarrierPrivileges 3416 * 3417 * @param subId the id of the subscription to set the preferred network type for. 3418 * @param networkType the preferred network type, defined in RILConstants.java. 3419 * @return true on success; false on any failure. 3420 * @hide 3421 */ 3422 public boolean setPreferredNetworkType(int subId, int networkType) { 3423 try { 3424 ITelephony telephony = getITelephony(); 3425 if (telephony != null) 3426 return telephony.setPreferredNetworkType(subId, networkType); 3427 } catch (RemoteException ex) { 3428 Rlog.e(TAG, "setPreferredNetworkType RemoteException", ex); 3429 } catch (NullPointerException ex) { 3430 Rlog.e(TAG, "setPreferredNetworkType NPE", ex); 3431 } 3432 return false; 3433 } 3434 3435 /** 3436 * Set the preferred network type to global mode which includes LTE, CDMA, EvDo and GSM/WCDMA. 3437 * 3438 * <p> 3439 * Requires that the calling app has carrier privileges. 3440 * @see #hasCarrierPrivileges 3441 * 3442 * @return true on success; false on any failure. 3443 */ 3444 public boolean setPreferredNetworkTypeToGlobal() { 3445 return setPreferredNetworkType(getDefaultSubscription(), 3446 RILConstants.NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA); 3447 } 3448 3449 /** 3450 * Check TETHER_DUN_REQUIRED and TETHER_DUN_APN settings, net.tethering.noprovisioning 3451 * SystemProperty, and config_tether_apndata to decide whether DUN APN is required for 3452 * tethering. 3453 * 3454 * @return 0: Not required. 1: required. 2: Not set. 3455 * @hide 3456 */ 3457 public int getTetherApnRequired() { 3458 try { 3459 ITelephony telephony = getITelephony(); 3460 if (telephony != null) 3461 return telephony.getTetherApnRequired(); 3462 } catch (RemoteException ex) { 3463 Rlog.e(TAG, "hasMatchedTetherApnSetting RemoteException", ex); 3464 } catch (NullPointerException ex) { 3465 Rlog.e(TAG, "hasMatchedTetherApnSetting NPE", ex); 3466 } 3467 return 2; 3468 } 3469 3470 3471 /** 3472 * Values used to return status for hasCarrierPrivileges call. 3473 */ 3474 /** @hide */ 3475 public static final int CARRIER_PRIVILEGE_STATUS_HAS_ACCESS = 1; 3476 /** @hide */ 3477 public static final int CARRIER_PRIVILEGE_STATUS_NO_ACCESS = 0; 3478 /** @hide */ 3479 public static final int CARRIER_PRIVILEGE_STATUS_RULES_NOT_LOADED = -1; 3480 /** @hide */ 3481 public static final int CARRIER_PRIVILEGE_STATUS_ERROR_LOADING_RULES = -2; 3482 3483 /** 3484 * Has the calling application been granted carrier privileges by the carrier. 3485 * 3486 * If any of the packages in the calling UID has carrier privileges, the 3487 * call will return true. This access is granted by the owner of the UICC 3488 * card and does not depend on the registered carrier. 3489 * 3490 * @return true if the app has carrier privileges. 3491 */ 3492 public boolean hasCarrierPrivileges() { 3493 try { 3494 ITelephony telephony = getITelephony(); 3495 if (telephony != null) 3496 return telephony.getCarrierPrivilegeStatus() == CARRIER_PRIVILEGE_STATUS_HAS_ACCESS; 3497 } catch (RemoteException ex) { 3498 Rlog.e(TAG, "hasCarrierPrivileges RemoteException", ex); 3499 } catch (NullPointerException ex) { 3500 Rlog.e(TAG, "hasCarrierPrivileges NPE", ex); 3501 } 3502 return false; 3503 } 3504 3505 /** 3506 * Override the branding for the current ICCID. 3507 * 3508 * Once set, whenever the SIM is present in the device, the service 3509 * provider name (SPN) and the operator name will both be replaced by the 3510 * brand value input. To unset the value, the same function should be 3511 * called with a null brand value. 3512 * 3513 * <p>Requires that the calling app has carrier privileges. 3514 * @see #hasCarrierPrivileges 3515 * 3516 * @param brand The brand name to display/set. 3517 * @return true if the operation was executed correctly. 3518 */ 3519 public boolean setOperatorBrandOverride(String brand) { 3520 try { 3521 ITelephony telephony = getITelephony(); 3522 if (telephony != null) 3523 return telephony.setOperatorBrandOverride(brand); 3524 } catch (RemoteException ex) { 3525 Rlog.e(TAG, "setOperatorBrandOverride RemoteException", ex); 3526 } catch (NullPointerException ex) { 3527 Rlog.e(TAG, "setOperatorBrandOverride NPE", ex); 3528 } 3529 return false; 3530 } 3531 3532 /** 3533 * Override the roaming preference for the current ICCID. 3534 * 3535 * Using this call, the carrier app (see #hasCarrierPrivileges) can override 3536 * the platform's notion of a network operator being considered roaming or not. 3537 * The change only affects the ICCID that was active when this call was made. 3538 * 3539 * If null is passed as any of the input, the corresponding value is deleted. 3540 * 3541 * <p>Requires that the caller have carrier privilege. See #hasCarrierPrivileges. 3542 * 3543 * @param gsmRoamingList - List of MCCMNCs to be considered roaming for 3GPP RATs. 3544 * @param gsmNonRoamingList - List of MCCMNCs to be considered not roaming for 3GPP RATs. 3545 * @param cdmaRoamingList - List of SIDs to be considered roaming for 3GPP2 RATs. 3546 * @param cdmaNonRoamingList - List of SIDs to be considered not roaming for 3GPP2 RATs. 3547 * @return true if the operation was executed correctly. 3548 * 3549 * @hide 3550 */ 3551 public boolean setRoamingOverride(List<String> gsmRoamingList, 3552 List<String> gsmNonRoamingList, List<String> cdmaRoamingList, 3553 List<String> cdmaNonRoamingList) { 3554 try { 3555 ITelephony telephony = getITelephony(); 3556 if (telephony != null) 3557 return telephony.setRoamingOverride(gsmRoamingList, gsmNonRoamingList, 3558 cdmaRoamingList, cdmaNonRoamingList); 3559 } catch (RemoteException ex) { 3560 Rlog.e(TAG, "setRoamingOverride RemoteException", ex); 3561 } catch (NullPointerException ex) { 3562 Rlog.e(TAG, "setRoamingOverride NPE", ex); 3563 } 3564 return false; 3565 } 3566 3567 /** 3568 * Expose the rest of ITelephony to @SystemApi 3569 */ 3570 3571 /** @hide */ 3572 @SystemApi 3573 public String getCdmaMdn() { 3574 return getCdmaMdn(getDefaultSubscription()); 3575 } 3576 3577 /** @hide */ 3578 @SystemApi 3579 public String getCdmaMdn(int subId) { 3580 try { 3581 ITelephony telephony = getITelephony(); 3582 if (telephony == null) 3583 return null; 3584 return telephony.getCdmaMdn(subId); 3585 } catch (RemoteException ex) { 3586 return null; 3587 } catch (NullPointerException ex) { 3588 return null; 3589 } 3590 } 3591 3592 /** @hide */ 3593 @SystemApi 3594 public String getCdmaMin() { 3595 return getCdmaMin(getDefaultSubscription()); 3596 } 3597 3598 /** @hide */ 3599 @SystemApi 3600 public String getCdmaMin(int subId) { 3601 try { 3602 ITelephony telephony = getITelephony(); 3603 if (telephony == null) 3604 return null; 3605 return telephony.getCdmaMin(subId); 3606 } catch (RemoteException ex) { 3607 return null; 3608 } catch (NullPointerException ex) { 3609 return null; 3610 } 3611 } 3612 3613 /** @hide */ 3614 @SystemApi 3615 public int checkCarrierPrivilegesForPackage(String pkgname) { 3616 try { 3617 ITelephony telephony = getITelephony(); 3618 if (telephony != null) 3619 return telephony.checkCarrierPrivilegesForPackage(pkgname); 3620 } catch (RemoteException ex) { 3621 Rlog.e(TAG, "checkCarrierPrivilegesForPackage RemoteException", ex); 3622 } catch (NullPointerException ex) { 3623 Rlog.e(TAG, "checkCarrierPrivilegesForPackage NPE", ex); 3624 } 3625 return CARRIER_PRIVILEGE_STATUS_NO_ACCESS; 3626 } 3627 3628 /** @hide */ 3629 @SystemApi 3630 public List<String> getCarrierPackageNamesForIntent(Intent intent) { 3631 return getCarrierPackageNamesForIntentAndPhone(intent, getDefaultPhone()); 3632 } 3633 3634 /** @hide */ 3635 @SystemApi 3636 public List<String> getCarrierPackageNamesForIntentAndPhone(Intent intent, int phoneId) { 3637 try { 3638 ITelephony telephony = getITelephony(); 3639 if (telephony != null) 3640 return telephony.getCarrierPackageNamesForIntentAndPhone(intent, phoneId); 3641 } catch (RemoteException ex) { 3642 Rlog.e(TAG, "getCarrierPackageNamesForIntentAndPhone RemoteException", ex); 3643 } catch (NullPointerException ex) { 3644 Rlog.e(TAG, "getCarrierPackageNamesForIntentAndPhone NPE", ex); 3645 } 3646 return null; 3647 } 3648 3649 /** @hide */ 3650 @SystemApi 3651 public void dial(String number) { 3652 try { 3653 ITelephony telephony = getITelephony(); 3654 if (telephony != null) 3655 telephony.dial(number); 3656 } catch (RemoteException e) { 3657 Log.e(TAG, "Error calling ITelephony#dial", e); 3658 } 3659 } 3660 3661 /** @hide */ 3662 @SystemApi 3663 public void call(String callingPackage, String number) { 3664 try { 3665 ITelephony telephony = getITelephony(); 3666 if (telephony != null) 3667 telephony.call(callingPackage, number); 3668 } catch (RemoteException e) { 3669 Log.e(TAG, "Error calling ITelephony#call", e); 3670 } 3671 } 3672 3673 /** @hide */ 3674 @SystemApi 3675 public boolean endCall() { 3676 try { 3677 ITelephony telephony = getITelephony(); 3678 if (telephony != null) 3679 return telephony.endCall(); 3680 } catch (RemoteException e) { 3681 Log.e(TAG, "Error calling ITelephony#endCall", e); 3682 } 3683 return false; 3684 } 3685 3686 /** @hide */ 3687 @SystemApi 3688 public void answerRingingCall() { 3689 try { 3690 ITelephony telephony = getITelephony(); 3691 if (telephony != null) 3692 telephony.answerRingingCall(); 3693 } catch (RemoteException e) { 3694 Log.e(TAG, "Error calling ITelephony#answerRingingCall", e); 3695 } 3696 } 3697 3698 /** @hide */ 3699 @SystemApi 3700 public void silenceRinger() { 3701 try { 3702 getTelecomService().silenceRinger(mContext.getOpPackageName()); 3703 } catch (RemoteException e) { 3704 Log.e(TAG, "Error calling ITelecomService#silenceRinger", e); 3705 } 3706 } 3707 3708 /** @hide */ 3709 @SystemApi 3710 public boolean isOffhook() { 3711 try { 3712 ITelephony telephony = getITelephony(); 3713 if (telephony != null) 3714 return telephony.isOffhook(); 3715 } catch (RemoteException e) { 3716 Log.e(TAG, "Error calling ITelephony#isOffhook", e); 3717 } 3718 return false; 3719 } 3720 3721 /** @hide */ 3722 @SystemApi 3723 public boolean isRinging() { 3724 try { 3725 ITelephony telephony = getITelephony(); 3726 if (telephony != null) 3727 return telephony.isRinging(); 3728 } catch (RemoteException e) { 3729 Log.e(TAG, "Error calling ITelephony#isRinging", e); 3730 } 3731 return false; 3732 } 3733 3734 /** @hide */ 3735 @SystemApi 3736 public boolean isIdle() { 3737 try { 3738 ITelephony telephony = getITelephony(); 3739 if (telephony != null) 3740 return telephony.isIdle(); 3741 } catch (RemoteException e) { 3742 Log.e(TAG, "Error calling ITelephony#isIdle", e); 3743 } 3744 return true; 3745 } 3746 3747 /** @hide */ 3748 @SystemApi 3749 public boolean isRadioOn() { 3750 try { 3751 ITelephony telephony = getITelephony(); 3752 if (telephony != null) 3753 return telephony.isRadioOn(); 3754 } catch (RemoteException e) { 3755 Log.e(TAG, "Error calling ITelephony#isRadioOn", e); 3756 } 3757 return false; 3758 } 3759 3760 /** @hide */ 3761 @SystemApi 3762 public boolean isSimPinEnabled() { 3763 try { 3764 ITelephony telephony = getITelephony(); 3765 if (telephony != null) 3766 return telephony.isSimPinEnabled(mContext.getOpPackageName()); 3767 } catch (RemoteException e) { 3768 Log.e(TAG, "Error calling ITelephony#isSimPinEnabled", e); 3769 } 3770 return false; 3771 } 3772 3773 /** @hide */ 3774 @SystemApi 3775 public boolean supplyPin(String pin) { 3776 try { 3777 ITelephony telephony = getITelephony(); 3778 if (telephony != null) 3779 return telephony.supplyPin(pin); 3780 } catch (RemoteException e) { 3781 Log.e(TAG, "Error calling ITelephony#supplyPin", e); 3782 } 3783 return false; 3784 } 3785 3786 /** @hide */ 3787 @SystemApi 3788 public boolean supplyPuk(String puk, String pin) { 3789 try { 3790 ITelephony telephony = getITelephony(); 3791 if (telephony != null) 3792 return telephony.supplyPuk(puk, pin); 3793 } catch (RemoteException e) { 3794 Log.e(TAG, "Error calling ITelephony#supplyPuk", e); 3795 } 3796 return false; 3797 } 3798 3799 /** @hide */ 3800 @SystemApi 3801 public int[] supplyPinReportResult(String pin) { 3802 try { 3803 ITelephony telephony = getITelephony(); 3804 if (telephony != null) 3805 return telephony.supplyPinReportResult(pin); 3806 } catch (RemoteException e) { 3807 Log.e(TAG, "Error calling ITelephony#supplyPinReportResult", e); 3808 } 3809 return new int[0]; 3810 } 3811 3812 /** @hide */ 3813 @SystemApi 3814 public int[] supplyPukReportResult(String puk, String pin) { 3815 try { 3816 ITelephony telephony = getITelephony(); 3817 if (telephony != null) 3818 return telephony.supplyPukReportResult(puk, pin); 3819 } catch (RemoteException e) { 3820 Log.e(TAG, "Error calling ITelephony#]", e); 3821 } 3822 return new int[0]; 3823 } 3824 3825 /** @hide */ 3826 @SystemApi 3827 public boolean handlePinMmi(String dialString) { 3828 try { 3829 ITelephony telephony = getITelephony(); 3830 if (telephony != null) 3831 return telephony.handlePinMmi(dialString); 3832 } catch (RemoteException e) { 3833 Log.e(TAG, "Error calling ITelephony#handlePinMmi", e); 3834 } 3835 return false; 3836 } 3837 3838 /** @hide */ 3839 @SystemApi 3840 public boolean handlePinMmiForSubscriber(int subId, String dialString) { 3841 try { 3842 ITelephony telephony = getITelephony(); 3843 if (telephony != null) 3844 return telephony.handlePinMmiForSubscriber(subId, dialString); 3845 } catch (RemoteException e) { 3846 Log.e(TAG, "Error calling ITelephony#handlePinMmi", e); 3847 } 3848 return false; 3849 } 3850 3851 /** @hide */ 3852 @SystemApi 3853 public void toggleRadioOnOff() { 3854 try { 3855 ITelephony telephony = getITelephony(); 3856 if (telephony != null) 3857 telephony.toggleRadioOnOff(); 3858 } catch (RemoteException e) { 3859 Log.e(TAG, "Error calling ITelephony#toggleRadioOnOff", e); 3860 } 3861 } 3862 3863 /** @hide */ 3864 @SystemApi 3865 public boolean setRadio(boolean turnOn) { 3866 try { 3867 ITelephony telephony = getITelephony(); 3868 if (telephony != null) 3869 return telephony.setRadio(turnOn); 3870 } catch (RemoteException e) { 3871 Log.e(TAG, "Error calling ITelephony#setRadio", e); 3872 } 3873 return false; 3874 } 3875 3876 /** @hide */ 3877 @SystemApi 3878 public boolean setRadioPower(boolean turnOn) { 3879 try { 3880 ITelephony telephony = getITelephony(); 3881 if (telephony != null) 3882 return telephony.setRadioPower(turnOn); 3883 } catch (RemoteException e) { 3884 Log.e(TAG, "Error calling ITelephony#setRadioPower", e); 3885 } 3886 return false; 3887 } 3888 3889 /** @hide */ 3890 @SystemApi 3891 public void updateServiceLocation() { 3892 try { 3893 ITelephony telephony = getITelephony(); 3894 if (telephony != null) 3895 telephony.updateServiceLocation(); 3896 } catch (RemoteException e) { 3897 Log.e(TAG, "Error calling ITelephony#updateServiceLocation", e); 3898 } 3899 } 3900 3901 /** @hide */ 3902 @SystemApi 3903 public boolean enableDataConnectivity() { 3904 try { 3905 ITelephony telephony = getITelephony(); 3906 if (telephony != null) 3907 return telephony.enableDataConnectivity(); 3908 } catch (RemoteException e) { 3909 Log.e(TAG, "Error calling ITelephony#enableDataConnectivity", e); 3910 } 3911 return false; 3912 } 3913 3914 /** @hide */ 3915 @SystemApi 3916 public boolean disableDataConnectivity() { 3917 try { 3918 ITelephony telephony = getITelephony(); 3919 if (telephony != null) 3920 return telephony.disableDataConnectivity(); 3921 } catch (RemoteException e) { 3922 Log.e(TAG, "Error calling ITelephony#disableDataConnectivity", e); 3923 } 3924 return false; 3925 } 3926 3927 /** @hide */ 3928 @SystemApi 3929 public boolean isDataConnectivityPossible() { 3930 try { 3931 ITelephony telephony = getITelephony(); 3932 if (telephony != null) 3933 return telephony.isDataConnectivityPossible(); 3934 } catch (RemoteException e) { 3935 Log.e(TAG, "Error calling ITelephony#isDataConnectivityPossible", e); 3936 } 3937 return false; 3938 } 3939 3940 /** @hide */ 3941 @SystemApi 3942 public boolean needsOtaServiceProvisioning() { 3943 try { 3944 ITelephony telephony = getITelephony(); 3945 if (telephony != null) 3946 return telephony.needsOtaServiceProvisioning(); 3947 } catch (RemoteException e) { 3948 Log.e(TAG, "Error calling ITelephony#needsOtaServiceProvisioning", e); 3949 } 3950 return false; 3951 } 3952 3953 /** @hide */ 3954 @SystemApi 3955 public void setDataEnabled(boolean enable) { 3956 setDataEnabled(SubscriptionManager.getDefaultDataSubId(), enable); 3957 } 3958 3959 /** @hide */ 3960 @SystemApi 3961 public void setDataEnabled(int subId, boolean enable) { 3962 try { 3963 Log.d(TAG, "setDataEnabled: enabled=" + enable); 3964 ITelephony telephony = getITelephony(); 3965 if (telephony != null) 3966 telephony.setDataEnabled(subId, enable); 3967 } catch (RemoteException e) { 3968 Log.e(TAG, "Error calling ITelephony#setDataEnabled", e); 3969 } 3970 } 3971 3972 /** @hide */ 3973 @SystemApi 3974 public boolean getDataEnabled() { 3975 return getDataEnabled(SubscriptionManager.getDefaultDataSubId()); 3976 } 3977 3978 /** @hide */ 3979 @SystemApi 3980 public boolean getDataEnabled(int subId) { 3981 boolean retVal = false; 3982 try { 3983 ITelephony telephony = getITelephony(); 3984 if (telephony != null) 3985 retVal = telephony.getDataEnabled(subId); 3986 } catch (RemoteException e) { 3987 Log.e(TAG, "Error calling ITelephony#getDataEnabled", e); 3988 } catch (NullPointerException e) { 3989 } 3990 Log.d(TAG, "getDataEnabled: retVal=" + retVal); 3991 return retVal; 3992 } 3993 3994 /** 3995 * Returns the result and response from RIL for oem request 3996 * 3997 * @param oemReq the data is sent to ril. 3998 * @param oemResp the respose data from RIL. 3999 * @return negative value request was not handled or get error 4000 * 0 request was handled succesfully, but no response data 4001 * positive value success, data length of response 4002 * @hide 4003 */ 4004 public int invokeOemRilRequestRaw(byte[] oemReq, byte[] oemResp) { 4005 try { 4006 ITelephony telephony = getITelephony(); 4007 if (telephony != null) 4008 return telephony.invokeOemRilRequestRaw(oemReq, oemResp); 4009 } catch (RemoteException ex) { 4010 } catch (NullPointerException ex) { 4011 } 4012 return -1; 4013 } 4014 4015 /** @hide */ 4016 @SystemApi 4017 public void enableVideoCalling(boolean enable) { 4018 try { 4019 ITelephony telephony = getITelephony(); 4020 if (telephony != null) 4021 telephony.enableVideoCalling(enable); 4022 } catch (RemoteException e) { 4023 Log.e(TAG, "Error calling ITelephony#enableVideoCalling", e); 4024 } 4025 } 4026 4027 /** @hide */ 4028 @SystemApi 4029 public boolean isVideoCallingEnabled() { 4030 try { 4031 ITelephony telephony = getITelephony(); 4032 if (telephony != null) 4033 return telephony.isVideoCallingEnabled(mContext.getOpPackageName()); 4034 } catch (RemoteException e) { 4035 Log.e(TAG, "Error calling ITelephony#isVideoCallingEnabled", e); 4036 } 4037 return false; 4038 } 4039 4040 /** 4041 * Whether the device supports configuring the DTMF tone length. 4042 * 4043 * @return {@code true} if the DTMF tone length can be changed, and {@code false} otherwise. 4044 */ 4045 public boolean canChangeDtmfToneLength() { 4046 try { 4047 ITelephony telephony = getITelephony(); 4048 if (telephony != null) { 4049 return telephony.canChangeDtmfToneLength(); 4050 } 4051 } catch (RemoteException e) { 4052 Log.e(TAG, "Error calling ITelephony#canChangeDtmfToneLength", e); 4053 } 4054 return false; 4055 } 4056 4057 /** 4058 * Whether the device is a world phone. 4059 * 4060 * @return {@code true} if the device is a world phone, and {@code false} otherwise. 4061 */ 4062 public boolean isWorldPhone() { 4063 try { 4064 ITelephony telephony = getITelephony(); 4065 if (telephony != null) { 4066 return telephony.isWorldPhone(); 4067 } 4068 } catch (RemoteException e) { 4069 Log.e(TAG, "Error calling ITelephony#isWorldPhone", e); 4070 } 4071 return false; 4072 } 4073 4074 /** 4075 * Whether the phone supports TTY mode. 4076 * 4077 * @return {@code true} if the device supports TTY mode, and {@code false} otherwise. 4078 */ 4079 public boolean isTtyModeSupported() { 4080 try { 4081 ITelephony telephony = getITelephony(); 4082 if (telephony != null) { 4083 return telephony.isTtyModeSupported(); 4084 } 4085 } catch (RemoteException e) { 4086 Log.e(TAG, "Error calling ITelephony#isTtyModeSupported", e); 4087 } 4088 return false; 4089 } 4090 4091 /** 4092 * Whether the phone supports hearing aid compatibility. 4093 * 4094 * @return {@code true} if the device supports hearing aid compatibility, and {@code false} 4095 * otherwise. 4096 */ 4097 public boolean isHearingAidCompatibilitySupported() { 4098 try { 4099 ITelephony telephony = getITelephony(); 4100 if (telephony != null) { 4101 return telephony.isHearingAidCompatibilitySupported(); 4102 } 4103 } catch (RemoteException e) { 4104 Log.e(TAG, "Error calling ITelephony#isHearingAidCompatibilitySupported", e); 4105 } 4106 return false; 4107 } 4108 4109 /** 4110 * This function retrieves value for setting "name+subId", and if that is not found 4111 * retrieves value for setting "name", and if that is not found throws 4112 * SettingNotFoundException 4113 * 4114 * @hide */ 4115 public static int getIntWithSubId(ContentResolver cr, String name, int subId) 4116 throws SettingNotFoundException { 4117 try { 4118 return Settings.Global.getInt(cr, name + subId); 4119 } catch (SettingNotFoundException e) { 4120 try { 4121 int val = Settings.Global.getInt(cr, name); 4122 Settings.Global.putInt(cr, name + subId, val); 4123 4124 /* We are now moving from 'setting' to 'setting+subId', and using the value stored 4125 * for 'setting' as default. Reset the default (since it may have a user set 4126 * value). */ 4127 int default_val = val; 4128 if (name.equals(Settings.Global.MOBILE_DATA)) { 4129 default_val = "true".equalsIgnoreCase( 4130 SystemProperties.get("ro.com.android.mobiledata", "true")) ? 1 : 0; 4131 } else if (name.equals(Settings.Global.DATA_ROAMING)) { 4132 default_val = "true".equalsIgnoreCase( 4133 SystemProperties.get("ro.com.android.dataroaming", "false")) ? 1 : 0; 4134 } 4135 4136 if (default_val != val) { 4137 Settings.Global.putInt(cr, name, default_val); 4138 } 4139 4140 return val; 4141 } catch (SettingNotFoundException exc) { 4142 throw new SettingNotFoundException(name); 4143 } 4144 } 4145 } 4146 4147 /** 4148 * Returns the IMS Registration Status 4149 * @hide 4150 */ 4151 public boolean isImsRegistered() { 4152 try { 4153 ITelephony telephony = getITelephony(); 4154 if (telephony == null) 4155 return false; 4156 return telephony.isImsRegistered(); 4157 } catch (RemoteException ex) { 4158 return false; 4159 } catch (NullPointerException ex) { 4160 return false; 4161 } 4162 } 4163 4164 /** 4165 * Returns the Status of Volte 4166 *@hide 4167 */ 4168 public boolean isVolteEnabled() { 4169 try { 4170 return getITelephony().isVolteEnabled(); 4171 } catch (RemoteException ex) { 4172 return false; 4173 } catch (NullPointerException ex) { 4174 return false; 4175 } 4176 } 4177 4178 /** 4179 * Returns the Status of Wi-Fi Calling 4180 *@hide 4181 */ 4182 public boolean isWifiCallingEnabled() { 4183 try { 4184 return getITelephony().isWifiCallingEnabled(); 4185 } catch (RemoteException ex) { 4186 return false; 4187 } catch (NullPointerException ex) { 4188 return false; 4189 } 4190 } 4191 4192 /** 4193 * Set TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC for the default phone. 4194 * 4195 * @hide 4196 */ 4197 public void setSimOperatorNumeric(String numeric) { 4198 int phoneId = getDefaultPhone(); 4199 setSimOperatorNumericForPhone(phoneId, numeric); 4200 } 4201 4202 /** 4203 * Set TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC for the given phone. 4204 * 4205 * @hide 4206 */ 4207 public void setSimOperatorNumericForPhone(int phoneId, String numeric) { 4208 setTelephonyProperty(phoneId, 4209 TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC, numeric); 4210 } 4211 4212 /** 4213 * Set TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC for the default phone. 4214 * 4215 * @hide 4216 */ 4217 public void setSimOperatorName(String name) { 4218 int phoneId = getDefaultPhone(); 4219 setSimOperatorNameForPhone(phoneId, name); 4220 } 4221 4222 /** 4223 * Set TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC for the given phone. 4224 * 4225 * @hide 4226 */ 4227 public void setSimOperatorNameForPhone(int phoneId, String name) { 4228 setTelephonyProperty(phoneId, 4229 TelephonyProperties.PROPERTY_ICC_OPERATOR_ALPHA, name); 4230 } 4231 4232 /** 4233 * Set TelephonyProperties.PROPERTY_ICC_OPERATOR_ISO_COUNTRY for the default phone. 4234 * 4235 * @hide 4236 */ 4237 public void setSimCountryIso(String iso) { 4238 int phoneId = getDefaultPhone(); 4239 setSimCountryIsoForPhone(phoneId, iso); 4240 } 4241 4242 /** 4243 * Set TelephonyProperties.PROPERTY_ICC_OPERATOR_ISO_COUNTRY for the given phone. 4244 * 4245 * @hide 4246 */ 4247 public void setSimCountryIsoForPhone(int phoneId, String iso) { 4248 setTelephonyProperty(phoneId, 4249 TelephonyProperties.PROPERTY_ICC_OPERATOR_ISO_COUNTRY, iso); 4250 } 4251 4252 /** 4253 * Set TelephonyProperties.PROPERTY_SIM_STATE for the default phone. 4254 * 4255 * @hide 4256 */ 4257 public void setSimState(String state) { 4258 int phoneId = getDefaultPhone(); 4259 setSimStateForPhone(phoneId, state); 4260 } 4261 4262 /** 4263 * Set TelephonyProperties.PROPERTY_SIM_STATE for the given phone. 4264 * 4265 * @hide 4266 */ 4267 public void setSimStateForPhone(int phoneId, String state) { 4268 setTelephonyProperty(phoneId, 4269 TelephonyProperties.PROPERTY_SIM_STATE, state); 4270 } 4271 4272 /** 4273 * Set baseband version for the default phone. 4274 * 4275 * @param version baseband version 4276 * @hide 4277 */ 4278 public void setBasebandVersion(String version) { 4279 int phoneId = getDefaultPhone(); 4280 setBasebandVersionForPhone(phoneId, version); 4281 } 4282 4283 /** 4284 * Set baseband version by phone id. 4285 * 4286 * @param phoneId for which baseband version is set 4287 * @param version baseband version 4288 * @hide 4289 */ 4290 public void setBasebandVersionForPhone(int phoneId, String version) { 4291 if (SubscriptionManager.isValidPhoneId(phoneId)) { 4292 String prop = TelephonyProperties.PROPERTY_BASEBAND_VERSION + 4293 ((phoneId == 0) ? "" : Integer.toString(phoneId)); 4294 SystemProperties.set(prop, version); 4295 } 4296 } 4297 4298 /** 4299 * Set phone type for the default phone. 4300 * 4301 * @param type phone type 4302 * 4303 * @hide 4304 */ 4305 public void setPhoneType(int type) { 4306 int phoneId = getDefaultPhone(); 4307 setPhoneType(phoneId, type); 4308 } 4309 4310 /** 4311 * Set phone type by phone id. 4312 * 4313 * @param phoneId for which phone type is set 4314 * @param type phone type 4315 * 4316 * @hide 4317 */ 4318 public void setPhoneType(int phoneId, int type) { 4319 if (SubscriptionManager.isValidPhoneId(phoneId)) { 4320 TelephonyManager.setTelephonyProperty(phoneId, 4321 TelephonyProperties.CURRENT_ACTIVE_PHONE, String.valueOf(type)); 4322 } 4323 } 4324 4325 /** 4326 * Get OTASP number schema for the default phone. 4327 * 4328 * @param defaultValue default value 4329 * @return OTA SP number schema 4330 * 4331 * @hide 4332 */ 4333 public String getOtaSpNumberSchema(String defaultValue) { 4334 int phoneId = getDefaultPhone(); 4335 return getOtaSpNumberSchemaForPhone(phoneId, defaultValue); 4336 } 4337 4338 /** 4339 * Get OTASP number schema by phone id. 4340 * 4341 * @param phoneId for which OTA SP number schema is get 4342 * @param defaultValue default value 4343 * @return OTA SP number schema 4344 * 4345 * @hide 4346 */ 4347 public String getOtaSpNumberSchemaForPhone(int phoneId, String defaultValue) { 4348 if (SubscriptionManager.isValidPhoneId(phoneId)) { 4349 return TelephonyManager.getTelephonyProperty(phoneId, 4350 TelephonyProperties.PROPERTY_OTASP_NUM_SCHEMA, defaultValue); 4351 } 4352 4353 return defaultValue; 4354 } 4355 4356 /** 4357 * Get SMS receive capable from system property for the default phone. 4358 * 4359 * @param defaultValue default value 4360 * @return SMS receive capable 4361 * 4362 * @hide 4363 */ 4364 public boolean getSmsReceiveCapable(boolean defaultValue) { 4365 int phoneId = getDefaultPhone(); 4366 return getSmsReceiveCapableForPhone(phoneId, defaultValue); 4367 } 4368 4369 /** 4370 * Get SMS receive capable from system property by phone id. 4371 * 4372 * @param phoneId for which SMS receive capable is get 4373 * @param defaultValue default value 4374 * @return SMS receive capable 4375 * 4376 * @hide 4377 */ 4378 public boolean getSmsReceiveCapableForPhone(int phoneId, boolean defaultValue) { 4379 if (SubscriptionManager.isValidPhoneId(phoneId)) { 4380 return Boolean.valueOf(TelephonyManager.getTelephonyProperty(phoneId, 4381 TelephonyProperties.PROPERTY_SMS_RECEIVE, String.valueOf(defaultValue))); 4382 } 4383 4384 return defaultValue; 4385 } 4386 4387 /** 4388 * Get SMS send capable from system property for the default phone. 4389 * 4390 * @param defaultValue default value 4391 * @return SMS send capable 4392 * 4393 * @hide 4394 */ 4395 public boolean getSmsSendCapable(boolean defaultValue) { 4396 int phoneId = getDefaultPhone(); 4397 return getSmsSendCapableForPhone(phoneId, defaultValue); 4398 } 4399 4400 /** 4401 * Get SMS send capable from system property by phone id. 4402 * 4403 * @param phoneId for which SMS send capable is get 4404 * @param defaultValue default value 4405 * @return SMS send capable 4406 * 4407 * @hide 4408 */ 4409 public boolean getSmsSendCapableForPhone(int phoneId, boolean defaultValue) { 4410 if (SubscriptionManager.isValidPhoneId(phoneId)) { 4411 return Boolean.valueOf(TelephonyManager.getTelephonyProperty(phoneId, 4412 TelephonyProperties.PROPERTY_SMS_SEND, String.valueOf(defaultValue))); 4413 } 4414 4415 return defaultValue; 4416 } 4417 4418 /** 4419 * Set the alphabetic name of current registered operator. 4420 * @param name the alphabetic name of current registered operator. 4421 * @hide 4422 */ 4423 public void setNetworkOperatorName(String name) { 4424 int phoneId = getDefaultPhone(); 4425 setNetworkOperatorNameForPhone(phoneId, name); 4426 } 4427 4428 /** 4429 * Set the alphabetic name of current registered operator. 4430 * @param phoneId which phone you want to set 4431 * @param name the alphabetic name of current registered operator. 4432 * @hide 4433 */ 4434 public void setNetworkOperatorNameForPhone(int phoneId, String name) { 4435 if (SubscriptionManager.isValidPhoneId(phoneId)) { 4436 setTelephonyProperty(phoneId, TelephonyProperties.PROPERTY_OPERATOR_ALPHA, name); 4437 } 4438 } 4439 4440 /** 4441 * Set the numeric name (MCC+MNC) of current registered operator. 4442 * @param operator the numeric name (MCC+MNC) of current registered operator 4443 * @hide 4444 */ 4445 public void setNetworkOperatorNumeric(String numeric) { 4446 int phoneId = getDefaultPhone(); 4447 setNetworkOperatorNumericForPhone(phoneId, numeric); 4448 } 4449 4450 /** 4451 * Set the numeric name (MCC+MNC) of current registered operator. 4452 * @param phoneId for which phone type is set 4453 * @param operator the numeric name (MCC+MNC) of current registered operator 4454 * @hide 4455 */ 4456 public void setNetworkOperatorNumericForPhone(int phoneId, String numeric) { 4457 setTelephonyProperty(phoneId, TelephonyProperties.PROPERTY_OPERATOR_NUMERIC, numeric); 4458 } 4459 4460 /** 4461 * Set roaming state of the current network, for GSM purposes. 4462 * @param isRoaming is network in romaing state or not 4463 * @hide 4464 */ 4465 public void setNetworkRoaming(boolean isRoaming) { 4466 int phoneId = getDefaultPhone(); 4467 setNetworkRoamingForPhone(phoneId, isRoaming); 4468 } 4469 4470 /** 4471 * Set roaming state of the current network, for GSM purposes. 4472 * @param phoneId which phone you want to set 4473 * @param isRoaming is network in romaing state or not 4474 * @hide 4475 */ 4476 public void setNetworkRoamingForPhone(int phoneId, boolean isRoaming) { 4477 if (SubscriptionManager.isValidPhoneId(phoneId)) { 4478 setTelephonyProperty(phoneId, TelephonyProperties.PROPERTY_OPERATOR_ISROAMING, 4479 isRoaming ? "true" : "false"); 4480 } 4481 } 4482 4483 /** 4484 * Set the ISO country code equivalent of the current registered 4485 * operator's MCC (Mobile Country Code). 4486 * @param iso the ISO country code equivalent of the current registered 4487 * @hide 4488 */ 4489 public void setNetworkCountryIso(String iso) { 4490 int phoneId = getDefaultPhone(); 4491 setNetworkCountryIsoForPhone(phoneId, iso); 4492 } 4493 4494 /** 4495 * Set the ISO country code equivalent of the current registered 4496 * operator's MCC (Mobile Country Code). 4497 * @param phoneId which phone you want to set 4498 * @param iso the ISO country code equivalent of the current registered 4499 * @hide 4500 */ 4501 public void setNetworkCountryIsoForPhone(int phoneId, String iso) { 4502 if (SubscriptionManager.isValidPhoneId(phoneId)) { 4503 setTelephonyProperty(phoneId, 4504 TelephonyProperties.PROPERTY_OPERATOR_ISO_COUNTRY, iso); 4505 } 4506 } 4507 4508 /** 4509 * Set the network type currently in use on the device for data transmission. 4510 * @param type the network type currently in use on the device for data transmission 4511 * @hide 4512 */ 4513 public void setDataNetworkType(int type) { 4514 int phoneId = getDefaultPhone(); 4515 setDataNetworkTypeForPhone(phoneId, type); 4516 } 4517 4518 /** 4519 * Set the network type currently in use on the device for data transmission. 4520 * @param phoneId which phone you want to set 4521 * @param type the network type currently in use on the device for data transmission 4522 * @hide 4523 */ 4524 public void setDataNetworkTypeForPhone(int phoneId, int type) { 4525 if (SubscriptionManager.isValidPhoneId(phoneId)) { 4526 setTelephonyProperty(phoneId, 4527 TelephonyProperties.PROPERTY_DATA_NETWORK_TYPE, 4528 ServiceState.rilRadioTechnologyToString(type)); 4529 } 4530 } 4531 4532 /** 4533 * Returns the subscription ID for the given phone account. 4534 * @hide 4535 */ 4536 public int getSubIdForPhoneAccount(PhoneAccount phoneAccount) { 4537 int retval = SubscriptionManager.INVALID_SUBSCRIPTION_ID; 4538 try { 4539 ITelephony service = getITelephony(); 4540 if (service != null) { 4541 retval = service.getSubIdForPhoneAccount(phoneAccount); 4542 } 4543 } catch (RemoteException e) { 4544 } 4545 4546 return retval; 4547 } 4548 4549 /** 4550 * Resets telephony manager settings back to factory defaults. 4551 * 4552 * @hide 4553 */ 4554 public void factoryReset(int subId) { 4555 try { 4556 Log.d(TAG, "factoryReset: subId=" + subId); 4557 ITelephony telephony = getITelephony(); 4558 if (telephony != null) 4559 telephony.factoryReset(subId); 4560 } catch (RemoteException e) { 4561 } 4562 } 4563} 4564