LCE service implementation - connectivity side

Change-Id: If11bd99c44c7dc8d2aa2bc05a10e04421739baa6
This commit is contained in:
fenglu
2015-03-20 11:29:56 -07:00
parent 26a93d9cdf
commit 26a1e5a5ae
4 changed files with 63 additions and 0 deletions

View File

@@ -2455,6 +2455,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

@@ -131,6 +131,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

@@ -52,6 +52,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;
@@ -129,6 +131,13 @@ public abstract class NetworkAgent extends Handler {
*/
public static final int EVENT_SET_EXPLICITLY_SELECTED = BASE + 8;
/**
* 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 + 9;
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);
@@ -190,6 +199,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(" +
@@ -232,6 +250,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));
}
@@ -279,6 +298,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

@@ -3289,6 +3289,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)