From d00b13033249b0b13e440998bb4949c78f37ba89 Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Thu, 12 Apr 2012 18:34:54 -0700 Subject: [PATCH] API to report if active network is metered. Report to developers if active network is "metered" and define it as the user being sensitive to heavy data usage. Bug: 3001465 Change-Id: I855ca3cd3eb1de3c4814148d70ccf24957af898a --- .../java/android/net/ConnectivityManager.java | 24 +++++++++++++++---- .../android/net/IConnectivityManager.aidl | 1 + .../android/server/ConnectivityService.java | 13 ++++++++++ 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index de169858be..ef4209f849 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -373,10 +373,11 @@ public class ConnectivityManager { } /** - * Gets you info about the current data network. - * Call {@link NetworkInfo#isConnected()} on the returned {@link NetworkInfo} - * to check if the device has a data connection. - */ + * Returns details about the currently active data network. When connected, + * this network is the default route for outgoing connections. You should + * always check {@link NetworkInfo#isConnected()} before initiating network + * traffic. This may return {@code null} when no networks are available. + */ public NetworkInfo getActiveNetworkInfo() { try { return mService.getActiveNetworkInfo(); @@ -856,4 +857,19 @@ public class ConnectivityManager { } catch (RemoteException e) {} return false; } + + /** + * Returns if the currently active data network is metered. A network is + * classified as metered when the user is sensitive to heavy data usage on + * that connection. You should check this before doing large data transfers, + * and warn the user or delay the operation until another network is + * available. + */ + public boolean isActiveNetworkMetered() { + try { + return mService.isActiveNetworkMetered(); + } catch (RemoteException e) { + return false; + } + } } diff --git a/core/java/android/net/IConnectivityManager.aidl b/core/java/android/net/IConnectivityManager.aidl index 70460087ca..92aeff2747 100644 --- a/core/java/android/net/IConnectivityManager.aidl +++ b/core/java/android/net/IConnectivityManager.aidl @@ -51,6 +51,7 @@ interface IConnectivityManager NetworkState[] getAllNetworkState(); NetworkQuotaInfo getActiveNetworkQuotaInfo(); + boolean isActiveNetworkMetered(); boolean setRadios(boolean onOff); diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java index 352decf705..359074a07c 100644 --- a/services/java/com/android/server/ConnectivityService.java +++ b/services/java/com/android/server/ConnectivityService.java @@ -875,6 +875,19 @@ private NetworkStateTracker makeWimaxStateTracker() { return null; } + @Override + public boolean isActiveNetworkMetered() { + enforceAccessPermission(); + final NetworkState state = getNetworkStateUnchecked(mActiveDefaultNetwork); + if (state != null) { + try { + return mPolicyManager.isNetworkMetered(state); + } catch (RemoteException e) { + } + } + return false; + } + public boolean setRadios(boolean turnOn) { boolean result = true; enforceChangePermission();