ConnectivityManager.java revision 6a2d32597a3f158f4ff5b07ad61c7d892d08f3bf
1/* 2 * Copyright (C) 2008 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package android.net; 18 19import static com.android.internal.util.Preconditions.checkNotNull; 20 21import android.annotation.SdkConstant; 22import android.annotation.SdkConstant.SdkConstantType; 23import android.content.Context; 24import android.os.Binder; 25import android.os.Build.VERSION_CODES; 26import android.os.Messenger; 27import android.os.RemoteException; 28import android.os.ResultReceiver; 29import android.provider.Settings; 30 31import java.net.InetAddress; 32 33/** 34 * Class that answers queries about the state of network connectivity. It also 35 * notifies applications when network connectivity changes. Get an instance 36 * of this class by calling 37 * {@link android.content.Context#getSystemService(String) Context.getSystemService(Context.CONNECTIVITY_SERVICE)}. 38 * <p> 39 * The primary responsibilities of this class are to: 40 * <ol> 41 * <li>Monitor network connections (Wi-Fi, GPRS, UMTS, etc.)</li> 42 * <li>Send broadcast intents when network connectivity changes</li> 43 * <li>Attempt to "fail over" to another network when connectivity to a network 44 * is lost</li> 45 * <li>Provide an API that allows applications to query the coarse-grained or fine-grained 46 * state of the available networks</li> 47 * </ol> 48 */ 49public class ConnectivityManager { 50 private static final String TAG = "ConnectivityManager"; 51 52 /** 53 * A change in network connectivity has occurred. A connection has either 54 * been established or lost. The NetworkInfo for the affected network is 55 * sent as an extra; it should be consulted to see what kind of 56 * connectivity event occurred. 57 * <p/> 58 * If this is a connection that was the result of failing over from a 59 * disconnected network, then the FAILOVER_CONNECTION boolean extra is 60 * set to true. 61 * <p/> 62 * For a loss of connectivity, if the connectivity manager is attempting 63 * to connect (or has already connected) to another network, the 64 * NetworkInfo for the new network is also passed as an extra. This lets 65 * any receivers of the broadcast know that they should not necessarily 66 * tell the user that no data traffic will be possible. Instead, the 67 * receiver should expect another broadcast soon, indicating either that 68 * the failover attempt succeeded (and so there is still overall data 69 * connectivity), or that the failover attempt failed, meaning that all 70 * connectivity has been lost. 71 * <p/> 72 * For a disconnect event, the boolean extra EXTRA_NO_CONNECTIVITY 73 * is set to {@code true} if there are no connected networks at all. 74 */ 75 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 76 public static final String CONNECTIVITY_ACTION = "android.net.conn.CONNECTIVITY_CHANGE"; 77 78 /** 79 * Identical to {@link #CONNECTIVITY_ACTION} broadcast, but sent without any 80 * applicable {@link Settings.Secure#CONNECTIVITY_CHANGE_DELAY}. 81 * 82 * @hide 83 */ 84 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 85 public static final String CONNECTIVITY_ACTION_IMMEDIATE = 86 "android.net.conn.CONNECTIVITY_CHANGE_IMMEDIATE"; 87 88 /** 89 * The lookup key for a {@link NetworkInfo} object. Retrieve with 90 * {@link android.content.Intent#getParcelableExtra(String)}. 91 * 92 * @deprecated Since {@link NetworkInfo} can vary based on UID, applications 93 * should always obtain network information through 94 * {@link #getActiveNetworkInfo()} or 95 * {@link #getAllNetworkInfo()}. 96 * @see #EXTRA_NETWORK_TYPE 97 */ 98 @Deprecated 99 public static final String EXTRA_NETWORK_INFO = "networkInfo"; 100 101 /** 102 * Network type which triggered a {@link #CONNECTIVITY_ACTION} broadcast. 103 * Can be used with {@link #getNetworkInfo(int)} to get {@link NetworkInfo} 104 * state based on the calling application. 105 * 106 * @see android.content.Intent#getIntExtra(String, int) 107 */ 108 public static final String EXTRA_NETWORK_TYPE = "networkType"; 109 110 /** 111 * The lookup key for a boolean that indicates whether a connect event 112 * is for a network to which the connectivity manager was failing over 113 * following a disconnect on another network. 114 * Retrieve it with {@link android.content.Intent#getBooleanExtra(String,boolean)}. 115 */ 116 public static final String EXTRA_IS_FAILOVER = "isFailover"; 117 /** 118 * The lookup key for a {@link NetworkInfo} object. This is supplied when 119 * there is another network that it may be possible to connect to. Retrieve with 120 * {@link android.content.Intent#getParcelableExtra(String)}. 121 */ 122 public static final String EXTRA_OTHER_NETWORK_INFO = "otherNetwork"; 123 /** 124 * The lookup key for a boolean that indicates whether there is a 125 * complete lack of connectivity, i.e., no network is available. 126 * Retrieve it with {@link android.content.Intent#getBooleanExtra(String,boolean)}. 127 */ 128 public static final String EXTRA_NO_CONNECTIVITY = "noConnectivity"; 129 /** 130 * The lookup key for a string that indicates why an attempt to connect 131 * to a network failed. The string has no particular structure. It is 132 * intended to be used in notifications presented to users. Retrieve 133 * it with {@link android.content.Intent#getStringExtra(String)}. 134 */ 135 public static final String EXTRA_REASON = "reason"; 136 /** 137 * The lookup key for a string that provides optionally supplied 138 * extra information about the network state. The information 139 * may be passed up from the lower networking layers, and its 140 * meaning may be specific to a particular network type. Retrieve 141 * it with {@link android.content.Intent#getStringExtra(String)}. 142 */ 143 public static final String EXTRA_EXTRA_INFO = "extraInfo"; 144 /** 145 * The lookup key for an int that provides information about 146 * our connection to the internet at large. 0 indicates no connection, 147 * 100 indicates a great connection. Retrieve it with 148 * {@link android.content.Intent#getIntExtra(String, int)}. 149 * {@hide} 150 */ 151 public static final String EXTRA_INET_CONDITION = "inetCondition"; 152 153 /** 154 * Broadcast action to indicate the change of data activity status 155 * (idle or active) on a network in a recent period. 156 * The network becomes active when data transmission is started, or 157 * idle if there is no data transmission for a period of time. 158 * {@hide} 159 */ 160 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 161 public static final String ACTION_DATA_ACTIVITY_CHANGE = "android.net.conn.DATA_ACTIVITY_CHANGE"; 162 /** 163 * The lookup key for an enum that indicates the network device type on which this data activity 164 * change happens. 165 * {@hide} 166 */ 167 public static final String EXTRA_DEVICE_TYPE = "deviceType"; 168 /** 169 * The lookup key for a boolean that indicates the device is active or not. {@code true} means 170 * it is actively sending or receiving data and {@code false} means it is idle. 171 * {@hide} 172 */ 173 public static final String EXTRA_IS_ACTIVE = "isActive"; 174 175 /** 176 * Broadcast Action: The setting for background data usage has changed 177 * values. Use {@link #getBackgroundDataSetting()} to get the current value. 178 * <p> 179 * If an application uses the network in the background, it should listen 180 * for this broadcast and stop using the background data if the value is 181 * {@code false}. 182 * <p> 183 * 184 * @deprecated As of {@link VERSION_CODES#ICE_CREAM_SANDWICH}, availability 185 * of background data depends on several combined factors, and 186 * this broadcast is no longer sent. Instead, when background 187 * data is unavailable, {@link #getActiveNetworkInfo()} will now 188 * appear disconnected. During first boot after a platform 189 * upgrade, this broadcast will be sent once if 190 * {@link #getBackgroundDataSetting()} was {@code false} before 191 * the upgrade. 192 */ 193 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 194 @Deprecated 195 public static final String ACTION_BACKGROUND_DATA_SETTING_CHANGED = 196 "android.net.conn.BACKGROUND_DATA_SETTING_CHANGED"; 197 198 /** 199 * Broadcast Action: The network connection may not be good 200 * uses {@code ConnectivityManager.EXTRA_INET_CONDITION} and 201 * {@code ConnectivityManager.EXTRA_NETWORK_INFO} to specify 202 * the network and it's condition. 203 * @hide 204 */ 205 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 206 public static final String INET_CONDITION_ACTION = 207 "android.net.conn.INET_CONDITION_ACTION"; 208 209 /** 210 * Broadcast Action: A tetherable connection has come or gone. 211 * Uses {@code ConnectivityManager.EXTRA_AVAILABLE_TETHER}, 212 * {@code ConnectivityManager.EXTRA_ACTIVE_TETHER} and 213 * {@code ConnectivityManager.EXTRA_ERRORED_TETHER} to indicate 214 * the current state of tethering. Each include a list of 215 * interface names in that state (may be empty). 216 * @hide 217 */ 218 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 219 public static final String ACTION_TETHER_STATE_CHANGED = 220 "android.net.conn.TETHER_STATE_CHANGED"; 221 222 /** 223 * @hide 224 * gives a String[] listing all the interfaces configured for 225 * tethering and currently available for tethering. 226 */ 227 public static final String EXTRA_AVAILABLE_TETHER = "availableArray"; 228 229 /** 230 * @hide 231 * gives a String[] listing all the interfaces currently tethered 232 * (ie, has dhcp support and packets potentially forwarded/NATed) 233 */ 234 public static final String EXTRA_ACTIVE_TETHER = "activeArray"; 235 236 /** 237 * @hide 238 * gives a String[] listing all the interfaces we tried to tether and 239 * failed. Use {@link #getLastTetherError} to find the error code 240 * for any interfaces listed here. 241 */ 242 public static final String EXTRA_ERRORED_TETHER = "erroredArray"; 243 244 /** 245 * Broadcast Action: The captive portal tracker has finished its test. 246 * Sent only while running Setup Wizard, in lieu of showing a user 247 * notification. 248 * @hide 249 */ 250 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 251 public static final String ACTION_CAPTIVE_PORTAL_TEST_COMPLETED = 252 "android.net.conn.CAPTIVE_PORTAL_TEST_COMPLETED"; 253 /** 254 * The lookup key for a boolean that indicates whether a captive portal was detected. 255 * Retrieve it with {@link android.content.Intent#getBooleanExtra(String,boolean)}. 256 * @hide 257 */ 258 public static final String EXTRA_IS_CAPTIVE_PORTAL = "captivePortal"; 259 260 /** 261 * The absence of a connection type. 262 * @hide 263 */ 264 public static final int TYPE_NONE = -1; 265 266 /** 267 * The Mobile data connection. When active, all data traffic 268 * will use this network type's interface by default 269 * (it has a default route) 270 */ 271 public static final int TYPE_MOBILE = 0; 272 /** 273 * The WIFI data connection. When active, all data traffic 274 * will use this network type's interface by default 275 * (it has a default route). 276 */ 277 public static final int TYPE_WIFI = 1; 278 /** 279 * An MMS-specific Mobile data connection. This network type may use the 280 * same network interface as {@link #TYPE_MOBILE} or it may use a different 281 * one. This is used by applications needing to talk to the carrier's 282 * Multimedia Messaging Service servers. 283 */ 284 public static final int TYPE_MOBILE_MMS = 2; 285 /** 286 * A SUPL-specific Mobile data connection. This network type may use the 287 * same network interface as {@link #TYPE_MOBILE} or it may use a different 288 * one. This is used by applications needing to talk to the carrier's 289 * Secure User Plane Location servers for help locating the device. 290 */ 291 public static final int TYPE_MOBILE_SUPL = 3; 292 /** 293 * A DUN-specific Mobile data connection. This network type may use the 294 * same network interface as {@link #TYPE_MOBILE} or it may use a different 295 * one. This is sometimes by the system when setting up an upstream connection 296 * for tethering so that the carrier is aware of DUN traffic. 297 */ 298 public static final int TYPE_MOBILE_DUN = 4; 299 /** 300 * A High Priority Mobile data connection. This network type uses the 301 * same network interface as {@link #TYPE_MOBILE} but the routing setup 302 * is different. Only requesting processes will have access to the 303 * Mobile DNS servers and only IP's explicitly requested via {@link #requestRouteToHost} 304 * will route over this interface if no default route exists. 305 */ 306 public static final int TYPE_MOBILE_HIPRI = 5; 307 /** 308 * The WiMAX data connection. When active, all data traffic 309 * will use this network type's interface by default 310 * (it has a default route). 311 */ 312 public static final int TYPE_WIMAX = 6; 313 314 /** 315 * The Bluetooth data connection. When active, all data traffic 316 * will use this network type's interface by default 317 * (it has a default route). 318 */ 319 public static final int TYPE_BLUETOOTH = 7; 320 321 /** 322 * Dummy data connection. This should not be used on shipping devices. 323 */ 324 public static final int TYPE_DUMMY = 8; 325 326 /** 327 * The Ethernet data connection. When active, all data traffic 328 * will use this network type's interface by default 329 * (it has a default route). 330 */ 331 public static final int TYPE_ETHERNET = 9; 332 333 /** 334 * Over the air Administration. 335 * {@hide} 336 */ 337 public static final int TYPE_MOBILE_FOTA = 10; 338 339 /** 340 * IP Multimedia Subsystem. 341 * {@hide} 342 */ 343 public static final int TYPE_MOBILE_IMS = 11; 344 345 /** 346 * Carrier Branded Services. 347 * {@hide} 348 */ 349 public static final int TYPE_MOBILE_CBS = 12; 350 351 /** 352 * A Wi-Fi p2p connection. Only requesting processes will have access to 353 * the peers connected. 354 * {@hide} 355 */ 356 public static final int TYPE_WIFI_P2P = 13; 357 358 /** 359 * The network to use for initially attaching to the network 360 * {@hide} 361 */ 362 public static final int TYPE_MOBILE_IA = 14; 363 364 /** {@hide} */ 365 public static final int MAX_RADIO_TYPE = TYPE_MOBILE_IA; 366 367 /** {@hide} */ 368 public static final int MAX_NETWORK_TYPE = TYPE_MOBILE_IA; 369 370 /** 371 * If you want to set the default network preference,you can directly 372 * change the networkAttributes array in framework's config.xml. 373 * 374 * @deprecated Since we support so many more networks now, the single 375 * network default network preference can't really express 376 * the hierarchy. Instead, the default is defined by the 377 * networkAttributes in config.xml. You can determine 378 * the current value by calling {@link #getNetworkPreference()} 379 * from an App. 380 */ 381 @Deprecated 382 public static final int DEFAULT_NETWORK_PREFERENCE = TYPE_WIFI; 383 384 /** 385 * Default value for {@link Settings.Global#CONNECTIVITY_CHANGE_DELAY} in 386 * milliseconds. This was introduced because IPv6 routes seem to take a 387 * moment to settle - trying network activity before the routes are adjusted 388 * can lead to packets using the wrong interface or having the wrong IP address. 389 * This delay is a bit crude, but in the future hopefully we will have kernel 390 * notifications letting us know when it's safe to use the new network. 391 * 392 * @hide 393 */ 394 public static final int CONNECTIVITY_CHANGE_DELAY_DEFAULT = 3000; 395 396 private final IConnectivityManager mService; 397 398 /** 399 * Tests if a given integer represents a valid network type. 400 * @param networkType the type to be tested 401 * @return a boolean. {@code true} if the type is valid, else {@code false} 402 */ 403 public static boolean isNetworkTypeValid(int networkType) { 404 return networkType >= 0 && networkType <= MAX_NETWORK_TYPE; 405 } 406 407 /** 408 * Returns a non-localized string representing a given network type. 409 * ONLY used for debugging output. 410 * @param type the type needing naming 411 * @return a String for the given type, or a string version of the type ("87") 412 * if no name is known. 413 * {@hide} 414 */ 415 public static String getNetworkTypeName(int type) { 416 switch (type) { 417 case TYPE_MOBILE: 418 return "MOBILE"; 419 case TYPE_WIFI: 420 return "WIFI"; 421 case TYPE_MOBILE_MMS: 422 return "MOBILE_MMS"; 423 case TYPE_MOBILE_SUPL: 424 return "MOBILE_SUPL"; 425 case TYPE_MOBILE_DUN: 426 return "MOBILE_DUN"; 427 case TYPE_MOBILE_HIPRI: 428 return "MOBILE_HIPRI"; 429 case TYPE_WIMAX: 430 return "WIMAX"; 431 case TYPE_BLUETOOTH: 432 return "BLUETOOTH"; 433 case TYPE_DUMMY: 434 return "DUMMY"; 435 case TYPE_ETHERNET: 436 return "ETHERNET"; 437 case TYPE_MOBILE_FOTA: 438 return "MOBILE_FOTA"; 439 case TYPE_MOBILE_IMS: 440 return "MOBILE_IMS"; 441 case TYPE_MOBILE_CBS: 442 return "MOBILE_CBS"; 443 case TYPE_WIFI_P2P: 444 return "WIFI_P2P"; 445 case TYPE_MOBILE_IA: 446 return "MOBILE_IA"; 447 default: 448 return Integer.toString(type); 449 } 450 } 451 452 /** 453 * Checks if a given type uses the cellular data connection. 454 * This should be replaced in the future by a network property. 455 * @param networkType the type to check 456 * @return a boolean - {@code true} if uses cellular network, else {@code false} 457 * {@hide} 458 */ 459 public static boolean isNetworkTypeMobile(int networkType) { 460 switch (networkType) { 461 case TYPE_MOBILE: 462 case TYPE_MOBILE_MMS: 463 case TYPE_MOBILE_SUPL: 464 case TYPE_MOBILE_DUN: 465 case TYPE_MOBILE_HIPRI: 466 case TYPE_MOBILE_FOTA: 467 case TYPE_MOBILE_IMS: 468 case TYPE_MOBILE_CBS: 469 case TYPE_MOBILE_IA: 470 return true; 471 default: 472 return false; 473 } 474 } 475 476 /** 477 * Checks if the given network type is backed by a Wi-Fi radio. 478 * 479 * @hide 480 */ 481 public static boolean isNetworkTypeWifi(int networkType) { 482 switch (networkType) { 483 case TYPE_WIFI: 484 case TYPE_WIFI_P2P: 485 return true; 486 default: 487 return false; 488 } 489 } 490 491 /** 492 * Checks if the given network type should be exempt from VPN routing rules 493 * 494 * @hide 495 */ 496 public static boolean isNetworkTypeExempt(int networkType) { 497 switch (networkType) { 498 case TYPE_MOBILE_MMS: 499 case TYPE_MOBILE_SUPL: 500 case TYPE_MOBILE_HIPRI: 501 case TYPE_MOBILE_IA: 502 return true; 503 default: 504 return false; 505 } 506 } 507 508 /** 509 * Specifies the preferred network type. When the device has more 510 * than one type available the preferred network type will be used. 511 * Note that this made sense when we only had 2 network types, 512 * but with more and more default networks we need an array to list 513 * their ordering. This will be deprecated soon. 514 * 515 * @param preference the network type to prefer over all others. It is 516 * unspecified what happens to the old preferred network in the 517 * overall ordering. 518 */ 519 public void setNetworkPreference(int preference) { 520 try { 521 mService.setNetworkPreference(preference); 522 } catch (RemoteException e) { 523 } 524 } 525 526 /** 527 * Retrieves the current preferred network type. 528 * Note that this made sense when we only had 2 network types, 529 * but with more and more default networks we need an array to list 530 * their ordering. This will be deprecated soon. 531 * 532 * @return an integer representing the preferred network type 533 * 534 * <p>This method requires the caller to hold the permission 535 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. 536 */ 537 public int getNetworkPreference() { 538 try { 539 return mService.getNetworkPreference(); 540 } catch (RemoteException e) { 541 return -1; 542 } 543 } 544 545 /** 546 * Returns details about the currently active default data network. When 547 * connected, this network is the default route for outgoing connections. 548 * You should always check {@link NetworkInfo#isConnected()} before initiating 549 * network traffic. This may return {@code null} when there is no default 550 * network. 551 * 552 * @return a {@link NetworkInfo} object for the current default network 553 * or {@code null} if no network default network is currently active 554 * 555 * <p>This method requires the call to hold the permission 556 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. 557 */ 558 public NetworkInfo getActiveNetworkInfo() { 559 try { 560 return mService.getActiveNetworkInfo(); 561 } catch (RemoteException e) { 562 return null; 563 } 564 } 565 566 /** 567 * Returns details about the currently active default data network 568 * for a given uid. This is for internal use only to avoid spying 569 * other apps. 570 * 571 * @return a {@link NetworkInfo} object for the current default network 572 * for the given uid or {@code null} if no default network is 573 * available for the specified uid. 574 * 575 * <p>This method requires the caller to hold the permission 576 * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL} 577 * {@hide} 578 */ 579 public NetworkInfo getActiveNetworkInfoForUid(int uid) { 580 try { 581 return mService.getActiveNetworkInfoForUid(uid); 582 } catch (RemoteException e) { 583 return null; 584 } 585 } 586 587 /** 588 * Returns connection status information about a particular 589 * network type. 590 * 591 * @param networkType integer specifying which networkType in 592 * which you're interested. 593 * @return a {@link NetworkInfo} object for the requested 594 * network type or {@code null} if the type is not 595 * supported by the device. 596 * 597 * <p>This method requires the call to hold the permission 598 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. 599 */ 600 public NetworkInfo getNetworkInfo(int networkType) { 601 try { 602 return mService.getNetworkInfo(networkType); 603 } catch (RemoteException e) { 604 return null; 605 } 606 } 607 608 /** 609 * Returns connection status information about all network 610 * types supported by the device. 611 * 612 * @return an array of {@link NetworkInfo} objects. Check each 613 * {@link NetworkInfo#getType} for which type each applies. 614 * 615 * <p>This method requires the call to hold the permission 616 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. 617 */ 618 public NetworkInfo[] getAllNetworkInfo() { 619 try { 620 return mService.getAllNetworkInfo(); 621 } catch (RemoteException e) { 622 return null; 623 } 624 } 625 626 /** 627 * Returns the IP information for the current default network. 628 * 629 * @return a {@link LinkProperties} object describing the IP info 630 * for the current default network, or {@code null} if there 631 * is no current default network. 632 * 633 * <p>This method requires the call to hold the permission 634 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. 635 * {@hide} 636 */ 637 public LinkProperties getActiveLinkProperties() { 638 try { 639 return mService.getActiveLinkProperties(); 640 } catch (RemoteException e) { 641 return null; 642 } 643 } 644 645 /** 646 * Returns the IP information for a given network type. 647 * 648 * @param networkType the network type of interest. 649 * @return a {@link LinkProperties} object describing the IP info 650 * for the given networkType, or {@code null} if there is 651 * no current default network. 652 * 653 * <p>This method requires the call to hold the permission 654 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. 655 * {@hide} 656 */ 657 public LinkProperties getLinkProperties(int networkType) { 658 try { 659 return mService.getLinkProperties(networkType); 660 } catch (RemoteException e) { 661 return null; 662 } 663 } 664 665 /** 666 * Tells each network type to set its radio power state as directed. 667 * 668 * @param turnOn a boolean, {@code true} to turn the radios on, 669 * {@code false} to turn them off. 670 * @return a boolean, {@code true} indicating success. All network types 671 * will be tried, even if some fail. 672 * 673 * <p>This method requires the call to hold the permission 674 * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}. 675 * {@hide} 676 */ 677 public boolean setRadios(boolean turnOn) { 678 try { 679 return mService.setRadios(turnOn); 680 } catch (RemoteException e) { 681 return false; 682 } 683 } 684 685 /** 686 * Tells a given networkType to set its radio power state as directed. 687 * 688 * @param networkType the int networkType of interest. 689 * @param turnOn a boolean, {@code true} to turn the radio on, 690 * {@code} false to turn it off. 691 * @return a boolean, {@code true} indicating success. 692 * 693 * <p>This method requires the call to hold the permission 694 * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}. 695 * {@hide} 696 */ 697 public boolean setRadio(int networkType, boolean turnOn) { 698 try { 699 return mService.setRadio(networkType, turnOn); 700 } catch (RemoteException e) { 701 return false; 702 } 703 } 704 705 /** 706 * Tells the underlying networking system that the caller wants to 707 * begin using the named feature. The interpretation of {@code feature} 708 * is completely up to each networking implementation. 709 * <p>This method requires the caller to hold the permission 710 * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}. 711 * @param networkType specifies which network the request pertains to 712 * @param feature the name of the feature to be used 713 * @return an integer value representing the outcome of the request. 714 * The interpretation of this value is specific to each networking 715 * implementation+feature combination, except that the value {@code -1} 716 * always indicates failure. 717 */ 718 public int startUsingNetworkFeature(int networkType, String feature) { 719 try { 720 return mService.startUsingNetworkFeature(networkType, feature, 721 new Binder()); 722 } catch (RemoteException e) { 723 return -1; 724 } 725 } 726 727 /** 728 * Tells the underlying networking system that the caller is finished 729 * using the named feature. The interpretation of {@code feature} 730 * is completely up to each networking implementation. 731 * <p>This method requires the caller to hold the permission 732 * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}. 733 * @param networkType specifies which network the request pertains to 734 * @param feature the name of the feature that is no longer needed 735 * @return an integer value representing the outcome of the request. 736 * The interpretation of this value is specific to each networking 737 * implementation+feature combination, except that the value {@code -1} 738 * always indicates failure. 739 */ 740 public int stopUsingNetworkFeature(int networkType, String feature) { 741 try { 742 return mService.stopUsingNetworkFeature(networkType, feature); 743 } catch (RemoteException e) { 744 return -1; 745 } 746 } 747 748 /** 749 * Ensure that a network route exists to deliver traffic to the specified 750 * host via the specified network interface. An attempt to add a route that 751 * already exists is ignored, but treated as successful. 752 * <p>This method requires the caller to hold the permission 753 * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}. 754 * @param networkType the type of the network over which traffic to the specified 755 * host is to be routed 756 * @param hostAddress the IP address of the host to which the route is desired 757 * @return {@code true} on success, {@code false} on failure 758 */ 759 public boolean requestRouteToHost(int networkType, int hostAddress) { 760 InetAddress inetAddress = NetworkUtils.intToInetAddress(hostAddress); 761 762 if (inetAddress == null) { 763 return false; 764 } 765 766 return requestRouteToHostAddress(networkType, inetAddress); 767 } 768 769 /** 770 * Ensure that a network route exists to deliver traffic to the specified 771 * host via the specified network interface. An attempt to add a route that 772 * already exists is ignored, but treated as successful. 773 * @param networkType the type of the network over which traffic to the specified 774 * host is to be routed 775 * @param hostAddress the IP address of the host to which the route is desired 776 * @return {@code true} on success, {@code false} on failure 777 * @hide 778 */ 779 public boolean requestRouteToHostAddress(int networkType, InetAddress hostAddress) { 780 byte[] address = hostAddress.getAddress(); 781 try { 782 return mService.requestRouteToHostAddress(networkType, address); 783 } catch (RemoteException e) { 784 return false; 785 } 786 } 787 788 /** 789 * Returns the value of the setting for background data usage. If false, 790 * applications should not use the network if the application is not in the 791 * foreground. Developers should respect this setting, and check the value 792 * of this before performing any background data operations. 793 * <p> 794 * All applications that have background services that use the network 795 * should listen to {@link #ACTION_BACKGROUND_DATA_SETTING_CHANGED}. 796 * <p> 797 * @deprecated As of {@link VERSION_CODES#ICE_CREAM_SANDWICH}, availability of 798 * background data depends on several combined factors, and this method will 799 * always return {@code true}. Instead, when background data is unavailable, 800 * {@link #getActiveNetworkInfo()} will now appear disconnected. 801 * 802 * @return Whether background data usage is allowed. 803 */ 804 @Deprecated 805 public boolean getBackgroundDataSetting() { 806 // assume that background data is allowed; final authority is 807 // NetworkInfo which may be blocked. 808 return true; 809 } 810 811 /** 812 * Sets the value of the setting for background data usage. 813 * 814 * @param allowBackgroundData Whether an application should use data while 815 * it is in the background. 816 * 817 * @attr ref android.Manifest.permission#CHANGE_BACKGROUND_DATA_SETTING 818 * @see #getBackgroundDataSetting() 819 * @hide 820 */ 821 @Deprecated 822 public void setBackgroundDataSetting(boolean allowBackgroundData) { 823 // ignored 824 } 825 826 /** 827 * Return quota status for the current active network, or {@code null} if no 828 * network is active. Quota status can change rapidly, so these values 829 * shouldn't be cached. 830 * 831 * <p>This method requires the call to hold the permission 832 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. 833 * 834 * @hide 835 */ 836 public NetworkQuotaInfo getActiveNetworkQuotaInfo() { 837 try { 838 return mService.getActiveNetworkQuotaInfo(); 839 } catch (RemoteException e) { 840 return null; 841 } 842 } 843 844 /** 845 * Gets the value of the setting for enabling Mobile data. 846 * 847 * @return Whether mobile data is enabled. 848 * 849 * <p>This method requires the call to hold the permission 850 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. 851 * @hide 852 */ 853 public boolean getMobileDataEnabled() { 854 try { 855 return mService.getMobileDataEnabled(); 856 } catch (RemoteException e) { 857 return true; 858 } 859 } 860 861 /** 862 * Sets the persisted value for enabling/disabling Mobile data. 863 * 864 * @param enabled Whether the user wants the mobile data connection used 865 * or not. 866 * @hide 867 */ 868 public void setMobileDataEnabled(boolean enabled) { 869 try { 870 mService.setMobileDataEnabled(enabled); 871 } catch (RemoteException e) { 872 } 873 } 874 875 /** 876 * {@hide} 877 */ 878 public ConnectivityManager(IConnectivityManager service) { 879 mService = checkNotNull(service, "missing IConnectivityManager"); 880 } 881 882 /** {@hide} */ 883 public static ConnectivityManager from(Context context) { 884 return (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 885 } 886 887 /** 888 * Get the set of tetherable, available interfaces. This list is limited by 889 * device configuration and current interface existence. 890 * 891 * @return an array of 0 or more Strings of tetherable interface names. 892 * 893 * <p>This method requires the call to hold the permission 894 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. 895 * {@hide} 896 */ 897 public String[] getTetherableIfaces() { 898 try { 899 return mService.getTetherableIfaces(); 900 } catch (RemoteException e) { 901 return new String[0]; 902 } 903 } 904 905 /** 906 * Get the set of tethered interfaces. 907 * 908 * @return an array of 0 or more String of currently tethered interface names. 909 * 910 * <p>This method requires the call to hold the permission 911 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. 912 * {@hide} 913 */ 914 public String[] getTetheredIfaces() { 915 try { 916 return mService.getTetheredIfaces(); 917 } catch (RemoteException e) { 918 return new String[0]; 919 } 920 } 921 922 /** 923 * Get the set of interface names which attempted to tether but 924 * failed. Re-attempting to tether may cause them to reset to the Tethered 925 * state. Alternatively, causing the interface to be destroyed and recreated 926 * may cause them to reset to the available state. 927 * {@link ConnectivityManager#getLastTetherError} can be used to get more 928 * information on the cause of the errors. 929 * 930 * @return an array of 0 or more String indicating the interface names 931 * which failed to tether. 932 * 933 * <p>This method requires the call to hold the permission 934 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. 935 * {@hide} 936 */ 937 public String[] getTetheringErroredIfaces() { 938 try { 939 return mService.getTetheringErroredIfaces(); 940 } catch (RemoteException e) { 941 return new String[0]; 942 } 943 } 944 945 /** 946 * Attempt to tether the named interface. This will setup a dhcp server 947 * on the interface, forward and NAT IP packets and forward DNS requests 948 * to the best active upstream network interface. Note that if no upstream 949 * IP network interface is available, dhcp will still run and traffic will be 950 * allowed between the tethered devices and this device, though upstream net 951 * access will of course fail until an upstream network interface becomes 952 * active. 953 * 954 * @param iface the interface name to tether. 955 * @return error a {@code TETHER_ERROR} value indicating success or failure type 956 * 957 * <p>This method requires the call to hold the permission 958 * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}. 959 * {@hide} 960 */ 961 public int tether(String iface) { 962 try { 963 return mService.tether(iface); 964 } catch (RemoteException e) { 965 return TETHER_ERROR_SERVICE_UNAVAIL; 966 } 967 } 968 969 /** 970 * Stop tethering the named interface. 971 * 972 * @param iface the interface name to untether. 973 * @return error a {@code TETHER_ERROR} value indicating success or failure type 974 * 975 * <p>This method requires the call to hold the permission 976 * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}. 977 * {@hide} 978 */ 979 public int untether(String iface) { 980 try { 981 return mService.untether(iface); 982 } catch (RemoteException e) { 983 return TETHER_ERROR_SERVICE_UNAVAIL; 984 } 985 } 986 987 /** 988 * Check if the device allows for tethering. It may be disabled via 989 * {@code ro.tether.denied} system property, {@link Settings#TETHER_SUPPORTED} or 990 * due to device configuration. 991 * 992 * @return a boolean - {@code true} indicating Tethering is supported. 993 * 994 * <p>This method requires the call to hold the permission 995 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. 996 * {@hide} 997 */ 998 public boolean isTetheringSupported() { 999 try { 1000 return mService.isTetheringSupported(); 1001 } catch (RemoteException e) { 1002 return false; 1003 } 1004 } 1005 1006 /** 1007 * Get the list of regular expressions that define any tetherable 1008 * USB network interfaces. If USB tethering is not supported by the 1009 * device, this list should be empty. 1010 * 1011 * @return an array of 0 or more regular expression Strings defining 1012 * what interfaces are considered tetherable usb interfaces. 1013 * 1014 * <p>This method requires the call to hold the permission 1015 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. 1016 * {@hide} 1017 */ 1018 public String[] getTetherableUsbRegexs() { 1019 try { 1020 return mService.getTetherableUsbRegexs(); 1021 } catch (RemoteException e) { 1022 return new String[0]; 1023 } 1024 } 1025 1026 /** 1027 * Get the list of regular expressions that define any tetherable 1028 * Wifi network interfaces. If Wifi tethering is not supported by the 1029 * device, this list should be empty. 1030 * 1031 * @return an array of 0 or more regular expression Strings defining 1032 * what interfaces are considered tetherable wifi interfaces. 1033 * 1034 * <p>This method requires the call to hold the permission 1035 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. 1036 * {@hide} 1037 */ 1038 public String[] getTetherableWifiRegexs() { 1039 try { 1040 return mService.getTetherableWifiRegexs(); 1041 } catch (RemoteException e) { 1042 return new String[0]; 1043 } 1044 } 1045 1046 /** 1047 * Get the list of regular expressions that define any tetherable 1048 * Bluetooth network interfaces. If Bluetooth tethering is not supported by the 1049 * device, this list should be empty. 1050 * 1051 * @return an array of 0 or more regular expression Strings defining 1052 * what interfaces are considered tetherable bluetooth interfaces. 1053 * 1054 * <p>This method requires the call to hold the permission 1055 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. 1056 * {@hide} 1057 */ 1058 public String[] getTetherableBluetoothRegexs() { 1059 try { 1060 return mService.getTetherableBluetoothRegexs(); 1061 } catch (RemoteException e) { 1062 return new String[0]; 1063 } 1064 } 1065 1066 /** 1067 * Attempt to both alter the mode of USB and Tethering of USB. A 1068 * utility method to deal with some of the complexity of USB - will 1069 * attempt to switch to Rndis and subsequently tether the resulting 1070 * interface on {@code true} or turn off tethering and switch off 1071 * Rndis on {@code false}. 1072 * 1073 * @param enable a boolean - {@code true} to enable tethering 1074 * @return error a {@code TETHER_ERROR} value indicating success or failure type 1075 * 1076 * <p>This method requires the call to hold the permission 1077 * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}. 1078 * {@hide} 1079 */ 1080 public int setUsbTethering(boolean enable) { 1081 try { 1082 return mService.setUsbTethering(enable); 1083 } catch (RemoteException e) { 1084 return TETHER_ERROR_SERVICE_UNAVAIL; 1085 } 1086 } 1087 1088 /** {@hide} */ 1089 public static final int TETHER_ERROR_NO_ERROR = 0; 1090 /** {@hide} */ 1091 public static final int TETHER_ERROR_UNKNOWN_IFACE = 1; 1092 /** {@hide} */ 1093 public static final int TETHER_ERROR_SERVICE_UNAVAIL = 2; 1094 /** {@hide} */ 1095 public static final int TETHER_ERROR_UNSUPPORTED = 3; 1096 /** {@hide} */ 1097 public static final int TETHER_ERROR_UNAVAIL_IFACE = 4; 1098 /** {@hide} */ 1099 public static final int TETHER_ERROR_MASTER_ERROR = 5; 1100 /** {@hide} */ 1101 public static final int TETHER_ERROR_TETHER_IFACE_ERROR = 6; 1102 /** {@hide} */ 1103 public static final int TETHER_ERROR_UNTETHER_IFACE_ERROR = 7; 1104 /** {@hide} */ 1105 public static final int TETHER_ERROR_ENABLE_NAT_ERROR = 8; 1106 /** {@hide} */ 1107 public static final int TETHER_ERROR_DISABLE_NAT_ERROR = 9; 1108 /** {@hide} */ 1109 public static final int TETHER_ERROR_IFACE_CFG_ERROR = 10; 1110 1111 /** 1112 * Get a more detailed error code after a Tethering or Untethering 1113 * request asynchronously failed. 1114 * 1115 * @param iface The name of the interface of interest 1116 * @return error The error code of the last error tethering or untethering the named 1117 * interface 1118 * 1119 * <p>This method requires the call to hold the permission 1120 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. 1121 * {@hide} 1122 */ 1123 public int getLastTetherError(String iface) { 1124 try { 1125 return mService.getLastTetherError(iface); 1126 } catch (RemoteException e) { 1127 return TETHER_ERROR_SERVICE_UNAVAIL; 1128 } 1129 } 1130 1131 /** 1132 * Try to ensure the device stays awake until we connect with the next network. 1133 * Actually just holds a wakelock for a number of seconds while we try to connect 1134 * to any default networks. This will expire if the timeout passes or if we connect 1135 * to a default after this is called. For internal use only. 1136 * 1137 * @param forWhom the name of the network going down for logging purposes 1138 * @return {@code true} on success, {@code false} on failure 1139 * 1140 * <p>This method requires the call to hold the permission 1141 * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL}. 1142 * {@hide} 1143 */ 1144 public boolean requestNetworkTransitionWakelock(String forWhom) { 1145 try { 1146 mService.requestNetworkTransitionWakelock(forWhom); 1147 return true; 1148 } catch (RemoteException e) { 1149 return false; 1150 } 1151 } 1152 1153 /** 1154 * Report network connectivity status. This is currently used only 1155 * to alter status bar UI. 1156 * 1157 * @param networkType The type of network you want to report on 1158 * @param percentage The quality of the connection 0 is bad, 100 is good 1159 * 1160 * <p>This method requires the call to hold the permission 1161 * {@link android.Manifest.permission#STATUS_BAR}. 1162 * {@hide} 1163 */ 1164 public void reportInetCondition(int networkType, int percentage) { 1165 try { 1166 mService.reportInetCondition(networkType, percentage); 1167 } catch (RemoteException e) { 1168 } 1169 } 1170 1171 /** 1172 * Set a network-independent global http proxy. This is not normally what you want 1173 * for typical HTTP proxies - they are general network dependent. However if you're 1174 * doing something unusual like general internal filtering this may be useful. On 1175 * a private network where the proxy is not accessible, you may break HTTP using this. 1176 * 1177 * @param proxyProperties The a {@link ProxyProperites} object defining the new global 1178 * HTTP proxy. A {@code null} value will clear the global HTTP proxy. 1179 * 1180 * <p>This method requires the call to hold the permission 1181 * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL}. 1182 * {@hide} 1183 */ 1184 public void setGlobalProxy(ProxyProperties p) { 1185 try { 1186 mService.setGlobalProxy(p); 1187 } catch (RemoteException e) { 1188 } 1189 } 1190 1191 /** 1192 * Retrieve any network-independent global HTTP proxy. 1193 * 1194 * @return {@link ProxyProperties} for the current global HTTP proxy or {@code null} 1195 * if no global HTTP proxy is set. 1196 * 1197 * <p>This method requires the call to hold the permission 1198 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. 1199 * {@hide} 1200 */ 1201 public ProxyProperties getGlobalProxy() { 1202 try { 1203 return mService.getGlobalProxy(); 1204 } catch (RemoteException e) { 1205 return null; 1206 } 1207 } 1208 1209 /** 1210 * Get the HTTP proxy settings for the current default network. Note that 1211 * if a global proxy is set, it will override any per-network setting. 1212 * 1213 * @return the {@link ProxyProperties} for the current HTTP proxy, or {@code null} if no 1214 * HTTP proxy is active. 1215 * 1216 * <p>This method requires the call to hold the permission 1217 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. 1218 * {@hide} 1219 */ 1220 public ProxyProperties getProxy() { 1221 try { 1222 return mService.getProxy(); 1223 } catch (RemoteException e) { 1224 return null; 1225 } 1226 } 1227 1228 /** 1229 * Sets a secondary requirement bit for the given networkType. 1230 * This requirement bit is generally under the control of the carrier 1231 * or its agents and is not directly controlled by the user. 1232 * 1233 * @param networkType The network who's dependence has changed 1234 * @param met Boolean - true if network use is OK, false if not 1235 * 1236 * <p>This method requires the call to hold the permission 1237 * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL}. 1238 * {@hide} 1239 */ 1240 public void setDataDependency(int networkType, boolean met) { 1241 try { 1242 mService.setDataDependency(networkType, met); 1243 } catch (RemoteException e) { 1244 } 1245 } 1246 1247 /** 1248 * Returns true if the hardware supports the given network type 1249 * else it returns false. This doesn't indicate we have coverage 1250 * or are authorized onto a network, just whether or not the 1251 * hardware supports it. For example a GSM phone without a SIM 1252 * should still return {@code true} for mobile data, but a wifi only 1253 * tablet would return {@code false}. 1254 * 1255 * @param networkType The network type we'd like to check 1256 * @return {@code true} if supported, else {@code false} 1257 * 1258 * <p>This method requires the call to hold the permission 1259 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. 1260 * @hide 1261 */ 1262 public boolean isNetworkSupported(int networkType) { 1263 try { 1264 return mService.isNetworkSupported(networkType); 1265 } catch (RemoteException e) {} 1266 return false; 1267 } 1268 1269 /** 1270 * Returns if the currently active data network is metered. A network is 1271 * classified as metered when the user is sensitive to heavy data usage on 1272 * that connection due to monetary costs, data limitations or 1273 * battery/performance issues. You should check this before doing large 1274 * data transfers, and warn the user or delay the operation until another 1275 * network is available. 1276 * 1277 * @return {@code true} if large transfers should be avoided, otherwise 1278 * {@code false}. 1279 * 1280 * <p>This method requires the call to hold the permission 1281 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. 1282 */ 1283 public boolean isActiveNetworkMetered() { 1284 try { 1285 return mService.isActiveNetworkMetered(); 1286 } catch (RemoteException e) { 1287 return false; 1288 } 1289 } 1290 1291 /** 1292 * If the LockdownVpn mechanism is enabled, updates the vpn 1293 * with a reload of its profile. 1294 * 1295 * @return a boolean with {@code} indicating success 1296 * 1297 * <p>This method can only be called by the system UID 1298 * {@hide} 1299 */ 1300 public boolean updateLockdownVpn() { 1301 try { 1302 return mService.updateLockdownVpn(); 1303 } catch (RemoteException e) { 1304 return false; 1305 } 1306 } 1307 1308 /** 1309 * Signal that the captive portal check on the indicated network 1310 * is complete and we can turn the network on for general use. 1311 * 1312 * @param info the {@link NetworkInfo} object for the networkType 1313 * in question. 1314 * 1315 * <p>This method requires the call to hold the permission 1316 * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL}. 1317 * {@hide} 1318 */ 1319 public void captivePortalCheckComplete(NetworkInfo info) { 1320 try { 1321 mService.captivePortalCheckComplete(info); 1322 } catch (RemoteException e) { 1323 } 1324 } 1325 1326 /** 1327 * Signal that the captive portal check on the indicated network 1328 * is complete and whether its a captive portal or not. 1329 * 1330 * @param info the {@link NetworkInfo} object for the networkType 1331 * in question. 1332 * @param isCaptivePortal true/false. 1333 * 1334 * <p>This method requires the call to hold the permission 1335 * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL}. 1336 * {@hide} 1337 */ 1338 public void captivePortalCheckCompleted(NetworkInfo info, boolean isCaptivePortal) { 1339 try { 1340 mService.captivePortalCheckCompleted(info, isCaptivePortal); 1341 } catch (RemoteException e) { 1342 } 1343 } 1344 1345 /** 1346 * Supply the backend messenger for a network tracker 1347 * 1348 * @param type NetworkType to set 1349 * @param messenger {@link Messenger} 1350 * {@hide} 1351 */ 1352 public void supplyMessenger(int networkType, Messenger messenger) { 1353 try { 1354 mService.supplyMessenger(networkType, messenger); 1355 } catch (RemoteException e) { 1356 } 1357 } 1358 1359 /** 1360 * The ResultReceiver resultCode for checkMobileProvisioning (CMP_RESULT_CODE) 1361 */ 1362 1363 /** 1364 * No connection was possible to the network. 1365 * {@hide} 1366 */ 1367 public static final int CMP_RESULT_CODE_NO_CONNECTION = 0; 1368 1369 /** 1370 * A connection was made to the internet, all is well. 1371 * {@hide} 1372 */ 1373 public static final int CMP_RESULT_CODE_CONNECTABLE = 1; 1374 1375 /** 1376 * A connection was made but there was a redirection, we appear to be in walled garden. 1377 * This is an indication of a warm sim on a mobile network. 1378 * {@hide} 1379 */ 1380 public static final int CMP_RESULT_CODE_REDIRECTED = 2; 1381 1382 /** 1383 * A connection was made but no dns server was available to resolve a name to address. 1384 * This is an indication of a warm sim on a mobile network. 1385 * 1386 * {@hide} 1387 */ 1388 public static final int CMP_RESULT_CODE_NO_DNS = 3; 1389 1390 /** 1391 * A connection was made but could not open a TCP connection. 1392 * This is an indication of a warm sim on a mobile network. 1393 * {@hide} 1394 */ 1395 public static final int CMP_RESULT_CODE_NO_TCP_CONNECTION = 4; 1396 1397 /** 1398 * Check mobile provisioning. The resultCode passed to 1399 * onReceiveResult will be one of the CMP_RESULT_CODE_xxxx values above. 1400 * This may take a minute or more to complete. 1401 * 1402 * @param sendNotificaiton, when true a notification will be sent to user. 1403 * @param suggestedTimeOutMs, timeout in milliseconds 1404 * @param resultReceiver needs to be supplied to receive the result 1405 * 1406 * @return time out that will be used, maybe less that suggestedTimeOutMs 1407 * -1 if an error. 1408 * 1409 * {@hide} 1410 */ 1411 public int checkMobileProvisioning(boolean sendNotification, int suggestedTimeOutMs, 1412 ResultReceiver resultReceiver) { 1413 int timeOutMs = -1; 1414 try { 1415 timeOutMs = mService.checkMobileProvisioning(sendNotification, suggestedTimeOutMs, 1416 resultReceiver); 1417 } catch (RemoteException e) { 1418 } 1419 return timeOutMs; 1420 } 1421 1422 /** 1423 * Get the mobile provisioning url. 1424 * {@hide} 1425 */ 1426 public String getMobileProvisioningUrl() { 1427 try { 1428 return mService.getMobileProvisioningUrl(); 1429 } catch (RemoteException e) { 1430 } 1431 return null; 1432 } 1433 1434 /** 1435 * Get the mobile redirected provisioning url. 1436 * {@hide} 1437 */ 1438 public String getMobileRedirectedProvisioningUrl() { 1439 try { 1440 return mService.getMobileRedirectedProvisioningUrl(); 1441 } catch (RemoteException e) { 1442 } 1443 return null; 1444 } 1445 1446 /** 1447 * get the information about a specific network link 1448 * @hide 1449 */ 1450 public LinkQualityInfo getLinkQualityInfo(int networkType) { 1451 try { 1452 LinkQualityInfo li = mService.getLinkQualityInfo(networkType); 1453 return li; 1454 } catch (RemoteException e) { 1455 return null; 1456 } 1457 } 1458 1459 /** 1460 * get the information of currently active network link 1461 * @hide 1462 */ 1463 public LinkQualityInfo getActiveLinkQualityInfo() { 1464 try { 1465 LinkQualityInfo li = mService.getActiveLinkQualityInfo(); 1466 return li; 1467 } catch (RemoteException e) { 1468 return null; 1469 } 1470 } 1471 1472 /** 1473 * get the information of all network links 1474 * @hide 1475 */ 1476 public LinkQualityInfo[] getAllLinkQualityInfo() { 1477 try { 1478 LinkQualityInfo[] li = mService.getAllLinkQualityInfo(); 1479 return li; 1480 } catch (RemoteException e) { 1481 return null; 1482 } 1483 } 1484} 1485