[SUBID01-0]Grow NetworkIdentity to include a new mSubId field
In the previous design of NSS and NPMS, those only had IMSI to identify
the cell network. Now the telephony has created the "subId" handle,
which is the preferred mechanism for identifying subscribers.
This commit adds NetworkStats support for subscriberId as a part of
the network identity key
Bug: 80526261
Test: atest NetworkTemplateTest NetworkStatsCollectionTest
NetworkStatsServiceTest NetworkIdentityTest
NetworkStatsDataMigrationUtilsTest
Change-Id: Ie1fe81006555dbcca4b62457fa6c319f04b4576d
This commit is contained in:
@@ -20,6 +20,7 @@ import static android.annotation.SystemApi.Client.MODULE_LIBRARIES;
|
||||
import static android.net.ConnectivityManager.TYPE_MOBILE;
|
||||
import static android.net.ConnectivityManager.TYPE_WIFI;
|
||||
import static android.net.NetworkTemplate.NETWORK_TYPE_ALL;
|
||||
import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
|
||||
|
||||
import android.annotation.IntDef;
|
||||
import android.annotation.NonNull;
|
||||
@@ -86,6 +87,7 @@ public class NetworkIdentity {
|
||||
|
||||
final int mType;
|
||||
final int mRatType;
|
||||
final int mSubId;
|
||||
final String mSubscriberId;
|
||||
final String mWifiNetworkKey;
|
||||
final boolean mRoaming;
|
||||
@@ -96,7 +98,7 @@ public class NetworkIdentity {
|
||||
/** @hide */
|
||||
public NetworkIdentity(
|
||||
int type, int ratType, @Nullable String subscriberId, @Nullable String wifiNetworkKey,
|
||||
boolean roaming, boolean metered, boolean defaultNetwork, int oemManaged) {
|
||||
boolean roaming, boolean metered, boolean defaultNetwork, int oemManaged, int subId) {
|
||||
mType = type;
|
||||
mRatType = ratType;
|
||||
mSubscriberId = subscriberId;
|
||||
@@ -105,12 +107,13 @@ public class NetworkIdentity {
|
||||
mMetered = metered;
|
||||
mDefaultNetwork = defaultNetwork;
|
||||
mOemManaged = oemManaged;
|
||||
mSubId = subId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(mType, mRatType, mSubscriberId, mWifiNetworkKey, mRoaming, mMetered,
|
||||
mDefaultNetwork, mOemManaged);
|
||||
mDefaultNetwork, mOemManaged, mSubId);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -122,7 +125,8 @@ public class NetworkIdentity {
|
||||
&& Objects.equals(mWifiNetworkKey, ident.mWifiNetworkKey)
|
||||
&& mMetered == ident.mMetered
|
||||
&& mDefaultNetwork == ident.mDefaultNetwork
|
||||
&& mOemManaged == ident.mOemManaged;
|
||||
&& mOemManaged == ident.mOemManaged
|
||||
&& mSubId == ident.mSubId;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -150,6 +154,7 @@ public class NetworkIdentity {
|
||||
builder.append(", metered=").append(mMetered);
|
||||
builder.append(", defaultNetwork=").append(mDefaultNetwork);
|
||||
builder.append(", oemManaged=").append(getOemManagedNames(mOemManaged));
|
||||
builder.append(", subId=").append(mSubId);
|
||||
return builder.append("}").toString();
|
||||
}
|
||||
|
||||
@@ -256,6 +261,11 @@ public class NetworkIdentity {
|
||||
return mOemManaged;
|
||||
}
|
||||
|
||||
/** Get the SubId of this instance. */
|
||||
public int getSubId() {
|
||||
return mSubId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Assemble a {@link NetworkIdentity} from the passed arguments.
|
||||
*
|
||||
@@ -276,7 +286,8 @@ public class NetworkIdentity {
|
||||
public static NetworkIdentity buildNetworkIdentity(Context context,
|
||||
@NonNull NetworkStateSnapshot snapshot, boolean defaultNetwork, int ratType) {
|
||||
final NetworkIdentity.Builder builder = new NetworkIdentity.Builder()
|
||||
.setNetworkStateSnapshot(snapshot).setDefaultNetwork(defaultNetwork);
|
||||
.setNetworkStateSnapshot(snapshot).setDefaultNetwork(defaultNetwork)
|
||||
.setSubId(snapshot.getSubId());
|
||||
if (snapshot.getLegacyType() == TYPE_MOBILE && ratType != NETWORK_TYPE_ALL) {
|
||||
builder.setRatType(ratType);
|
||||
}
|
||||
@@ -325,6 +336,9 @@ public class NetworkIdentity {
|
||||
if (res == 0) {
|
||||
res = Integer.compare(left.mOemManaged, right.mOemManaged);
|
||||
}
|
||||
if (res == 0) {
|
||||
res = Integer.compare(left.mSubId, right.mSubId);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
@@ -345,6 +359,7 @@ public class NetworkIdentity {
|
||||
private boolean mMetered;
|
||||
private boolean mDefaultNetwork;
|
||||
private int mOemManaged;
|
||||
private int mSubId;
|
||||
|
||||
/**
|
||||
* Creates a new Builder.
|
||||
@@ -359,6 +374,7 @@ public class NetworkIdentity {
|
||||
mMetered = false;
|
||||
mDefaultNetwork = false;
|
||||
mOemManaged = NetworkTemplate.OEM_MANAGED_NO;
|
||||
mSubId = INVALID_SUBSCRIPTION_ID;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -537,6 +553,19 @@ public class NetworkIdentity {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the Subscription Id.
|
||||
*
|
||||
* @param subId the Subscription Id of the network. Or INVALID_SUBSCRIPTION_ID if not
|
||||
* applicable.
|
||||
* @return this builder.
|
||||
*/
|
||||
@NonNull
|
||||
public Builder setSubId(int subId) {
|
||||
mSubId = subId;
|
||||
return this;
|
||||
}
|
||||
|
||||
private void ensureValidParameters() {
|
||||
// Assert non-mobile network cannot have a ratType.
|
||||
if (mType != TYPE_MOBILE && mRatType != NetworkTemplate.NETWORK_TYPE_ALL) {
|
||||
@@ -559,7 +588,7 @@ public class NetworkIdentity {
|
||||
public NetworkIdentity build() {
|
||||
ensureValidParameters();
|
||||
return new NetworkIdentity(mType, mRatType, mSubscriberId, mWifiNetworkKey,
|
||||
mRoaming, mMetered, mDefaultNetwork, mOemManaged);
|
||||
mRoaming, mMetered, mDefaultNetwork, mOemManaged, mSubId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
package android.net;
|
||||
|
||||
import static android.net.ConnectivityManager.TYPE_MOBILE;
|
||||
import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.service.NetworkIdentitySetProto;
|
||||
@@ -42,6 +43,7 @@ public class NetworkIdentitySet extends HashSet<NetworkIdentity> {
|
||||
private static final int VERSION_ADD_METERED = 4;
|
||||
private static final int VERSION_ADD_DEFAULT_NETWORK = 5;
|
||||
private static final int VERSION_ADD_OEM_MANAGED_NETWORK = 6;
|
||||
private static final int VERSION_ADD_SUB_ID = 7;
|
||||
|
||||
/**
|
||||
* Construct a {@link NetworkIdentitySet} object.
|
||||
@@ -103,8 +105,15 @@ public class NetworkIdentitySet extends HashSet<NetworkIdentity> {
|
||||
oemNetCapabilities = NetworkIdentity.OEM_NONE;
|
||||
}
|
||||
|
||||
final int subId;
|
||||
if (version >= VERSION_ADD_SUB_ID) {
|
||||
subId = in.readInt();
|
||||
} else {
|
||||
subId = INVALID_SUBSCRIPTION_ID;
|
||||
}
|
||||
|
||||
add(new NetworkIdentity(type, ratType, subscriberId, networkId, roaming, metered,
|
||||
defaultNetwork, oemNetCapabilities));
|
||||
defaultNetwork, oemNetCapabilities, subId));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -113,7 +122,7 @@ public class NetworkIdentitySet extends HashSet<NetworkIdentity> {
|
||||
* @hide
|
||||
*/
|
||||
public void writeToStream(DataOutput out) throws IOException {
|
||||
out.writeInt(VERSION_ADD_OEM_MANAGED_NETWORK);
|
||||
out.writeInt(VERSION_ADD_SUB_ID);
|
||||
out.writeInt(size());
|
||||
for (NetworkIdentity ident : this) {
|
||||
out.writeInt(ident.getType());
|
||||
@@ -124,6 +133,7 @@ public class NetworkIdentitySet extends HashSet<NetworkIdentity> {
|
||||
out.writeBoolean(ident.isMetered());
|
||||
out.writeBoolean(ident.isDefaultNetwork());
|
||||
out.writeInt(ident.getOemManaged());
|
||||
out.writeInt(ident.getSubId());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
package android.net;
|
||||
|
||||
import static android.annotation.SystemApi.Client.MODULE_LIBRARIES;
|
||||
import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
|
||||
import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.annotation.Nullable;
|
||||
@@ -98,12 +100,29 @@ public final class NetworkStateSnapshot implements Parcelable {
|
||||
return mLinkProperties;
|
||||
}
|
||||
|
||||
/** Get the Subscriber Id of the network associated with this snapshot. */
|
||||
/**
|
||||
* Get the Subscriber Id of the network associated with this snapshot.
|
||||
* @deprecated Please use #getSubId, which doesn't return personally identifiable
|
||||
* information.
|
||||
*/
|
||||
@Deprecated
|
||||
@Nullable
|
||||
public String getSubscriberId() {
|
||||
return mSubscriberId;
|
||||
}
|
||||
|
||||
/** Get the subId of the network associated with this snapshot. */
|
||||
public int getSubId() {
|
||||
if (mNetworkCapabilities.hasTransport(TRANSPORT_CELLULAR)) {
|
||||
final NetworkSpecifier spec = mNetworkCapabilities.getNetworkSpecifier();
|
||||
if (spec instanceof TelephonyNetworkSpecifier) {
|
||||
return ((TelephonyNetworkSpecifier) spec).getSubscriptionId();
|
||||
}
|
||||
}
|
||||
return INVALID_SUBSCRIPTION_ID;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the legacy type of the network associated with this snapshot.
|
||||
* @return the legacy network type. See {@code ConnectivityManager#TYPE_*}.
|
||||
|
||||
@@ -1484,10 +1484,15 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
||||
NetworkCapabilities.NET_CAPABILITY_IMS) && !ident.isMetered()) {
|
||||
|
||||
// Copy the identify from IMS one but mark it as metered.
|
||||
NetworkIdentity vtIdent = new NetworkIdentity(ident.getType(),
|
||||
ident.getRatType(), ident.getSubscriberId(), ident.getWifiNetworkKey(),
|
||||
ident.isRoaming(), true /* metered */,
|
||||
true /* onDefaultNetwork */, ident.getOemManaged());
|
||||
NetworkIdentity vtIdent = new NetworkIdentity.Builder()
|
||||
.setType(ident.getType())
|
||||
.setRatType(ident.getRatType())
|
||||
.setSubscriberId(ident.getSubscriberId())
|
||||
.setWifiNetworkKey(ident.getWifiNetworkKey())
|
||||
.setRoaming(ident.isRoaming()).setMetered(true)
|
||||
.setDefaultNetwork(true)
|
||||
.setOemManaged(ident.getOemManaged())
|
||||
.setSubId(ident.getSubId()).build();
|
||||
final String ifaceVt = IFACE_VT + getSubIdForMobile(snapshot);
|
||||
findOrCreateNetworkIdentitySet(mActiveIfaces, ifaceVt).add(vtIdent);
|
||||
findOrCreateNetworkIdentitySet(mActiveUidIfaces, ifaceVt).add(vtIdent);
|
||||
|
||||
Reference in New Issue
Block a user