diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index ce1b01ecd5..b34160061c 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -2451,6 +2451,23 @@ public class ConnectivityManager { sendRequestForNetwork(request.networkCapabilities, networkCallback, 0, LISTEN, TYPE_NONE); } + /** + * Request connectivityservice to refresh network capabilities for the given + * {@link network}. This method returns true if the network is still active, false + * otherwise. Notice the method call assumes the caller has registered for + * listening NetworkCapabilities updates. + * + * @param network{@link Network} specifying which network you're interested. + * @hide + */ + public boolean requestBwUpdate(Network network) { + try { + return mService.requestBwUpdate(network); + } catch (RemoteException e) { + return false; + } + } + /** * Unregisters callbacks about and possibly releases networks originating from * {@link #requestNetwork} and {@link #registerNetworkCallback} calls. If the diff --git a/core/java/android/net/IConnectivityManager.aidl b/core/java/android/net/IConnectivityManager.aidl index 055f1ab2e8..9d9b1bfa33 100644 --- a/core/java/android/net/IConnectivityManager.aidl +++ b/core/java/android/net/IConnectivityManager.aidl @@ -134,6 +134,8 @@ interface IConnectivityManager void registerNetworkFactory(in Messenger messenger, in String name); + boolean requestBwUpdate(in Network network); + void unregisterNetworkFactory(in Messenger messenger); int registerNetworkAgent(in Messenger messenger, in NetworkInfo ni, in LinkProperties lp, diff --git a/core/java/android/net/NetworkAgent.java b/core/java/android/net/NetworkAgent.java index 3f2dd28284..9c3a623190 100644 --- a/core/java/android/net/NetworkAgent.java +++ b/core/java/android/net/NetworkAgent.java @@ -49,6 +49,8 @@ public abstract class NetworkAgent extends Handler { private static final boolean VDBG = false; private final Context mContext; private final ArrayListmPreConnectedQueue = new ArrayList(); + private volatile long mLastBwRefreshTime = 0; + private static final long BW_REFRESH_MIN_WIN_MS = 500; private static final int BASE = Protocol.BASE_NETWORK_AGENT; @@ -138,6 +140,11 @@ public abstract class NetworkAgent extends Handler { */ public static final int CMD_SAVE_ACCEPT_UNVALIDATED = BASE + 9; + /** Sent by ConnectivityService to the NetworkAgent to inform the agent to pull + * the underlying network connection for updated bandwidth information. + */ + public static final int CMD_REQUEST_BANDWIDTH_UPDATE = BASE + 10; + public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni, NetworkCapabilities nc, LinkProperties lp, int score) { this(looper, context, logTag, ni, nc, lp, score, null); @@ -199,6 +206,15 @@ public abstract class NetworkAgent extends Handler { log("Unhandled Message " + msg); break; } + case CMD_REQUEST_BANDWIDTH_UPDATE: { + if (VDBG) { + log("CMD_REQUEST_BANDWIDTH_UPDATE request received."); + } + if (System.currentTimeMillis() > (mLastBwRefreshTime + BW_REFRESH_MIN_WIN_MS)) { + pollLceData(); + } + break; + } case CMD_REPORT_NETWORK_STATUS: { if (VDBG) { log("CMD_REPORT_NETWORK_STATUS(" + @@ -244,6 +260,7 @@ public abstract class NetworkAgent extends Handler { * Called by the bearer code when it has new NetworkCapabilities data. */ public void sendNetworkCapabilities(NetworkCapabilities networkCapabilities) { + mLastBwRefreshTime = System.currentTimeMillis(); queueOrSendMessage(EVENT_NETWORK_CAPABILITIES_CHANGED, new NetworkCapabilities(networkCapabilities)); } @@ -297,6 +314,13 @@ public abstract class NetworkAgent extends Handler { */ abstract protected void unwanted(); + /** + * Called when ConnectivityService request a bandwidth update. The parent factory + * shall try to overwrite this method and produce a bandwidth update if capable. + */ + protected void pollLceData() { + } + /** * Called when the system determines the usefulness of this network. * diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 484908d423..4a5f80837c 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -3455,6 +3455,24 @@ public class ConnectivityService extends IConnectivityManager.Stub } } + @Override + public boolean requestBwUpdate(Network network) { + enforceAccessPermission(); + NetworkAgentInfo nai = null; + if (network == null) { + return false; + } + synchronized (mNetworkForNetId) { + nai = mNetworkForNetId.get(network.netId); + } + if (nai != null) { + nai.asyncChannel.sendMessage(android.net.NetworkAgent.CMD_REQUEST_BANDWIDTH_UPDATE); + return true; + } + return false; + } + + private void enforceMeteredApnPolicy(NetworkCapabilities networkCapabilities) { // if UID is restricted, don't allow them to bring up metered APNs if (networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)