LCE service implementation - connectivity side

Change-Id: If11bd99c44c7dc8d2aa2bc05a10e04421739baa6
This commit is contained in:
fenglu
2015-03-20 11:29:56 -07:00
parent 3153bb0792
commit 7656433e44
4 changed files with 61 additions and 0 deletions

View File

@@ -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

View File

@@ -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,

View File

@@ -49,6 +49,8 @@ public abstract class NetworkAgent extends Handler {
private static final boolean VDBG = false;
private final Context mContext;
private final ArrayList<Message>mPreConnectedQueue = new ArrayList<Message>();
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.
*

View File

@@ -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)