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