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 17 package android.telephony; 18 19 import static com.android.internal.util.Preconditions.checkNotNull; 20 21 import android.annotation.IntDef; 22 import android.annotation.Nullable; 23 import android.annotation.RequiresPermission; 24 import android.annotation.SdkConstant; 25 import android.annotation.SuppressLint; 26 import android.annotation.SdkConstant.SdkConstantType; 27 import android.annotation.SystemApi; 28 import android.annotation.SystemService; 29 import android.annotation.WorkerThread; 30 import android.app.ActivityThread; 31 import android.app.PendingIntent; 32 import android.content.ContentResolver; 33 import android.content.Context; 34 import android.content.Intent; 35 import android.net.ConnectivityManager; 36 import android.net.Uri; 37 import android.os.BatteryStats; 38 import android.os.Bundle; 39 import android.os.Handler; 40 import android.os.PersistableBundle; 41 import android.os.RemoteException; 42 import android.os.ResultReceiver; 43 import android.os.ServiceManager; 44 import android.os.SystemProperties; 45 import android.provider.Settings; 46 import android.provider.Settings.SettingNotFoundException; 47 import android.service.carrier.CarrierIdentifier; 48 import android.telecom.PhoneAccount; 49 import android.telecom.PhoneAccountHandle; 50 import android.telephony.VisualVoicemailService.VisualVoicemailTask; 51 import android.telephony.ims.feature.ImsFeature; 52 import android.util.Log; 53 54 import com.android.ims.internal.IImsServiceController; 55 import com.android.ims.internal.IImsServiceFeatureListener; 56 import com.android.internal.annotations.VisibleForTesting; 57 import com.android.internal.telecom.ITelecomService; 58 import com.android.internal.telephony.CellNetworkScanResult; 59 import com.android.internal.telephony.IPhoneSubInfo; 60 import com.android.internal.telephony.ITelephony; 61 import com.android.internal.telephony.ITelephonyRegistry; 62 import com.android.internal.telephony.OperatorInfo; 63 import com.android.internal.telephony.PhoneConstants; 64 import com.android.internal.telephony.RILConstants; 65 import com.android.internal.telephony.TelephonyProperties; 66 67 import java.io.FileInputStream; 68 import java.io.IOException; 69 import java.lang.annotation.Retention; 70 import java.lang.annotation.RetentionPolicy; 71 import java.util.ArrayList; 72 import java.util.Collections; 73 import java.util.List; 74 import java.util.regex.Matcher; 75 import java.util.regex.Pattern; 76 77 /** 78 * Provides access to information about the telephony services on 79 * the device. Applications can use the methods in this class to 80 * determine telephony services and states, as well as to access some 81 * types of subscriber information. Applications can also register 82 * a listener to receive notification of telephony state changes. 83 * <p> 84 * The returned TelephonyManager will use the default subscription for all calls. 85 * To call an API for a specific subscription, use {@link #createForSubscriptionId(int)}. e.g. 86 * <code> 87 * telephonyManager = defaultSubTelephonyManager.createForSubscriptionId(subId); 88 * </code> 89 * <p> 90 * Note that access to some telephony information is 91 * permission-protected. Your application cannot access the protected 92 * information unless it has the appropriate permissions declared in 93 * its manifest file. Where permissions apply, they are noted in the 94 * the methods through which you access the protected information. 95 */ 96 @SystemService(Context.TELEPHONY_SERVICE) 97 public class TelephonyManager { 98 private static final String TAG = "TelephonyManager"; 99 100 /** 101 * The key to use when placing the result of {@link #requestModemActivityInfo(ResultReceiver)} 102 * into the ResultReceiver Bundle. 103 * @hide 104 */ 105 public static final String MODEM_ACTIVITY_RESULT_KEY = 106 BatteryStats.RESULT_RECEIVER_CONTROLLER_KEY; 107 108 private static ITelephonyRegistry sRegistry; 109 110 /** 111 * The allowed states of Wi-Fi calling. 112 * 113 * @hide 114 */ 115 public interface WifiCallingChoices { 116 /** Always use Wi-Fi calling */ 117 static final int ALWAYS_USE = 0; 118 /** Ask the user whether to use Wi-Fi on every call */ 119 static final int ASK_EVERY_TIME = 1; 120 /** Never use Wi-Fi calling */ 121 static final int NEVER_USE = 2; 122 } 123 124 /** The otaspMode passed to PhoneStateListener#onOtaspChanged */ 125 /** @hide */ 126 static public final int OTASP_UNINITIALIZED = 0; 127 /** @hide */ 128 static public final int OTASP_UNKNOWN = 1; 129 /** @hide */ 130 static public final int OTASP_NEEDED = 2; 131 /** @hide */ 132 static public final int OTASP_NOT_NEEDED = 3; 133 /* OtaUtil has conflict enum 4: OtaUtils.OTASP_FAILURE_SPC_RETRIES */ 134 /** @hide */ 135 static public final int OTASP_SIM_UNPROVISIONED = 5; 136 137 138 private final Context mContext; 139 private final int mSubId; 140 private SubscriptionManager mSubscriptionManager; 141 142 private static String multiSimConfig = 143 SystemProperties.get(TelephonyProperties.PROPERTY_MULTI_SIM_CONFIG); 144 145 /** Enum indicating multisim variants 146 * DSDS - Dual SIM Dual Standby 147 * DSDA - Dual SIM Dual Active 148 * TSTS - Triple SIM Triple Standby 149 **/ 150 /** @hide */ 151 public enum MultiSimVariants { 152 DSDS, 153 DSDA, 154 TSTS, 155 UNKNOWN 156 }; 157 158 /** @hide */ 159 public TelephonyManager(Context context) { 160 this(context, SubscriptionManager.DEFAULT_SUBSCRIPTION_ID); 161 } 162 163 /** @hide */ 164 public TelephonyManager(Context context, int subId) { 165 mSubId = subId; 166 Context appContext = context.getApplicationContext(); 167 if (appContext != null) { 168 mContext = appContext; 169 } else { 170 mContext = context; 171 } 172 mSubscriptionManager = SubscriptionManager.from(mContext); 173 174 if (sRegistry == null) { 175 sRegistry = ITelephonyRegistry.Stub.asInterface(ServiceManager.getService( 176 "telephony.registry")); 177 } 178 } 179 180 /** @hide */ 181 private TelephonyManager() { 182 mContext = null; 183 mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; 184 } 185 186 private static TelephonyManager sInstance = new TelephonyManager(); 187 188 /** @hide 189 /* @deprecated - use getSystemService as described above */ 190 public static TelephonyManager getDefault() { 191 return sInstance; 192 } 193 194 private String getOpPackageName() { 195 // For legacy reasons the TelephonyManager has API for getting 196 // a static instance with no context set preventing us from 197 // getting the op package name. As a workaround we do a best 198 // effort and get the context from the current activity thread. 199 if (mContext != null) { 200 return mContext.getOpPackageName(); 201 } 202 return ActivityThread.currentOpPackageName(); 203 } 204 205 /** 206 * Returns the multi SIM variant 207 * Returns DSDS for Dual SIM Dual Standby 208 * Returns DSDA for Dual SIM Dual Active 209 * Returns TSTS for Triple SIM Triple Standby 210 * Returns UNKNOWN for others 211 */ 212 /** {@hide} */ 213 public MultiSimVariants getMultiSimConfiguration() { 214 String mSimConfig = 215 SystemProperties.get(TelephonyProperties.PROPERTY_MULTI_SIM_CONFIG); 216 if (mSimConfig.equals("dsds")) { 217 return MultiSimVariants.DSDS; 218 } else if (mSimConfig.equals("dsda")) { 219 return MultiSimVariants.DSDA; 220 } else if (mSimConfig.equals("tsts")) { 221 return MultiSimVariants.TSTS; 222 } else { 223 return MultiSimVariants.UNKNOWN; 224 } 225 } 226 227 228 /** 229 * Returns the number of phones available. 230 * Returns 0 if none of voice, sms, data is not supported 231 * Returns 1 for Single standby mode (Single SIM functionality) 232 * Returns 2 for Dual standby mode.(Dual SIM functionality) 233 */ 234 public int getPhoneCount() { 235 int phoneCount = 1; 236 switch (getMultiSimConfiguration()) { 237 case UNKNOWN: 238 // if voice or sms or data is supported, return 1 otherwise 0 239 if (isVoiceCapable() || isSmsCapable()) { 240 phoneCount = 1; 241 } else { 242 // todo: try to clean this up further by getting rid of the nested conditions 243 if (mContext == null) { 244 phoneCount = 1; 245 } else { 246 // check for data support 247 ConnectivityManager cm = (ConnectivityManager)mContext.getSystemService( 248 Context.CONNECTIVITY_SERVICE); 249 if (cm == null) { 250 phoneCount = 1; 251 } else { 252 if (cm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE)) { 253 phoneCount = 1; 254 } else { 255 phoneCount = 0; 256 } 257 } 258 } 259 } 260 break; 261 case DSDS: 262 case DSDA: 263 phoneCount = PhoneConstants.MAX_PHONE_COUNT_DUAL_SIM; 264 break; 265 case TSTS: 266 phoneCount = PhoneConstants.MAX_PHONE_COUNT_TRI_SIM; 267 break; 268 } 269 return phoneCount; 270 } 271 272 /** {@hide} */ 273 public static TelephonyManager from(Context context) { 274 return (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 275 } 276 277 /** 278 * Create a new TelephonyManager object pinned to the given subscription ID. 279 * 280 * @return a TelephonyManager that uses the given subId for all calls. 281 */ 282 public TelephonyManager createForSubscriptionId(int subId) { 283 // Don't reuse any TelephonyManager objects. 284 return new TelephonyManager(mContext, subId); 285 } 286 287 /** 288 * Create a new TelephonyManager object pinned to the subscription ID associated with the given 289 * phone account. 290 * 291 * @return a TelephonyManager that uses the given phone account for all calls, or {@code null} 292 * if the phone account does not correspond to a valid subscription ID. 293 */ 294 @Nullable 295 public TelephonyManager createForPhoneAccountHandle(PhoneAccountHandle phoneAccountHandle) { 296 int subId = getSubIdForPhoneAccountHandle(phoneAccountHandle); 297 if (!SubscriptionManager.isValidSubscriptionId(subId)) { 298 return null; 299 } 300 return new TelephonyManager(mContext, subId); 301 } 302 303 /** {@hide} */ 304 public boolean isMultiSimEnabled() { 305 return (multiSimConfig.equals("dsds") || multiSimConfig.equals("dsda") || 306 multiSimConfig.equals("tsts")); 307 } 308 309 // 310 // Broadcast Intent actions 311 // 312 313 /** 314 * Broadcast intent action indicating that the call state 315 * on the device has changed. 316 * 317 * <p> 318 * The {@link #EXTRA_STATE} extra indicates the new call state. 319 * If the new state is RINGING, a second extra 320 * {@link #EXTRA_INCOMING_NUMBER} provides the incoming phone number as 321 * a String. 322 * 323 * <p class="note"> 324 * This was a {@link android.content.Context#sendStickyBroadcast sticky} 325 * broadcast in version 1.0, but it is no longer sticky. 326 * Instead, use {@link #getCallState} to synchronously query the current call state. 327 * 328 * @see #EXTRA_STATE 329 * @see #EXTRA_INCOMING_NUMBER 330 * @see #getCallState 331 */ 332 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 333 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 334 public static final String ACTION_PHONE_STATE_CHANGED = 335 "android.intent.action.PHONE_STATE"; 336 337 /** 338 * The Phone app sends this intent when a user opts to respond-via-message during an incoming 339 * call. By default, the device's default SMS app consumes this message and sends a text message 340 * to the caller. A third party app can also provide this functionality by consuming this Intent 341 * with a {@link android.app.Service} and sending the message using its own messaging system. 342 * <p>The intent contains a URI (available from {@link android.content.Intent#getData}) 343 * describing the recipient, using either the {@code sms:}, {@code smsto:}, {@code mms:}, 344 * or {@code mmsto:} URI schema. Each of these URI schema carry the recipient information the 345 * same way: the path part of the URI contains the recipient's phone number or a comma-separated 346 * set of phone numbers if there are multiple recipients. For example, {@code 347 * smsto:2065551234}.</p> 348 * 349 * <p>The intent may also contain extras for the message text (in {@link 350 * android.content.Intent#EXTRA_TEXT}) and a message subject 351 * (in {@link android.content.Intent#EXTRA_SUBJECT}).</p> 352 * 353 * <p class="note"><strong>Note:</strong> 354 * The intent-filter that consumes this Intent needs to be in a {@link android.app.Service} 355 * that requires the 356 * permission {@link android.Manifest.permission#SEND_RESPOND_VIA_MESSAGE}.</p> 357 * <p>For example, the service that receives this intent can be declared in the manifest file 358 * with an intent filter like this:</p> 359 * <pre> 360 * <!-- Service that delivers SMS messages received from the phone "quick response" --> 361 * <service android:name=".HeadlessSmsSendService" 362 * android:permission="android.permission.SEND_RESPOND_VIA_MESSAGE" 363 * android:exported="true" > 364 * <intent-filter> 365 * <action android:name="android.intent.action.RESPOND_VIA_MESSAGE" /> 366 * <category android:name="android.intent.category.DEFAULT" /> 367 * <data android:scheme="sms" /> 368 * <data android:scheme="smsto" /> 369 * <data android:scheme="mms" /> 370 * <data android:scheme="mmsto" /> 371 * </intent-filter> 372 * </service></pre> 373 * <p> 374 * Output: nothing. 375 */ 376 @SdkConstant(SdkConstantType.SERVICE_ACTION) 377 public static final String ACTION_RESPOND_VIA_MESSAGE = 378 "android.intent.action.RESPOND_VIA_MESSAGE"; 379 380 /** 381 * The emergency dialer may choose to present activities with intent filters for this 382 * action as emergency assistance buttons that launch the activity when clicked. 383 * 384 * @hide 385 */ 386 @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) 387 public static final String ACTION_EMERGENCY_ASSISTANCE = 388 "android.telephony.action.EMERGENCY_ASSISTANCE"; 389 390 /** 391 * A boolean meta-data value indicating whether the voicemail settings should be hidden in the 392 * call settings page launched by 393 * {@link android.telecom.TelecomManager#ACTION_SHOW_CALL_SETTINGS}. 394 * Dialer implementations (see {@link android.telecom.TelecomManager#getDefaultDialerPackage()}) 395 * which would also like to manage voicemail settings should set this meta-data to {@code true} 396 * in the manifest registration of their application. 397 * 398 * @see android.telecom.TelecomManager#ACTION_SHOW_CALL_SETTINGS 399 * @see #ACTION_CONFIGURE_VOICEMAIL 400 * @see #EXTRA_HIDE_PUBLIC_SETTINGS 401 */ 402 public static final String METADATA_HIDE_VOICEMAIL_SETTINGS_MENU = 403 "android.telephony.HIDE_VOICEMAIL_SETTINGS_MENU"; 404 405 /** 406 * Open the voicemail settings activity to make changes to voicemail configuration. 407 * 408 * <p> 409 * The {@link #EXTRA_HIDE_PUBLIC_SETTINGS} hides settings the dialer will modify through public 410 * API if set. 411 * 412 * @see #EXTRA_HIDE_PUBLIC_SETTINGS 413 */ 414 @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) 415 public static final String ACTION_CONFIGURE_VOICEMAIL = 416 "android.telephony.action.CONFIGURE_VOICEMAIL"; 417 418 /** 419 * The boolean value indicating whether the voicemail settings activity launched by {@link 420 * #ACTION_CONFIGURE_VOICEMAIL} should hide settings accessible through public API. This is 421 * used by dialer implementations which provides their own voicemail settings UI, but still 422 * needs to expose device specific voicemail settings to the user. 423 * 424 * @see #ACTION_CONFIGURE_VOICEMAIL 425 * @see #METADATA_HIDE_VOICEMAIL_SETTINGS_MENU 426 */ 427 public static final String EXTRA_HIDE_PUBLIC_SETTINGS = 428 "android.telephony.extra.HIDE_PUBLIC_SETTINGS"; 429 430 /** 431 * @hide 432 */ 433 public static final boolean EMERGENCY_ASSISTANCE_ENABLED = true; 434 435 /** 436 * The lookup key used with the {@link #ACTION_PHONE_STATE_CHANGED} broadcast 437 * for a String containing the new call state. 438 * 439 * <p class="note"> 440 * Retrieve with 441 * {@link android.content.Intent#getStringExtra(String)}. 442 * 443 * @see #EXTRA_STATE_IDLE 444 * @see #EXTRA_STATE_RINGING 445 * @see #EXTRA_STATE_OFFHOOK 446 */ 447 public static final String EXTRA_STATE = PhoneConstants.STATE_KEY; 448 449 /** 450 * Value used with {@link #EXTRA_STATE} corresponding to 451 * {@link #CALL_STATE_IDLE}. 452 */ 453 public static final String EXTRA_STATE_IDLE = PhoneConstants.State.IDLE.toString(); 454 455 /** 456 * Value used with {@link #EXTRA_STATE} corresponding to 457 * {@link #CALL_STATE_RINGING}. 458 */ 459 public static final String EXTRA_STATE_RINGING = PhoneConstants.State.RINGING.toString(); 460 461 /** 462 * Value used with {@link #EXTRA_STATE} corresponding to 463 * {@link #CALL_STATE_OFFHOOK}. 464 */ 465 public static final String EXTRA_STATE_OFFHOOK = PhoneConstants.State.OFFHOOK.toString(); 466 467 /** 468 * The lookup key used with the {@link #ACTION_PHONE_STATE_CHANGED} broadcast 469 * for a String containing the incoming phone number. 470 * Only valid when the new call state is RINGING. 471 * 472 * <p class="note"> 473 * Retrieve with 474 * {@link android.content.Intent#getStringExtra(String)}. 475 */ 476 public static final String EXTRA_INCOMING_NUMBER = "incoming_number"; 477 478 /** 479 * Broadcast intent action indicating that a precise call state 480 * (cellular) on the device has changed. 481 * 482 * <p> 483 * The {@link #EXTRA_RINGING_CALL_STATE} extra indicates the ringing call state. 484 * The {@link #EXTRA_FOREGROUND_CALL_STATE} extra indicates the foreground call state. 485 * The {@link #EXTRA_BACKGROUND_CALL_STATE} extra indicates the background call state. 486 * The {@link #EXTRA_DISCONNECT_CAUSE} extra indicates the disconnect cause. 487 * The {@link #EXTRA_PRECISE_DISCONNECT_CAUSE} extra indicates the precise disconnect cause. 488 * 489 * <p class="note"> 490 * Requires the READ_PRECISE_PHONE_STATE permission. 491 * 492 * @see #EXTRA_RINGING_CALL_STATE 493 * @see #EXTRA_FOREGROUND_CALL_STATE 494 * @see #EXTRA_BACKGROUND_CALL_STATE 495 * @see #EXTRA_DISCONNECT_CAUSE 496 * @see #EXTRA_PRECISE_DISCONNECT_CAUSE 497 * 498 * <p class="note"> 499 * Requires the READ_PRECISE_PHONE_STATE permission. 500 * 501 * @hide 502 */ 503 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 504 public static final String ACTION_PRECISE_CALL_STATE_CHANGED = 505 "android.intent.action.PRECISE_CALL_STATE"; 506 507 /** 508 * The lookup key used with the {@link #ACTION_PRECISE_CALL_STATE_CHANGED} broadcast 509 * for an integer containing the state of the current ringing call. 510 * 511 * @see PreciseCallState#PRECISE_CALL_STATE_NOT_VALID 512 * @see PreciseCallState#PRECISE_CALL_STATE_IDLE 513 * @see PreciseCallState#PRECISE_CALL_STATE_ACTIVE 514 * @see PreciseCallState#PRECISE_CALL_STATE_HOLDING 515 * @see PreciseCallState#PRECISE_CALL_STATE_DIALING 516 * @see PreciseCallState#PRECISE_CALL_STATE_ALERTING 517 * @see PreciseCallState#PRECISE_CALL_STATE_INCOMING 518 * @see PreciseCallState#PRECISE_CALL_STATE_WAITING 519 * @see PreciseCallState#PRECISE_CALL_STATE_DISCONNECTED 520 * @see PreciseCallState#PRECISE_CALL_STATE_DISCONNECTING 521 * 522 * <p class="note"> 523 * Retrieve with 524 * {@link android.content.Intent#getIntExtra(String name, int defaultValue)}. 525 * 526 * @hide 527 */ 528 public static final String EXTRA_RINGING_CALL_STATE = "ringing_state"; 529 530 /** 531 * The lookup key used with the {@link #ACTION_PRECISE_CALL_STATE_CHANGED} broadcast 532 * for an integer containing the state of the current foreground call. 533 * 534 * @see PreciseCallState#PRECISE_CALL_STATE_NOT_VALID 535 * @see PreciseCallState#PRECISE_CALL_STATE_IDLE 536 * @see PreciseCallState#PRECISE_CALL_STATE_ACTIVE 537 * @see PreciseCallState#PRECISE_CALL_STATE_HOLDING 538 * @see PreciseCallState#PRECISE_CALL_STATE_DIALING 539 * @see PreciseCallState#PRECISE_CALL_STATE_ALERTING 540 * @see PreciseCallState#PRECISE_CALL_STATE_INCOMING 541 * @see PreciseCallState#PRECISE_CALL_STATE_WAITING 542 * @see PreciseCallState#PRECISE_CALL_STATE_DISCONNECTED 543 * @see PreciseCallState#PRECISE_CALL_STATE_DISCONNECTING 544 * 545 * <p class="note"> 546 * Retrieve with 547 * {@link android.content.Intent#getIntExtra(String name, int defaultValue)}. 548 * 549 * @hide 550 */ 551 public static final String EXTRA_FOREGROUND_CALL_STATE = "foreground_state"; 552 553 /** 554 * The lookup key used with the {@link #ACTION_PRECISE_CALL_STATE_CHANGED} broadcast 555 * for an integer containing the state of the current background call. 556 * 557 * @see PreciseCallState#PRECISE_CALL_STATE_NOT_VALID 558 * @see PreciseCallState#PRECISE_CALL_STATE_IDLE 559 * @see PreciseCallState#PRECISE_CALL_STATE_ACTIVE 560 * @see PreciseCallState#PRECISE_CALL_STATE_HOLDING 561 * @see PreciseCallState#PRECISE_CALL_STATE_DIALING 562 * @see PreciseCallState#PRECISE_CALL_STATE_ALERTING 563 * @see PreciseCallState#PRECISE_CALL_STATE_INCOMING 564 * @see PreciseCallState#PRECISE_CALL_STATE_WAITING 565 * @see PreciseCallState#PRECISE_CALL_STATE_DISCONNECTED 566 * @see PreciseCallState#PRECISE_CALL_STATE_DISCONNECTING 567 * 568 * <p class="note"> 569 * Retrieve with 570 * {@link android.content.Intent#getIntExtra(String name, int defaultValue)}. 571 * 572 * @hide 573 */ 574 public static final String EXTRA_BACKGROUND_CALL_STATE = "background_state"; 575 576 /** 577 * The lookup key used with the {@link #ACTION_PRECISE_CALL_STATE_CHANGED} broadcast 578 * for an integer containing the disconnect cause. 579 * 580 * @see DisconnectCause 581 * 582 * <p class="note"> 583 * Retrieve with 584 * {@link android.content.Intent#getIntExtra(String name, int defaultValue)}. 585 * 586 * @hide 587 */ 588 public static final String EXTRA_DISCONNECT_CAUSE = "disconnect_cause"; 589 590 /** 591 * The lookup key used with the {@link #ACTION_PRECISE_CALL_STATE_CHANGED} broadcast 592 * for an integer containing the disconnect cause provided by the RIL. 593 * 594 * @see PreciseDisconnectCause 595 * 596 * <p class="note"> 597 * Retrieve with 598 * {@link android.content.Intent#getIntExtra(String name, int defaultValue)}. 599 * 600 * @hide 601 */ 602 public static final String EXTRA_PRECISE_DISCONNECT_CAUSE = "precise_disconnect_cause"; 603 604 /** 605 * Broadcast intent action indicating a data connection has changed, 606 * providing precise information about the connection. 607 * 608 * <p> 609 * The {@link #EXTRA_DATA_STATE} extra indicates the connection state. 610 * The {@link #EXTRA_DATA_NETWORK_TYPE} extra indicates the connection network type. 611 * The {@link #EXTRA_DATA_APN_TYPE} extra indicates the APN type. 612 * The {@link #EXTRA_DATA_APN} extra indicates the APN. 613 * The {@link #EXTRA_DATA_CHANGE_REASON} extra indicates the connection change reason. 614 * The {@link #EXTRA_DATA_IFACE_PROPERTIES} extra indicates the connection interface. 615 * The {@link #EXTRA_DATA_FAILURE_CAUSE} extra indicates the connection fail cause. 616 * 617 * <p class="note"> 618 * Requires the READ_PRECISE_PHONE_STATE permission. 619 * 620 * @see #EXTRA_DATA_STATE 621 * @see #EXTRA_DATA_NETWORK_TYPE 622 * @see #EXTRA_DATA_APN_TYPE 623 * @see #EXTRA_DATA_APN 624 * @see #EXTRA_DATA_CHANGE_REASON 625 * @see #EXTRA_DATA_IFACE 626 * @see #EXTRA_DATA_FAILURE_CAUSE 627 * @hide 628 * 629 * @deprecated If the app is running in the background, it won't be able to receive this 630 * broadcast. Apps should use ConnectivityManager {@link #registerNetworkCallback( 631 * android.net.NetworkRequest, ConnectivityManager.NetworkCallback)} to listen for network 632 * changes. 633 */ 634 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 635 @Deprecated 636 public static final String ACTION_PRECISE_DATA_CONNECTION_STATE_CHANGED = 637 "android.intent.action.PRECISE_DATA_CONNECTION_STATE_CHANGED"; 638 639 /** 640 * The lookup key used with the {@link #ACTION_PRECISE_DATA_CONNECTION_STATE_CHANGED} broadcast 641 * for an integer containing the state of the current data connection. 642 * 643 * @see TelephonyManager#DATA_UNKNOWN 644 * @see TelephonyManager#DATA_DISCONNECTED 645 * @see TelephonyManager#DATA_CONNECTING 646 * @see TelephonyManager#DATA_CONNECTED 647 * @see TelephonyManager#DATA_SUSPENDED 648 * 649 * <p class="note"> 650 * Retrieve with 651 * {@link android.content.Intent#getIntExtra(String name, int defaultValue)}. 652 * 653 * @hide 654 */ 655 public static final String EXTRA_DATA_STATE = PhoneConstants.STATE_KEY; 656 657 /** 658 * The lookup key used with the {@link #ACTION_PRECISE_DATA_CONNECTION_STATE_CHANGED} broadcast 659 * for an integer containing the network type. 660 * 661 * @see TelephonyManager#NETWORK_TYPE_UNKNOWN 662 * @see TelephonyManager#NETWORK_TYPE_GPRS 663 * @see TelephonyManager#NETWORK_TYPE_EDGE 664 * @see TelephonyManager#NETWORK_TYPE_UMTS 665 * @see TelephonyManager#NETWORK_TYPE_CDMA 666 * @see TelephonyManager#NETWORK_TYPE_EVDO_0 667 * @see TelephonyManager#NETWORK_TYPE_EVDO_A 668 * @see TelephonyManager#NETWORK_TYPE_1xRTT 669 * @see TelephonyManager#NETWORK_TYPE_HSDPA 670 * @see TelephonyManager#NETWORK_TYPE_HSUPA 671 * @see TelephonyManager#NETWORK_TYPE_HSPA 672 * @see TelephonyManager#NETWORK_TYPE_IDEN 673 * @see TelephonyManager#NETWORK_TYPE_EVDO_B 674 * @see TelephonyManager#NETWORK_TYPE_LTE 675 * @see TelephonyManager#NETWORK_TYPE_EHRPD 676 * @see TelephonyManager#NETWORK_TYPE_HSPAP 677 * 678 * <p class="note"> 679 * Retrieve with 680 * {@link android.content.Intent#getIntExtra(String name, int defaultValue)}. 681 * 682 * @hide 683 */ 684 public static final String EXTRA_DATA_NETWORK_TYPE = PhoneConstants.DATA_NETWORK_TYPE_KEY; 685 686 /** 687 * The lookup key used with the {@link #ACTION_PRECISE_DATA_CONNECTION_STATE_CHANGED} broadcast 688 * for an String containing the data APN type. 689 * 690 * <p class="note"> 691 * Retrieve with 692 * {@link android.content.Intent#getStringExtra(String name)}. 693 * 694 * @hide 695 */ 696 public static final String EXTRA_DATA_APN_TYPE = PhoneConstants.DATA_APN_TYPE_KEY; 697 698 /** 699 * The lookup key used with the {@link #ACTION_PRECISE_DATA_CONNECTION_STATE_CHANGED} broadcast 700 * for an String containing the data APN. 701 * 702 * <p class="note"> 703 * Retrieve with 704 * {@link android.content.Intent#getStringExtra(String name)}. 705 * 706 * @hide 707 */ 708 public static final String EXTRA_DATA_APN = PhoneConstants.DATA_APN_KEY; 709 710 /** 711 * The lookup key used with the {@link #ACTION_PRECISE_DATA_CONNECTION_STATE_CHANGED} broadcast 712 * for an String representation of the change reason. 713 * 714 * <p class="note"> 715 * Retrieve with 716 * {@link android.content.Intent#getStringExtra(String name)}. 717 * 718 * @hide 719 */ 720 public static final String EXTRA_DATA_CHANGE_REASON = PhoneConstants.STATE_CHANGE_REASON_KEY; 721 722 /** 723 * The lookup key used with the {@link #ACTION_PRECISE_DATA_CONNECTION_STATE_CHANGED} broadcast 724 * for an String representation of the data interface. 725 * 726 * <p class="note"> 727 * Retrieve with 728 * {@link android.content.Intent#getParcelableExtra(String name)}. 729 * 730 * @hide 731 */ 732 public static final String EXTRA_DATA_LINK_PROPERTIES_KEY = PhoneConstants.DATA_LINK_PROPERTIES_KEY; 733 734 /** 735 * The lookup key used with the {@link #ACTION_PRECISE_DATA_CONNECTION_STATE_CHANGED} broadcast 736 * for the data connection fail cause. 737 * 738 * <p class="note"> 739 * Retrieve with 740 * {@link android.content.Intent#getStringExtra(String name)}. 741 * 742 * @hide 743 */ 744 public static final String EXTRA_DATA_FAILURE_CAUSE = PhoneConstants.DATA_FAILURE_CAUSE_KEY; 745 746 /** 747 * Broadcast intent action for letting the default dialer to know to show voicemail 748 * notification. 749 * 750 * <p> 751 * The {@link #EXTRA_PHONE_ACCOUNT_HANDLE} extra indicates which {@link PhoneAccountHandle} the 752 * voicemail is received on. 753 * The {@link #EXTRA_NOTIFICATION_COUNT} extra indicates the total numbers of unheard 754 * voicemails. 755 * The {@link #EXTRA_VOICEMAIL_NUMBER} extra indicates the voicemail number if available. 756 * The {@link #EXTRA_CALL_VOICEMAIL_INTENT} extra is a {@link android.app.PendingIntent} that 757 * will call the voicemail number when sent. This extra will be empty if the voicemail number 758 * is not set, and {@link #EXTRA_LAUNCH_VOICEMAIL_SETTINGS_INTENT} will be set instead. 759 * The {@link #EXTRA_LAUNCH_VOICEMAIL_SETTINGS_INTENT} extra is a 760 * {@link android.app.PendingIntent} that will launch the voicemail settings. This extra is only 761 * available when the voicemail number is not set. 762 * 763 * @see #EXTRA_PHONE_ACCOUNT_HANDLE 764 * @see #EXTRA_NOTIFICATION_COUNT 765 * @see #EXTRA_VOICEMAIL_NUMBER 766 * @see #EXTRA_CALL_VOICEMAIL_INTENT 767 * @see #EXTRA_LAUNCH_VOICEMAIL_SETTINGS_INTENT 768 */ 769 public static final String ACTION_SHOW_VOICEMAIL_NOTIFICATION = 770 "android.telephony.action.SHOW_VOICEMAIL_NOTIFICATION"; 771 772 /** 773 * The extra used with an {@link #ACTION_SHOW_VOICEMAIL_NOTIFICATION} {@code Intent} to specify 774 * the {@link PhoneAccountHandle} the notification is for. 775 * <p class="note"> 776 * Retrieve with {@link android.content.Intent#getParcelableExtra(String)}. 777 */ 778 public static final String EXTRA_PHONE_ACCOUNT_HANDLE = 779 "android.telephony.extra.PHONE_ACCOUNT_HANDLE"; 780 781 /** 782 * The number of voice messages associated with the notification. 783 */ 784 public static final String EXTRA_NOTIFICATION_COUNT = 785 "android.telephony.extra.NOTIFICATION_COUNT"; 786 787 /** 788 * The voicemail number. 789 */ 790 public static final String EXTRA_VOICEMAIL_NUMBER = 791 "android.telephony.extra.VOICEMAIL_NUMBER"; 792 793 /** 794 * The intent to call voicemail. 795 */ 796 public static final String EXTRA_CALL_VOICEMAIL_INTENT = 797 "android.telephony.extra.CALL_VOICEMAIL_INTENT"; 798 799 /** 800 * The intent to launch voicemail settings. 801 */ 802 public static final String EXTRA_LAUNCH_VOICEMAIL_SETTINGS_INTENT = 803 "android.telephony.extra.LAUNCH_VOICEMAIL_SETTINGS_INTENT"; 804 805 /** 806 * {@link android.telecom.Connection} event used to indicate that an IMS call has be 807 * successfully handed over from WIFI to LTE. 808 * <p> 809 * Sent via {@link android.telecom.Connection#sendConnectionEvent(String, Bundle)}. 810 * The {@link Bundle} parameter is expected to be null when this connection event is used. 811 * @hide 812 */ 813 public static final String EVENT_HANDOVER_VIDEO_FROM_WIFI_TO_LTE = 814 "android.telephony.event.EVENT_HANDOVER_VIDEO_FROM_WIFI_TO_LTE"; 815 816 /** 817 * {@link android.telecom.Connection} event used to indicate that an IMS call failed to be 818 * handed over from LTE to WIFI. 819 * <p> 820 * Sent via {@link android.telecom.Connection#sendConnectionEvent(String, Bundle)}. 821 * The {@link Bundle} parameter is expected to be null when this connection event is used. 822 * @hide 823 */ 824 public static final String EVENT_HANDOVER_TO_WIFI_FAILED = 825 "android.telephony.event.EVENT_HANDOVER_TO_WIFI_FAILED"; 826 827 /** 828 * {@link android.telecom.Connection} event used to indicate that a video call was downgraded to 829 * audio because the data limit was reached. 830 * <p> 831 * Sent via {@link android.telecom.Connection#sendConnectionEvent(String, Bundle)}. 832 * The {@link Bundle} parameter is expected to be null when this connection event is used. 833 * @hide 834 */ 835 public static final String EVENT_DOWNGRADE_DATA_LIMIT_REACHED = 836 "android.telephony.event.EVENT_DOWNGRADE_DATA_LIMIT_REACHED"; 837 838 /** 839 * {@link android.telecom.Connection} event used to indicate that a video call was downgraded to 840 * audio because the data was disabled. 841 * <p> 842 * Sent via {@link android.telecom.Connection#sendConnectionEvent(String, Bundle)}. 843 * The {@link Bundle} parameter is expected to be null when this connection event is used. 844 * @hide 845 */ 846 public static final String EVENT_DOWNGRADE_DATA_DISABLED = 847 "android.telephony.event.EVENT_DOWNGRADE_DATA_DISABLED"; 848 849 /** 850 * {@link android.telecom.Connection} event used to indicate that the InCall UI should notify 851 * the user when an international call is placed while on WFC only. 852 * <p> 853 * Used when the carrier config value 854 * {@link CarrierConfigManager#KEY_NOTIFY_INTERNATIONAL_CALL_ON_WFC_BOOL} is true, the device 855 * is on WFC (VoLTE not available) and an international number is dialed. 856 * <p> 857 * Sent via {@link android.telecom.Connection#sendConnectionEvent(String, Bundle)}. 858 * The {@link Bundle} parameter is expected to be null when this connection event is used. 859 * @hide 860 */ 861 public static final String EVENT_NOTIFY_INTERNATIONAL_CALL_ON_WFC = 862 "android.telephony.event.EVENT_NOTIFY_INTERNATIONAL_CALL_ON_WFC"; 863 864 /* Visual voicemail protocols */ 865 866 /** 867 * The OMTP protocol. 868 */ 869 public static final String VVM_TYPE_OMTP = "vvm_type_omtp"; 870 871 /** 872 * A flavor of OMTP protocol with a different mobile originated (MO) format 873 */ 874 public static final String VVM_TYPE_CVVM = "vvm_type_cvvm"; 875 876 /** 877 * Key in bundle returned by {@link #getVisualVoicemailPackageName()}, indicating whether visual 878 * voicemail was enabled or disabled by the user. If the user never explicitly changed this 879 * setting, this key will not exist. 880 * 881 * @see #getVisualVoicemailSettings() 882 * @hide 883 */ 884 @SystemApi 885 public static final String EXTRA_VISUAL_VOICEMAIL_ENABLED_BY_USER_BOOL = 886 "android.telephony.extra.VISUAL_VOICEMAIL_ENABLED_BY_USER_BOOL"; 887 888 /** 889 * Key in bundle returned by {@link #getVisualVoicemailPackageName()}, indicating the voicemail 890 * access PIN scrambled during the auto provisioning process. The user is expected to reset 891 * their PIN if this value is not {@code null}. 892 * 893 * @see #getVisualVoicemailSettings() 894 * @hide 895 */ 896 @SystemApi 897 public static final String EXTRA_VOICEMAIL_SCRAMBLED_PIN_STRING = 898 "android.telephony.extra.VOICEMAIL_SCRAMBLED_PIN_STRING"; 899 900 /** 901 * @hide 902 */ 903 public static final String USSD_RESPONSE = "USSD_RESPONSE"; 904 905 /** 906 * USSD return code success. 907 * @hide 908 */ 909 public static final int USSD_RETURN_SUCCESS = 100; 910 911 /** 912 * Failed code returned when the mobile network has failed to complete a USSD request. 913 * <p> 914 * Returned via {@link TelephonyManager.UssdResponseCallback#onReceiveUssdResponseFailed( 915 * TelephonyManager, String, int)}. 916 */ 917 public static final int USSD_RETURN_FAILURE = -1; 918 919 /** 920 * Failure code returned when a USSD request has failed to execute because the Telephony 921 * service is unavailable. 922 * <p> 923 * Returned via {@link TelephonyManager.UssdResponseCallback#onReceiveUssdResponseFailed( 924 * TelephonyManager, String, int)}. 925 */ 926 public static final int USSD_ERROR_SERVICE_UNAVAIL = -2; 927 928 // 929 // 930 // Device Info 931 // 932 // 933 934 /** 935 * Returns the software version number for the device, for example, 936 * the IMEI/SV for GSM phones. Return null if the software version is 937 * not available. 938 */ 939 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 940 public String getDeviceSoftwareVersion() { 941 return getDeviceSoftwareVersion(getSlotIndex()); 942 } 943 944 /** 945 * Returns the software version number for the device, for example, 946 * the IMEI/SV for GSM phones. Return null if the software version is 947 * not available. 948 * 949 * @param slotIndex of which deviceID is returned 950 */ 951 /** {@hide} */ 952 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 953 public String getDeviceSoftwareVersion(int slotIndex) { 954 ITelephony telephony = getITelephony(); 955 if (telephony == null) return null; 956 957 try { 958 return telephony.getDeviceSoftwareVersionForSlot(slotIndex, getOpPackageName()); 959 } catch (RemoteException ex) { 960 return null; 961 } catch (NullPointerException ex) { 962 return null; 963 } 964 } 965 966 /** 967 * Returns the unique device ID, for example, the IMEI for GSM and the MEID 968 * or ESN for CDMA phones. Return null if device ID is not available. 969 * 970 * @deprecated Use (@link getImei} which returns IMEI for GSM or (@link getMeid} which returns 971 * MEID for CDMA. 972 */ 973 @Deprecated 974 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 975 public String getDeviceId() { 976 try { 977 ITelephony telephony = getITelephony(); 978 if (telephony == null) 979 return null; 980 return telephony.getDeviceId(mContext.getOpPackageName()); 981 } catch (RemoteException ex) { 982 return null; 983 } catch (NullPointerException ex) { 984 return null; 985 } 986 } 987 988 /** 989 * Returns the unique device ID of a subscription, for example, the IMEI for 990 * GSM and the MEID for CDMA phones. Return null if device ID is not available. 991 * 992 * @param slotIndex of which deviceID is returned 993 * 994 * @deprecated Use (@link getImei} which returns IMEI for GSM or (@link getMeid} which returns 995 * MEID for CDMA. 996 */ 997 @Deprecated 998 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 999 public String getDeviceId(int slotIndex) { 1000 // FIXME this assumes phoneId == slotIndex 1001 try { 1002 IPhoneSubInfo info = getSubscriberInfo(); 1003 if (info == null) 1004 return null; 1005 return info.getDeviceIdForPhone(slotIndex, mContext.getOpPackageName()); 1006 } catch (RemoteException ex) { 1007 return null; 1008 } catch (NullPointerException ex) { 1009 return null; 1010 } 1011 } 1012 1013 /** 1014 * Returns the IMEI (International Mobile Equipment Identity). Return null if IMEI is not 1015 * available. 1016 */ 1017 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 1018 public String getImei() { 1019 return getImei(getSlotIndex()); 1020 } 1021 1022 /** 1023 * Returns the IMEI (International Mobile Equipment Identity). Return null if IMEI is not 1024 * available. 1025 * 1026 * @param slotIndex of which IMEI is returned 1027 */ 1028 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 1029 public String getImei(int slotIndex) { 1030 ITelephony telephony = getITelephony(); 1031 if (telephony == null) return null; 1032 1033 try { 1034 return telephony.getImeiForSlot(slotIndex, getOpPackageName()); 1035 } catch (RemoteException ex) { 1036 return null; 1037 } catch (NullPointerException ex) { 1038 return null; 1039 } 1040 } 1041 1042 /** 1043 * Returns the MEID (Mobile Equipment Identifier). Return null if MEID is not available. 1044 */ 1045 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 1046 public String getMeid() { 1047 return getMeid(getSlotIndex()); 1048 } 1049 1050 /** 1051 * Returns the MEID (Mobile Equipment Identifier). Return null if MEID is not available. 1052 * 1053 * @param slotIndex of which MEID is returned 1054 */ 1055 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 1056 public String getMeid(int slotIndex) { 1057 ITelephony telephony = getITelephony(); 1058 if (telephony == null) return null; 1059 1060 try { 1061 return telephony.getMeidForSlot(slotIndex, getOpPackageName()); 1062 } catch (RemoteException ex) { 1063 return null; 1064 } catch (NullPointerException ex) { 1065 return null; 1066 } 1067 } 1068 1069 /** 1070 * Returns the NAI. Return null if NAI is not available. 1071 * 1072 */ 1073 /** {@hide}*/ 1074 public String getNai() { 1075 return getNai(getSlotIndex()); 1076 } 1077 1078 /** 1079 * Returns the NAI. Return null if NAI is not available. 1080 * 1081 * @param slotIndex of which Nai is returned 1082 */ 1083 /** {@hide}*/ 1084 public String getNai(int slotIndex) { 1085 int[] subId = SubscriptionManager.getSubId(slotIndex); 1086 try { 1087 IPhoneSubInfo info = getSubscriberInfo(); 1088 if (info == null) 1089 return null; 1090 String nai = info.getNaiForSubscriber(subId[0], mContext.getOpPackageName()); 1091 if (Log.isLoggable(TAG, Log.VERBOSE)) { 1092 Rlog.v(TAG, "Nai = " + nai); 1093 } 1094 return nai; 1095 } catch (RemoteException ex) { 1096 return null; 1097 } catch (NullPointerException ex) { 1098 return null; 1099 } 1100 } 1101 1102 /** 1103 * Returns the current location of the device. 1104 *<p> 1105 * If there is only one radio in the device and that radio has an LTE connection, 1106 * this method will return null. The implementation must not to try add LTE 1107 * identifiers into the existing cdma/gsm classes. 1108 *<p> 1109 * @return Current location of the device or null if not available. 1110 * 1111 * @deprecated use {@link #getAllCellInfo} instead, which returns a superset of this API. 1112 */ 1113 @Deprecated 1114 @RequiresPermission(anyOf = { 1115 android.Manifest.permission.ACCESS_COARSE_LOCATION, 1116 android.Manifest.permission.ACCESS_FINE_LOCATION 1117 }) 1118 public CellLocation getCellLocation() { 1119 try { 1120 ITelephony telephony = getITelephony(); 1121 if (telephony == null) { 1122 Rlog.d(TAG, "getCellLocation returning null because telephony is null"); 1123 return null; 1124 } 1125 Bundle bundle = telephony.getCellLocation(mContext.getOpPackageName()); 1126 if (bundle.isEmpty()) { 1127 Rlog.d(TAG, "getCellLocation returning null because bundle is empty"); 1128 return null; 1129 } 1130 CellLocation cl = CellLocation.newFromBundle(bundle); 1131 if (cl.isEmpty()) { 1132 Rlog.d(TAG, "getCellLocation returning null because CellLocation is empty"); 1133 return null; 1134 } 1135 return cl; 1136 } catch (RemoteException ex) { 1137 Rlog.d(TAG, "getCellLocation returning null due to RemoteException " + ex); 1138 return null; 1139 } catch (NullPointerException ex) { 1140 Rlog.d(TAG, "getCellLocation returning null due to NullPointerException " + ex); 1141 return null; 1142 } 1143 } 1144 1145 /** 1146 * Enables location update notifications. {@link PhoneStateListener#onCellLocationChanged 1147 * PhoneStateListener.onCellLocationChanged} will be called on location updates. 1148 * 1149 * @hide 1150 */ 1151 @RequiresPermission(android.Manifest.permission.CONTROL_LOCATION_UPDATES) 1152 public void enableLocationUpdates() { 1153 enableLocationUpdates(getSubId()); 1154 } 1155 1156 /** 1157 * Enables location update notifications for a subscription. 1158 * {@link PhoneStateListener#onCellLocationChanged 1159 * PhoneStateListener.onCellLocationChanged} will be called on location updates. 1160 * 1161 * @param subId for which the location updates are enabled 1162 * @hide 1163 */ 1164 @RequiresPermission(android.Manifest.permission.CONTROL_LOCATION_UPDATES) 1165 public void enableLocationUpdates(int subId) { 1166 try { 1167 ITelephony telephony = getITelephony(); 1168 if (telephony != null) 1169 telephony.enableLocationUpdatesForSubscriber(subId); 1170 } catch (RemoteException ex) { 1171 } catch (NullPointerException ex) { 1172 } 1173 } 1174 1175 /** 1176 * Disables location update notifications. {@link PhoneStateListener#onCellLocationChanged 1177 * PhoneStateListener.onCellLocationChanged} will be called on location updates. 1178 * 1179 * @hide 1180 */ 1181 @RequiresPermission(android.Manifest.permission.CONTROL_LOCATION_UPDATES) 1182 public void disableLocationUpdates() { 1183 disableLocationUpdates(getSubId()); 1184 } 1185 1186 /** @hide */ 1187 public void disableLocationUpdates(int subId) { 1188 try { 1189 ITelephony telephony = getITelephony(); 1190 if (telephony != null) 1191 telephony.disableLocationUpdatesForSubscriber(subId); 1192 } catch (RemoteException ex) { 1193 } catch (NullPointerException ex) { 1194 } 1195 } 1196 1197 /** 1198 * Returns the neighboring cell information of the device. 1199 * 1200 * @return List of NeighboringCellInfo or null if info unavailable. 1201 * 1202 * @deprecated Use {@link #getAllCellInfo} which returns a superset of the information 1203 * from NeighboringCellInfo. 1204 */ 1205 @Deprecated 1206 @RequiresPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION) 1207 public List<NeighboringCellInfo> getNeighboringCellInfo() { 1208 try { 1209 ITelephony telephony = getITelephony(); 1210 if (telephony == null) 1211 return null; 1212 return telephony.getNeighboringCellInfo(mContext.getOpPackageName()); 1213 } catch (RemoteException ex) { 1214 return null; 1215 } catch (NullPointerException ex) { 1216 return null; 1217 } 1218 } 1219 1220 /** No phone radio. */ 1221 public static final int PHONE_TYPE_NONE = PhoneConstants.PHONE_TYPE_NONE; 1222 /** Phone radio is GSM. */ 1223 public static final int PHONE_TYPE_GSM = PhoneConstants.PHONE_TYPE_GSM; 1224 /** Phone radio is CDMA. */ 1225 public static final int PHONE_TYPE_CDMA = PhoneConstants.PHONE_TYPE_CDMA; 1226 /** Phone is via SIP. */ 1227 public static final int PHONE_TYPE_SIP = PhoneConstants.PHONE_TYPE_SIP; 1228 1229 /** 1230 * Returns the current phone type. 1231 * TODO: This is a last minute change and hence hidden. 1232 * 1233 * @see #PHONE_TYPE_NONE 1234 * @see #PHONE_TYPE_GSM 1235 * @see #PHONE_TYPE_CDMA 1236 * @see #PHONE_TYPE_SIP 1237 * 1238 * {@hide} 1239 */ 1240 @SystemApi 1241 public int getCurrentPhoneType() { 1242 return getCurrentPhoneType(getSubId()); 1243 } 1244 1245 /** 1246 * Returns a constant indicating the device phone type for a subscription. 1247 * 1248 * @see #PHONE_TYPE_NONE 1249 * @see #PHONE_TYPE_GSM 1250 * @see #PHONE_TYPE_CDMA 1251 * 1252 * @param subId for which phone type is returned 1253 * @hide 1254 */ 1255 @SystemApi 1256 public int getCurrentPhoneType(int subId) { 1257 int phoneId; 1258 if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { 1259 // if we don't have any sims, we don't have subscriptions, but we 1260 // still may want to know what type of phone we've got. 1261 phoneId = 0; 1262 } else { 1263 phoneId = SubscriptionManager.getPhoneId(subId); 1264 } 1265 1266 return getCurrentPhoneTypeForSlot(phoneId); 1267 } 1268 1269 /** 1270 * See getCurrentPhoneType. 1271 * 1272 * @hide 1273 */ 1274 public int getCurrentPhoneTypeForSlot(int slotIndex) { 1275 try{ 1276 ITelephony telephony = getITelephony(); 1277 if (telephony != null) { 1278 return telephony.getActivePhoneTypeForSlot(slotIndex); 1279 } else { 1280 // This can happen when the ITelephony interface is not up yet. 1281 return getPhoneTypeFromProperty(slotIndex); 1282 } 1283 } catch (RemoteException ex) { 1284 // This shouldn't happen in the normal case, as a backup we 1285 // read from the system property. 1286 return getPhoneTypeFromProperty(slotIndex); 1287 } catch (NullPointerException ex) { 1288 // This shouldn't happen in the normal case, as a backup we 1289 // read from the system property. 1290 return getPhoneTypeFromProperty(slotIndex); 1291 } 1292 } 1293 1294 /** 1295 * Returns a constant indicating the device phone type. This 1296 * indicates the type of radio used to transmit voice calls. 1297 * 1298 * @see #PHONE_TYPE_NONE 1299 * @see #PHONE_TYPE_GSM 1300 * @see #PHONE_TYPE_CDMA 1301 * @see #PHONE_TYPE_SIP 1302 */ 1303 public int getPhoneType() { 1304 if (!isVoiceCapable()) { 1305 return PHONE_TYPE_NONE; 1306 } 1307 return getCurrentPhoneType(); 1308 } 1309 1310 private int getPhoneTypeFromProperty() { 1311 return getPhoneTypeFromProperty(getPhoneId()); 1312 } 1313 1314 /** {@hide} */ 1315 private int getPhoneTypeFromProperty(int phoneId) { 1316 String type = getTelephonyProperty(phoneId, 1317 TelephonyProperties.CURRENT_ACTIVE_PHONE, null); 1318 if (type == null || type.isEmpty()) { 1319 return getPhoneTypeFromNetworkType(phoneId); 1320 } 1321 return Integer.parseInt(type); 1322 } 1323 1324 private int getPhoneTypeFromNetworkType() { 1325 return getPhoneTypeFromNetworkType(getPhoneId()); 1326 } 1327 1328 /** {@hide} */ 1329 private int getPhoneTypeFromNetworkType(int phoneId) { 1330 // When the system property CURRENT_ACTIVE_PHONE, has not been set, 1331 // use the system property for default network type. 1332 // This is a fail safe, and can only happen at first boot. 1333 String mode = getTelephonyProperty(phoneId, "ro.telephony.default_network", null); 1334 if (mode != null && !mode.isEmpty()) { 1335 return TelephonyManager.getPhoneType(Integer.parseInt(mode)); 1336 } 1337 return TelephonyManager.PHONE_TYPE_NONE; 1338 } 1339 1340 /** 1341 * This function returns the type of the phone, depending 1342 * on the network mode. 1343 * 1344 * @param networkMode 1345 * @return Phone Type 1346 * 1347 * @hide 1348 */ 1349 public static int getPhoneType(int networkMode) { 1350 switch(networkMode) { 1351 case RILConstants.NETWORK_MODE_CDMA: 1352 case RILConstants.NETWORK_MODE_CDMA_NO_EVDO: 1353 case RILConstants.NETWORK_MODE_EVDO_NO_CDMA: 1354 return PhoneConstants.PHONE_TYPE_CDMA; 1355 1356 case RILConstants.NETWORK_MODE_WCDMA_PREF: 1357 case RILConstants.NETWORK_MODE_GSM_ONLY: 1358 case RILConstants.NETWORK_MODE_WCDMA_ONLY: 1359 case RILConstants.NETWORK_MODE_GSM_UMTS: 1360 case RILConstants.NETWORK_MODE_LTE_GSM_WCDMA: 1361 case RILConstants.NETWORK_MODE_LTE_WCDMA: 1362 case RILConstants.NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA: 1363 case RILConstants.NETWORK_MODE_TDSCDMA_ONLY: 1364 case RILConstants.NETWORK_MODE_TDSCDMA_WCDMA: 1365 case RILConstants.NETWORK_MODE_LTE_TDSCDMA: 1366 case RILConstants.NETWORK_MODE_TDSCDMA_GSM: 1367 case RILConstants.NETWORK_MODE_LTE_TDSCDMA_GSM: 1368 case RILConstants.NETWORK_MODE_TDSCDMA_GSM_WCDMA: 1369 case RILConstants.NETWORK_MODE_LTE_TDSCDMA_WCDMA: 1370 case RILConstants.NETWORK_MODE_LTE_TDSCDMA_GSM_WCDMA: 1371 case RILConstants.NETWORK_MODE_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA: 1372 return PhoneConstants.PHONE_TYPE_GSM; 1373 1374 // Use CDMA Phone for the global mode including CDMA 1375 case RILConstants.NETWORK_MODE_GLOBAL: 1376 case RILConstants.NETWORK_MODE_LTE_CDMA_EVDO: 1377 case RILConstants.NETWORK_MODE_TDSCDMA_CDMA_EVDO_GSM_WCDMA: 1378 return PhoneConstants.PHONE_TYPE_CDMA; 1379 1380 case RILConstants.NETWORK_MODE_LTE_ONLY: 1381 if (getLteOnCdmaModeStatic() == PhoneConstants.LTE_ON_CDMA_TRUE) { 1382 return PhoneConstants.PHONE_TYPE_CDMA; 1383 } else { 1384 return PhoneConstants.PHONE_TYPE_GSM; 1385 } 1386 default: 1387 return PhoneConstants.PHONE_TYPE_GSM; 1388 } 1389 } 1390 1391 /** 1392 * The contents of the /proc/cmdline file 1393 */ 1394 private static String getProcCmdLine() 1395 { 1396 String cmdline = ""; 1397 FileInputStream is = null; 1398 try { 1399 is = new FileInputStream("/proc/cmdline"); 1400 byte [] buffer = new byte[2048]; 1401 int count = is.read(buffer); 1402 if (count > 0) { 1403 cmdline = new String(buffer, 0, count); 1404 } 1405 } catch (IOException e) { 1406 Rlog.d(TAG, "No /proc/cmdline exception=" + e); 1407 } finally { 1408 if (is != null) { 1409 try { 1410 is.close(); 1411 } catch (IOException e) { 1412 } 1413 } 1414 } 1415 Rlog.d(TAG, "/proc/cmdline=" + cmdline); 1416 return cmdline; 1417 } 1418 1419 /** Kernel command line */ 1420 private static final String sKernelCmdLine = getProcCmdLine(); 1421 1422 /** Pattern for selecting the product type from the kernel command line */ 1423 private static final Pattern sProductTypePattern = 1424 Pattern.compile("\\sproduct_type\\s*=\\s*(\\w+)"); 1425 1426 /** The ProductType used for LTE on CDMA devices */ 1427 private static final String sLteOnCdmaProductType = 1428 SystemProperties.get(TelephonyProperties.PROPERTY_LTE_ON_CDMA_PRODUCT_TYPE, ""); 1429 1430 /** 1431 * Return if the current radio is LTE on CDMA. This 1432 * is a tri-state return value as for a period of time 1433 * the mode may be unknown. 1434 * 1435 * @return {@link PhoneConstants#LTE_ON_CDMA_UNKNOWN}, {@link PhoneConstants#LTE_ON_CDMA_FALSE} 1436 * or {@link PhoneConstants#LTE_ON_CDMA_TRUE} 1437 * 1438 * @hide 1439 */ 1440 public static int getLteOnCdmaModeStatic() { 1441 int retVal; 1442 int curVal; 1443 String productType = ""; 1444 1445 curVal = SystemProperties.getInt(TelephonyProperties.PROPERTY_LTE_ON_CDMA_DEVICE, 1446 PhoneConstants.LTE_ON_CDMA_UNKNOWN); 1447 retVal = curVal; 1448 if (retVal == PhoneConstants.LTE_ON_CDMA_UNKNOWN) { 1449 Matcher matcher = sProductTypePattern.matcher(sKernelCmdLine); 1450 if (matcher.find()) { 1451 productType = matcher.group(1); 1452 if (sLteOnCdmaProductType.equals(productType)) { 1453 retVal = PhoneConstants.LTE_ON_CDMA_TRUE; 1454 } else { 1455 retVal = PhoneConstants.LTE_ON_CDMA_FALSE; 1456 } 1457 } else { 1458 retVal = PhoneConstants.LTE_ON_CDMA_FALSE; 1459 } 1460 } 1461 1462 Rlog.d(TAG, "getLteOnCdmaMode=" + retVal + " curVal=" + curVal + 1463 " product_type='" + productType + 1464 "' lteOnCdmaProductType='" + sLteOnCdmaProductType + "'"); 1465 return retVal; 1466 } 1467 1468 // 1469 // 1470 // Current Network 1471 // 1472 // 1473 1474 /** 1475 * Returns the alphabetic name of current registered operator. 1476 * <p> 1477 * Availability: Only when user is registered to a network. Result may be 1478 * unreliable on CDMA networks (use {@link #getPhoneType()} to determine if 1479 * on a CDMA network). 1480 */ 1481 public String getNetworkOperatorName() { 1482 return getNetworkOperatorName(getSubId()); 1483 } 1484 1485 /** 1486 * Returns the alphabetic name of current registered operator 1487 * for a particular subscription. 1488 * <p> 1489 * Availability: Only when user is registered to a network. Result may be 1490 * unreliable on CDMA networks (use {@link #getPhoneType()} to determine if 1491 * on a CDMA network). 1492 * @param subId 1493 * @hide 1494 */ 1495 public String getNetworkOperatorName(int subId) { 1496 int phoneId = SubscriptionManager.getPhoneId(subId); 1497 return getTelephonyProperty(phoneId, TelephonyProperties.PROPERTY_OPERATOR_ALPHA, ""); 1498 } 1499 1500 /** 1501 * Returns the numeric name (MCC+MNC) of current registered operator. 1502 * <p> 1503 * Availability: Only when user is registered to a network. Result may be 1504 * unreliable on CDMA networks (use {@link #getPhoneType()} to determine if 1505 * on a CDMA network). 1506 */ 1507 public String getNetworkOperator() { 1508 return getNetworkOperatorForPhone(getPhoneId()); 1509 } 1510 1511 /** 1512 * Returns the numeric name (MCC+MNC) of current registered operator 1513 * for a particular subscription. 1514 * <p> 1515 * Availability: Only when user is registered to a network. Result may be 1516 * unreliable on CDMA networks (use {@link #getPhoneType()} to determine if 1517 * on a CDMA network). 1518 * 1519 * @param subId 1520 * @hide 1521 */ 1522 public String getNetworkOperator(int subId) { 1523 int phoneId = SubscriptionManager.getPhoneId(subId); 1524 return getNetworkOperatorForPhone(phoneId); 1525 } 1526 1527 /** 1528 * Returns the numeric name (MCC+MNC) of current registered operator 1529 * for a particular subscription. 1530 * <p> 1531 * Availability: Only when user is registered to a network. Result may be 1532 * unreliable on CDMA networks (use {@link #getPhoneType()} to determine if 1533 * on a CDMA network). 1534 * 1535 * @param phoneId 1536 * @hide 1537 **/ 1538 public String getNetworkOperatorForPhone(int phoneId) { 1539 return getTelephonyProperty(phoneId, TelephonyProperties.PROPERTY_OPERATOR_NUMERIC, ""); 1540 } 1541 1542 1543 /** 1544 * Returns the network specifier of the subscription ID pinned to the TelephonyManager. The 1545 * network specifier is used by {@link 1546 * android.net.NetworkRequest.Builder#setNetworkSpecifier(String)} to create a {@link 1547 * android.net.NetworkRequest} that connects through the subscription. 1548 * 1549 * @see android.net.NetworkRequest.Builder#setNetworkSpecifier(String) 1550 * @see #createForSubscriptionId(int) 1551 * @see #createForPhoneAccountHandle(PhoneAccountHandle) 1552 */ 1553 public String getNetworkSpecifier() { 1554 return String.valueOf(getSubId()); 1555 } 1556 1557 /** 1558 * Returns the carrier config of the subscription ID pinned to the TelephonyManager. If an 1559 * invalid subscription ID is pinned to the TelephonyManager, the returned config will contain 1560 * default values. 1561 * 1562 * @see CarrierConfigManager#getConfigForSubId(int) 1563 * @see #createForSubscriptionId(int) 1564 * @see #createForPhoneAccountHandle(PhoneAccountHandle) 1565 */ 1566 @WorkerThread 1567 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 1568 public PersistableBundle getCarrierConfig() { 1569 CarrierConfigManager carrierConfigManager = mContext 1570 .getSystemService(CarrierConfigManager.class); 1571 return carrierConfigManager.getConfigForSubId(getSubId()); 1572 } 1573 1574 /** 1575 * Returns true if the device is considered roaming on the current 1576 * network, for GSM purposes. 1577 * <p> 1578 * Availability: Only when user registered to a network. 1579 */ 1580 public boolean isNetworkRoaming() { 1581 return isNetworkRoaming(getSubId()); 1582 } 1583 1584 /** 1585 * Returns true if the device is considered roaming on the current 1586 * network for a subscription. 1587 * <p> 1588 * Availability: Only when user registered to a network. 1589 * 1590 * @param subId 1591 * @hide 1592 */ 1593 public boolean isNetworkRoaming(int subId) { 1594 int phoneId = SubscriptionManager.getPhoneId(subId); 1595 return Boolean.parseBoolean(getTelephonyProperty(phoneId, 1596 TelephonyProperties.PROPERTY_OPERATOR_ISROAMING, null)); 1597 } 1598 1599 /** 1600 * Returns the ISO country code equivalent of the current registered 1601 * operator's MCC (Mobile Country Code). 1602 * <p> 1603 * Availability: Only when user is registered to a network. Result may be 1604 * unreliable on CDMA networks (use {@link #getPhoneType()} to determine if 1605 * on a CDMA network). 1606 */ 1607 public String getNetworkCountryIso() { 1608 return getNetworkCountryIsoForPhone(getPhoneId()); 1609 } 1610 1611 /** 1612 * Returns the ISO country code equivalent of the current registered 1613 * operator's MCC (Mobile Country Code) of a subscription. 1614 * <p> 1615 * Availability: Only when user is registered to a network. Result may be 1616 * unreliable on CDMA networks (use {@link #getPhoneType()} to determine if 1617 * on a CDMA network). 1618 * 1619 * @param subId for which Network CountryIso is returned 1620 * @hide 1621 */ 1622 public String getNetworkCountryIso(int subId) { 1623 int phoneId = SubscriptionManager.getPhoneId(subId); 1624 return getNetworkCountryIsoForPhone(phoneId); 1625 } 1626 1627 /** 1628 * Returns the ISO country code equivalent of the current registered 1629 * operator's MCC (Mobile Country Code) of a subscription. 1630 * <p> 1631 * Availability: Only when user is registered to a network. Result may be 1632 * unreliable on CDMA networks (use {@link #getPhoneType()} to determine if 1633 * on a CDMA network). 1634 * 1635 * @param phoneId for which Network CountryIso is returned 1636 */ 1637 /** {@hide} */ 1638 public String getNetworkCountryIsoForPhone(int phoneId) { 1639 return getTelephonyProperty(phoneId, TelephonyProperties.PROPERTY_OPERATOR_ISO_COUNTRY, ""); 1640 } 1641 1642 /** Network type is unknown */ 1643 public static final int NETWORK_TYPE_UNKNOWN = 0; 1644 /** Current network is GPRS */ 1645 public static final int NETWORK_TYPE_GPRS = 1; 1646 /** Current network is EDGE */ 1647 public static final int NETWORK_TYPE_EDGE = 2; 1648 /** Current network is UMTS */ 1649 public static final int NETWORK_TYPE_UMTS = 3; 1650 /** Current network is CDMA: Either IS95A or IS95B*/ 1651 public static final int NETWORK_TYPE_CDMA = 4; 1652 /** Current network is EVDO revision 0*/ 1653 public static final int NETWORK_TYPE_EVDO_0 = 5; 1654 /** Current network is EVDO revision A*/ 1655 public static final int NETWORK_TYPE_EVDO_A = 6; 1656 /** Current network is 1xRTT*/ 1657 public static final int NETWORK_TYPE_1xRTT = 7; 1658 /** Current network is HSDPA */ 1659 public static final int NETWORK_TYPE_HSDPA = 8; 1660 /** Current network is HSUPA */ 1661 public static final int NETWORK_TYPE_HSUPA = 9; 1662 /** Current network is HSPA */ 1663 public static final int NETWORK_TYPE_HSPA = 10; 1664 /** Current network is iDen */ 1665 public static final int NETWORK_TYPE_IDEN = 11; 1666 /** Current network is EVDO revision B*/ 1667 public static final int NETWORK_TYPE_EVDO_B = 12; 1668 /** Current network is LTE */ 1669 public static final int NETWORK_TYPE_LTE = 13; 1670 /** Current network is eHRPD */ 1671 public static final int NETWORK_TYPE_EHRPD = 14; 1672 /** Current network is HSPA+ */ 1673 public static final int NETWORK_TYPE_HSPAP = 15; 1674 /** Current network is GSM */ 1675 public static final int NETWORK_TYPE_GSM = 16; 1676 /** Current network is TD_SCDMA */ 1677 public static final int NETWORK_TYPE_TD_SCDMA = 17; 1678 /** Current network is IWLAN */ 1679 public static final int NETWORK_TYPE_IWLAN = 18; 1680 /** Current network is LTE_CA {@hide} */ 1681 public static final int NETWORK_TYPE_LTE_CA = 19; 1682 /** 1683 * @return the NETWORK_TYPE_xxxx for current data connection. 1684 */ 1685 public int getNetworkType() { 1686 try { 1687 ITelephony telephony = getITelephony(); 1688 if (telephony != null) { 1689 return telephony.getNetworkType(); 1690 } else { 1691 // This can happen when the ITelephony interface is not up yet. 1692 return NETWORK_TYPE_UNKNOWN; 1693 } 1694 } catch(RemoteException ex) { 1695 // This shouldn't happen in the normal case 1696 return NETWORK_TYPE_UNKNOWN; 1697 } catch (NullPointerException ex) { 1698 // This could happen before phone restarts due to crashing 1699 return NETWORK_TYPE_UNKNOWN; 1700 } 1701 } 1702 1703 /** 1704 * Returns a constant indicating the radio technology (network type) 1705 * currently in use on the device for a subscription. 1706 * @return the network type 1707 * 1708 * @param subId for which network type is returned 1709 * 1710 * @see #NETWORK_TYPE_UNKNOWN 1711 * @see #NETWORK_TYPE_GPRS 1712 * @see #NETWORK_TYPE_EDGE 1713 * @see #NETWORK_TYPE_UMTS 1714 * @see #NETWORK_TYPE_HSDPA 1715 * @see #NETWORK_TYPE_HSUPA 1716 * @see #NETWORK_TYPE_HSPA 1717 * @see #NETWORK_TYPE_CDMA 1718 * @see #NETWORK_TYPE_EVDO_0 1719 * @see #NETWORK_TYPE_EVDO_A 1720 * @see #NETWORK_TYPE_EVDO_B 1721 * @see #NETWORK_TYPE_1xRTT 1722 * @see #NETWORK_TYPE_IDEN 1723 * @see #NETWORK_TYPE_LTE 1724 * @see #NETWORK_TYPE_EHRPD 1725 * @see #NETWORK_TYPE_HSPAP 1726 * 1727 * @hide 1728 */ 1729 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 1730 public int getNetworkType(int subId) { 1731 try { 1732 ITelephony telephony = getITelephony(); 1733 if (telephony != null) { 1734 return telephony.getNetworkTypeForSubscriber(subId, getOpPackageName()); 1735 } else { 1736 // This can happen when the ITelephony interface is not up yet. 1737 return NETWORK_TYPE_UNKNOWN; 1738 } 1739 } catch(RemoteException ex) { 1740 // This shouldn't happen in the normal case 1741 return NETWORK_TYPE_UNKNOWN; 1742 } catch (NullPointerException ex) { 1743 // This could happen before phone restarts due to crashing 1744 return NETWORK_TYPE_UNKNOWN; 1745 } 1746 } 1747 1748 /** 1749 * Returns a constant indicating the radio technology (network type) 1750 * currently in use on the device for data transmission. 1751 * 1752 * If this object has been created with {@link #createForSubscriptionId}, applies to the given 1753 * subId. Otherwise, applies to {@link SubscriptionManager#getDefaultDataSubscriptionId()} 1754 * 1755 * @return the network type 1756 * 1757 * @see #NETWORK_TYPE_UNKNOWN 1758 * @see #NETWORK_TYPE_GPRS 1759 * @see #NETWORK_TYPE_EDGE 1760 * @see #NETWORK_TYPE_UMTS 1761 * @see #NETWORK_TYPE_HSDPA 1762 * @see #NETWORK_TYPE_HSUPA 1763 * @see #NETWORK_TYPE_HSPA 1764 * @see #NETWORK_TYPE_CDMA 1765 * @see #NETWORK_TYPE_EVDO_0 1766 * @see #NETWORK_TYPE_EVDO_A 1767 * @see #NETWORK_TYPE_EVDO_B 1768 * @see #NETWORK_TYPE_1xRTT 1769 * @see #NETWORK_TYPE_IDEN 1770 * @see #NETWORK_TYPE_LTE 1771 * @see #NETWORK_TYPE_EHRPD 1772 * @see #NETWORK_TYPE_HSPAP 1773 */ 1774 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 1775 public int getDataNetworkType() { 1776 return getDataNetworkType(getSubId(SubscriptionManager.getDefaultDataSubscriptionId())); 1777 } 1778 1779 /** 1780 * Returns a constant indicating the radio technology (network type) 1781 * currently in use on the device for data transmission for a subscription 1782 * @return the network type 1783 * 1784 * @param subId for which network type is returned 1785 * @hide 1786 */ 1787 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 1788 public int getDataNetworkType(int subId) { 1789 try{ 1790 ITelephony telephony = getITelephony(); 1791 if (telephony != null) { 1792 return telephony.getDataNetworkTypeForSubscriber(subId, getOpPackageName()); 1793 } else { 1794 // This can happen when the ITelephony interface is not up yet. 1795 return NETWORK_TYPE_UNKNOWN; 1796 } 1797 } catch(RemoteException ex) { 1798 // This shouldn't happen in the normal case 1799 return NETWORK_TYPE_UNKNOWN; 1800 } catch (NullPointerException ex) { 1801 // This could happen before phone restarts due to crashing 1802 return NETWORK_TYPE_UNKNOWN; 1803 } 1804 } 1805 1806 /** 1807 * Returns the NETWORK_TYPE_xxxx for voice 1808 */ 1809 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 1810 public int getVoiceNetworkType() { 1811 return getVoiceNetworkType(getSubId()); 1812 } 1813 1814 /** 1815 * Returns the NETWORK_TYPE_xxxx for voice for a subId 1816 * @hide 1817 */ 1818 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 1819 public int getVoiceNetworkType(int subId) { 1820 try{ 1821 ITelephony telephony = getITelephony(); 1822 if (telephony != null) { 1823 return telephony.getVoiceNetworkTypeForSubscriber(subId, getOpPackageName()); 1824 } else { 1825 // This can happen when the ITelephony interface is not up yet. 1826 return NETWORK_TYPE_UNKNOWN; 1827 } 1828 } catch(RemoteException ex) { 1829 // This shouldn't happen in the normal case 1830 return NETWORK_TYPE_UNKNOWN; 1831 } catch (NullPointerException ex) { 1832 // This could happen before phone restarts due to crashing 1833 return NETWORK_TYPE_UNKNOWN; 1834 } 1835 } 1836 1837 /** 1838 * Network Class Definitions. 1839 * Do not change this order, it is used for sorting during emergency calling in 1840 * {@link TelephonyConnectionService#getFirstPhoneForEmergencyCall()}. Any newer technologies 1841 * should be added after the current definitions. 1842 */ 1843 /** Unknown network class. {@hide} */ 1844 public static final int NETWORK_CLASS_UNKNOWN = 0; 1845 /** Class of broadly defined "2G" networks. {@hide} */ 1846 public static final int NETWORK_CLASS_2_G = 1; 1847 /** Class of broadly defined "3G" networks. {@hide} */ 1848 public static final int NETWORK_CLASS_3_G = 2; 1849 /** Class of broadly defined "4G" networks. {@hide} */ 1850 public static final int NETWORK_CLASS_4_G = 3; 1851 1852 /** 1853 * Return general class of network type, such as "3G" or "4G". In cases 1854 * where classification is contentious, this method is conservative. 1855 * 1856 * @hide 1857 */ 1858 public static int getNetworkClass(int networkType) { 1859 switch (networkType) { 1860 case NETWORK_TYPE_GPRS: 1861 case NETWORK_TYPE_GSM: 1862 case NETWORK_TYPE_EDGE: 1863 case NETWORK_TYPE_CDMA: 1864 case NETWORK_TYPE_1xRTT: 1865 case NETWORK_TYPE_IDEN: 1866 return NETWORK_CLASS_2_G; 1867 case NETWORK_TYPE_UMTS: 1868 case NETWORK_TYPE_EVDO_0: 1869 case NETWORK_TYPE_EVDO_A: 1870 case NETWORK_TYPE_HSDPA: 1871 case NETWORK_TYPE_HSUPA: 1872 case NETWORK_TYPE_HSPA: 1873 case NETWORK_TYPE_EVDO_B: 1874 case NETWORK_TYPE_EHRPD: 1875 case NETWORK_TYPE_HSPAP: 1876 case NETWORK_TYPE_TD_SCDMA: 1877 return NETWORK_CLASS_3_G; 1878 case NETWORK_TYPE_LTE: 1879 case NETWORK_TYPE_IWLAN: 1880 case NETWORK_TYPE_LTE_CA: 1881 return NETWORK_CLASS_4_G; 1882 default: 1883 return NETWORK_CLASS_UNKNOWN; 1884 } 1885 } 1886 1887 /** 1888 * Returns a string representation of the radio technology (network type) 1889 * currently in use on the device. 1890 * @return the name of the radio technology 1891 * 1892 * @hide pending API council review 1893 */ 1894 public String getNetworkTypeName() { 1895 return getNetworkTypeName(getNetworkType()); 1896 } 1897 1898 /** 1899 * Returns a string representation of the radio technology (network type) 1900 * currently in use on the device. 1901 * @param subId for which network type is returned 1902 * @return the name of the radio technology 1903 * 1904 */ 1905 /** {@hide} */ 1906 public static String getNetworkTypeName(int type) { 1907 switch (type) { 1908 case NETWORK_TYPE_GPRS: 1909 return "GPRS"; 1910 case NETWORK_TYPE_EDGE: 1911 return "EDGE"; 1912 case NETWORK_TYPE_UMTS: 1913 return "UMTS"; 1914 case NETWORK_TYPE_HSDPA: 1915 return "HSDPA"; 1916 case NETWORK_TYPE_HSUPA: 1917 return "HSUPA"; 1918 case NETWORK_TYPE_HSPA: 1919 return "HSPA"; 1920 case NETWORK_TYPE_CDMA: 1921 return "CDMA"; 1922 case NETWORK_TYPE_EVDO_0: 1923 return "CDMA - EvDo rev. 0"; 1924 case NETWORK_TYPE_EVDO_A: 1925 return "CDMA - EvDo rev. A"; 1926 case NETWORK_TYPE_EVDO_B: 1927 return "CDMA - EvDo rev. B"; 1928 case NETWORK_TYPE_1xRTT: 1929 return "CDMA - 1xRTT"; 1930 case NETWORK_TYPE_LTE: 1931 return "LTE"; 1932 case NETWORK_TYPE_EHRPD: 1933 return "CDMA - eHRPD"; 1934 case NETWORK_TYPE_IDEN: 1935 return "iDEN"; 1936 case NETWORK_TYPE_HSPAP: 1937 return "HSPA+"; 1938 case NETWORK_TYPE_GSM: 1939 return "GSM"; 1940 case NETWORK_TYPE_TD_SCDMA: 1941 return "TD_SCDMA"; 1942 case NETWORK_TYPE_IWLAN: 1943 return "IWLAN"; 1944 case NETWORK_TYPE_LTE_CA: 1945 return "LTE_CA"; 1946 default: 1947 return "UNKNOWN"; 1948 } 1949 } 1950 1951 // 1952 // 1953 // SIM Card 1954 // 1955 // 1956 1957 /** 1958 * SIM card state: Unknown. Signifies that the SIM is in transition 1959 * between states. For example, when the user inputs the SIM pin 1960 * under PIN_REQUIRED state, a query for sim status returns 1961 * this state before turning to SIM_STATE_READY. 1962 * 1963 * These are the ordinal value of IccCardConstants.State. 1964 */ 1965 public static final int SIM_STATE_UNKNOWN = 0; 1966 /** SIM card state: no SIM card is available in the device */ 1967 public static final int SIM_STATE_ABSENT = 1; 1968 /** SIM card state: Locked: requires the user's SIM PIN to unlock */ 1969 public static final int SIM_STATE_PIN_REQUIRED = 2; 1970 /** SIM card state: Locked: requires the user's SIM PUK to unlock */ 1971 public static final int SIM_STATE_PUK_REQUIRED = 3; 1972 /** SIM card state: Locked: requires a network PIN to unlock */ 1973 public static final int SIM_STATE_NETWORK_LOCKED = 4; 1974 /** SIM card state: Ready */ 1975 public static final int SIM_STATE_READY = 5; 1976 /** SIM card state: SIM Card is NOT READY */ 1977 public static final int SIM_STATE_NOT_READY = 6; 1978 /** SIM card state: SIM Card Error, permanently disabled */ 1979 public static final int SIM_STATE_PERM_DISABLED = 7; 1980 /** SIM card state: SIM Card Error, present but faulty */ 1981 public static final int SIM_STATE_CARD_IO_ERROR = 8; 1982 /** SIM card state: SIM Card restricted, present but not usable due to 1983 * carrier restrictions. 1984 */ 1985 public static final int SIM_STATE_CARD_RESTRICTED = 9; 1986 1987 /** 1988 * @return true if a ICC card is present 1989 */ 1990 public boolean hasIccCard() { 1991 return hasIccCard(getSlotIndex()); 1992 } 1993 1994 /** 1995 * @return true if a ICC card is present for a subscription 1996 * 1997 * @param slotIndex for which icc card presence is checked 1998 */ 1999 /** {@hide} */ 2000 // FIXME Input argument slotIndex should be of type int 2001 public boolean hasIccCard(int slotIndex) { 2002 2003 try { 2004 ITelephony telephony = getITelephony(); 2005 if (telephony == null) 2006 return false; 2007 return telephony.hasIccCardUsingSlotIndex(slotIndex); 2008 } catch (RemoteException ex) { 2009 // Assume no ICC card if remote exception which shouldn't happen 2010 return false; 2011 } catch (NullPointerException ex) { 2012 // This could happen before phone restarts due to crashing 2013 return false; 2014 } 2015 } 2016 2017 /** 2018 * Returns a constant indicating the state of the default SIM card. 2019 * 2020 * @see #SIM_STATE_UNKNOWN 2021 * @see #SIM_STATE_ABSENT 2022 * @see #SIM_STATE_PIN_REQUIRED 2023 * @see #SIM_STATE_PUK_REQUIRED 2024 * @see #SIM_STATE_NETWORK_LOCKED 2025 * @see #SIM_STATE_READY 2026 * @see #SIM_STATE_NOT_READY 2027 * @see #SIM_STATE_PERM_DISABLED 2028 * @see #SIM_STATE_CARD_IO_ERROR 2029 * @see #SIM_STATE_CARD_RESTRICTED 2030 */ 2031 public int getSimState() { 2032 int slotIndex = getSlotIndex(); 2033 // slotIndex may be invalid due to sim being absent. In that case query all slots to get 2034 // sim state 2035 if (slotIndex < 0) { 2036 // query for all slots and return absent if all sim states are absent, otherwise 2037 // return unknown 2038 for (int i = 0; i < getPhoneCount(); i++) { 2039 int simState = getSimState(i); 2040 if (simState != SIM_STATE_ABSENT) { 2041 Rlog.d(TAG, "getSimState: default sim:" + slotIndex + ", sim state for " + 2042 "slotIndex=" + i + " is " + simState + ", return state as unknown"); 2043 return SIM_STATE_UNKNOWN; 2044 } 2045 } 2046 Rlog.d(TAG, "getSimState: default sim:" + slotIndex + ", all SIMs absent, return " + 2047 "state as absent"); 2048 return SIM_STATE_ABSENT; 2049 } 2050 return getSimState(slotIndex); 2051 } 2052 2053 /** 2054 * Returns a constant indicating the state of the device SIM card in a slot. 2055 * 2056 * @param slotIndex 2057 * 2058 * @see #SIM_STATE_UNKNOWN 2059 * @see #SIM_STATE_ABSENT 2060 * @see #SIM_STATE_PIN_REQUIRED 2061 * @see #SIM_STATE_PUK_REQUIRED 2062 * @see #SIM_STATE_NETWORK_LOCKED 2063 * @see #SIM_STATE_READY 2064 * @see #SIM_STATE_NOT_READY 2065 * @see #SIM_STATE_PERM_DISABLED 2066 * @see #SIM_STATE_CARD_IO_ERROR 2067 * @see #SIM_STATE_CARD_RESTRICTED 2068 */ 2069 public int getSimState(int slotIndex) { 2070 int simState = SubscriptionManager.getSimStateForSlotIndex(slotIndex); 2071 return simState; 2072 } 2073 2074 /** 2075 * Returns the MCC+MNC (mobile country code + mobile network code) of the 2076 * provider of the SIM. 5 or 6 decimal digits. 2077 * <p> 2078 * Availability: SIM state must be {@link #SIM_STATE_READY} 2079 * 2080 * @see #getSimState 2081 */ 2082 public String getSimOperator() { 2083 return getSimOperatorNumeric(); 2084 } 2085 2086 /** 2087 * Returns the MCC+MNC (mobile country code + mobile network code) of the 2088 * provider of the SIM. 5 or 6 decimal digits. 2089 * <p> 2090 * Availability: SIM state must be {@link #SIM_STATE_READY} 2091 * 2092 * @see #getSimState 2093 * 2094 * @param subId for which SimOperator is returned 2095 * @hide 2096 */ 2097 public String getSimOperator(int subId) { 2098 return getSimOperatorNumeric(subId); 2099 } 2100 2101 /** 2102 * Returns the MCC+MNC (mobile country code + mobile network code) of the 2103 * provider of the SIM. 5 or 6 decimal digits. 2104 * <p> 2105 * Availability: SIM state must be {@link #SIM_STATE_READY} 2106 * 2107 * @see #getSimState 2108 * @hide 2109 */ 2110 public String getSimOperatorNumeric() { 2111 int subId = SubscriptionManager.getDefaultDataSubscriptionId(); 2112 if (!SubscriptionManager.isUsableSubIdValue(subId)) { 2113 subId = SubscriptionManager.getDefaultSmsSubscriptionId(); 2114 if (!SubscriptionManager.isUsableSubIdValue(subId)) { 2115 subId = SubscriptionManager.getDefaultVoiceSubscriptionId(); 2116 if (!SubscriptionManager.isUsableSubIdValue(subId)) { 2117 subId = SubscriptionManager.getDefaultSubscriptionId(); 2118 } 2119 } 2120 } 2121 return getSimOperatorNumeric(subId); 2122 } 2123 2124 /** 2125 * Returns the MCC+MNC (mobile country code + mobile network code) of the 2126 * provider of the SIM for a particular subscription. 5 or 6 decimal digits. 2127 * <p> 2128 * Availability: SIM state must be {@link #SIM_STATE_READY} 2129 * 2130 * @see #getSimState 2131 * 2132 * @param subId for which SimOperator is returned 2133 * @hide 2134 */ 2135 public String getSimOperatorNumeric(int subId) { 2136 int phoneId = SubscriptionManager.getPhoneId(subId); 2137 return getSimOperatorNumericForPhone(phoneId); 2138 } 2139 2140 /** 2141 * Returns the MCC+MNC (mobile country code + mobile network code) of the 2142 * provider of the SIM for a particular subscription. 5 or 6 decimal digits. 2143 * <p> 2144 * 2145 * @param phoneId for which SimOperator is returned 2146 * @hide 2147 */ 2148 public String getSimOperatorNumericForPhone(int phoneId) { 2149 return getTelephonyProperty(phoneId, 2150 TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC, ""); 2151 } 2152 2153 /** 2154 * Returns the Service Provider Name (SPN). 2155 * <p> 2156 * Availability: SIM state must be {@link #SIM_STATE_READY} 2157 * 2158 * @see #getSimState 2159 */ 2160 public String getSimOperatorName() { 2161 return getSimOperatorNameForPhone(getPhoneId()); 2162 } 2163 2164 /** 2165 * Returns the Service Provider Name (SPN). 2166 * <p> 2167 * Availability: SIM state must be {@link #SIM_STATE_READY} 2168 * 2169 * @see #getSimState 2170 * 2171 * @param subId for which SimOperatorName is returned 2172 * @hide 2173 */ 2174 public String getSimOperatorName(int subId) { 2175 int phoneId = SubscriptionManager.getPhoneId(subId); 2176 return getSimOperatorNameForPhone(phoneId); 2177 } 2178 2179 /** 2180 * Returns the Service Provider Name (SPN). 2181 * 2182 * @hide 2183 */ 2184 public String getSimOperatorNameForPhone(int phoneId) { 2185 return getTelephonyProperty(phoneId, 2186 TelephonyProperties.PROPERTY_ICC_OPERATOR_ALPHA, ""); 2187 } 2188 2189 /** 2190 * Returns the ISO country code equivalent for the SIM provider's country code. 2191 */ 2192 public String getSimCountryIso() { 2193 return getSimCountryIsoForPhone(getPhoneId()); 2194 } 2195 2196 /** 2197 * Returns the ISO country code equivalent for the SIM provider's country code. 2198 * 2199 * @param subId for which SimCountryIso is returned 2200 * @hide 2201 */ 2202 public String getSimCountryIso(int subId) { 2203 int phoneId = SubscriptionManager.getPhoneId(subId); 2204 return getSimCountryIsoForPhone(phoneId); 2205 } 2206 2207 /** 2208 * Returns the ISO country code equivalent for the SIM provider's country code. 2209 * 2210 * @hide 2211 */ 2212 public String getSimCountryIsoForPhone(int phoneId) { 2213 return getTelephonyProperty(phoneId, 2214 TelephonyProperties.PROPERTY_ICC_OPERATOR_ISO_COUNTRY, ""); 2215 } 2216 2217 /** 2218 * Returns the serial number of the SIM, if applicable. Return null if it is 2219 * unavailable. 2220 */ 2221 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 2222 public String getSimSerialNumber() { 2223 return getSimSerialNumber(getSubId()); 2224 } 2225 2226 /** 2227 * Returns the serial number for the given subscription, if applicable. Return null if it is 2228 * unavailable. 2229 * <p> 2230 * @param subId for which Sim Serial number is returned 2231 * @hide 2232 */ 2233 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 2234 public String getSimSerialNumber(int subId) { 2235 try { 2236 IPhoneSubInfo info = getSubscriberInfo(); 2237 if (info == null) 2238 return null; 2239 return info.getIccSerialNumberForSubscriber(subId, mContext.getOpPackageName()); 2240 } catch (RemoteException ex) { 2241 return null; 2242 } catch (NullPointerException ex) { 2243 // This could happen before phone restarts due to crashing 2244 return null; 2245 } 2246 } 2247 2248 /** 2249 * Return if the current radio is LTE on CDMA. This 2250 * is a tri-state return value as for a period of time 2251 * the mode may be unknown. 2252 * 2253 * @return {@link PhoneConstants#LTE_ON_CDMA_UNKNOWN}, {@link PhoneConstants#LTE_ON_CDMA_FALSE} 2254 * or {@link PhoneConstants#LTE_ON_CDMA_TRUE} 2255 * 2256 * @hide 2257 */ 2258 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 2259 public int getLteOnCdmaMode() { 2260 return getLteOnCdmaMode(getSubId()); 2261 } 2262 2263 /** 2264 * Return if the current radio is LTE on CDMA for Subscription. This 2265 * is a tri-state return value as for a period of time 2266 * the mode may be unknown. 2267 * 2268 * @param subId for which radio is LTE on CDMA is returned 2269 * @return {@link PhoneConstants#LTE_ON_CDMA_UNKNOWN}, {@link PhoneConstants#LTE_ON_CDMA_FALSE} 2270 * or {@link PhoneConstants#LTE_ON_CDMA_TRUE} 2271 * @hide 2272 */ 2273 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 2274 public int getLteOnCdmaMode(int subId) { 2275 try { 2276 ITelephony telephony = getITelephony(); 2277 if (telephony == null) 2278 return PhoneConstants.LTE_ON_CDMA_UNKNOWN; 2279 return telephony.getLteOnCdmaModeForSubscriber(subId, getOpPackageName()); 2280 } catch (RemoteException ex) { 2281 // Assume no ICC card if remote exception which shouldn't happen 2282 return PhoneConstants.LTE_ON_CDMA_UNKNOWN; 2283 } catch (NullPointerException ex) { 2284 // This could happen before phone restarts due to crashing 2285 return PhoneConstants.LTE_ON_CDMA_UNKNOWN; 2286 } 2287 } 2288 2289 // 2290 // 2291 // Subscriber Info 2292 // 2293 // 2294 2295 /** 2296 * Returns the unique subscriber ID, for example, the IMSI for a GSM phone. 2297 * Return null if it is unavailable. 2298 */ 2299 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 2300 public String getSubscriberId() { 2301 return getSubscriberId(getSubId()); 2302 } 2303 2304 /** 2305 * Returns the unique subscriber ID, for example, the IMSI for a GSM phone 2306 * for a subscription. 2307 * Return null if it is unavailable. 2308 * 2309 * @param subId whose subscriber id is returned 2310 * @hide 2311 */ 2312 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 2313 public String getSubscriberId(int subId) { 2314 try { 2315 IPhoneSubInfo info = getSubscriberInfo(); 2316 if (info == null) 2317 return null; 2318 return info.getSubscriberIdForSubscriber(subId, mContext.getOpPackageName()); 2319 } catch (RemoteException ex) { 2320 return null; 2321 } catch (NullPointerException ex) { 2322 // This could happen before phone restarts due to crashing 2323 return null; 2324 } 2325 } 2326 2327 /** 2328 * Returns the Group Identifier Level1 for a GSM phone. 2329 * Return null if it is unavailable. 2330 */ 2331 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 2332 public String getGroupIdLevel1() { 2333 try { 2334 IPhoneSubInfo info = getSubscriberInfo(); 2335 if (info == null) 2336 return null; 2337 return info.getGroupIdLevel1(mContext.getOpPackageName()); 2338 } catch (RemoteException ex) { 2339 return null; 2340 } catch (NullPointerException ex) { 2341 // This could happen before phone restarts due to crashing 2342 return null; 2343 } 2344 } 2345 2346 /** 2347 * Returns the Group Identifier Level1 for a GSM phone for a particular subscription. 2348 * Return null if it is unavailable. 2349 * 2350 * @param subId whose subscriber id is returned 2351 * @hide 2352 */ 2353 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 2354 public String getGroupIdLevel1(int subId) { 2355 try { 2356 IPhoneSubInfo info = getSubscriberInfo(); 2357 if (info == null) 2358 return null; 2359 return info.getGroupIdLevel1ForSubscriber(subId, mContext.getOpPackageName()); 2360 } catch (RemoteException ex) { 2361 return null; 2362 } catch (NullPointerException ex) { 2363 // This could happen before phone restarts due to crashing 2364 return null; 2365 } 2366 } 2367 2368 /** 2369 * Returns the phone number string for line 1, for example, the MSISDN 2370 * for a GSM phone. Return null if it is unavailable. 2371 * <p> 2372 * The default SMS app can also use this. 2373 */ 2374 @RequiresPermission(anyOf = { 2375 android.Manifest.permission.READ_PHONE_STATE, 2376 android.Manifest.permission.READ_SMS, 2377 android.Manifest.permission.READ_PHONE_NUMBERS 2378 }) 2379 public String getLine1Number() { 2380 return getLine1Number(getSubId()); 2381 } 2382 2383 /** 2384 * Returns the phone number string for line 1, for example, the MSISDN 2385 * for a GSM phone for a particular subscription. Return null if it is unavailable. 2386 * <p> 2387 * The default SMS app can also use this. 2388 * 2389 * @param subId whose phone number for line 1 is returned 2390 * @hide 2391 */ 2392 @RequiresPermission(anyOf = { 2393 android.Manifest.permission.READ_PHONE_STATE, 2394 android.Manifest.permission.READ_SMS, 2395 android.Manifest.permission.READ_PHONE_NUMBERS 2396 }) 2397 public String getLine1Number(int subId) { 2398 String number = null; 2399 try { 2400 ITelephony telephony = getITelephony(); 2401 if (telephony != null) 2402 number = telephony.getLine1NumberForDisplay(subId, mContext.getOpPackageName()); 2403 } catch (RemoteException ex) { 2404 } catch (NullPointerException ex) { 2405 } 2406 if (number != null) { 2407 return number; 2408 } 2409 try { 2410 IPhoneSubInfo info = getSubscriberInfo(); 2411 if (info == null) 2412 return null; 2413 return info.getLine1NumberForSubscriber(subId, mContext.getOpPackageName()); 2414 } catch (RemoteException ex) { 2415 return null; 2416 } catch (NullPointerException ex) { 2417 // This could happen before phone restarts due to crashing 2418 return null; 2419 } 2420 } 2421 2422 /** 2423 * Set the line 1 phone number string and its alphatag for the current ICCID 2424 * for display purpose only, for example, displayed in Phone Status. It won't 2425 * change the actual MSISDN/MDN. To unset alphatag or number, pass in a null 2426 * value. 2427 * 2428 * <p>Requires that the calling app has carrier privileges. 2429 * @see #hasCarrierPrivileges 2430 * 2431 * @param alphaTag alpha-tagging of the dailing nubmer 2432 * @param number The dialing number 2433 * @return true if the operation was executed correctly. 2434 */ 2435 public boolean setLine1NumberForDisplay(String alphaTag, String number) { 2436 return setLine1NumberForDisplay(getSubId(), alphaTag, number); 2437 } 2438 2439 /** 2440 * Set the line 1 phone number string and its alphatag for the current ICCID 2441 * for display purpose only, for example, displayed in Phone Status. It won't 2442 * change the actual MSISDN/MDN. To unset alphatag or number, pass in a null 2443 * value. 2444 * 2445 * <p>Requires that the calling app has carrier privileges. 2446 * @see #hasCarrierPrivileges 2447 * 2448 * @param subId the subscriber that the alphatag and dialing number belongs to. 2449 * @param alphaTag alpha-tagging of the dailing nubmer 2450 * @param number The dialing number 2451 * @return true if the operation was executed correctly. 2452 * @hide 2453 */ 2454 public boolean setLine1NumberForDisplay(int subId, String alphaTag, String number) { 2455 try { 2456 ITelephony telephony = getITelephony(); 2457 if (telephony != null) 2458 return telephony.setLine1NumberForDisplayForSubscriber(subId, alphaTag, number); 2459 } catch (RemoteException ex) { 2460 } catch (NullPointerException ex) { 2461 } 2462 return false; 2463 } 2464 2465 /** 2466 * Returns the alphabetic identifier associated with the line 1 number. 2467 * Return null if it is unavailable. 2468 * @hide 2469 * nobody seems to call this. 2470 */ 2471 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 2472 public String getLine1AlphaTag() { 2473 return getLine1AlphaTag(getSubId()); 2474 } 2475 2476 /** 2477 * Returns the alphabetic identifier associated with the line 1 number 2478 * for a subscription. 2479 * Return null if it is unavailable. 2480 * @param subId whose alphabetic identifier associated with line 1 is returned 2481 * nobody seems to call this. 2482 * @hide 2483 */ 2484 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 2485 public String getLine1AlphaTag(int subId) { 2486 String alphaTag = null; 2487 try { 2488 ITelephony telephony = getITelephony(); 2489 if (telephony != null) 2490 alphaTag = telephony.getLine1AlphaTagForDisplay(subId, 2491 getOpPackageName()); 2492 } catch (RemoteException ex) { 2493 } catch (NullPointerException ex) { 2494 } 2495 if (alphaTag != null) { 2496 return alphaTag; 2497 } 2498 try { 2499 IPhoneSubInfo info = getSubscriberInfo(); 2500 if (info == null) 2501 return null; 2502 return info.getLine1AlphaTagForSubscriber(subId, getOpPackageName()); 2503 } catch (RemoteException ex) { 2504 return null; 2505 } catch (NullPointerException ex) { 2506 // This could happen before phone restarts due to crashing 2507 return null; 2508 } 2509 } 2510 2511 /** 2512 * Return the set of subscriber IDs that should be considered as "merged 2513 * together" for data usage purposes. This is commonly {@code null} to 2514 * indicate no merging is required. Any returned subscribers are sorted in a 2515 * deterministic order. 2516 * 2517 * @hide 2518 */ 2519 public @Nullable String[] getMergedSubscriberIds() { 2520 try { 2521 ITelephony telephony = getITelephony(); 2522 if (telephony != null) 2523 return telephony.getMergedSubscriberIds(getOpPackageName()); 2524 } catch (RemoteException ex) { 2525 } catch (NullPointerException ex) { 2526 } 2527 return null; 2528 } 2529 2530 /** 2531 * Returns the MSISDN string. 2532 * for a GSM phone. Return null if it is unavailable. 2533 * 2534 * @hide 2535 */ 2536 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 2537 public String getMsisdn() { 2538 return getMsisdn(getSubId()); 2539 } 2540 2541 /** 2542 * Returns the MSISDN string. 2543 * for a GSM phone. Return null if it is unavailable. 2544 * 2545 * @param subId for which msisdn is returned 2546 * @hide 2547 */ 2548 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 2549 public String getMsisdn(int subId) { 2550 try { 2551 IPhoneSubInfo info = getSubscriberInfo(); 2552 if (info == null) 2553 return null; 2554 return info.getMsisdnForSubscriber(subId, getOpPackageName()); 2555 } catch (RemoteException ex) { 2556 return null; 2557 } catch (NullPointerException ex) { 2558 // This could happen before phone restarts due to crashing 2559 return null; 2560 } 2561 } 2562 2563 /** 2564 * Returns the voice mail number. Return null if it is unavailable. 2565 */ 2566 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 2567 public String getVoiceMailNumber() { 2568 return getVoiceMailNumber(getSubId()); 2569 } 2570 2571 /** 2572 * Returns the voice mail number for a subscription. 2573 * Return null if it is unavailable. 2574 * @param subId whose voice mail number is returned 2575 * @hide 2576 */ 2577 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 2578 public String getVoiceMailNumber(int subId) { 2579 try { 2580 IPhoneSubInfo info = getSubscriberInfo(); 2581 if (info == null) 2582 return null; 2583 return info.getVoiceMailNumberForSubscriber(subId, getOpPackageName()); 2584 } catch (RemoteException ex) { 2585 return null; 2586 } catch (NullPointerException ex) { 2587 // This could happen before phone restarts due to crashing 2588 return null; 2589 } 2590 } 2591 2592 /** 2593 * Returns the complete voice mail number. Return null if it is unavailable. 2594 * 2595 * @hide 2596 */ 2597 @RequiresPermission(android.Manifest.permission.CALL_PRIVILEGED) 2598 public String getCompleteVoiceMailNumber() { 2599 return getCompleteVoiceMailNumber(getSubId()); 2600 } 2601 2602 /** 2603 * Returns the complete voice mail number. Return null if it is unavailable. 2604 * 2605 * @param subId 2606 * @hide 2607 */ 2608 @RequiresPermission(android.Manifest.permission.CALL_PRIVILEGED) 2609 public String getCompleteVoiceMailNumber(int subId) { 2610 try { 2611 IPhoneSubInfo info = getSubscriberInfo(); 2612 if (info == null) 2613 return null; 2614 return info.getCompleteVoiceMailNumberForSubscriber(subId); 2615 } catch (RemoteException ex) { 2616 return null; 2617 } catch (NullPointerException ex) { 2618 // This could happen before phone restarts due to crashing 2619 return null; 2620 } 2621 } 2622 2623 /** 2624 * Sets the voice mail number. 2625 * 2626 * <p>Requires that the calling app has carrier privileges. 2627 * @see #hasCarrierPrivileges 2628 * 2629 * @param alphaTag The alpha tag to display. 2630 * @param number The voicemail number. 2631 */ 2632 public boolean setVoiceMailNumber(String alphaTag, String number) { 2633 return setVoiceMailNumber(getSubId(), alphaTag, number); 2634 } 2635 2636 /** 2637 * Sets the voicemail number for the given subscriber. 2638 * 2639 * <p>Requires that the calling app has carrier privileges. 2640 * @see #hasCarrierPrivileges 2641 * 2642 * @param subId The subscription id. 2643 * @param alphaTag The alpha tag to display. 2644 * @param number The voicemail number. 2645 * @hide 2646 */ 2647 public boolean setVoiceMailNumber(int subId, String alphaTag, String number) { 2648 try { 2649 ITelephony telephony = getITelephony(); 2650 if (telephony != null) 2651 return telephony.setVoiceMailNumber(subId, alphaTag, number); 2652 } catch (RemoteException ex) { 2653 } catch (NullPointerException ex) { 2654 } 2655 return false; 2656 } 2657 2658 /** 2659 * Enables or disables the visual voicemail client for a phone account. 2660 * 2661 * <p>Requires that the calling app is the default dialer, or has carrier privileges, or 2662 * has permission {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE}. 2663 * @see #hasCarrierPrivileges 2664 * 2665 * @param phoneAccountHandle the phone account to change the client state 2666 * @param enabled the new state of the client 2667 * @hide 2668 * @deprecated Visual voicemail no longer in telephony. {@link VisualVoicemailService} should 2669 * be implemented instead. 2670 */ 2671 @SystemApi 2672 @SuppressLint("Doclava125") 2673 public void setVisualVoicemailEnabled(PhoneAccountHandle phoneAccountHandle, boolean enabled){ 2674 } 2675 2676 /** 2677 * Returns whether the visual voicemail client is enabled. 2678 * 2679 * @param phoneAccountHandle the phone account to check for. 2680 * @return {@code true} when the visual voicemail client is enabled for this client 2681 * @hide 2682 * @deprecated Visual voicemail no longer in telephony. {@link VisualVoicemailService} should 2683 * be implemented instead. 2684 */ 2685 @SystemApi 2686 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 2687 @SuppressLint("Doclava125") 2688 public boolean isVisualVoicemailEnabled(PhoneAccountHandle phoneAccountHandle){ 2689 return false; 2690 } 2691 2692 /** 2693 * Returns an opaque bundle of settings formerly used by the visual voicemail client for the 2694 * subscription ID pinned to the TelephonyManager, or {@code null} if the subscription ID is 2695 * invalid. This method allows the system dialer to migrate settings out of the pre-O visual 2696 * voicemail client in telephony. 2697 * 2698 * <p>Requires the caller to be the system dialer. 2699 * 2700 * @see #KEY_VISUAL_VOICEMAIL_ENABLED_BY_USER_BOOL 2701 * @see #KEY_VOICEMAIL_SCRAMBLED_PIN_STRING 2702 * 2703 * @hide 2704 */ 2705 @SystemApi 2706 @SuppressLint("Doclava125") 2707 @Nullable 2708 public Bundle getVisualVoicemailSettings(){ 2709 try { 2710 ITelephony telephony = getITelephony(); 2711 if (telephony != null) { 2712 return telephony 2713 .getVisualVoicemailSettings(mContext.getOpPackageName(), mSubId); 2714 } 2715 } catch (RemoteException ex) { 2716 } catch (NullPointerException ex) { 2717 } 2718 return null; 2719 } 2720 2721 /** 2722 * Returns the package responsible of processing visual voicemail for the subscription ID pinned 2723 * to the TelephonyManager. Returns {@code null} when there is no package responsible for 2724 * processing visual voicemail for the subscription. 2725 * 2726 * @see #createForSubscriptionId(int) 2727 * @see #createForPhoneAccountHandle(PhoneAccountHandle) 2728 * @see VisualVoicemailService 2729 */ 2730 @Nullable 2731 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 2732 public String getVisualVoicemailPackageName() { 2733 try { 2734 ITelephony telephony = getITelephony(); 2735 if (telephony != null) { 2736 return telephony 2737 .getVisualVoicemailPackageName(mContext.getOpPackageName(), getSubId()); 2738 } 2739 } catch (RemoteException ex) { 2740 } catch (NullPointerException ex) { 2741 } 2742 return null; 2743 } 2744 2745 /** 2746 * Set the visual voicemail SMS filter settings for the subscription ID pinned 2747 * to the TelephonyManager. 2748 * When the filter is enabled, {@link 2749 * VisualVoicemailService#onSmsReceived(VisualVoicemailTask, VisualVoicemailSms)} will be 2750 * called when a SMS matching the settings is received. The caller should have 2751 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} and implement a 2752 * VisualVoicemailService. 2753 * 2754 * <p>Requires Permission: 2755 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 2756 * 2757 * @param settings The settings for the filter, or {@code null} to disable the filter. 2758 */ 2759 public void setVisualVoicemailSmsFilterSettings(VisualVoicemailSmsFilterSettings settings) { 2760 if (settings == null) { 2761 disableVisualVoicemailSmsFilter(mSubId); 2762 } else { 2763 enableVisualVoicemailSmsFilter(mSubId, settings); 2764 } 2765 } 2766 2767 /** 2768 * Send a visual voicemail SMS. The caller must be the current default dialer. 2769 * A {@link VisualVoicemailService} uses this method to send a command via SMS to the carrier's 2770 * visual voicemail server. Some examples for carriers using the OMTP standard include 2771 * activating and deactivating visual voicemail, or requesting the current visual voicemail 2772 * provisioning status. See the OMTP Visual Voicemail specification for more information on the 2773 * format of these SMS messages. 2774 * 2775 * <p>Requires Permission: 2776 * {@link android.Manifest.permission#SEND_SMS SEND_SMS} 2777 * 2778 * @param number The destination number. 2779 * @param port The destination port for data SMS, or 0 for text SMS. 2780 * @param text The message content. For data sms, it will be encoded as a UTF-8 byte stream. 2781 * @param sentIntent The sent intent passed to the {@link SmsManager} 2782 * 2783 * @throws SecurityException if the caller is not the current default dialer 2784 * 2785 * @see SmsManager#sendDataMessage(String, String, short, byte[], PendingIntent, PendingIntent) 2786 * @see SmsManager#sendTextMessage(String, String, String, PendingIntent, PendingIntent) 2787 */ 2788 public void sendVisualVoicemailSms(String number, int port, String text, 2789 PendingIntent sentIntent) { 2790 sendVisualVoicemailSmsForSubscriber(mSubId, number, port, text, sentIntent); 2791 } 2792 2793 /** 2794 * Enables the visual voicemail SMS filter for a phone account. When the filter is 2795 * enabled, Incoming SMS messages matching the OMTP VVM SMS interface will be redirected to the 2796 * visual voicemail client with 2797 * {@link android.provider.VoicemailContract.ACTION_VOICEMAIL_SMS_RECEIVED}. 2798 * 2799 * <p>This takes effect only when the caller is the default dialer. The enabled status and 2800 * settings persist through default dialer changes, but the filter will only honor the setting 2801 * set by the current default dialer. 2802 * 2803 * 2804 * @param subId The subscription id of the phone account. 2805 * @param settings The settings for the filter. 2806 */ 2807 /** @hide */ 2808 public void enableVisualVoicemailSmsFilter(int subId, 2809 VisualVoicemailSmsFilterSettings settings) { 2810 if(settings == null){ 2811 throw new IllegalArgumentException("Settings cannot be null"); 2812 } 2813 try { 2814 ITelephony telephony = getITelephony(); 2815 if (telephony != null) { 2816 telephony.enableVisualVoicemailSmsFilter(mContext.getOpPackageName(), subId, 2817 settings); 2818 } 2819 } catch (RemoteException ex) { 2820 } catch (NullPointerException ex) { 2821 } 2822 } 2823 2824 /** 2825 * Disables the visual voicemail SMS filter for a phone account. 2826 * 2827 * <p>This takes effect only when the caller is the default dialer. The enabled status and 2828 * settings persist through default dialer changes, but the filter will only honor the setting 2829 * set by the current default dialer. 2830 */ 2831 /** @hide */ 2832 public void disableVisualVoicemailSmsFilter(int subId) { 2833 try { 2834 ITelephony telephony = getITelephony(); 2835 if (telephony != null) { 2836 telephony.disableVisualVoicemailSmsFilter(mContext.getOpPackageName(), subId); 2837 } 2838 } catch (RemoteException ex) { 2839 } catch (NullPointerException ex) { 2840 } 2841 } 2842 2843 /** 2844 * @returns the settings of the visual voicemail SMS filter for a phone account, or {@code null} 2845 * if the filter is disabled. 2846 * 2847 * <p>This takes effect only when the caller is the default dialer. The enabled status and 2848 * settings persist through default dialer changes, but the filter will only honor the setting 2849 * set by the current default dialer. 2850 */ 2851 /** @hide */ 2852 @Nullable 2853 public VisualVoicemailSmsFilterSettings getVisualVoicemailSmsFilterSettings(int subId) { 2854 try { 2855 ITelephony telephony = getITelephony(); 2856 if (telephony != null) { 2857 return telephony 2858 .getVisualVoicemailSmsFilterSettings(mContext.getOpPackageName(), subId); 2859 } 2860 } catch (RemoteException ex) { 2861 } catch (NullPointerException ex) { 2862 } 2863 2864 return null; 2865 } 2866 2867 /** 2868 * @returns the settings of the visual voicemail SMS filter for a phone account set by the 2869 * current active visual voicemail client, or {@code null} if the filter is disabled. 2870 * 2871 * <p>Requires the calling app to have READ_PRIVILEGED_PHONE_STATE permission. 2872 */ 2873 /** @hide */ 2874 @Nullable 2875 public VisualVoicemailSmsFilterSettings getActiveVisualVoicemailSmsFilterSettings(int subId) { 2876 try { 2877 ITelephony telephony = getITelephony(); 2878 if (telephony != null) { 2879 return telephony.getActiveVisualVoicemailSmsFilterSettings(subId); 2880 } 2881 } catch (RemoteException ex) { 2882 } catch (NullPointerException ex) { 2883 } 2884 2885 return null; 2886 } 2887 2888 /** 2889 * Send a visual voicemail SMS. The IPC caller must be the current default dialer. 2890 * 2891 * @param phoneAccountHandle The account to send the SMS with. 2892 * @param number The destination number. 2893 * @param port The destination port for data SMS, or 0 for text SMS. 2894 * @param text The message content. For data sms, it will be encoded as a UTF-8 byte stream. 2895 * @param sentIntent The sent intent passed to the {@link SmsManager} 2896 * 2897 * @see SmsManager#sendDataMessage(String, String, short, byte[], PendingIntent, PendingIntent) 2898 * @see SmsManager#sendTextMessage(String, String, String, PendingIntent, PendingIntent) 2899 * 2900 * @hide 2901 */ 2902 @RequiresPermission(android.Manifest.permission.SEND_SMS) 2903 public void sendVisualVoicemailSmsForSubscriber(int subId, String number, int port, 2904 String text, PendingIntent sentIntent) { 2905 try { 2906 ITelephony telephony = getITelephony(); 2907 if (telephony != null) { 2908 telephony.sendVisualVoicemailSmsForSubscriber( 2909 mContext.getOpPackageName(), subId, number, port, text, sentIntent); 2910 } 2911 } catch (RemoteException ex) { 2912 } 2913 } 2914 2915 /** 2916 * Initial SIM activation state, unknown. Not set by any carrier apps. 2917 * @hide 2918 */ 2919 public static final int SIM_ACTIVATION_STATE_UNKNOWN = 0; 2920 2921 /** 2922 * indicate SIM is under activation procedure now. 2923 * intermediate state followed by another state update with activation procedure result: 2924 * @see #SIM_ACTIVATION_STATE_ACTIVATED 2925 * @see #SIM_ACTIVATION_STATE_DEACTIVATED 2926 * @see #SIM_ACTIVATION_STATE_RESTRICTED 2927 * @hide 2928 */ 2929 public static final int SIM_ACTIVATION_STATE_ACTIVATING = 1; 2930 2931 /** 2932 * Indicate SIM has been successfully activated with full service 2933 * @hide 2934 */ 2935 public static final int SIM_ACTIVATION_STATE_ACTIVATED = 2; 2936 2937 /** 2938 * Indicate SIM has been deactivated by the carrier so that service is not available 2939 * and requires activation service to enable services. 2940 * Carrier apps could be signalled to set activation state to deactivated if detected 2941 * deactivated sim state and set it back to activated after successfully run activation service. 2942 * @hide 2943 */ 2944 public static final int SIM_ACTIVATION_STATE_DEACTIVATED = 3; 2945 2946 /** 2947 * Restricted state indicate SIM has been activated but service are restricted. 2948 * note this is currently available for data activation state. For example out of byte sim. 2949 * @hide 2950 */ 2951 public static final int SIM_ACTIVATION_STATE_RESTRICTED = 4; 2952 2953 /** 2954 * Sets the voice activation state for the given subscriber. 2955 * 2956 * <p>Requires Permission: 2957 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 2958 * Or the calling app has carrier privileges. @see #hasCarrierPrivileges 2959 * 2960 * @param subId The subscription id. 2961 * @param activationState The voice activation state of the given subscriber. 2962 * @see #SIM_ACTIVATION_STATE_UNKNOWN 2963 * @see #SIM_ACTIVATION_STATE_ACTIVATING 2964 * @see #SIM_ACTIVATION_STATE_ACTIVATED 2965 * @see #SIM_ACTIVATION_STATE_DEACTIVATED 2966 * @hide 2967 */ 2968 public void setVoiceActivationState(int subId, int activationState) { 2969 try { 2970 ITelephony telephony = getITelephony(); 2971 if (telephony != null) 2972 telephony.setVoiceActivationState(subId, activationState); 2973 } catch (RemoteException ex) { 2974 } catch (NullPointerException ex) { 2975 } 2976 } 2977 2978 /** 2979 * Sets the data activation state for the given subscriber. 2980 * 2981 * <p>Requires Permission: 2982 * {@link android.Manifest.permission#MODIFY_PHONE_STATE} 2983 * Or the calling app has carrier privileges. @see #hasCarrierPrivileges 2984 * 2985 * @param subId The subscription id. 2986 * @param activationState The data activation state of the given subscriber. 2987 * @see #SIM_ACTIVATION_STATE_UNKNOWN 2988 * @see #SIM_ACTIVATION_STATE_ACTIVATING 2989 * @see #SIM_ACTIVATION_STATE_ACTIVATED 2990 * @see #SIM_ACTIVATION_STATE_DEACTIVATED 2991 * @see #SIM_ACTIVATION_STATE_RESTRICTED 2992 * @hide 2993 */ 2994 public void setDataActivationState(int subId, int activationState) { 2995 try { 2996 ITelephony telephony = getITelephony(); 2997 if (telephony != null) 2998 telephony.setDataActivationState(subId, activationState); 2999 } catch (RemoteException ex) { 3000 } catch (NullPointerException ex) { 3001 } 3002 } 3003 3004 /** 3005 * Returns the voice activation state for the given subscriber. 3006 * 3007 * @param subId The subscription id. 3008 * 3009 * @return voiceActivationState for the given subscriber 3010 * @see #SIM_ACTIVATION_STATE_UNKNOWN 3011 * @see #SIM_ACTIVATION_STATE_ACTIVATING 3012 * @see #SIM_ACTIVATION_STATE_ACTIVATED 3013 * @see #SIM_ACTIVATION_STATE_DEACTIVATED 3014 * @hide 3015 */ 3016 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 3017 public int getVoiceActivationState(int subId) { 3018 try { 3019 ITelephony telephony = getITelephony(); 3020 if (telephony != null) 3021 return telephony.getVoiceActivationState(subId, getOpPackageName()); 3022 } catch (RemoteException ex) { 3023 } catch (NullPointerException ex) { 3024 } 3025 return SIM_ACTIVATION_STATE_UNKNOWN; 3026 } 3027 3028 /** 3029 * Returns the data activation state for the given subscriber. 3030 * 3031 * @param subId The subscription id. 3032 * 3033 * @return dataActivationState for the given subscriber 3034 * @see #SIM_ACTIVATION_STATE_UNKNOWN 3035 * @see #SIM_ACTIVATION_STATE_ACTIVATING 3036 * @see #SIM_ACTIVATION_STATE_ACTIVATED 3037 * @see #SIM_ACTIVATION_STATE_DEACTIVATED 3038 * @see #SIM_ACTIVATION_STATE_RESTRICTED 3039 * @hide 3040 */ 3041 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 3042 public int getDataActivationState(int subId) { 3043 try { 3044 ITelephony telephony = getITelephony(); 3045 if (telephony != null) 3046 return telephony.getDataActivationState(subId, getOpPackageName()); 3047 } catch (RemoteException ex) { 3048 } catch (NullPointerException ex) { 3049 } 3050 return SIM_ACTIVATION_STATE_UNKNOWN; 3051 } 3052 3053 /** 3054 * Returns the voice mail count. Return 0 if unavailable, -1 if there are unread voice messages 3055 * but the count is unknown. 3056 * @hide 3057 */ 3058 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 3059 public int getVoiceMessageCount() { 3060 return getVoiceMessageCount(getSubId()); 3061 } 3062 3063 /** 3064 * Returns the voice mail count for a subscription. Return 0 if unavailable. 3065 * @param subId whose voice message count is returned 3066 * @hide 3067 */ 3068 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 3069 public int getVoiceMessageCount(int subId) { 3070 try { 3071 ITelephony telephony = getITelephony(); 3072 if (telephony == null) 3073 return 0; 3074 return telephony.getVoiceMessageCountForSubscriber(subId); 3075 } catch (RemoteException ex) { 3076 return 0; 3077 } catch (NullPointerException ex) { 3078 // This could happen before phone restarts due to crashing 3079 return 0; 3080 } 3081 } 3082 3083 /** 3084 * Retrieves the alphabetic identifier associated with the voice 3085 * mail number. 3086 */ 3087 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 3088 public String getVoiceMailAlphaTag() { 3089 return getVoiceMailAlphaTag(getSubId()); 3090 } 3091 3092 /** 3093 * Retrieves the alphabetic identifier associated with the voice 3094 * mail number for a subscription. 3095 * @param subId whose alphabetic identifier associated with the 3096 * voice mail number is returned 3097 * @hide 3098 */ 3099 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 3100 public String getVoiceMailAlphaTag(int subId) { 3101 try { 3102 IPhoneSubInfo info = getSubscriberInfo(); 3103 if (info == null) 3104 return null; 3105 return info.getVoiceMailAlphaTagForSubscriber(subId, getOpPackageName()); 3106 } catch (RemoteException ex) { 3107 return null; 3108 } catch (NullPointerException ex) { 3109 // This could happen before phone restarts due to crashing 3110 return null; 3111 } 3112 } 3113 3114 /** 3115 * Send the special dialer code. The IPC caller must be the current default dialer or has 3116 * carrier privileges. 3117 * @see #hasCarrierPrivileges 3118 * 3119 * @param inputCode The special dialer code to send 3120 * 3121 * @throws SecurityException if the caller does not have carrier privileges or is not the 3122 * current default dialer 3123 * 3124 * @throws IllegalStateException if telephony service is unavailable. 3125 */ 3126 public void sendDialerSpecialCode(String inputCode) { 3127 try { 3128 final ITelephony telephony = getITelephony(); 3129 telephony.sendDialerSpecialCode(mContext.getOpPackageName(), inputCode); 3130 } catch (RemoteException ex) { 3131 // This could happen if binder process crashes. 3132 ex.rethrowFromSystemServer(); 3133 } catch (NullPointerException ex) { 3134 // This could happen before phone restarts due to crashing 3135 throw new IllegalStateException("Telephony service unavailable"); 3136 } 3137 } 3138 3139 /** 3140 * Returns the IMS private user identity (IMPI) that was loaded from the ISIM. 3141 * @return the IMPI, or null if not present or not loaded 3142 * @hide 3143 */ 3144 public String getIsimImpi() { 3145 try { 3146 IPhoneSubInfo info = getSubscriberInfo(); 3147 if (info == null) 3148 return null; 3149 return info.getIsimImpi(); 3150 } catch (RemoteException ex) { 3151 return null; 3152 } catch (NullPointerException ex) { 3153 // This could happen before phone restarts due to crashing 3154 return null; 3155 } 3156 } 3157 3158 /** 3159 * Returns the IMS home network domain name that was loaded from the ISIM. 3160 * @return the IMS domain name, or null if not present or not loaded 3161 * @hide 3162 */ 3163 public String getIsimDomain() { 3164 try { 3165 IPhoneSubInfo info = getSubscriberInfo(); 3166 if (info == null) 3167 return null; 3168 return info.getIsimDomain(); 3169 } catch (RemoteException ex) { 3170 return null; 3171 } catch (NullPointerException ex) { 3172 // This could happen before phone restarts due to crashing 3173 return null; 3174 } 3175 } 3176 3177 /** 3178 * Returns the IMS public user identities (IMPU) that were loaded from the ISIM. 3179 * @return an array of IMPU strings, with one IMPU per string, or null if 3180 * not present or not loaded 3181 * @hide 3182 */ 3183 public String[] getIsimImpu() { 3184 try { 3185 IPhoneSubInfo info = getSubscriberInfo(); 3186 if (info == null) 3187 return null; 3188 return info.getIsimImpu(); 3189 } catch (RemoteException ex) { 3190 return null; 3191 } catch (NullPointerException ex) { 3192 // This could happen before phone restarts due to crashing 3193 return null; 3194 } 3195 } 3196 3197 /** 3198 * @hide 3199 */ 3200 private IPhoneSubInfo getSubscriberInfo() { 3201 // get it each time because that process crashes a lot 3202 return IPhoneSubInfo.Stub.asInterface(ServiceManager.getService("iphonesubinfo")); 3203 } 3204 3205 /** Device call state: No activity. */ 3206 public static final int CALL_STATE_IDLE = 0; 3207 /** Device call state: Ringing. A new call arrived and is 3208 * ringing or waiting. In the latter case, another call is 3209 * already active. */ 3210 public static final int CALL_STATE_RINGING = 1; 3211 /** Device call state: Off-hook. At least one call exists 3212 * that is dialing, active, or on hold, and no calls are ringing 3213 * or waiting. */ 3214 public static final int CALL_STATE_OFFHOOK = 2; 3215 3216 /** 3217 * Returns one of the following constants that represents the current state of all 3218 * phone calls. 3219 * 3220 * {@link TelephonyManager#CALL_STATE_RINGING} 3221 * {@link TelephonyManager#CALL_STATE_OFFHOOK} 3222 * {@link TelephonyManager#CALL_STATE_IDLE} 3223 */ 3224 public int getCallState() { 3225 try { 3226 ITelecomService telecom = getTelecomService(); 3227 if (telecom != null) { 3228 return telecom.getCallState(); 3229 } 3230 } catch (RemoteException e) { 3231 Log.e(TAG, "Error calling ITelecomService#getCallState", e); 3232 } 3233 return CALL_STATE_IDLE; 3234 } 3235 3236 /** 3237 * Returns a constant indicating the call state (cellular) on the device 3238 * for a subscription. 3239 * 3240 * @param subId whose call state is returned 3241 * @hide 3242 */ 3243 public int getCallState(int subId) { 3244 int phoneId = SubscriptionManager.getPhoneId(subId); 3245 return getCallStateForSlot(phoneId); 3246 } 3247 3248 /** 3249 * See getCallState. 3250 * 3251 * @hide 3252 */ 3253 public int getCallStateForSlot(int slotIndex) { 3254 try { 3255 ITelephony telephony = getITelephony(); 3256 if (telephony == null) 3257 return CALL_STATE_IDLE; 3258 return telephony.getCallStateForSlot(slotIndex); 3259 } catch (RemoteException ex) { 3260 // the phone process is restarting. 3261 return CALL_STATE_IDLE; 3262 } catch (NullPointerException ex) { 3263 // the phone process is restarting. 3264 return CALL_STATE_IDLE; 3265 } 3266 } 3267 3268 3269 /** Data connection activity: No traffic. */ 3270 public static final int DATA_ACTIVITY_NONE = 0x00000000; 3271 /** Data connection activity: Currently receiving IP PPP traffic. */ 3272 public static final int DATA_ACTIVITY_IN = 0x00000001; 3273 /** Data connection activity: Currently sending IP PPP traffic. */ 3274 public static final int DATA_ACTIVITY_OUT = 0x00000002; 3275 /** Data connection activity: Currently both sending and receiving 3276 * IP PPP traffic. */ 3277 public static final int DATA_ACTIVITY_INOUT = DATA_ACTIVITY_IN | DATA_ACTIVITY_OUT; 3278 /** 3279 * Data connection is active, but physical link is down 3280 */ 3281 public static final int DATA_ACTIVITY_DORMANT = 0x00000004; 3282 3283 /** 3284 * Returns a constant indicating the type of activity on a data connection 3285 * (cellular). 3286 * 3287 * @see #DATA_ACTIVITY_NONE 3288 * @see #DATA_ACTIVITY_IN 3289 * @see #DATA_ACTIVITY_OUT 3290 * @see #DATA_ACTIVITY_INOUT 3291 * @see #DATA_ACTIVITY_DORMANT 3292 */ 3293 public int getDataActivity() { 3294 try { 3295 ITelephony telephony = getITelephony(); 3296 if (telephony == null) 3297 return DATA_ACTIVITY_NONE; 3298 return telephony.getDataActivity(); 3299 } catch (RemoteException ex) { 3300 // the phone process is restarting. 3301 return DATA_ACTIVITY_NONE; 3302 } catch (NullPointerException ex) { 3303 // the phone process is restarting. 3304 return DATA_ACTIVITY_NONE; 3305 } 3306 } 3307 3308 /** Data connection state: Unknown. Used before we know the state. 3309 * @hide 3310 */ 3311 public static final int DATA_UNKNOWN = -1; 3312 /** Data connection state: Disconnected. IP traffic not available. */ 3313 public static final int DATA_DISCONNECTED = 0; 3314 /** Data connection state: Currently setting up a data connection. */ 3315 public static final int DATA_CONNECTING = 1; 3316 /** Data connection state: Connected. IP traffic should be available. */ 3317 public static final int DATA_CONNECTED = 2; 3318 /** Data connection state: Suspended. The connection is up, but IP 3319 * traffic is temporarily unavailable. For example, in a 2G network, 3320 * data activity may be suspended when a voice call arrives. */ 3321 public static final int DATA_SUSPENDED = 3; 3322 3323 /** 3324 * Returns a constant indicating the current data connection state 3325 * (cellular). 3326 * 3327 * @see #DATA_DISCONNECTED 3328 * @see #DATA_CONNECTING 3329 * @see #DATA_CONNECTED 3330 * @see #DATA_SUSPENDED 3331 */ 3332 public int getDataState() { 3333 try { 3334 ITelephony telephony = getITelephony(); 3335 if (telephony == null) 3336 return DATA_DISCONNECTED; 3337 return telephony.getDataState(); 3338 } catch (RemoteException ex) { 3339 // the phone process is restarting. 3340 return DATA_DISCONNECTED; 3341 } catch (NullPointerException ex) { 3342 return DATA_DISCONNECTED; 3343 } 3344 } 3345 3346 /** 3347 * @hide 3348 */ 3349 private ITelephony getITelephony() { 3350 return ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE)); 3351 } 3352 3353 /** 3354 * @hide 3355 */ 3356 private ITelecomService getTelecomService() { 3357 return ITelecomService.Stub.asInterface(ServiceManager.getService(Context.TELECOM_SERVICE)); 3358 } 3359 3360 // 3361 // 3362 // PhoneStateListener 3363 // 3364 // 3365 3366 /** 3367 * Registers a listener object to receive notification of changes 3368 * in specified telephony states. 3369 * <p> 3370 * To register a listener, pass a {@link PhoneStateListener} 3371 * and specify at least one telephony state of interest in 3372 * the events argument. 3373 * 3374 * At registration, and when a specified telephony state 3375 * changes, the telephony manager invokes the appropriate 3376 * callback method on the listener object and passes the 3377 * current (updated) values. 3378 * <p> 3379 * To unregister a listener, pass the listener object and set the 3380 * events argument to 3381 * {@link PhoneStateListener#LISTEN_NONE LISTEN_NONE} (0). 3382 * 3383 * @param listener The {@link PhoneStateListener} object to register 3384 * (or unregister) 3385 * @param events The telephony state(s) of interest to the listener, 3386 * as a bitwise-OR combination of {@link PhoneStateListener} 3387 * LISTEN_ flags. 3388 */ 3389 public void listen(PhoneStateListener listener, int events) { 3390 if (mContext == null) return; 3391 try { 3392 boolean notifyNow = (getITelephony() != null); 3393 // If the listener has not explicitly set the subId (for example, created with the 3394 // default constructor), replace the subId so it will listen to the account the 3395 // telephony manager is created with. 3396 if (listener.mSubId == null) { 3397 listener.mSubId = mSubId; 3398 } 3399 sRegistry.listenForSubscriber(listener.mSubId, getOpPackageName(), 3400 listener.callback, events, notifyNow); 3401 } catch (RemoteException ex) { 3402 // system process dead 3403 } catch (NullPointerException ex) { 3404 // system process dead 3405 } 3406 } 3407 3408 /** 3409 * Returns the CDMA ERI icon index to display 3410 * @hide 3411 */ 3412 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 3413 public int getCdmaEriIconIndex() { 3414 return getCdmaEriIconIndex(getSubId()); 3415 } 3416 3417 /** 3418 * Returns the CDMA ERI icon index to display for a subscription 3419 * @hide 3420 */ 3421 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 3422 public int getCdmaEriIconIndex(int subId) { 3423 try { 3424 ITelephony telephony = getITelephony(); 3425 if (telephony == null) 3426 return -1; 3427 return telephony.getCdmaEriIconIndexForSubscriber(subId, getOpPackageName()); 3428 } catch (RemoteException ex) { 3429 // the phone process is restarting. 3430 return -1; 3431 } catch (NullPointerException ex) { 3432 return -1; 3433 } 3434 } 3435 3436 /** 3437 * Returns the CDMA ERI icon mode, 3438 * 0 - ON 3439 * 1 - FLASHING 3440 * 3441 * @hide 3442 */ 3443 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 3444 public int getCdmaEriIconMode() { 3445 return getCdmaEriIconMode(getSubId()); 3446 } 3447 3448 /** 3449 * Returns the CDMA ERI icon mode for a subscription. 3450 * 0 - ON 3451 * 1 - FLASHING 3452 * 3453 * @hide 3454 */ 3455 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 3456 public int getCdmaEriIconMode(int subId) { 3457 try { 3458 ITelephony telephony = getITelephony(); 3459 if (telephony == null) 3460 return -1; 3461 return telephony.getCdmaEriIconModeForSubscriber(subId, getOpPackageName()); 3462 } catch (RemoteException ex) { 3463 // the phone process is restarting. 3464 return -1; 3465 } catch (NullPointerException ex) { 3466 return -1; 3467 } 3468 } 3469 3470 /** 3471 * Returns the CDMA ERI text, 3472 * 3473 * @hide 3474 */ 3475 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 3476 public String getCdmaEriText() { 3477 return getCdmaEriText(getSubId()); 3478 } 3479 3480 /** 3481 * Returns the CDMA ERI text, of a subscription 3482 * 3483 * @hide 3484 */ 3485 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 3486 public String getCdmaEriText(int subId) { 3487 try { 3488 ITelephony telephony = getITelephony(); 3489 if (telephony == null) 3490 return null; 3491 return telephony.getCdmaEriTextForSubscriber(subId, getOpPackageName()); 3492 } catch (RemoteException ex) { 3493 // the phone process is restarting. 3494 return null; 3495 } catch (NullPointerException ex) { 3496 return null; 3497 } 3498 } 3499 3500 /** 3501 * @return true if the current device is "voice capable". 3502 * <p> 3503 * "Voice capable" means that this device supports circuit-switched 3504 * (i.e. voice) phone calls over the telephony network, and is allowed 3505 * to display the in-call UI while a cellular voice call is active. 3506 * This will be false on "data only" devices which can't make voice 3507 * calls and don't support any in-call UI. 3508 * <p> 3509 * Note: the meaning of this flag is subtly different from the 3510 * PackageManager.FEATURE_TELEPHONY system feature, which is available 3511 * on any device with a telephony radio, even if the device is 3512 * data-only. 3513 */ 3514 public boolean isVoiceCapable() { 3515 if (mContext == null) return true; 3516 return mContext.getResources().getBoolean( 3517 com.android.internal.R.bool.config_voice_capable); 3518 } 3519 3520 /** 3521 * @return true if the current device supports sms service. 3522 * <p> 3523 * If true, this means that the device supports both sending and 3524 * receiving sms via the telephony network. 3525 * <p> 3526 * Note: Voicemail waiting sms, cell broadcasting sms, and MMS are 3527 * disabled when device doesn't support sms. 3528 */ 3529 public boolean isSmsCapable() { 3530 if (mContext == null) return true; 3531 return mContext.getResources().getBoolean( 3532 com.android.internal.R.bool.config_sms_capable); 3533 } 3534 3535 /** 3536 * Returns all observed cell information from all radios on the 3537 * device including the primary and neighboring cells. Calling this method does 3538 * not trigger a call to {@link android.telephony.PhoneStateListener#onCellInfoChanged 3539 * onCellInfoChanged()}, or change the rate at which 3540 * {@link android.telephony.PhoneStateListener#onCellInfoChanged 3541 * onCellInfoChanged()} is called. 3542 * 3543 *<p> 3544 * The list can include one or more {@link android.telephony.CellInfoGsm CellInfoGsm}, 3545 * {@link android.telephony.CellInfoCdma CellInfoCdma}, 3546 * {@link android.telephony.CellInfoLte CellInfoLte}, and 3547 * {@link android.telephony.CellInfoWcdma CellInfoWcdma} objects, in any combination. 3548 * On devices with multiple radios it is typical to see instances of 3549 * one or more of any these in the list. In addition, zero, one, or more 3550 * of the returned objects may be considered registered; that is, their 3551 * {@link android.telephony.CellInfo#isRegistered CellInfo.isRegistered()} 3552 * methods may return true. 3553 * 3554 * <p>This method returns valid data for registered cells on devices with 3555 * {@link android.content.pm.PackageManager#FEATURE_TELEPHONY}. In cases where only 3556 * partial information is available for a particular CellInfo entry, unavailable fields 3557 * will be reported as Integer.MAX_VALUE. All reported cells will include at least a 3558 * valid set of technology-specific identification info and a power level measurement. 3559 * 3560 *<p> 3561 * This method is preferred over using {@link 3562 * android.telephony.TelephonyManager#getCellLocation getCellLocation()}. 3563 * However, for older devices, <code>getAllCellInfo()</code> may return 3564 * null. In these cases, you should call {@link 3565 * android.telephony.TelephonyManager#getCellLocation getCellLocation()} 3566 * instead. 3567 * 3568 * @return List of {@link android.telephony.CellInfo}; null if cell 3569 * information is unavailable. 3570 */ 3571 @RequiresPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION) 3572 public List<CellInfo> getAllCellInfo() { 3573 try { 3574 ITelephony telephony = getITelephony(); 3575 if (telephony == null) 3576 return null; 3577 return telephony.getAllCellInfo(getOpPackageName()); 3578 } catch (RemoteException ex) { 3579 return null; 3580 } catch (NullPointerException ex) { 3581 return null; 3582 } 3583 } 3584 3585 /** 3586 * Sets the minimum time in milli-seconds between {@link PhoneStateListener#onCellInfoChanged 3587 * PhoneStateListener.onCellInfoChanged} will be invoked. 3588 *<p> 3589 * The default, 0, means invoke onCellInfoChanged when any of the reported 3590 * information changes. Setting the value to INT_MAX(0x7fffffff) means never issue 3591 * A onCellInfoChanged. 3592 *<p> 3593 * @param rateInMillis the rate 3594 * 3595 * @hide 3596 */ 3597 public void setCellInfoListRate(int rateInMillis) { 3598 try { 3599 ITelephony telephony = getITelephony(); 3600 if (telephony != null) 3601 telephony.setCellInfoListRate(rateInMillis); 3602 } catch (RemoteException ex) { 3603 } catch (NullPointerException ex) { 3604 } 3605 } 3606 3607 /** 3608 * Returns the MMS user agent. 3609 */ 3610 public String getMmsUserAgent() { 3611 if (mContext == null) return null; 3612 return mContext.getResources().getString( 3613 com.android.internal.R.string.config_mms_user_agent); 3614 } 3615 3616 /** 3617 * Returns the MMS user agent profile URL. 3618 */ 3619 public String getMmsUAProfUrl() { 3620 if (mContext == null) return null; 3621 return mContext.getResources().getString( 3622 com.android.internal.R.string.config_mms_user_agent_profile_url); 3623 } 3624 3625 /** 3626 * Opens a logical channel to the ICC card. 3627 * 3628 * Input parameters equivalent to TS 27.007 AT+CCHO command. 3629 * 3630 * <p>Requires Permission: 3631 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 3632 * Or the calling app has carrier privileges. @see #hasCarrierPrivileges 3633 * 3634 * @param AID Application id. See ETSI 102.221 and 101.220. 3635 * @return an IccOpenLogicalChannelResponse object. 3636 * @deprecated Replaced by {@link #iccOpenLogicalChannel(String, int)} 3637 */ 3638 @Deprecated 3639 public IccOpenLogicalChannelResponse iccOpenLogicalChannel(String AID) { 3640 return iccOpenLogicalChannel(getSubId(), AID, -1); 3641 } 3642 3643 /** 3644 * Opens a logical channel to the ICC card. 3645 * 3646 * Input parameters equivalent to TS 27.007 AT+CCHO command. 3647 * 3648 * <p>Requires Permission: 3649 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 3650 * Or the calling app has carrier privileges. @see #hasCarrierPrivileges 3651 * 3652 * @param AID Application id. See ETSI 102.221 and 101.220. 3653 * @param p2 P2 parameter (described in ISO 7816-4). 3654 * @return an IccOpenLogicalChannelResponse object. 3655 */ 3656 public IccOpenLogicalChannelResponse iccOpenLogicalChannel(String AID, int p2) { 3657 return iccOpenLogicalChannel(getSubId(), AID, p2); 3658 } 3659 3660 /** 3661 * Opens a logical channel to the ICC card. 3662 * 3663 * Input parameters equivalent to TS 27.007 AT+CCHO command. 3664 * 3665 * <p>Requires Permission: 3666 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 3667 * Or the calling app has carrier privileges. @see #hasCarrierPrivileges 3668 * 3669 * @param subId The subscription to use. 3670 * @param AID Application id. See ETSI 102.221 and 101.220. 3671 * @param p2 P2 parameter (described in ISO 7816-4). 3672 * @return an IccOpenLogicalChannelResponse object. 3673 * @hide 3674 */ 3675 public IccOpenLogicalChannelResponse iccOpenLogicalChannel(int subId, String AID, int p2) { 3676 try { 3677 ITelephony telephony = getITelephony(); 3678 if (telephony != null) 3679 return telephony.iccOpenLogicalChannel(subId, AID, p2); 3680 } catch (RemoteException ex) { 3681 } catch (NullPointerException ex) { 3682 } 3683 return null; 3684 } 3685 3686 /** 3687 * Closes a previously opened logical channel to the ICC card. 3688 * 3689 * Input parameters equivalent to TS 27.007 AT+CCHC command. 3690 * 3691 * <p>Requires Permission: 3692 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 3693 * Or the calling app has carrier privileges. @see #hasCarrierPrivileges 3694 * 3695 * @param channel is the channel id to be closed as retruned by a successful 3696 * iccOpenLogicalChannel. 3697 * @return true if the channel was closed successfully. 3698 */ 3699 public boolean iccCloseLogicalChannel(int channel) { 3700 return iccCloseLogicalChannel(getSubId(), channel); 3701 } 3702 3703 /** 3704 * Closes a previously opened logical channel to the ICC card. 3705 * 3706 * Input parameters equivalent to TS 27.007 AT+CCHC command. 3707 * 3708 * <p>Requires Permission: 3709 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 3710 * Or the calling app has carrier privileges. @see #hasCarrierPrivileges 3711 * 3712 * @param subId The subscription to use. 3713 * @param channel is the channel id to be closed as retruned by a successful 3714 * iccOpenLogicalChannel. 3715 * @return true if the channel was closed successfully. 3716 * @hide 3717 */ 3718 public boolean iccCloseLogicalChannel(int subId, int channel) { 3719 try { 3720 ITelephony telephony = getITelephony(); 3721 if (telephony != null) 3722 return telephony.iccCloseLogicalChannel(subId, channel); 3723 } catch (RemoteException ex) { 3724 } catch (NullPointerException ex) { 3725 } 3726 return false; 3727 } 3728 3729 /** 3730 * Transmit an APDU to the ICC card over a logical channel. 3731 * 3732 * Input parameters equivalent to TS 27.007 AT+CGLA command. 3733 * 3734 * <p>Requires Permission: 3735 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 3736 * Or the calling app has carrier privileges. @see #hasCarrierPrivileges 3737 * 3738 * @param channel is the channel id to be closed as returned by a successful 3739 * iccOpenLogicalChannel. 3740 * @param cla Class of the APDU command. 3741 * @param instruction Instruction of the APDU command. 3742 * @param p1 P1 value of the APDU command. 3743 * @param p2 P2 value of the APDU command. 3744 * @param p3 P3 value of the APDU command. If p3 is negative a 4 byte APDU 3745 * is sent to the SIM. 3746 * @param data Data to be sent with the APDU. 3747 * @return The APDU response from the ICC card with the status appended at 3748 * the end. 3749 */ 3750 public String iccTransmitApduLogicalChannel(int channel, int cla, 3751 int instruction, int p1, int p2, int p3, String data) { 3752 return iccTransmitApduLogicalChannel(getSubId(), channel, cla, 3753 instruction, p1, p2, p3, data); 3754 } 3755 3756 /** 3757 * Transmit an APDU to the ICC card over a logical channel. 3758 * 3759 * Input parameters equivalent to TS 27.007 AT+CGLA command. 3760 * 3761 * <p>Requires Permission: 3762 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 3763 * Or the calling app has carrier privileges. @see #hasCarrierPrivileges 3764 * 3765 * @param subId The subscription to use. 3766 * @param channel is the channel id to be closed as returned by a successful 3767 * iccOpenLogicalChannel. 3768 * @param cla Class of the APDU command. 3769 * @param instruction Instruction of the APDU command. 3770 * @param p1 P1 value of the APDU command. 3771 * @param p2 P2 value of the APDU command. 3772 * @param p3 P3 value of the APDU command. If p3 is negative a 4 byte APDU 3773 * is sent to the SIM. 3774 * @param data Data to be sent with the APDU. 3775 * @return The APDU response from the ICC card with the status appended at 3776 * the end. 3777 * @hide 3778 */ 3779 public String iccTransmitApduLogicalChannel(int subId, int channel, int cla, 3780 int instruction, int p1, int p2, int p3, String data) { 3781 try { 3782 ITelephony telephony = getITelephony(); 3783 if (telephony != null) 3784 return telephony.iccTransmitApduLogicalChannel(subId, channel, cla, 3785 instruction, p1, p2, p3, data); 3786 } catch (RemoteException ex) { 3787 } catch (NullPointerException ex) { 3788 } 3789 return ""; 3790 } 3791 3792 /** 3793 * Transmit an APDU to the ICC card over the basic channel. 3794 * 3795 * Input parameters equivalent to TS 27.007 AT+CSIM command. 3796 * 3797 * <p>Requires Permission: 3798 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 3799 * Or the calling app has carrier privileges. @see #hasCarrierPrivileges 3800 * 3801 * @param cla Class of the APDU command. 3802 * @param instruction Instruction of the APDU command. 3803 * @param p1 P1 value of the APDU command. 3804 * @param p2 P2 value of the APDU command. 3805 * @param p3 P3 value of the APDU command. If p3 is negative a 4 byte APDU 3806 * is sent to the SIM. 3807 * @param data Data to be sent with the APDU. 3808 * @return The APDU response from the ICC card with the status appended at 3809 * the end. 3810 */ 3811 public String iccTransmitApduBasicChannel(int cla, 3812 int instruction, int p1, int p2, int p3, String data) { 3813 return iccTransmitApduBasicChannel(getSubId(), cla, 3814 instruction, p1, p2, p3, data); 3815 } 3816 3817 /** 3818 * Transmit an APDU to the ICC card over the basic channel. 3819 * 3820 * Input parameters equivalent to TS 27.007 AT+CSIM command. 3821 * 3822 * <p>Requires Permission: 3823 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 3824 * Or the calling app has carrier privileges. @see #hasCarrierPrivileges 3825 * 3826 * @param subId The subscription to use. 3827 * @param cla Class of the APDU command. 3828 * @param instruction Instruction of the APDU command. 3829 * @param p1 P1 value of the APDU command. 3830 * @param p2 P2 value of the APDU command. 3831 * @param p3 P3 value of the APDU command. If p3 is negative a 4 byte APDU 3832 * is sent to the SIM. 3833 * @param data Data to be sent with the APDU. 3834 * @return The APDU response from the ICC card with the status appended at 3835 * the end. 3836 * @hide 3837 */ 3838 public String iccTransmitApduBasicChannel(int subId, int cla, 3839 int instruction, int p1, int p2, int p3, String data) { 3840 try { 3841 ITelephony telephony = getITelephony(); 3842 if (telephony != null) 3843 return telephony.iccTransmitApduBasicChannel(subId, cla, 3844 instruction, p1, p2, p3, data); 3845 } catch (RemoteException ex) { 3846 } catch (NullPointerException ex) { 3847 } 3848 return ""; 3849 } 3850 3851 /** 3852 * Returns the response APDU for a command APDU sent through SIM_IO. 3853 * 3854 * <p>Requires Permission: 3855 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 3856 * Or the calling app has carrier privileges. @see #hasCarrierPrivileges 3857 * 3858 * @param fileID 3859 * @param command 3860 * @param p1 P1 value of the APDU command. 3861 * @param p2 P2 value of the APDU command. 3862 * @param p3 P3 value of the APDU command. 3863 * @param filePath 3864 * @return The APDU response. 3865 */ 3866 public byte[] iccExchangeSimIO(int fileID, int command, int p1, int p2, int p3, 3867 String filePath) { 3868 return iccExchangeSimIO(getSubId(), fileID, command, p1, p2, p3, filePath); 3869 } 3870 3871 /** 3872 * Returns the response APDU for a command APDU sent through SIM_IO. 3873 * 3874 * <p>Requires Permission: 3875 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 3876 * Or the calling app has carrier privileges. @see #hasCarrierPrivileges 3877 * 3878 * @param subId The subscription to use. 3879 * @param fileID 3880 * @param command 3881 * @param p1 P1 value of the APDU command. 3882 * @param p2 P2 value of the APDU command. 3883 * @param p3 P3 value of the APDU command. 3884 * @param filePath 3885 * @return The APDU response. 3886 * @hide 3887 */ 3888 public byte[] iccExchangeSimIO(int subId, int fileID, int command, int p1, int p2, 3889 int p3, String filePath) { 3890 try { 3891 ITelephony telephony = getITelephony(); 3892 if (telephony != null) 3893 return telephony.iccExchangeSimIO(subId, fileID, command, p1, p2, p3, filePath); 3894 } catch (RemoteException ex) { 3895 } catch (NullPointerException ex) { 3896 } 3897 return null; 3898 } 3899 3900 /** 3901 * Send ENVELOPE to the SIM and return the response. 3902 * 3903 * <p>Requires Permission: 3904 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 3905 * Or the calling app has carrier privileges. @see #hasCarrierPrivileges 3906 * 3907 * @param content String containing SAT/USAT response in hexadecimal 3908 * format starting with command tag. See TS 102 223 for 3909 * details. 3910 * @return The APDU response from the ICC card in hexadecimal format 3911 * with the last 4 bytes being the status word. If the command fails, 3912 * returns an empty string. 3913 */ 3914 public String sendEnvelopeWithStatus(String content) { 3915 return sendEnvelopeWithStatus(getSubId(), content); 3916 } 3917 3918 /** 3919 * Send ENVELOPE to the SIM and return the response. 3920 * 3921 * <p>Requires Permission: 3922 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 3923 * Or the calling app has carrier privileges. @see #hasCarrierPrivileges 3924 * 3925 * @param subId The subscription to use. 3926 * @param content String containing SAT/USAT response in hexadecimal 3927 * format starting with command tag. See TS 102 223 for 3928 * details. 3929 * @return The APDU response from the ICC card in hexadecimal format 3930 * with the last 4 bytes being the status word. If the command fails, 3931 * returns an empty string. 3932 * @hide 3933 */ 3934 public String sendEnvelopeWithStatus(int subId, String content) { 3935 try { 3936 ITelephony telephony = getITelephony(); 3937 if (telephony != null) 3938 return telephony.sendEnvelopeWithStatus(subId, content); 3939 } catch (RemoteException ex) { 3940 } catch (NullPointerException ex) { 3941 } 3942 return ""; 3943 } 3944 3945 /** 3946 * Read one of the NV items defined in com.android.internal.telephony.RadioNVItems. 3947 * Used for device configuration by some CDMA operators. 3948 * <p> 3949 * Requires Permission: 3950 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 3951 * Or the calling app has carrier privileges. @see #hasCarrierPrivileges 3952 * 3953 * @param itemID the ID of the item to read. 3954 * @return the NV item as a String, or null on any failure. 3955 * 3956 * @hide 3957 */ 3958 public String nvReadItem(int itemID) { 3959 try { 3960 ITelephony telephony = getITelephony(); 3961 if (telephony != null) 3962 return telephony.nvReadItem(itemID); 3963 } catch (RemoteException ex) { 3964 Rlog.e(TAG, "nvReadItem RemoteException", ex); 3965 } catch (NullPointerException ex) { 3966 Rlog.e(TAG, "nvReadItem NPE", ex); 3967 } 3968 return ""; 3969 } 3970 3971 /** 3972 * Write one of the NV items defined in com.android.internal.telephony.RadioNVItems. 3973 * Used for device configuration by some CDMA operators. 3974 * <p> 3975 * Requires Permission: 3976 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 3977 * Or the calling app has carrier privileges. @see #hasCarrierPrivileges 3978 * 3979 * @param itemID the ID of the item to read. 3980 * @param itemValue the value to write, as a String. 3981 * @return true on success; false on any failure. 3982 * 3983 * @hide 3984 */ 3985 public boolean nvWriteItem(int itemID, String itemValue) { 3986 try { 3987 ITelephony telephony = getITelephony(); 3988 if (telephony != null) 3989 return telephony.nvWriteItem(itemID, itemValue); 3990 } catch (RemoteException ex) { 3991 Rlog.e(TAG, "nvWriteItem RemoteException", ex); 3992 } catch (NullPointerException ex) { 3993 Rlog.e(TAG, "nvWriteItem NPE", ex); 3994 } 3995 return false; 3996 } 3997 3998 /** 3999 * Update the CDMA Preferred Roaming List (PRL) in the radio NV storage. 4000 * Used for device configuration by some CDMA operators. 4001 * <p> 4002 * Requires Permission: 4003 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 4004 * Or the calling app has carrier privileges. @see #hasCarrierPrivileges 4005 * 4006 * @param preferredRoamingList byte array containing the new PRL. 4007 * @return true on success; false on any failure. 4008 * 4009 * @hide 4010 */ 4011 public boolean nvWriteCdmaPrl(byte[] preferredRoamingList) { 4012 try { 4013 ITelephony telephony = getITelephony(); 4014 if (telephony != null) 4015 return telephony.nvWriteCdmaPrl(preferredRoamingList); 4016 } catch (RemoteException ex) { 4017 Rlog.e(TAG, "nvWriteCdmaPrl RemoteException", ex); 4018 } catch (NullPointerException ex) { 4019 Rlog.e(TAG, "nvWriteCdmaPrl NPE", ex); 4020 } 4021 return false; 4022 } 4023 4024 /** 4025 * Perform the specified type of NV config reset. The radio will be taken offline 4026 * and the device must be rebooted after the operation. Used for device 4027 * configuration by some CDMA operators. 4028 * <p> 4029 * Requires Permission: 4030 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 4031 * Or the calling app has carrier privileges. @see #hasCarrierPrivileges 4032 * 4033 * @param resetType reset type: 1: reload NV reset, 2: erase NV reset, 3: factory NV reset 4034 * @return true on success; false on any failure. 4035 * 4036 * @hide 4037 */ 4038 public boolean nvResetConfig(int resetType) { 4039 try { 4040 ITelephony telephony = getITelephony(); 4041 if (telephony != null) 4042 return telephony.nvResetConfig(resetType); 4043 } catch (RemoteException ex) { 4044 Rlog.e(TAG, "nvResetConfig RemoteException", ex); 4045 } catch (NullPointerException ex) { 4046 Rlog.e(TAG, "nvResetConfig NPE", ex); 4047 } 4048 return false; 4049 } 4050 4051 /** 4052 * Return an appropriate subscription ID for any situation. 4053 * 4054 * If this object has been created with {@link #createForSubscriptionId}, then the provided 4055 * subId is returned. Otherwise, the default subId will be returned. 4056 */ 4057 private int getSubId() { 4058 if (SubscriptionManager.isUsableSubIdValue(mSubId)) { 4059 return mSubId; 4060 } 4061 return SubscriptionManager.getDefaultSubscriptionId(); 4062 } 4063 4064 /** 4065 * Return an appropriate subscription ID for any situation. 4066 * 4067 * If this object has been created with {@link #createForSubscriptionId}, then the provided 4068 * subId is returned. Otherwise, the preferred subId which is based on caller's context is 4069 * returned. 4070 * {@see SubscriptionManager#getDefaultDataSubscriptionId()} 4071 * {@see SubscriptionManager#getDefaultVoiceSubscriptionId()} 4072 * {@see SubscriptionManager#getDefaultSmsSubscriptionId()} 4073 */ 4074 private int getSubId(int preferredSubId) { 4075 if (SubscriptionManager.isUsableSubIdValue(mSubId)) { 4076 return mSubId; 4077 } 4078 return preferredSubId; 4079 } 4080 4081 /** 4082 * Return an appropriate phone ID for any situation. 4083 * 4084 * If this object has been created with {@link #createForSubscriptionId}, then the phoneId 4085 * associated with the provided subId is returned. Otherwise, the default phoneId associated 4086 * with the default subId will be returned. 4087 */ 4088 private int getPhoneId() { 4089 return SubscriptionManager.getPhoneId(getSubId()); 4090 } 4091 4092 /** 4093 * Return an appropriate phone ID for any situation. 4094 * 4095 * If this object has been created with {@link #createForSubscriptionId}, then the phoneId 4096 * associated with the provided subId is returned. Otherwise, return the phoneId associated 4097 * with the preferred subId based on caller's context. 4098 * {@see SubscriptionManager#getDefaultDataSubscriptionId()} 4099 * {@see SubscriptionManager#getDefaultVoiceSubscriptionId()} 4100 * {@see SubscriptionManager#getDefaultSmsSubscriptionId()} 4101 */ 4102 private int getPhoneId(int preferredSubId) { 4103 return SubscriptionManager.getPhoneId(getSubId(preferredSubId)); 4104 } 4105 4106 /** 4107 * Return an appropriate slot index for any situation. 4108 * 4109 * if this object has been created with {@link #createForSubscriptionId}, then the slot index 4110 * associated with the provided subId is returned. Otherwise, return the slot index associated 4111 * with the default subId. 4112 * If SIM is not inserted, return default SIM slot index. 4113 * 4114 * {@hide} 4115 */ 4116 @VisibleForTesting 4117 public int getSlotIndex() { 4118 int slotIndex = SubscriptionManager.getSlotIndex(getSubId()); 4119 if (slotIndex == SubscriptionManager.SIM_NOT_INSERTED) { 4120 slotIndex = SubscriptionManager.DEFAULT_SIM_SLOT_INDEX; 4121 } 4122 return slotIndex; 4123 } 4124 4125 /** 4126 * Sets the telephony property with the value specified. 4127 * 4128 * @hide 4129 */ 4130 public static void setTelephonyProperty(int phoneId, String property, String value) { 4131 String propVal = ""; 4132 String p[] = null; 4133 String prop = SystemProperties.get(property); 4134 4135 if (value == null) { 4136 value = ""; 4137 } 4138 4139 if (prop != null) { 4140 p = prop.split(","); 4141 } 4142 4143 if (!SubscriptionManager.isValidPhoneId(phoneId)) { 4144 Rlog.d(TAG, "setTelephonyProperty: invalid phoneId=" + phoneId + 4145 " property=" + property + " value: " + value + " prop=" + prop); 4146 return; 4147 } 4148 4149 for (int i = 0; i < phoneId; i++) { 4150 String str = ""; 4151 if ((p != null) && (i < p.length)) { 4152 str = p[i]; 4153 } 4154 propVal = propVal + str + ","; 4155 } 4156 4157 propVal = propVal + value; 4158 if (p != null) { 4159 for (int i = phoneId + 1; i < p.length; i++) { 4160 propVal = propVal + "," + p[i]; 4161 } 4162 } 4163 4164 if (propVal.length() > SystemProperties.PROP_VALUE_MAX) { 4165 Rlog.d(TAG, "setTelephonyProperty: property too long phoneId=" + phoneId + 4166 " property=" + property + " value: " + value + " propVal=" + propVal); 4167 return; 4168 } 4169 4170 Rlog.d(TAG, "setTelephonyProperty: success phoneId=" + phoneId + 4171 " property=" + property + " value: " + value + " propVal=" + propVal); 4172 SystemProperties.set(property, propVal); 4173 } 4174 4175 /** 4176 * Convenience function for retrieving a value from the secure settings 4177 * value list as an integer. Note that internally setting values are 4178 * always stored as strings; this function converts the string to an 4179 * integer for you. 4180 * <p> 4181 * This version does not take a default value. If the setting has not 4182 * been set, or the string value is not a number, 4183 * it throws {@link SettingNotFoundException}. 4184 * 4185 * @param cr The ContentResolver to access. 4186 * @param name The name of the setting to retrieve. 4187 * @param index The index of the list 4188 * 4189 * @throws SettingNotFoundException Thrown if a setting by the given 4190 * name can't be found or the setting value is not an integer. 4191 * 4192 * @return The value at the given index of settings. 4193 * @hide 4194 */ 4195 public static int getIntAtIndex(android.content.ContentResolver cr, 4196 String name, int index) 4197 throws android.provider.Settings.SettingNotFoundException { 4198 String v = android.provider.Settings.Global.getString(cr, name); 4199 if (v != null) { 4200 String valArray[] = v.split(","); 4201 if ((index >= 0) && (index < valArray.length) && (valArray[index] != null)) { 4202 try { 4203 return Integer.parseInt(valArray[index]); 4204 } catch (NumberFormatException e) { 4205 //Log.e(TAG, "Exception while parsing Integer: ", e); 4206 } 4207 } 4208 } 4209 throw new android.provider.Settings.SettingNotFoundException(name); 4210 } 4211 4212 /** 4213 * Convenience function for updating settings value as coma separated 4214 * integer values. This will either create a new entry in the table if the 4215 * given name does not exist, or modify the value of the existing row 4216 * with that name. Note that internally setting values are always 4217 * stored as strings, so this function converts the given value to a 4218 * string before storing it. 4219 * 4220 * @param cr The ContentResolver to access. 4221 * @param name The name of the setting to modify. 4222 * @param index The index of the list 4223 * @param value The new value for the setting to be added to the list. 4224 * @return true if the value was set, false on database errors 4225 * @hide 4226 */ 4227 public static boolean putIntAtIndex(android.content.ContentResolver cr, 4228 String name, int index, int value) { 4229 String data = ""; 4230 String valArray[] = null; 4231 String v = android.provider.Settings.Global.getString(cr, name); 4232 4233 if (index == Integer.MAX_VALUE) { 4234 throw new RuntimeException("putIntAtIndex index == MAX_VALUE index=" + index); 4235 } 4236 if (index < 0) { 4237 throw new RuntimeException("putIntAtIndex index < 0 index=" + index); 4238 } 4239 if (v != null) { 4240 valArray = v.split(","); 4241 } 4242 4243 // Copy the elements from valArray till index 4244 for (int i = 0; i < index; i++) { 4245 String str = ""; 4246 if ((valArray != null) && (i < valArray.length)) { 4247 str = valArray[i]; 4248 } 4249 data = data + str + ","; 4250 } 4251 4252 data = data + value; 4253 4254 // Copy the remaining elements from valArray if any. 4255 if (valArray != null) { 4256 for (int i = index+1; i < valArray.length; i++) { 4257 data = data + "," + valArray[i]; 4258 } 4259 } 4260 return android.provider.Settings.Global.putString(cr, name, data); 4261 } 4262 4263 /** 4264 * Gets the telephony property. 4265 * 4266 * @hide 4267 */ 4268 public static String getTelephonyProperty(int phoneId, String property, String defaultVal) { 4269 String propVal = null; 4270 String prop = SystemProperties.get(property); 4271 if ((prop != null) && (prop.length() > 0)) { 4272 String values[] = prop.split(","); 4273 if ((phoneId >= 0) && (phoneId < values.length) && (values[phoneId] != null)) { 4274 propVal = values[phoneId]; 4275 } 4276 } 4277 return propVal == null ? defaultVal : propVal; 4278 } 4279 4280 /** @hide */ 4281 public int getSimCount() { 4282 // FIXME Need to get it from Telephony Dev Controller when that gets implemented! 4283 // and then this method shouldn't be used at all! 4284 if(isMultiSimEnabled()) { 4285 return 2; 4286 } else { 4287 return 1; 4288 } 4289 } 4290 4291 /** 4292 * Returns the IMS Service Table (IST) that was loaded from the ISIM. 4293 * @return IMS Service Table or null if not present or not loaded 4294 * @hide 4295 */ 4296 public String getIsimIst() { 4297 try { 4298 IPhoneSubInfo info = getSubscriberInfo(); 4299 if (info == null) 4300 return null; 4301 return info.getIsimIst(); 4302 } catch (RemoteException ex) { 4303 return null; 4304 } catch (NullPointerException ex) { 4305 // This could happen before phone restarts due to crashing 4306 return null; 4307 } 4308 } 4309 4310 /** 4311 * Returns the IMS Proxy Call Session Control Function(PCSCF) that were loaded from the ISIM. 4312 * @return an array of PCSCF strings with one PCSCF per string, or null if 4313 * not present or not loaded 4314 * @hide 4315 */ 4316 public String[] getIsimPcscf() { 4317 try { 4318 IPhoneSubInfo info = getSubscriberInfo(); 4319 if (info == null) 4320 return null; 4321 return info.getIsimPcscf(); 4322 } catch (RemoteException ex) { 4323 return null; 4324 } catch (NullPointerException ex) { 4325 // This could happen before phone restarts due to crashing 4326 return null; 4327 } 4328 } 4329 4330 /** 4331 * Returns the response of ISIM Authetification through RIL. 4332 * Returns null if the Authentification hasn't been successed or isn't present iphonesubinfo. 4333 * @return the response of ISIM Authetification, or null if not available 4334 * @hide 4335 * @deprecated 4336 * @see getIccAuthentication with appType=PhoneConstants.APPTYPE_ISIM 4337 */ 4338 public String getIsimChallengeResponse(String nonce){ 4339 try { 4340 IPhoneSubInfo info = getSubscriberInfo(); 4341 if (info == null) 4342 return null; 4343 return info.getIsimChallengeResponse(nonce); 4344 } catch (RemoteException ex) { 4345 return null; 4346 } catch (NullPointerException ex) { 4347 // This could happen before phone restarts due to crashing 4348 return null; 4349 } 4350 } 4351 4352 // ICC SIM Application Types 4353 /** UICC application type is SIM */ 4354 public static final int APPTYPE_SIM = PhoneConstants.APPTYPE_SIM; 4355 /** UICC application type is USIM */ 4356 public static final int APPTYPE_USIM = PhoneConstants.APPTYPE_USIM; 4357 /** UICC application type is RUIM */ 4358 public static final int APPTYPE_RUIM = PhoneConstants.APPTYPE_RUIM; 4359 /** UICC application type is CSIM */ 4360 public static final int APPTYPE_CSIM = PhoneConstants.APPTYPE_CSIM; 4361 /** UICC application type is ISIM */ 4362 public static final int APPTYPE_ISIM = PhoneConstants.APPTYPE_ISIM; 4363 // authContext (parameter P2) when doing UICC challenge, 4364 // per 3GPP TS 31.102 (Section 7.1.2) 4365 /** Authentication type for UICC challenge is EAP SIM. See RFC 4186 for details. */ 4366 public static final int AUTHTYPE_EAP_SIM = PhoneConstants.AUTH_CONTEXT_EAP_SIM; 4367 /** Authentication type for UICC challenge is EAP AKA. See RFC 4187 for details. */ 4368 public static final int AUTHTYPE_EAP_AKA = PhoneConstants.AUTH_CONTEXT_EAP_AKA; 4369 4370 /** 4371 * Returns the response of authentication for the default subscription. 4372 * Returns null if the authentication hasn't been successful 4373 * 4374 * <p>Requires that the calling app has carrier privileges or READ_PRIVILEGED_PHONE_STATE 4375 * permission. 4376 * 4377 * @param appType the icc application type, like {@link #APPTYPE_USIM} 4378 * @param authType the authentication type, {@link #AUTHTYPE_EAP_AKA} or 4379 * {@link #AUTHTYPE_EAP_SIM} 4380 * @param data authentication challenge data, base64 encoded. 4381 * See 3GPP TS 31.102 7.1.2 for more details. 4382 * @return the response of authentication, or null if not available 4383 * 4384 * @see #hasCarrierPrivileges 4385 */ 4386 public String getIccAuthentication(int appType, int authType, String data) { 4387 return getIccAuthentication(getSubId(), appType, authType, data); 4388 } 4389 4390 /** 4391 * Returns the response of USIM Authentication for specified subId. 4392 * Returns null if the authentication hasn't been successful 4393 * 4394 * <p>Requires that the calling app has carrier privileges. 4395 * 4396 * @param subId subscription ID used for authentication 4397 * @param appType the icc application type, like {@link #APPTYPE_USIM} 4398 * @param authType the authentication type, {@link #AUTHTYPE_EAP_AKA} or 4399 * {@link #AUTHTYPE_EAP_SIM} 4400 * @param data authentication challenge data, base64 encoded. 4401 * See 3GPP TS 31.102 7.1.2 for more details. 4402 * @return the response of authentication, or null if not available 4403 * 4404 * @see #hasCarrierPrivileges 4405 * @hide 4406 */ 4407 public String getIccAuthentication(int subId, int appType, int authType, String data) { 4408 try { 4409 IPhoneSubInfo info = getSubscriberInfo(); 4410 if (info == null) 4411 return null; 4412 return info.getIccSimChallengeResponse(subId, appType, authType, data); 4413 } catch (RemoteException ex) { 4414 return null; 4415 } catch (NullPointerException ex) { 4416 // This could happen before phone starts 4417 return null; 4418 } 4419 } 4420 4421 /** 4422 * Returns an array of Forbidden PLMNs from the USIM App 4423 * Returns null if the query fails. 4424 * 4425 * @return an array of forbidden PLMNs or null if not available 4426 */ 4427 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 4428 public String[] getForbiddenPlmns() { 4429 return getForbiddenPlmns(getSubId(), APPTYPE_USIM); 4430 } 4431 4432 /** 4433 * Returns an array of Forbidden PLMNs from the specified SIM App 4434 * Returns null if the query fails. 4435 * 4436 * @param subId subscription ID used for authentication 4437 * @param appType the icc application type, like {@link #APPTYPE_USIM} 4438 * @return fplmns an array of forbidden PLMNs 4439 * @hide 4440 */ 4441 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 4442 public String[] getForbiddenPlmns(int subId, int appType) { 4443 try { 4444 ITelephony telephony = getITelephony(); 4445 if (telephony == null) 4446 return null; 4447 return telephony.getForbiddenPlmns(subId, appType); 4448 } catch (RemoteException ex) { 4449 return null; 4450 } catch (NullPointerException ex) { 4451 // This could happen before phone starts 4452 return null; 4453 } 4454 } 4455 4456 /** 4457 * Get P-CSCF address from PCO after data connection is established or modified. 4458 * @param apnType the apnType, "ims" for IMS APN, "emergency" for EMERGENCY APN 4459 * @return array of P-CSCF address 4460 * @hide 4461 */ 4462 public String[] getPcscfAddress(String apnType) { 4463 try { 4464 ITelephony telephony = getITelephony(); 4465 if (telephony == null) 4466 return new String[0]; 4467 return telephony.getPcscfAddress(apnType, getOpPackageName()); 4468 } catch (RemoteException e) { 4469 return new String[0]; 4470 } 4471 } 4472 4473 /** @hide */ 4474 @IntDef({ImsFeature.EMERGENCY_MMTEL, ImsFeature.MMTEL, ImsFeature.RCS}) 4475 @Retention(RetentionPolicy.SOURCE) 4476 public @interface Feature {} 4477 4478 /** 4479 * Returns the {@link IImsServiceController} that corresponds to the given slot Id and IMS 4480 * feature or {@link null} if the service is not available. If an ImsServiceController is 4481 * available, the {@link IImsServiceFeatureListener} callback is registered as a listener for 4482 * feature updates. 4483 * @param slotIndex The SIM slot that we are requesting the {@link IImsServiceController} for. 4484 * @param feature The IMS Feature we are requesting, corresponding to {@link ImsFeature}. 4485 * @param callback Listener that will send updates to ImsManager when there are updates to 4486 * ImsServiceController. 4487 * @return {@link IImsServiceController} interface for the feature specified or {@link null} if 4488 * it is unavailable. 4489 * @hide 4490 */ 4491 public IImsServiceController getImsServiceControllerAndListen(int slotIndex, @Feature int feature, 4492 IImsServiceFeatureListener callback) { 4493 try { 4494 ITelephony telephony = getITelephony(); 4495 if (telephony != null) { 4496 return telephony.getImsServiceControllerAndListen(slotIndex, feature, callback); 4497 } 4498 } catch (RemoteException e) { 4499 Rlog.e(TAG, "getImsServiceControllerAndListen, RemoteException: " + e.getMessage()); 4500 } 4501 return null; 4502 } 4503 4504 /** 4505 * Set IMS registration state 4506 * 4507 * @param Registration state 4508 * @hide 4509 */ 4510 public void setImsRegistrationState(boolean registered) { 4511 try { 4512 ITelephony telephony = getITelephony(); 4513 if (telephony != null) 4514 telephony.setImsRegistrationState(registered); 4515 } catch (RemoteException e) { 4516 } 4517 } 4518 4519 /** 4520 * Get the preferred network type. 4521 * Used for device configuration by some CDMA operators. 4522 * <p> 4523 * Requires Permission: 4524 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 4525 * Or the calling app has carrier privileges. @see #hasCarrierPrivileges 4526 * 4527 * @return the preferred network type, defined in RILConstants.java. 4528 * @hide 4529 */ 4530 public int getPreferredNetworkType(int subId) { 4531 try { 4532 ITelephony telephony = getITelephony(); 4533 if (telephony != null) 4534 return telephony.getPreferredNetworkType(subId); 4535 } catch (RemoteException ex) { 4536 Rlog.e(TAG, "getPreferredNetworkType RemoteException", ex); 4537 } catch (NullPointerException ex) { 4538 Rlog.e(TAG, "getPreferredNetworkType NPE", ex); 4539 } 4540 return -1; 4541 } 4542 4543 /** 4544 * Sets the network selection mode to automatic. 4545 * <p> 4546 * Requires Permission: 4547 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 4548 * Or the calling app has carrier privileges. @see #hasCarrierPrivileges 4549 * 4550 * @hide 4551 * TODO: Add an overload that takes no args. 4552 */ 4553 public void setNetworkSelectionModeAutomatic(int subId) { 4554 try { 4555 ITelephony telephony = getITelephony(); 4556 if (telephony != null) 4557 telephony.setNetworkSelectionModeAutomatic(subId); 4558 } catch (RemoteException ex) { 4559 Rlog.e(TAG, "setNetworkSelectionModeAutomatic RemoteException", ex); 4560 } catch (NullPointerException ex) { 4561 Rlog.e(TAG, "setNetworkSelectionModeAutomatic NPE", ex); 4562 } 4563 } 4564 4565 /** 4566 * Perform a radio scan and return the list of avialble networks. 4567 * 4568 * The return value is a list of the OperatorInfo of the networks found. Note that this 4569 * scan can take a long time (sometimes minutes) to happen. 4570 * 4571 * <p> 4572 * Requires Permission: 4573 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 4574 * Or the calling app has carrier privileges. @see #hasCarrierPrivileges 4575 * 4576 * @hide 4577 * TODO: Add an overload that takes no args. 4578 */ 4579 public CellNetworkScanResult getCellNetworkScanResults(int subId) { 4580 try { 4581 ITelephony telephony = getITelephony(); 4582 if (telephony != null) 4583 return telephony.getCellNetworkScanResults(subId); 4584 } catch (RemoteException ex) { 4585 Rlog.e(TAG, "getCellNetworkScanResults RemoteException", ex); 4586 } catch (NullPointerException ex) { 4587 Rlog.e(TAG, "getCellNetworkScanResults NPE", ex); 4588 } 4589 return null; 4590 } 4591 4592 /** 4593 * Ask the radio to connect to the input network and change selection mode to manual. 4594 * 4595 * <p> 4596 * Requires Permission: 4597 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 4598 * Or the calling app has carrier privileges. @see #hasCarrierPrivileges 4599 * 4600 * @hide 4601 * TODO: Add an overload that takes no args. 4602 */ 4603 public boolean setNetworkSelectionModeManual(int subId, OperatorInfo operator, 4604 boolean persistSelection) { 4605 try { 4606 ITelephony telephony = getITelephony(); 4607 if (telephony != null) 4608 return telephony.setNetworkSelectionModeManual(subId, operator, persistSelection); 4609 } catch (RemoteException ex) { 4610 Rlog.e(TAG, "setNetworkSelectionModeManual RemoteException", ex); 4611 } catch (NullPointerException ex) { 4612 Rlog.e(TAG, "setNetworkSelectionModeManual NPE", ex); 4613 } 4614 return false; 4615 } 4616 4617 /** 4618 * Set the preferred network type. 4619 * Used for device configuration by some CDMA operators. 4620 * <p> 4621 * Requires Permission: 4622 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 4623 * Or the calling app has carrier privileges. @see #hasCarrierPrivileges 4624 * 4625 * @param subId the id of the subscription to set the preferred network type for. 4626 * @param networkType the preferred network type, defined in RILConstants.java. 4627 * @return true on success; false on any failure. 4628 * @hide 4629 */ 4630 public boolean setPreferredNetworkType(int subId, int networkType) { 4631 try { 4632 ITelephony telephony = getITelephony(); 4633 if (telephony != null) 4634 return telephony.setPreferredNetworkType(subId, networkType); 4635 } catch (RemoteException ex) { 4636 Rlog.e(TAG, "setPreferredNetworkType RemoteException", ex); 4637 } catch (NullPointerException ex) { 4638 Rlog.e(TAG, "setPreferredNetworkType NPE", ex); 4639 } 4640 return false; 4641 } 4642 4643 /** 4644 * Set the preferred network type to global mode which includes LTE, CDMA, EvDo and GSM/WCDMA. 4645 * 4646 * <p> 4647 * Requires that the calling app has carrier privileges. 4648 * @see #hasCarrierPrivileges 4649 * 4650 * @return true on success; false on any failure. 4651 */ 4652 public boolean setPreferredNetworkTypeToGlobal() { 4653 return setPreferredNetworkTypeToGlobal(getSubId()); 4654 } 4655 4656 /** 4657 * Set the preferred network type to global mode which includes LTE, CDMA, EvDo and GSM/WCDMA. 4658 * 4659 * <p> 4660 * Requires that the calling app has carrier privileges. 4661 * @see #hasCarrierPrivileges 4662 * 4663 * @return true on success; false on any failure. 4664 * @hide 4665 */ 4666 public boolean setPreferredNetworkTypeToGlobal(int subId) { 4667 return setPreferredNetworkType(subId, RILConstants.NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA); 4668 } 4669 4670 /** 4671 * Check TETHER_DUN_REQUIRED and TETHER_DUN_APN settings, net.tethering.noprovisioning 4672 * SystemProperty, and config_tether_apndata to decide whether DUN APN is required for 4673 * tethering. 4674 * 4675 * @return 0: Not required. 1: required. 2: Not set. 4676 * @hide 4677 */ 4678 public int getTetherApnRequired() { 4679 try { 4680 ITelephony telephony = getITelephony(); 4681 if (telephony != null) 4682 return telephony.getTetherApnRequired(); 4683 } catch (RemoteException ex) { 4684 Rlog.e(TAG, "hasMatchedTetherApnSetting RemoteException", ex); 4685 } catch (NullPointerException ex) { 4686 Rlog.e(TAG, "hasMatchedTetherApnSetting NPE", ex); 4687 } 4688 return 2; 4689 } 4690 4691 4692 /** 4693 * Values used to return status for hasCarrierPrivileges call. 4694 */ 4695 /** @hide */ @SystemApi 4696 public static final int CARRIER_PRIVILEGE_STATUS_HAS_ACCESS = 1; 4697 /** @hide */ @SystemApi 4698 public static final int CARRIER_PRIVILEGE_STATUS_NO_ACCESS = 0; 4699 /** @hide */ @SystemApi 4700 public static final int CARRIER_PRIVILEGE_STATUS_RULES_NOT_LOADED = -1; 4701 /** @hide */ @SystemApi 4702 public static final int CARRIER_PRIVILEGE_STATUS_ERROR_LOADING_RULES = -2; 4703 4704 /** 4705 * Has the calling application been granted carrier privileges by the carrier. 4706 * 4707 * If any of the packages in the calling UID has carrier privileges, the 4708 * call will return true. This access is granted by the owner of the UICC 4709 * card and does not depend on the registered carrier. 4710 * 4711 * @return true if the app has carrier privileges. 4712 */ 4713 public boolean hasCarrierPrivileges() { 4714 return hasCarrierPrivileges(getSubId()); 4715 } 4716 4717 /** 4718 * Has the calling application been granted carrier privileges by the carrier. 4719 * 4720 * If any of the packages in the calling UID has carrier privileges, the 4721 * call will return true. This access is granted by the owner of the UICC 4722 * card and does not depend on the registered carrier. 4723 * 4724 * @param subId The subscription to use. 4725 * @return true if the app has carrier privileges. 4726 * @hide 4727 */ 4728 public boolean hasCarrierPrivileges(int subId) { 4729 try { 4730 ITelephony telephony = getITelephony(); 4731 if (telephony != null) { 4732 return telephony.getCarrierPrivilegeStatus(mSubId) == 4733 CARRIER_PRIVILEGE_STATUS_HAS_ACCESS; 4734 } 4735 } catch (RemoteException ex) { 4736 Rlog.e(TAG, "hasCarrierPrivileges RemoteException", ex); 4737 } catch (NullPointerException ex) { 4738 Rlog.e(TAG, "hasCarrierPrivileges NPE", ex); 4739 } 4740 return false; 4741 } 4742 4743 /** 4744 * Override the branding for the current ICCID. 4745 * 4746 * Once set, whenever the SIM is present in the device, the service 4747 * provider name (SPN) and the operator name will both be replaced by the 4748 * brand value input. To unset the value, the same function should be 4749 * called with a null brand value. 4750 * 4751 * <p>Requires that the calling app has carrier privileges. 4752 * @see #hasCarrierPrivileges 4753 * 4754 * @param brand The brand name to display/set. 4755 * @return true if the operation was executed correctly. 4756 */ 4757 public boolean setOperatorBrandOverride(String brand) { 4758 return setOperatorBrandOverride(getSubId(), brand); 4759 } 4760 4761 /** 4762 * Override the branding for the current ICCID. 4763 * 4764 * Once set, whenever the SIM is present in the device, the service 4765 * provider name (SPN) and the operator name will both be replaced by the 4766 * brand value input. To unset the value, the same function should be 4767 * called with a null brand value. 4768 * 4769 * <p>Requires that the calling app has carrier privileges. 4770 * @see #hasCarrierPrivileges 4771 * 4772 * @param subId The subscription to use. 4773 * @param brand The brand name to display/set. 4774 * @return true if the operation was executed correctly. 4775 * @hide 4776 */ 4777 public boolean setOperatorBrandOverride(int subId, String brand) { 4778 try { 4779 ITelephony telephony = getITelephony(); 4780 if (telephony != null) 4781 return telephony.setOperatorBrandOverride(subId, brand); 4782 } catch (RemoteException ex) { 4783 Rlog.e(TAG, "setOperatorBrandOverride RemoteException", ex); 4784 } catch (NullPointerException ex) { 4785 Rlog.e(TAG, "setOperatorBrandOverride NPE", ex); 4786 } 4787 return false; 4788 } 4789 4790 /** 4791 * Override the roaming preference for the current ICCID. 4792 * 4793 * Using this call, the carrier app (see #hasCarrierPrivileges) can override 4794 * the platform's notion of a network operator being considered roaming or not. 4795 * The change only affects the ICCID that was active when this call was made. 4796 * 4797 * If null is passed as any of the input, the corresponding value is deleted. 4798 * 4799 * <p>Requires that the caller have carrier privilege. See #hasCarrierPrivileges. 4800 * 4801 * @param gsmRoamingList - List of MCCMNCs to be considered roaming for 3GPP RATs. 4802 * @param gsmNonRoamingList - List of MCCMNCs to be considered not roaming for 3GPP RATs. 4803 * @param cdmaRoamingList - List of SIDs to be considered roaming for 3GPP2 RATs. 4804 * @param cdmaNonRoamingList - List of SIDs to be considered not roaming for 3GPP2 RATs. 4805 * @return true if the operation was executed correctly. 4806 * 4807 * @hide 4808 */ 4809 public boolean setRoamingOverride(List<String> gsmRoamingList, 4810 List<String> gsmNonRoamingList, List<String> cdmaRoamingList, 4811 List<String> cdmaNonRoamingList) { 4812 return setRoamingOverride(getSubId(), gsmRoamingList, gsmNonRoamingList, 4813 cdmaRoamingList, cdmaNonRoamingList); 4814 } 4815 4816 /** 4817 * Override the roaming preference for the current ICCID. 4818 * 4819 * Using this call, the carrier app (see #hasCarrierPrivileges) can override 4820 * the platform's notion of a network operator being considered roaming or not. 4821 * The change only affects the ICCID that was active when this call was made. 4822 * 4823 * If null is passed as any of the input, the corresponding value is deleted. 4824 * 4825 * <p>Requires that the caller have carrier privilege. See #hasCarrierPrivileges. 4826 * 4827 * @param subId for which the roaming overrides apply. 4828 * @param gsmRoamingList - List of MCCMNCs to be considered roaming for 3GPP RATs. 4829 * @param gsmNonRoamingList - List of MCCMNCs to be considered not roaming for 3GPP RATs. 4830 * @param cdmaRoamingList - List of SIDs to be considered roaming for 3GPP2 RATs. 4831 * @param cdmaNonRoamingList - List of SIDs to be considered not roaming for 3GPP2 RATs. 4832 * @return true if the operation was executed correctly. 4833 * 4834 * @hide 4835 */ 4836 public boolean setRoamingOverride(int subId, List<String> gsmRoamingList, 4837 List<String> gsmNonRoamingList, List<String> cdmaRoamingList, 4838 List<String> cdmaNonRoamingList) { 4839 try { 4840 ITelephony telephony = getITelephony(); 4841 if (telephony != null) 4842 return telephony.setRoamingOverride(subId, gsmRoamingList, gsmNonRoamingList, 4843 cdmaRoamingList, cdmaNonRoamingList); 4844 } catch (RemoteException ex) { 4845 Rlog.e(TAG, "setRoamingOverride RemoteException", ex); 4846 } catch (NullPointerException ex) { 4847 Rlog.e(TAG, "setRoamingOverride NPE", ex); 4848 } 4849 return false; 4850 } 4851 4852 /** 4853 * Expose the rest of ITelephony to @SystemApi 4854 */ 4855 4856 /** @hide */ 4857 @SystemApi 4858 @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) 4859 public String getCdmaMdn() { 4860 return getCdmaMdn(getSubId()); 4861 } 4862 4863 /** @hide */ 4864 @SystemApi 4865 @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) 4866 public String getCdmaMdn(int subId) { 4867 try { 4868 ITelephony telephony = getITelephony(); 4869 if (telephony == null) 4870 return null; 4871 return telephony.getCdmaMdn(subId); 4872 } catch (RemoteException ex) { 4873 return null; 4874 } catch (NullPointerException ex) { 4875 return null; 4876 } 4877 } 4878 4879 /** @hide */ 4880 @SystemApi 4881 @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) 4882 public String getCdmaMin() { 4883 return getCdmaMin(getSubId()); 4884 } 4885 4886 /** @hide */ 4887 @SystemApi 4888 @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) 4889 public String getCdmaMin(int subId) { 4890 try { 4891 ITelephony telephony = getITelephony(); 4892 if (telephony == null) 4893 return null; 4894 return telephony.getCdmaMin(subId); 4895 } catch (RemoteException ex) { 4896 return null; 4897 } catch (NullPointerException ex) { 4898 return null; 4899 } 4900 } 4901 4902 /** @hide */ 4903 @SystemApi 4904 @SuppressLint("Doclava125") 4905 public int checkCarrierPrivilegesForPackage(String pkgName) { 4906 try { 4907 ITelephony telephony = getITelephony(); 4908 if (telephony != null) 4909 return telephony.checkCarrierPrivilegesForPackage(pkgName); 4910 } catch (RemoteException ex) { 4911 Rlog.e(TAG, "checkCarrierPrivilegesForPackage RemoteException", ex); 4912 } catch (NullPointerException ex) { 4913 Rlog.e(TAG, "checkCarrierPrivilegesForPackage NPE", ex); 4914 } 4915 return CARRIER_PRIVILEGE_STATUS_NO_ACCESS; 4916 } 4917 4918 /** @hide */ 4919 @SystemApi 4920 @SuppressLint("Doclava125") 4921 public int checkCarrierPrivilegesForPackageAnyPhone(String pkgName) { 4922 try { 4923 ITelephony telephony = getITelephony(); 4924 if (telephony != null) 4925 return telephony.checkCarrierPrivilegesForPackageAnyPhone(pkgName); 4926 } catch (RemoteException ex) { 4927 Rlog.e(TAG, "checkCarrierPrivilegesForPackageAnyPhone RemoteException", ex); 4928 } catch (NullPointerException ex) { 4929 Rlog.e(TAG, "checkCarrierPrivilegesForPackageAnyPhone NPE", ex); 4930 } 4931 return CARRIER_PRIVILEGE_STATUS_NO_ACCESS; 4932 } 4933 4934 /** @hide */ 4935 @SystemApi 4936 public List<String> getCarrierPackageNamesForIntent(Intent intent) { 4937 return getCarrierPackageNamesForIntentAndPhone(intent, getPhoneId()); 4938 } 4939 4940 /** @hide */ 4941 @SystemApi 4942 public List<String> getCarrierPackageNamesForIntentAndPhone(Intent intent, int phoneId) { 4943 try { 4944 ITelephony telephony = getITelephony(); 4945 if (telephony != null) 4946 return telephony.getCarrierPackageNamesForIntentAndPhone(intent, phoneId); 4947 } catch (RemoteException ex) { 4948 Rlog.e(TAG, "getCarrierPackageNamesForIntentAndPhone RemoteException", ex); 4949 } catch (NullPointerException ex) { 4950 Rlog.e(TAG, "getCarrierPackageNamesForIntentAndPhone NPE", ex); 4951 } 4952 return null; 4953 } 4954 4955 /** @hide */ 4956 public List<String> getPackagesWithCarrierPrivileges() { 4957 try { 4958 ITelephony telephony = getITelephony(); 4959 if (telephony != null) { 4960 return telephony.getPackagesWithCarrierPrivileges(); 4961 } 4962 } catch (RemoteException ex) { 4963 Rlog.e(TAG, "getPackagesWithCarrierPrivileges RemoteException", ex); 4964 } catch (NullPointerException ex) { 4965 Rlog.e(TAG, "getPackagesWithCarrierPrivileges NPE", ex); 4966 } 4967 return Collections.EMPTY_LIST; 4968 } 4969 4970 /** @hide */ 4971 @SystemApi 4972 @SuppressLint("Doclava125") 4973 public void dial(String number) { 4974 try { 4975 ITelephony telephony = getITelephony(); 4976 if (telephony != null) 4977 telephony.dial(number); 4978 } catch (RemoteException e) { 4979 Log.e(TAG, "Error calling ITelephony#dial", e); 4980 } 4981 } 4982 4983 /** @hide */ 4984 @SystemApi 4985 @RequiresPermission(android.Manifest.permission.CALL_PHONE) 4986 public void call(String callingPackage, String number) { 4987 try { 4988 ITelephony telephony = getITelephony(); 4989 if (telephony != null) 4990 telephony.call(callingPackage, number); 4991 } catch (RemoteException e) { 4992 Log.e(TAG, "Error calling ITelephony#call", e); 4993 } 4994 } 4995 4996 /** @hide */ 4997 @SystemApi 4998 @RequiresPermission(android.Manifest.permission.CALL_PHONE) 4999 public boolean endCall() { 5000 try { 5001 ITelephony telephony = getITelephony(); 5002 if (telephony != null) 5003 return telephony.endCall(); 5004 } catch (RemoteException e) { 5005 Log.e(TAG, "Error calling ITelephony#endCall", e); 5006 } 5007 return false; 5008 } 5009 5010 /** @hide */ 5011 @SystemApi 5012 @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) 5013 public void answerRingingCall() { 5014 try { 5015 ITelephony telephony = getITelephony(); 5016 if (telephony != null) 5017 telephony.answerRingingCall(); 5018 } catch (RemoteException e) { 5019 Log.e(TAG, "Error calling ITelephony#answerRingingCall", e); 5020 } 5021 } 5022 5023 /** @hide */ 5024 @SystemApi 5025 @SuppressLint("Doclava125") 5026 public void silenceRinger() { 5027 try { 5028 getTelecomService().silenceRinger(getOpPackageName()); 5029 } catch (RemoteException e) { 5030 Log.e(TAG, "Error calling ITelecomService#silenceRinger", e); 5031 } 5032 } 5033 5034 /** @hide */ 5035 @SystemApi 5036 @RequiresPermission(anyOf = { 5037 android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, 5038 android.Manifest.permission.READ_PHONE_STATE 5039 }) 5040 public boolean isOffhook() { 5041 try { 5042 ITelephony telephony = getITelephony(); 5043 if (telephony != null) 5044 return telephony.isOffhook(getOpPackageName()); 5045 } catch (RemoteException e) { 5046 Log.e(TAG, "Error calling ITelephony#isOffhook", e); 5047 } 5048 return false; 5049 } 5050 5051 /** @hide */ 5052 @SystemApi 5053 @RequiresPermission(anyOf = { 5054 android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, 5055 android.Manifest.permission.READ_PHONE_STATE 5056 }) 5057 public boolean isRinging() { 5058 try { 5059 ITelephony telephony = getITelephony(); 5060 if (telephony != null) 5061 return telephony.isRinging(getOpPackageName()); 5062 } catch (RemoteException e) { 5063 Log.e(TAG, "Error calling ITelephony#isRinging", e); 5064 } 5065 return false; 5066 } 5067 5068 /** @hide */ 5069 @SystemApi 5070 @RequiresPermission(anyOf = { 5071 android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, 5072 android.Manifest.permission.READ_PHONE_STATE 5073 }) 5074 public boolean isIdle() { 5075 try { 5076 ITelephony telephony = getITelephony(); 5077 if (telephony != null) 5078 return telephony.isIdle(getOpPackageName()); 5079 } catch (RemoteException e) { 5080 Log.e(TAG, "Error calling ITelephony#isIdle", e); 5081 } 5082 return true; 5083 } 5084 5085 /** @hide */ 5086 @SystemApi 5087 @RequiresPermission(anyOf = { 5088 android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, 5089 android.Manifest.permission.READ_PHONE_STATE 5090 }) 5091 public boolean isRadioOn() { 5092 try { 5093 ITelephony telephony = getITelephony(); 5094 if (telephony != null) 5095 return telephony.isRadioOn(getOpPackageName()); 5096 } catch (RemoteException e) { 5097 Log.e(TAG, "Error calling ITelephony#isRadioOn", e); 5098 } 5099 return false; 5100 } 5101 5102 /** @hide */ 5103 @SystemApi 5104 @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) 5105 public boolean supplyPin(String pin) { 5106 try { 5107 ITelephony telephony = getITelephony(); 5108 if (telephony != null) 5109 return telephony.supplyPin(pin); 5110 } catch (RemoteException e) { 5111 Log.e(TAG, "Error calling ITelephony#supplyPin", e); 5112 } 5113 return false; 5114 } 5115 5116 /** @hide */ 5117 @SystemApi 5118 @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) 5119 public boolean supplyPuk(String puk, String pin) { 5120 try { 5121 ITelephony telephony = getITelephony(); 5122 if (telephony != null) 5123 return telephony.supplyPuk(puk, pin); 5124 } catch (RemoteException e) { 5125 Log.e(TAG, "Error calling ITelephony#supplyPuk", e); 5126 } 5127 return false; 5128 } 5129 5130 /** @hide */ 5131 @SystemApi 5132 @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) 5133 public int[] supplyPinReportResult(String pin) { 5134 try { 5135 ITelephony telephony = getITelephony(); 5136 if (telephony != null) 5137 return telephony.supplyPinReportResult(pin); 5138 } catch (RemoteException e) { 5139 Log.e(TAG, "Error calling ITelephony#supplyPinReportResult", e); 5140 } 5141 return new int[0]; 5142 } 5143 5144 /** @hide */ 5145 @SystemApi 5146 @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) 5147 public int[] supplyPukReportResult(String puk, String pin) { 5148 try { 5149 ITelephony telephony = getITelephony(); 5150 if (telephony != null) 5151 return telephony.supplyPukReportResult(puk, pin); 5152 } catch (RemoteException e) { 5153 Log.e(TAG, "Error calling ITelephony#]", e); 5154 } 5155 return new int[0]; 5156 } 5157 5158 /** 5159 * Used to notify callers of 5160 * {@link TelephonyManager#sendUssdRequest(String, UssdResponseCallback, Handler)} when the 5161 * network either successfully executes a USSD request, or if there was a failure while 5162 * executing the request. 5163 * <p> 5164 * {@link #onReceiveUssdResponse(TelephonyManager, String, CharSequence)} will be called if the 5165 * USSD request has succeeded. 5166 * {@link #onReceiveUssdResponseFailed(TelephonyManager, String, int)} will be called if the 5167 * USSD request has failed. 5168 */ 5169 public static abstract class UssdResponseCallback { 5170 /** 5171 * Called when a USSD request has succeeded. The {@code response} contains the USSD 5172 * response received from the network. The calling app can choose to either display the 5173 * response to the user or perform some operation based on the response. 5174 * <p> 5175 * USSD responses are unstructured text and their content is determined by the mobile network 5176 * operator. 5177 * 5178 * @param telephonyManager the TelephonyManager the callback is registered to. 5179 * @param request the USSD request sent to the mobile network. 5180 * @param response the response to the USSD request provided by the mobile network. 5181 **/ 5182 public void onReceiveUssdResponse(final TelephonyManager telephonyManager, 5183 String request, CharSequence response) {}; 5184 5185 /** 5186 * Called when a USSD request has failed to complete. 5187 * 5188 * @param telephonyManager the TelephonyManager the callback is registered to. 5189 * @param request the USSD request sent to the mobile network. 5190 * @param failureCode failure code indicating why the request failed. Will be either 5191 * {@link TelephonyManager#USSD_RETURN_FAILURE} or 5192 * {@link TelephonyManager#USSD_ERROR_SERVICE_UNAVAIL}. 5193 **/ 5194 public void onReceiveUssdResponseFailed(final TelephonyManager telephonyManager, 5195 String request, int failureCode) {}; 5196 } 5197 5198 /** 5199 * Sends an Unstructured Supplementary Service Data (USSD) request to the mobile network and 5200 * informs the caller of the response via the supplied {@code callback}. 5201 * <p>Carriers define USSD codes which can be sent by the user to request information such as 5202 * the user's current data balance or minutes balance. 5203 * <p>Requires permission: 5204 * {@link android.Manifest.permission#CALL_PHONE} 5205 * @param ussdRequest the USSD command to be executed. 5206 * @param callback called by the framework to inform the caller of the result of executing the 5207 * USSD request (see {@link UssdResponseCallback}). 5208 * @param handler the {@link Handler} to run the request on. 5209 */ 5210 @RequiresPermission(android.Manifest.permission.CALL_PHONE) 5211 public void sendUssdRequest(String ussdRequest, 5212 final UssdResponseCallback callback, Handler handler) { 5213 checkNotNull(callback, "UssdResponseCallback cannot be null."); 5214 final TelephonyManager telephonyManager = this; 5215 5216 ResultReceiver wrappedCallback = new ResultReceiver(handler) { 5217 @Override 5218 protected void onReceiveResult(int resultCode, Bundle ussdResponse) { 5219 Rlog.d(TAG, "USSD:" + resultCode); 5220 checkNotNull(ussdResponse, "ussdResponse cannot be null."); 5221 UssdResponse response = ussdResponse.getParcelable(USSD_RESPONSE); 5222 5223 if (resultCode == USSD_RETURN_SUCCESS) { 5224 callback.onReceiveUssdResponse(telephonyManager, response.getUssdRequest(), 5225 response.getReturnMessage()); 5226 } else { 5227 callback.onReceiveUssdResponseFailed(telephonyManager, 5228 response.getUssdRequest(), resultCode); 5229 } 5230 } 5231 }; 5232 5233 try { 5234 ITelephony telephony = getITelephony(); 5235 if (telephony != null) { 5236 telephony.handleUssdRequest(getSubId(), ussdRequest, wrappedCallback); 5237 } 5238 } catch (RemoteException e) { 5239 Log.e(TAG, "Error calling ITelephony#sendUSSDCode", e); 5240 UssdResponse response = new UssdResponse(ussdRequest, ""); 5241 Bundle returnData = new Bundle(); 5242 returnData.putParcelable(USSD_RESPONSE, response); 5243 wrappedCallback.send(USSD_ERROR_SERVICE_UNAVAIL, returnData); 5244 } 5245 } 5246 5247 /** 5248 * Whether the device is currently on a technology (e.g. UMTS or LTE) which can support 5249 * voice and data simultaneously. This can change based on location or network condition. 5250 * 5251 * @return {@code true} if simultaneous voice and data supported, and {@code false} otherwise. 5252 */ 5253 public boolean isConcurrentVoiceAndDataSupported() { 5254 try { 5255 ITelephony telephony = getITelephony(); 5256 return (telephony == null ? false : telephony.isConcurrentVoiceAndDataAllowed( 5257 getSubId())); 5258 } catch (RemoteException e) { 5259 Log.e(TAG, "Error calling ITelephony#isConcurrentVoiceAndDataAllowed", e); 5260 } 5261 return false; 5262 } 5263 5264 /** @hide */ 5265 @SystemApi 5266 @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) 5267 public boolean handlePinMmi(String dialString) { 5268 try { 5269 ITelephony telephony = getITelephony(); 5270 if (telephony != null) 5271 return telephony.handlePinMmi(dialString); 5272 } catch (RemoteException e) { 5273 Log.e(TAG, "Error calling ITelephony#handlePinMmi", e); 5274 } 5275 return false; 5276 } 5277 5278 /** @hide */ 5279 @SystemApi 5280 @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) 5281 public boolean handlePinMmiForSubscriber(int subId, String dialString) { 5282 try { 5283 ITelephony telephony = getITelephony(); 5284 if (telephony != null) 5285 return telephony.handlePinMmiForSubscriber(subId, dialString); 5286 } catch (RemoteException e) { 5287 Log.e(TAG, "Error calling ITelephony#handlePinMmi", e); 5288 } 5289 return false; 5290 } 5291 5292 /** @hide */ 5293 @SystemApi 5294 @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) 5295 public void toggleRadioOnOff() { 5296 try { 5297 ITelephony telephony = getITelephony(); 5298 if (telephony != null) 5299 telephony.toggleRadioOnOff(); 5300 } catch (RemoteException e) { 5301 Log.e(TAG, "Error calling ITelephony#toggleRadioOnOff", e); 5302 } 5303 } 5304 5305 /** @hide */ 5306 @SystemApi 5307 @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) 5308 public boolean setRadio(boolean turnOn) { 5309 try { 5310 ITelephony telephony = getITelephony(); 5311 if (telephony != null) 5312 return telephony.setRadio(turnOn); 5313 } catch (RemoteException e) { 5314 Log.e(TAG, "Error calling ITelephony#setRadio", e); 5315 } 5316 return false; 5317 } 5318 5319 /** @hide */ 5320 @SystemApi 5321 @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) 5322 public boolean setRadioPower(boolean turnOn) { 5323 try { 5324 ITelephony telephony = getITelephony(); 5325 if (telephony != null) 5326 return telephony.setRadioPower(turnOn); 5327 } catch (RemoteException e) { 5328 Log.e(TAG, "Error calling ITelephony#setRadioPower", e); 5329 } 5330 return false; 5331 } 5332 5333 /** @hide */ 5334 @SystemApi 5335 @SuppressLint("Doclava125") 5336 public void updateServiceLocation() { 5337 try { 5338 ITelephony telephony = getITelephony(); 5339 if (telephony != null) 5340 telephony.updateServiceLocation(); 5341 } catch (RemoteException e) { 5342 Log.e(TAG, "Error calling ITelephony#updateServiceLocation", e); 5343 } 5344 } 5345 5346 /** @hide */ 5347 @SystemApi 5348 @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) 5349 public boolean enableDataConnectivity() { 5350 try { 5351 ITelephony telephony = getITelephony(); 5352 if (telephony != null) 5353 return telephony.enableDataConnectivity(); 5354 } catch (RemoteException e) { 5355 Log.e(TAG, "Error calling ITelephony#enableDataConnectivity", e); 5356 } 5357 return false; 5358 } 5359 5360 /** @hide */ 5361 @SystemApi 5362 @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) 5363 public boolean disableDataConnectivity() { 5364 try { 5365 ITelephony telephony = getITelephony(); 5366 if (telephony != null) 5367 return telephony.disableDataConnectivity(); 5368 } catch (RemoteException e) { 5369 Log.e(TAG, "Error calling ITelephony#disableDataConnectivity", e); 5370 } 5371 return false; 5372 } 5373 5374 /** @hide */ 5375 @SystemApi 5376 public boolean isDataConnectivityPossible() { 5377 try { 5378 ITelephony telephony = getITelephony(); 5379 if (telephony != null) 5380 return telephony.isDataConnectivityPossible(); 5381 } catch (RemoteException e) { 5382 Log.e(TAG, "Error calling ITelephony#isDataConnectivityPossible", e); 5383 } 5384 return false; 5385 } 5386 5387 /** @hide */ 5388 @SystemApi 5389 public boolean needsOtaServiceProvisioning() { 5390 try { 5391 ITelephony telephony = getITelephony(); 5392 if (telephony != null) 5393 return telephony.needsOtaServiceProvisioning(); 5394 } catch (RemoteException e) { 5395 Log.e(TAG, "Error calling ITelephony#needsOtaServiceProvisioning", e); 5396 } 5397 return false; 5398 } 5399 5400 /** 5401 * Turns mobile data on or off. 5402 * If this object has been created with {@link #createForSubscriptionId}, applies to the given 5403 * subId. Otherwise, applies to {@link SubscriptionManager#getDefaultDataSubscriptionId()} 5404 * 5405 * <p>Requires Permission: 5406 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the 5407 * calling app has carrier privileges. 5408 * 5409 * @param enable Whether to enable mobile data. 5410 * 5411 * @see #hasCarrierPrivileges 5412 */ 5413 @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) 5414 public void setDataEnabled(boolean enable) { 5415 setDataEnabled(getSubId(SubscriptionManager.getDefaultDataSubscriptionId()), enable); 5416 } 5417 5418 /** @hide */ 5419 @SystemApi 5420 @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) 5421 public void setDataEnabled(int subId, boolean enable) { 5422 try { 5423 Log.d(TAG, "setDataEnabled: enabled=" + enable); 5424 ITelephony telephony = getITelephony(); 5425 if (telephony != null) 5426 telephony.setDataEnabled(subId, enable); 5427 } catch (RemoteException e) { 5428 Log.e(TAG, "Error calling ITelephony#setDataEnabled", e); 5429 } 5430 } 5431 5432 5433 /** 5434 * @deprecated use {@link #isDataEnabled()} instead. 5435 * @hide 5436 */ 5437 @SystemApi 5438 @Deprecated 5439 public boolean getDataEnabled() { 5440 return isDataEnabled(); 5441 } 5442 5443 /** 5444 * Returns whether mobile data is enabled or not. 5445 * 5446 * If this object has been created with {@link #createForSubscriptionId}, applies to the given 5447 * subId. Otherwise, applies to {@link SubscriptionManager#getDefaultDataSubscriptionId()} 5448 * 5449 * <p>Requires one of the following permissions: 5450 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE ACCESS_NETWORK_STATE}, 5451 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE}, or that the 5452 * calling app has carrier privileges. 5453 * 5454 * <p>Note that this does not take into account any data restrictions that may be present on the 5455 * calling app. Such restrictions may be inspected with 5456 * {@link ConnectivityManager#getRestrictBackgroundStatus}. 5457 * 5458 * @return true if mobile data is enabled. 5459 * 5460 * @see #hasCarrierPrivileges 5461 */ 5462 @SuppressWarnings("deprecation") 5463 public boolean isDataEnabled() { 5464 return getDataEnabled(getSubId(SubscriptionManager.getDefaultDataSubscriptionId())); 5465 } 5466 5467 /** 5468 * @deprecated use {@link #isDataEnabled(int)} instead. 5469 * @hide 5470 */ 5471 @SystemApi 5472 public boolean getDataEnabled(int subId) { 5473 boolean retVal = false; 5474 try { 5475 ITelephony telephony = getITelephony(); 5476 if (telephony != null) 5477 retVal = telephony.getDataEnabled(subId); 5478 } catch (RemoteException e) { 5479 Log.e(TAG, "Error calling ITelephony#getDataEnabled", e); 5480 } catch (NullPointerException e) { 5481 } 5482 return retVal; 5483 } 5484 5485 /** 5486 * Returns the result and response from RIL for oem request 5487 * 5488 * @param oemReq the data is sent to ril. 5489 * @param oemResp the respose data from RIL. 5490 * @return negative value request was not handled or get error 5491 * 0 request was handled succesfully, but no response data 5492 * positive value success, data length of response 5493 * @hide 5494 * @deprecated OEM needs a vendor-extension hal and their apps should use that instead 5495 */ 5496 @Deprecated 5497 public int invokeOemRilRequestRaw(byte[] oemReq, byte[] oemResp) { 5498 try { 5499 ITelephony telephony = getITelephony(); 5500 if (telephony != null) 5501 return telephony.invokeOemRilRequestRaw(oemReq, oemResp); 5502 } catch (RemoteException ex) { 5503 } catch (NullPointerException ex) { 5504 } 5505 return -1; 5506 } 5507 5508 /** @hide */ 5509 @SystemApi 5510 @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) 5511 public void enableVideoCalling(boolean enable) { 5512 try { 5513 ITelephony telephony = getITelephony(); 5514 if (telephony != null) 5515 telephony.enableVideoCalling(enable); 5516 } catch (RemoteException e) { 5517 Log.e(TAG, "Error calling ITelephony#enableVideoCalling", e); 5518 } 5519 } 5520 5521 /** @hide */ 5522 @SystemApi 5523 @RequiresPermission(anyOf = { 5524 android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, 5525 android.Manifest.permission.READ_PHONE_STATE 5526 }) 5527 public boolean isVideoCallingEnabled() { 5528 try { 5529 ITelephony telephony = getITelephony(); 5530 if (telephony != null) 5531 return telephony.isVideoCallingEnabled(getOpPackageName()); 5532 } catch (RemoteException e) { 5533 Log.e(TAG, "Error calling ITelephony#isVideoCallingEnabled", e); 5534 } 5535 return false; 5536 } 5537 5538 /** 5539 * Whether the device supports configuring the DTMF tone length. 5540 * 5541 * @return {@code true} if the DTMF tone length can be changed, and {@code false} otherwise. 5542 */ 5543 public boolean canChangeDtmfToneLength() { 5544 try { 5545 ITelephony telephony = getITelephony(); 5546 if (telephony != null) { 5547 return telephony.canChangeDtmfToneLength(); 5548 } 5549 } catch (RemoteException e) { 5550 Log.e(TAG, "Error calling ITelephony#canChangeDtmfToneLength", e); 5551 } catch (SecurityException e) { 5552 Log.e(TAG, "Permission error calling ITelephony#canChangeDtmfToneLength", e); 5553 } 5554 return false; 5555 } 5556 5557 /** 5558 * Whether the device is a world phone. 5559 * 5560 * @return {@code true} if the device is a world phone, and {@code false} otherwise. 5561 */ 5562 public boolean isWorldPhone() { 5563 try { 5564 ITelephony telephony = getITelephony(); 5565 if (telephony != null) { 5566 return telephony.isWorldPhone(); 5567 } 5568 } catch (RemoteException e) { 5569 Log.e(TAG, "Error calling ITelephony#isWorldPhone", e); 5570 } catch (SecurityException e) { 5571 Log.e(TAG, "Permission error calling ITelephony#isWorldPhone", e); 5572 } 5573 return false; 5574 } 5575 5576 /** 5577 * Whether the phone supports TTY mode. 5578 * 5579 * @return {@code true} if the device supports TTY mode, and {@code false} otherwise. 5580 */ 5581 public boolean isTtyModeSupported() { 5582 try { 5583 ITelephony telephony = getITelephony(); 5584 if (telephony != null) { 5585 return telephony.isTtyModeSupported(); 5586 } 5587 } catch (RemoteException e) { 5588 Log.e(TAG, "Error calling ITelephony#isTtyModeSupported", e); 5589 } catch (SecurityException e) { 5590 Log.e(TAG, "Permission error calling ITelephony#isTtyModeSupported", e); 5591 } 5592 return false; 5593 } 5594 5595 /** 5596 * Whether the phone supports hearing aid compatibility. 5597 * 5598 * @return {@code true} if the device supports hearing aid compatibility, and {@code false} 5599 * otherwise. 5600 */ 5601 public boolean isHearingAidCompatibilitySupported() { 5602 try { 5603 ITelephony telephony = getITelephony(); 5604 if (telephony != null) { 5605 return telephony.isHearingAidCompatibilitySupported(); 5606 } 5607 } catch (RemoteException e) { 5608 Log.e(TAG, "Error calling ITelephony#isHearingAidCompatibilitySupported", e); 5609 } catch (SecurityException e) { 5610 Log.e(TAG, "Permission error calling ITelephony#isHearingAidCompatibilitySupported", e); 5611 } 5612 return false; 5613 } 5614 5615 /** 5616 * This function retrieves value for setting "name+subId", and if that is not found 5617 * retrieves value for setting "name", and if that is not found throws 5618 * SettingNotFoundException 5619 * 5620 * @hide 5621 */ 5622 public static int getIntWithSubId(ContentResolver cr, String name, int subId) 5623 throws SettingNotFoundException { 5624 try { 5625 return Settings.Global.getInt(cr, name + subId); 5626 } catch (SettingNotFoundException e) { 5627 try { 5628 int val = Settings.Global.getInt(cr, name); 5629 Settings.Global.putInt(cr, name + subId, val); 5630 5631 /* We are now moving from 'setting' to 'setting+subId', and using the value stored 5632 * for 'setting' as default. Reset the default (since it may have a user set 5633 * value). */ 5634 int default_val = val; 5635 if (name.equals(Settings.Global.MOBILE_DATA)) { 5636 default_val = "true".equalsIgnoreCase( 5637 SystemProperties.get("ro.com.android.mobiledata", "true")) ? 1 : 0; 5638 } else if (name.equals(Settings.Global.DATA_ROAMING)) { 5639 default_val = "true".equalsIgnoreCase( 5640 SystemProperties.get("ro.com.android.dataroaming", "false")) ? 1 : 0; 5641 } 5642 5643 if (default_val != val) { 5644 Settings.Global.putInt(cr, name, default_val); 5645 } 5646 5647 return val; 5648 } catch (SettingNotFoundException exc) { 5649 throw new SettingNotFoundException(name); 5650 } 5651 } 5652 } 5653 5654 /** 5655 * Returns the IMS Registration Status 5656 * @hide 5657 */ 5658 public boolean isImsRegistered() { 5659 try { 5660 ITelephony telephony = getITelephony(); 5661 if (telephony == null) 5662 return false; 5663 return telephony.isImsRegistered(); 5664 } catch (RemoteException ex) { 5665 return false; 5666 } catch (NullPointerException ex) { 5667 return false; 5668 } 5669 } 5670 5671 /** 5672 * Returns the Status of Volte 5673 * @hide 5674 */ 5675 public boolean isVolteAvailable() { 5676 try { 5677 return getITelephony().isVolteAvailable(); 5678 } catch (RemoteException ex) { 5679 return false; 5680 } catch (NullPointerException ex) { 5681 return false; 5682 } 5683 } 5684 5685 /** 5686 * Returns the Status of video telephony (VT) 5687 * @hide 5688 */ 5689 public boolean isVideoTelephonyAvailable() { 5690 try { 5691 return getITelephony().isVideoTelephonyAvailable(); 5692 } catch (RemoteException ex) { 5693 return false; 5694 } catch (NullPointerException ex) { 5695 return false; 5696 } 5697 } 5698 5699 /** 5700 * Returns the Status of Wi-Fi Calling 5701 * @hide 5702 */ 5703 public boolean isWifiCallingAvailable() { 5704 try { 5705 return getITelephony().isWifiCallingAvailable(); 5706 } catch (RemoteException ex) { 5707 return false; 5708 } catch (NullPointerException ex) { 5709 return false; 5710 } 5711 } 5712 5713 /** 5714 * Set TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC for the default phone. 5715 * 5716 * @hide 5717 */ 5718 public void setSimOperatorNumeric(String numeric) { 5719 int phoneId = getPhoneId(); 5720 setSimOperatorNumericForPhone(phoneId, numeric); 5721 } 5722 5723 /** 5724 * Set TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC for the given phone. 5725 * 5726 * @hide 5727 */ 5728 public void setSimOperatorNumericForPhone(int phoneId, String numeric) { 5729 setTelephonyProperty(phoneId, 5730 TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC, numeric); 5731 } 5732 5733 /** 5734 * Set TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC for the default phone. 5735 * 5736 * @hide 5737 */ 5738 public void setSimOperatorName(String name) { 5739 int phoneId = getPhoneId(); 5740 setSimOperatorNameForPhone(phoneId, name); 5741 } 5742 5743 /** 5744 * Set TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC for the given phone. 5745 * 5746 * @hide 5747 */ 5748 public void setSimOperatorNameForPhone(int phoneId, String name) { 5749 setTelephonyProperty(phoneId, 5750 TelephonyProperties.PROPERTY_ICC_OPERATOR_ALPHA, name); 5751 } 5752 5753 /** 5754 * Set TelephonyProperties.PROPERTY_ICC_OPERATOR_ISO_COUNTRY for the default phone. 5755 * 5756 * @hide 5757 */ 5758 public void setSimCountryIso(String iso) { 5759 int phoneId = getPhoneId(); 5760 setSimCountryIsoForPhone(phoneId, iso); 5761 } 5762 5763 /** 5764 * Set TelephonyProperties.PROPERTY_ICC_OPERATOR_ISO_COUNTRY for the given phone. 5765 * 5766 * @hide 5767 */ 5768 public void setSimCountryIsoForPhone(int phoneId, String iso) { 5769 setTelephonyProperty(phoneId, 5770 TelephonyProperties.PROPERTY_ICC_OPERATOR_ISO_COUNTRY, iso); 5771 } 5772 5773 /** 5774 * Set TelephonyProperties.PROPERTY_SIM_STATE for the default phone. 5775 * 5776 * @hide 5777 */ 5778 public void setSimState(String state) { 5779 int phoneId = getPhoneId(); 5780 setSimStateForPhone(phoneId, state); 5781 } 5782 5783 /** 5784 * Set TelephonyProperties.PROPERTY_SIM_STATE for the given phone. 5785 * 5786 * @hide 5787 */ 5788 public void setSimStateForPhone(int phoneId, String state) { 5789 setTelephonyProperty(phoneId, 5790 TelephonyProperties.PROPERTY_SIM_STATE, state); 5791 } 5792 5793 /** 5794 * Set SIM card power state. Request is equivalent to inserting or removing the card. 5795 * 5796 * @param powerUp True if powering up the SIM, otherwise powering down 5797 * 5798 * <p>Requires Permission: 5799 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 5800 * 5801 * @hide 5802 **/ 5803 public void setSimPowerState(boolean powerUp) { 5804 setSimPowerStateForSlot(getSlotIndex(), powerUp); 5805 } 5806 5807 /** 5808 * Set SIM card power state. Request is equivalent to inserting or removing the card. 5809 * 5810 * @param slotIndex SIM slot id 5811 * @param powerUp True if powering up the SIM, otherwise powering down 5812 * 5813 * <p>Requires Permission: 5814 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 5815 * 5816 * @hide 5817 **/ 5818 public void setSimPowerStateForSlot(int slotIndex, boolean powerUp) { 5819 try { 5820 ITelephony telephony = getITelephony(); 5821 if (telephony != null) { 5822 telephony.setSimPowerStateForSlot(slotIndex, powerUp); 5823 } 5824 } catch (RemoteException e) { 5825 Log.e(TAG, "Error calling ITelephony#setSimPowerStateForSlot", e); 5826 } catch (SecurityException e) { 5827 Log.e(TAG, "Permission error calling ITelephony#setSimPowerStateForSlot", e); 5828 } 5829 } 5830 5831 /** 5832 * Set baseband version for the default phone. 5833 * 5834 * @param version baseband version 5835 * @hide 5836 */ 5837 public void setBasebandVersion(String version) { 5838 int phoneId = getPhoneId(); 5839 setBasebandVersionForPhone(phoneId, version); 5840 } 5841 5842 /** 5843 * Set baseband version by phone id. 5844 * 5845 * @param phoneId for which baseband version is set 5846 * @param version baseband version 5847 * @hide 5848 */ 5849 public void setBasebandVersionForPhone(int phoneId, String version) { 5850 if (SubscriptionManager.isValidPhoneId(phoneId)) { 5851 String prop = TelephonyProperties.PROPERTY_BASEBAND_VERSION + 5852 ((phoneId == 0) ? "" : Integer.toString(phoneId)); 5853 SystemProperties.set(prop, version); 5854 } 5855 } 5856 5857 /** 5858 * Set phone type for the default phone. 5859 * 5860 * @param type phone type 5861 * 5862 * @hide 5863 */ 5864 public void setPhoneType(int type) { 5865 int phoneId = getPhoneId(); 5866 setPhoneType(phoneId, type); 5867 } 5868 5869 /** 5870 * Set phone type by phone id. 5871 * 5872 * @param phoneId for which phone type is set 5873 * @param type phone type 5874 * 5875 * @hide 5876 */ 5877 public void setPhoneType(int phoneId, int type) { 5878 if (SubscriptionManager.isValidPhoneId(phoneId)) { 5879 TelephonyManager.setTelephonyProperty(phoneId, 5880 TelephonyProperties.CURRENT_ACTIVE_PHONE, String.valueOf(type)); 5881 } 5882 } 5883 5884 /** 5885 * Get OTASP number schema for the default phone. 5886 * 5887 * @param defaultValue default value 5888 * @return OTA SP number schema 5889 * 5890 * @hide 5891 */ 5892 public String getOtaSpNumberSchema(String defaultValue) { 5893 int phoneId = getPhoneId(); 5894 return getOtaSpNumberSchemaForPhone(phoneId, defaultValue); 5895 } 5896 5897 /** 5898 * Get OTASP number schema by phone id. 5899 * 5900 * @param phoneId for which OTA SP number schema is get 5901 * @param defaultValue default value 5902 * @return OTA SP number schema 5903 * 5904 * @hide 5905 */ 5906 public String getOtaSpNumberSchemaForPhone(int phoneId, String defaultValue) { 5907 if (SubscriptionManager.isValidPhoneId(phoneId)) { 5908 return TelephonyManager.getTelephonyProperty(phoneId, 5909 TelephonyProperties.PROPERTY_OTASP_NUM_SCHEMA, defaultValue); 5910 } 5911 5912 return defaultValue; 5913 } 5914 5915 /** 5916 * Get SMS receive capable from system property for the default phone. 5917 * 5918 * @param defaultValue default value 5919 * @return SMS receive capable 5920 * 5921 * @hide 5922 */ 5923 public boolean getSmsReceiveCapable(boolean defaultValue) { 5924 int phoneId = getPhoneId(); 5925 return getSmsReceiveCapableForPhone(phoneId, defaultValue); 5926 } 5927 5928 /** 5929 * Get SMS receive capable from system property by phone id. 5930 * 5931 * @param phoneId for which SMS receive capable is get 5932 * @param defaultValue default value 5933 * @return SMS receive capable 5934 * 5935 * @hide 5936 */ 5937 public boolean getSmsReceiveCapableForPhone(int phoneId, boolean defaultValue) { 5938 if (SubscriptionManager.isValidPhoneId(phoneId)) { 5939 return Boolean.parseBoolean(TelephonyManager.getTelephonyProperty(phoneId, 5940 TelephonyProperties.PROPERTY_SMS_RECEIVE, String.valueOf(defaultValue))); 5941 } 5942 5943 return defaultValue; 5944 } 5945 5946 /** 5947 * Get SMS send capable from system property for the default phone. 5948 * 5949 * @param defaultValue default value 5950 * @return SMS send capable 5951 * 5952 * @hide 5953 */ 5954 public boolean getSmsSendCapable(boolean defaultValue) { 5955 int phoneId = getPhoneId(); 5956 return getSmsSendCapableForPhone(phoneId, defaultValue); 5957 } 5958 5959 /** 5960 * Get SMS send capable from system property by phone id. 5961 * 5962 * @param phoneId for which SMS send capable is get 5963 * @param defaultValue default value 5964 * @return SMS send capable 5965 * 5966 * @hide 5967 */ 5968 public boolean getSmsSendCapableForPhone(int phoneId, boolean defaultValue) { 5969 if (SubscriptionManager.isValidPhoneId(phoneId)) { 5970 return Boolean.parseBoolean(TelephonyManager.getTelephonyProperty(phoneId, 5971 TelephonyProperties.PROPERTY_SMS_SEND, String.valueOf(defaultValue))); 5972 } 5973 5974 return defaultValue; 5975 } 5976 5977 /** 5978 * Set the alphabetic name of current registered operator. 5979 * @param name the alphabetic name of current registered operator. 5980 * @hide 5981 */ 5982 public void setNetworkOperatorName(String name) { 5983 int phoneId = getPhoneId(); 5984 setNetworkOperatorNameForPhone(phoneId, name); 5985 } 5986 5987 /** 5988 * Set the alphabetic name of current registered operator. 5989 * @param phoneId which phone you want to set 5990 * @param name the alphabetic name of current registered operator. 5991 * @hide 5992 */ 5993 public void setNetworkOperatorNameForPhone(int phoneId, String name) { 5994 if (SubscriptionManager.isValidPhoneId(phoneId)) { 5995 setTelephonyProperty(phoneId, TelephonyProperties.PROPERTY_OPERATOR_ALPHA, name); 5996 } 5997 } 5998 5999 /** 6000 * Set the numeric name (MCC+MNC) of current registered operator. 6001 * @param operator the numeric name (MCC+MNC) of current registered operator 6002 * @hide 6003 */ 6004 public void setNetworkOperatorNumeric(String numeric) { 6005 int phoneId = getPhoneId(); 6006 setNetworkOperatorNumericForPhone(phoneId, numeric); 6007 } 6008 6009 /** 6010 * Set the numeric name (MCC+MNC) of current registered operator. 6011 * @param phoneId for which phone type is set 6012 * @param operator the numeric name (MCC+MNC) of current registered operator 6013 * @hide 6014 */ 6015 public void setNetworkOperatorNumericForPhone(int phoneId, String numeric) { 6016 setTelephonyProperty(phoneId, TelephonyProperties.PROPERTY_OPERATOR_NUMERIC, numeric); 6017 } 6018 6019 /** 6020 * Set roaming state of the current network, for GSM purposes. 6021 * @param isRoaming is network in romaing state or not 6022 * @hide 6023 */ 6024 public void setNetworkRoaming(boolean isRoaming) { 6025 int phoneId = getPhoneId(); 6026 setNetworkRoamingForPhone(phoneId, isRoaming); 6027 } 6028 6029 /** 6030 * Set roaming state of the current network, for GSM purposes. 6031 * @param phoneId which phone you want to set 6032 * @param isRoaming is network in romaing state or not 6033 * @hide 6034 */ 6035 public void setNetworkRoamingForPhone(int phoneId, boolean isRoaming) { 6036 if (SubscriptionManager.isValidPhoneId(phoneId)) { 6037 setTelephonyProperty(phoneId, TelephonyProperties.PROPERTY_OPERATOR_ISROAMING, 6038 isRoaming ? "true" : "false"); 6039 } 6040 } 6041 6042 /** 6043 * Set the ISO country code equivalent of the current registered 6044 * operator's MCC (Mobile Country Code). 6045 * @param iso the ISO country code equivalent of the current registered 6046 * @hide 6047 */ 6048 public void setNetworkCountryIso(String iso) { 6049 int phoneId = getPhoneId(); 6050 setNetworkCountryIsoForPhone(phoneId, iso); 6051 } 6052 6053 /** 6054 * Set the ISO country code equivalent of the current registered 6055 * operator's MCC (Mobile Country Code). 6056 * @param phoneId which phone you want to set 6057 * @param iso the ISO country code equivalent of the current registered 6058 * @hide 6059 */ 6060 public void setNetworkCountryIsoForPhone(int phoneId, String iso) { 6061 if (SubscriptionManager.isValidPhoneId(phoneId)) { 6062 setTelephonyProperty(phoneId, 6063 TelephonyProperties.PROPERTY_OPERATOR_ISO_COUNTRY, iso); 6064 } 6065 } 6066 6067 /** 6068 * Set the network type currently in use on the device for data transmission. 6069 * 6070 * If this object has been created with {@link #createForSubscriptionId}, applies to the 6071 * phoneId associated with the given subId. Otherwise, applies to the phoneId associated with 6072 * {@link SubscriptionManager#getDefaultDataSubscriptionId()} 6073 * @param type the network type currently in use on the device for data transmission 6074 * @hide 6075 */ 6076 public void setDataNetworkType(int type) { 6077 int phoneId = getPhoneId(SubscriptionManager.getDefaultDataSubscriptionId()); 6078 setDataNetworkTypeForPhone(phoneId, type); 6079 } 6080 6081 /** 6082 * Set the network type currently in use on the device for data transmission. 6083 * @param phoneId which phone you want to set 6084 * @param type the network type currently in use on the device for data transmission 6085 * @hide 6086 */ 6087 public void setDataNetworkTypeForPhone(int phoneId, int type) { 6088 if (SubscriptionManager.isValidPhoneId(phoneId)) { 6089 setTelephonyProperty(phoneId, 6090 TelephonyProperties.PROPERTY_DATA_NETWORK_TYPE, 6091 ServiceState.rilRadioTechnologyToString(type)); 6092 } 6093 } 6094 6095 /** 6096 * Returns the subscription ID for the given phone account. 6097 * @hide 6098 */ 6099 public int getSubIdForPhoneAccount(PhoneAccount phoneAccount) { 6100 int retval = SubscriptionManager.INVALID_SUBSCRIPTION_ID; 6101 try { 6102 ITelephony service = getITelephony(); 6103 if (service != null) { 6104 retval = service.getSubIdForPhoneAccount(phoneAccount); 6105 } 6106 } catch (RemoteException e) { 6107 } 6108 6109 return retval; 6110 } 6111 6112 private int getSubIdForPhoneAccountHandle(PhoneAccountHandle phoneAccountHandle) { 6113 int retval = SubscriptionManager.INVALID_SUBSCRIPTION_ID; 6114 try { 6115 ITelecomService service = getTelecomService(); 6116 if (service != null) { 6117 retval = getSubIdForPhoneAccount(service.getPhoneAccount(phoneAccountHandle)); 6118 } 6119 } catch (RemoteException e) { 6120 } 6121 6122 return retval; 6123 } 6124 6125 /** 6126 * Resets telephony manager settings back to factory defaults. 6127 * 6128 * @hide 6129 */ 6130 public void factoryReset(int subId) { 6131 try { 6132 Log.d(TAG, "factoryReset: subId=" + subId); 6133 ITelephony telephony = getITelephony(); 6134 if (telephony != null) 6135 telephony.factoryReset(subId); 6136 } catch (RemoteException e) { 6137 } 6138 } 6139 6140 6141 /** @hide */ 6142 public String getLocaleFromDefaultSim() { 6143 try { 6144 final ITelephony telephony = getITelephony(); 6145 if (telephony != null) { 6146 return telephony.getLocaleFromDefaultSim(); 6147 } 6148 } catch (RemoteException ex) { 6149 } 6150 return null; 6151 } 6152 6153 /** 6154 * Requests the modem activity info. The recipient will place the result 6155 * in `result`. 6156 * @param result The object on which the recipient will send the resulting 6157 * {@link android.telephony.ModemActivityInfo} object. 6158 * @hide 6159 */ 6160 public void requestModemActivityInfo(ResultReceiver result) { 6161 try { 6162 ITelephony service = getITelephony(); 6163 if (service != null) { 6164 service.requestModemActivityInfo(result); 6165 return; 6166 } 6167 } catch (RemoteException e) { 6168 Log.e(TAG, "Error calling ITelephony#getModemActivityInfo", e); 6169 } 6170 result.send(0, null); 6171 } 6172 6173 /** 6174 * Returns the current {@link ServiceState} information. 6175 */ 6176 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) 6177 public ServiceState getServiceState() { 6178 return getServiceStateForSubscriber(getSubId()); 6179 } 6180 6181 /** 6182 * Returns the service state information on specified subscription. Callers require 6183 * either READ_PRIVILEGED_PHONE_STATE or READ_PHONE_STATE to retrieve the information. 6184 * @hide 6185 */ 6186 public ServiceState getServiceStateForSubscriber(int subId) { 6187 try { 6188 ITelephony service = getITelephony(); 6189 if (service != null) { 6190 return service.getServiceStateForSubscriber(subId, getOpPackageName()); 6191 } 6192 } catch (RemoteException e) { 6193 Log.e(TAG, "Error calling ITelephony#getServiceStateForSubscriber", e); 6194 } 6195 return null; 6196 } 6197 6198 /** 6199 * Returns the URI for the per-account voicemail ringtone set in Phone settings. 6200 * 6201 * @param accountHandle The handle for the {@link PhoneAccount} for which to retrieve the 6202 * voicemail ringtone. 6203 * @return The URI for the ringtone to play when receiving a voicemail from a specific 6204 * PhoneAccount. 6205 */ 6206 public Uri getVoicemailRingtoneUri(PhoneAccountHandle accountHandle) { 6207 try { 6208 ITelephony service = getITelephony(); 6209 if (service != null) { 6210 return service.getVoicemailRingtoneUri(accountHandle); 6211 } 6212 } catch (RemoteException e) { 6213 Log.e(TAG, "Error calling ITelephony#getVoicemailRingtoneUri", e); 6214 } 6215 return null; 6216 } 6217 6218 /** 6219 * Sets the per-account voicemail ringtone. 6220 * 6221 * <p>Requires that the calling app is the default dialer, or has carrier privileges, or has 6222 * permission {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE}. 6223 * 6224 * @param phoneAccountHandle The handle for the {@link PhoneAccount} for which to set the 6225 * voicemail ringtone. 6226 * @param uri The URI for the ringtone to play when receiving a voicemail from a specific 6227 * PhoneAccount. 6228 * @see #hasCarrierPrivileges 6229 */ 6230 public void setVoicemailRingtoneUri(PhoneAccountHandle phoneAccountHandle, Uri uri) { 6231 try { 6232 ITelephony service = getITelephony(); 6233 if (service != null) { 6234 service.setVoicemailRingtoneUri(getOpPackageName(), phoneAccountHandle, uri); 6235 } 6236 } catch (RemoteException e) { 6237 Log.e(TAG, "Error calling ITelephony#setVoicemailRingtoneUri", e); 6238 } 6239 } 6240 6241 /** 6242 * Returns whether vibration is set for voicemail notification in Phone settings. 6243 * 6244 * @param accountHandle The handle for the {@link PhoneAccount} for which to retrieve the 6245 * voicemail vibration setting. 6246 * @return {@code true} if the vibration is set for this PhoneAccount, {@code false} otherwise. 6247 */ 6248 public boolean isVoicemailVibrationEnabled(PhoneAccountHandle accountHandle) { 6249 try { 6250 ITelephony service = getITelephony(); 6251 if (service != null) { 6252 return service.isVoicemailVibrationEnabled(accountHandle); 6253 } 6254 } catch (RemoteException e) { 6255 Log.e(TAG, "Error calling ITelephony#isVoicemailVibrationEnabled", e); 6256 } 6257 return false; 6258 } 6259 6260 /** 6261 * Sets the per-account preference whether vibration is enabled for voicemail notifications. 6262 * 6263 * <p>Requires that the calling app is the default dialer, or has carrier privileges, or has 6264 * permission {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE}. 6265 * 6266 * @param phoneAccountHandle The handle for the {@link PhoneAccount} for which to set the 6267 * voicemail vibration setting. 6268 * @param enabled Whether to enable or disable vibration for voicemail notifications from a 6269 * specific PhoneAccount. 6270 * @see #hasCarrierPrivileges 6271 */ 6272 public void setVoicemailVibrationEnabled(PhoneAccountHandle phoneAccountHandle, 6273 boolean enabled) { 6274 try { 6275 ITelephony service = getITelephony(); 6276 if (service != null) { 6277 service.setVoicemailVibrationEnabled(getOpPackageName(), phoneAccountHandle, 6278 enabled); 6279 } 6280 } catch (RemoteException e) { 6281 Log.e(TAG, "Error calling ITelephony#isVoicemailVibrationEnabled", e); 6282 } 6283 } 6284 6285 /** 6286 * Return the application ID for the app type like {@link APPTYPE_CSIM}. 6287 * 6288 * Requires that the calling app has READ_PRIVILEGED_PHONE_STATE permission 6289 * 6290 * @param appType the uicc app type like {@link APPTYPE_CSIM} 6291 * @return Application ID for specificied app type or null if no uicc or error. 6292 * @hide 6293 */ 6294 public String getAidForAppType(int appType) { 6295 return getAidForAppType(getSubId(), appType); 6296 } 6297 6298 /** 6299 * Return the application ID for the app type like {@link APPTYPE_CSIM}. 6300 * 6301 * Requires that the calling app has READ_PRIVILEGED_PHONE_STATE permission 6302 * 6303 * @param subId the subscription ID that this request applies to. 6304 * @param appType the uicc app type, like {@link APPTYPE_CSIM} 6305 * @return Application ID for specificied app type or null if no uicc or error. 6306 * @hide 6307 */ 6308 public String getAidForAppType(int subId, int appType) { 6309 try { 6310 ITelephony service = getITelephony(); 6311 if (service != null) { 6312 return service.getAidForAppType(subId, appType); 6313 } 6314 } catch (RemoteException e) { 6315 Log.e(TAG, "Error calling ITelephony#getAidForAppType", e); 6316 } 6317 return null; 6318 } 6319 6320 /** 6321 * Return the Electronic Serial Number. 6322 * 6323 * Requires that the calling app has READ_PRIVILEGED_PHONE_STATE permission 6324 * 6325 * @return ESN or null if error. 6326 * @hide 6327 */ 6328 public String getEsn() { 6329 return getEsn(getSubId()); 6330 } 6331 6332 /** 6333 * Return the Electronic Serial Number. 6334 * 6335 * Requires that the calling app has READ_PRIVILEGED_PHONE_STATE permission 6336 * 6337 * @param subId the subscription ID that this request applies to. 6338 * @return ESN or null if error. 6339 * @hide 6340 */ 6341 public String getEsn(int subId) { 6342 try { 6343 ITelephony service = getITelephony(); 6344 if (service != null) { 6345 return service.getEsn(subId); 6346 } 6347 } catch (RemoteException e) { 6348 Log.e(TAG, "Error calling ITelephony#getEsn", e); 6349 } 6350 return null; 6351 } 6352 6353 /** 6354 * Return the Preferred Roaming List Version 6355 * 6356 * Requires that the calling app has READ_PRIVILEGED_PHONE_STATE permission 6357 * 6358 * @return PRLVersion or null if error. 6359 * @hide 6360 */ 6361 public String getCdmaPrlVersion() { 6362 return getCdmaPrlVersion(getSubId()); 6363 } 6364 6365 /** 6366 * Return the Preferred Roaming List Version 6367 * 6368 * Requires that the calling app has READ_PRIVILEGED_PHONE_STATE permission 6369 * 6370 * @param subId the subscription ID that this request applies to. 6371 * @return PRLVersion or null if error. 6372 * @hide 6373 */ 6374 public String getCdmaPrlVersion(int subId) { 6375 try { 6376 ITelephony service = getITelephony(); 6377 if (service != null) { 6378 return service.getCdmaPrlVersion(subId); 6379 } 6380 } catch (RemoteException e) { 6381 Log.e(TAG, "Error calling ITelephony#getCdmaPrlVersion", e); 6382 } 6383 return null; 6384 } 6385 6386 /** 6387 * Get snapshot of Telephony histograms 6388 * @return List of Telephony histograms 6389 * Requires Permission: 6390 * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} 6391 * Or the calling app has carrier privileges. 6392 * @hide 6393 */ 6394 @SystemApi 6395 @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) 6396 public List<TelephonyHistogram> getTelephonyHistograms() { 6397 try { 6398 ITelephony service = getITelephony(); 6399 if (service != null) { 6400 return service.getTelephonyHistograms(); 6401 } 6402 } catch (RemoteException e) { 6403 Log.e(TAG, "Error calling ITelephony#getTelephonyHistograms", e); 6404 } 6405 return null; 6406 } 6407 6408 /** 6409 * Set the allowed carrier list for slotIndex 6410 * Require system privileges. In the future we may add this to carrier APIs. 6411 * 6412 * <p>Requires Permission: 6413 * {@link android.Manifest.permission#MODIFY_PHONE_STATE} 6414 * 6415 * <p>This method works only on devices with {@link 6416 * android.content.pm.PackageManager#FEATURE_TELEPHONY_CARRIERLOCK} enabled. 6417 * 6418 * @return The number of carriers set successfully. Should be length of 6419 * carrierList on success; -1 if carrierList null or on error. 6420 * @hide 6421 */ 6422 @SystemApi 6423 @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) 6424 public int setAllowedCarriers(int slotIndex, List<CarrierIdentifier> carriers) { 6425 try { 6426 ITelephony service = getITelephony(); 6427 if (service != null) { 6428 return service.setAllowedCarriers(slotIndex, carriers); 6429 } 6430 } catch (RemoteException e) { 6431 Log.e(TAG, "Error calling ITelephony#setAllowedCarriers", e); 6432 } catch (NullPointerException e) { 6433 Log.e(TAG, "Error calling ITelephony#setAllowedCarriers", e); 6434 } 6435 return -1; 6436 } 6437 6438 /** 6439 * Get the allowed carrier list for slotIndex. 6440 * Require system privileges. In the future we may add this to carrier APIs. 6441 * 6442 * <p>This method returns valid data on devices with {@link 6443 * android.content.pm.PackageManager#FEATURE_TELEPHONY_CARRIERLOCK} enabled. 6444 * 6445 * @return List of {@link android.telephony.CarrierIdentifier}; empty list 6446 * means all carriers are allowed. 6447 * @hide 6448 */ 6449 @SystemApi 6450 @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) 6451 public List<CarrierIdentifier> getAllowedCarriers(int slotIndex) { 6452 try { 6453 ITelephony service = getITelephony(); 6454 if (service != null) { 6455 return service.getAllowedCarriers(slotIndex); 6456 } 6457 } catch (RemoteException e) { 6458 Log.e(TAG, "Error calling ITelephony#getAllowedCarriers", e); 6459 } catch (NullPointerException e) { 6460 Log.e(TAG, "Error calling ITelephony#setAllowedCarriers", e); 6461 } 6462 return new ArrayList<CarrierIdentifier>(0); 6463 } 6464 6465 /** 6466 * Action set from carrier signalling broadcast receivers to enable/disable metered apns 6467 * Permissions android.Manifest.permission.MODIFY_PHONE_STATE is required 6468 * @param subId the subscription ID that this action applies to. 6469 * @param enabled control enable or disable metered apns. 6470 * @hide 6471 */ 6472 public void carrierActionSetMeteredApnsEnabled(int subId, boolean enabled) { 6473 try { 6474 ITelephony service = getITelephony(); 6475 if (service != null) { 6476 service.carrierActionSetMeteredApnsEnabled(subId, enabled); 6477 } 6478 } catch (RemoteException e) { 6479 Log.e(TAG, "Error calling ITelephony#carrierActionSetMeteredApnsEnabled", e); 6480 } 6481 } 6482 6483 /** 6484 * Action set from carrier signalling broadcast receivers to enable/disable radio 6485 * Permissions android.Manifest.permission.MODIFY_PHONE_STATE is required 6486 * @param subId the subscription ID that this action applies to. 6487 * @param enabled control enable or disable radio. 6488 * @hide 6489 */ 6490 public void carrierActionSetRadioEnabled(int subId, boolean enabled) { 6491 try { 6492 ITelephony service = getITelephony(); 6493 if (service != null) { 6494 service.carrierActionSetRadioEnabled(subId, enabled); 6495 } 6496 } catch (RemoteException e) { 6497 Log.e(TAG, "Error calling ITelephony#carrierActionSetRadioEnabled", e); 6498 } 6499 } 6500 6501 /** 6502 * Get aggregated video call data usage since boot. 6503 * Permissions android.Manifest.permission.READ_NETWORK_USAGE_HISTORY is required. 6504 * @return total data usage in bytes 6505 * @hide 6506 */ 6507 public long getVtDataUsage() { 6508 6509 try { 6510 ITelephony service = getITelephony(); 6511 if (service != null) { 6512 return service.getVtDataUsage(); 6513 } 6514 } catch (RemoteException e) { 6515 Log.e(TAG, "Error calling getVtDataUsage", e); 6516 } 6517 return 0; 6518 } 6519 6520 /** 6521 * Policy control of data connection. Usually used when data limit is passed. 6522 * @param enabled True if enabling the data, otherwise disabling. 6523 * @param subId sub id 6524 * @hide 6525 */ 6526 public void setPolicyDataEnabled(boolean enabled, int subId) { 6527 try { 6528 ITelephony service = getITelephony(); 6529 if (service != null) { 6530 service.setPolicyDataEnabled(enabled, subId); 6531 } 6532 } catch (RemoteException e) { 6533 Log.e(TAG, "Error calling ITelephony#setPolicyDataEnabled", e); 6534 } 6535 } 6536 6537 /** 6538 * Get Client request stats which will contain statistical information 6539 * on each request made by client. 6540 * Callers require either READ_PRIVILEGED_PHONE_STATE or 6541 * READ_PHONE_STATE to retrieve the information. 6542 * @param subId sub id 6543 * @return List of Client Request Stats 6544 * @hide 6545 */ 6546 public List<ClientRequestStats> getClientRequestStats(int subId) { 6547 try { 6548 ITelephony service = getITelephony(); 6549 if (service != null) { 6550 return service.getClientRequestStats(getOpPackageName(), subId); 6551 } 6552 } catch (RemoteException e) { 6553 Log.e(TAG, "Error calling ITelephony#getClientRequestStats", e); 6554 } 6555 6556 return null; 6557 } 6558 6559 /** 6560 * Check if phone is in emergency callback mode 6561 * @return true if phone is in emergency callback mode 6562 * @hide 6563 */ 6564 public boolean getEmergencyCallbackMode() { 6565 return getEmergencyCallbackMode(getSubId()); 6566 } 6567 6568 /** 6569 * Check if phone is in emergency callback mode 6570 * @return true if phone is in emergency callback mode 6571 * @param subId the subscription ID that this action applies to. 6572 * @hide 6573 */ 6574 public boolean getEmergencyCallbackMode(int subId) { 6575 try { 6576 ITelephony telephony = getITelephony(); 6577 if (telephony == null) { 6578 return false; 6579 } 6580 return telephony.getEmergencyCallbackMode(subId); 6581 } catch (RemoteException e) { 6582 Log.e(TAG, "Error calling ITelephony#getEmergencyCallbackMode", e); 6583 } 6584 return false; 6585 } 6586 } 6587 6588