Support metered Wi-Fi NetworkPolicy.

Add networkId field to NetworkIdentity to identify Wi-Fi networks by
SSID.  Add support for policies without usage cycles.

Only apply mobile policies when SIM state is ready, which is cleaner
than just checking for airplane mode.  Also avoids creating no-op
default policies when subscriberId is null.

Bug: 3001465, 3291052
Change-Id: I1f8aaa49a5db306df022c402ea7f3f5d4bc0cfc7
This commit is contained in:
Jeff Sharkey
2012-04-04 20:40:58 -07:00
parent f3f68819df
commit 3bd888f411
5 changed files with 139 additions and 89 deletions

View File

@@ -21,7 +21,6 @@ import android.net.NetworkIdentity;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ProtocolException;
import java.util.HashSet;
/**
@@ -33,48 +32,46 @@ import java.util.HashSet;
public class NetworkIdentitySet extends HashSet<NetworkIdentity> {
private static final int VERSION_INIT = 1;
private static final int VERSION_ADD_ROAMING = 2;
private static final int VERSION_ADD_NETWORK_ID = 3;
public NetworkIdentitySet() {
}
public NetworkIdentitySet(DataInputStream in) throws IOException {
final int version = in.readInt();
switch (version) {
case VERSION_INIT: {
final int size = in.readInt();
for (int i = 0; i < size; i++) {
final int ignoredVersion = in.readInt();
final int type = in.readInt();
final int subType = in.readInt();
final String subscriberId = readOptionalString(in);
add(new NetworkIdentity(type, subType, subscriberId, false));
}
break;
final int size = in.readInt();
for (int i = 0; i < size; i++) {
if (version <= VERSION_INIT) {
final int ignored = in.readInt();
}
case VERSION_ADD_ROAMING: {
final int size = in.readInt();
for (int i = 0; i < size; i++) {
final int type = in.readInt();
final int subType = in.readInt();
final String subscriberId = readOptionalString(in);
final boolean roaming = in.readBoolean();
add(new NetworkIdentity(type, subType, subscriberId, roaming));
}
break;
final int type = in.readInt();
final int subType = in.readInt();
final String subscriberId = readOptionalString(in);
final String networkId;
if (version >= VERSION_ADD_NETWORK_ID) {
networkId = readOptionalString(in);
} else {
networkId = null;
}
default: {
throw new ProtocolException("unexpected version: " + version);
final boolean roaming;
if (version >= VERSION_ADD_ROAMING) {
roaming = in.readBoolean();
} else {
roaming = false;
}
add(new NetworkIdentity(type, subType, subscriberId, networkId, false));
}
}
public void writeToStream(DataOutputStream out) throws IOException {
out.writeInt(VERSION_ADD_ROAMING);
out.writeInt(VERSION_ADD_NETWORK_ID);
out.writeInt(size());
for (NetworkIdentity ident : this) {
out.writeInt(ident.getType());
out.writeInt(ident.getSubType());
writeOptionalString(out, ident.getSubscriberId());
writeOptionalString(out, ident.getNetworkId());
out.writeBoolean(ident.getRoaming());
}
}

View File

@@ -34,7 +34,7 @@ import static android.net.NetworkStats.SET_FOREGROUND;
import static android.net.NetworkStats.TAG_NONE;
import static android.net.NetworkStats.UID_ALL;
import static android.net.NetworkTemplate.buildTemplateMobileAll;
import static android.net.NetworkTemplate.buildTemplateWifi;
import static android.net.NetworkTemplate.buildTemplateWifiWildcard;
import static android.net.TrafficStats.MB_IN_BYTES;
import static android.provider.Settings.Secure.NETSTATS_DEV_BUCKET_DURATION;
import static android.provider.Settings.Secure.NETSTATS_DEV_DELETE_AGE;
@@ -836,7 +836,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
trustedTime);
// collect wifi sample
template = buildTemplateWifi();
template = buildTemplateWifiWildcard();
devTotal = mDevRecorder.getTotalSinceBootLocked(template);
xtTotal = new NetworkStats.Entry();
uidTotal = mUidRecorder.getTotalSinceBootLocked(template);