[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:
@@ -24,6 +24,7 @@ import static android.net.ConnectivityManager.TYPE_MOBILE_MMS;
|
||||
import static android.net.ConnectivityManager.TYPE_MOBILE_SUPL;
|
||||
import static android.net.NetworkStats.SET_DEFAULT;
|
||||
import static android.net.NetworkStats.TAG_NONE;
|
||||
import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.annotation.SystemApi;
|
||||
@@ -108,6 +109,7 @@ public class NetworkStatsDataMigrationUtils {
|
||||
static final int VERSION_ADD_METERED = 4;
|
||||
static final int VERSION_ADD_DEFAULT_NETWORK = 5;
|
||||
static final int VERSION_ADD_OEM_MANAGED_NETWORK = 6;
|
||||
static final int VERSION_ADD_SUB_ID = 7;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -448,6 +450,13 @@ public class NetworkStatsDataMigrationUtils {
|
||||
oemNetCapabilities = NetworkTemplate.OEM_MANAGED_NO;
|
||||
}
|
||||
|
||||
final int subId;
|
||||
if (version >= IdentitySetVersion.VERSION_ADD_SUB_ID) {
|
||||
subId = in.readInt();
|
||||
} else {
|
||||
subId = INVALID_SUBSCRIPTION_ID;
|
||||
}
|
||||
|
||||
// Legacy files might contain TYPE_MOBILE_* types which were deprecated in later
|
||||
// releases. For backward compatibility, record them as TYPE_MOBILE instead.
|
||||
final int collapsedLegacyType = getCollapsedLegacyType(type);
|
||||
@@ -457,7 +466,8 @@ public class NetworkStatsDataMigrationUtils {
|
||||
.setWifiNetworkKey(networkId)
|
||||
.setRoaming(roaming).setMetered(metered)
|
||||
.setDefaultNetwork(defaultNetwork)
|
||||
.setOemManaged(oemNetCapabilities);
|
||||
.setOemManaged(oemNetCapabilities)
|
||||
.setSubId(subId);
|
||||
if (type == TYPE_MOBILE && ratType != NetworkTemplate.NETWORK_TYPE_ALL) {
|
||||
builder.setRatType(ratType);
|
||||
}
|
||||
@@ -501,10 +511,10 @@ public class NetworkStatsDataMigrationUtils {
|
||||
* This is copied from {@code NetworkStatsCollection#readLegacyUid}.
|
||||
* See {@code NetworkStatsService#maybeUpgradeLegacyStatsLocked}.
|
||||
*
|
||||
* @param taggedData whether to read tagged data. For legacy uid files, the tagged
|
||||
* data was stored in the same binary file with non-tagged data.
|
||||
* But in later releases, these data should be kept in different
|
||||
* recorders.
|
||||
* @param taggedData whether to read only tagged data (true) or only non-tagged data
|
||||
* (false). For legacy uid files, the tagged data was stored in
|
||||
* the same binary file with non-tagged data. But in later releases,
|
||||
* these data should be kept in different recorders.
|
||||
* @hide
|
||||
*/
|
||||
@VisibleForTesting
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -25,7 +25,6 @@ import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
|
||||
import static android.net.NetworkPolicy.LIMIT_DISABLED;
|
||||
import static android.net.NetworkPolicy.WARNING_DISABLED;
|
||||
import static android.provider.Settings.Global.NETWORK_DEFAULT_DAILY_MULTIPATH_QUOTA_BYTES;
|
||||
import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
|
||||
|
||||
import static com.android.server.net.NetworkPolicyManagerInternal.QUOTA_TYPE_MULTIPATH;
|
||||
import static com.android.server.net.NetworkPolicyManagerService.OPPORTUNISTIC_QUOTA_UNKNOWN;
|
||||
@@ -191,6 +190,7 @@ public class MultipathPolicyTracker {
|
||||
class MultipathTracker {
|
||||
final Network network;
|
||||
final String subscriberId;
|
||||
private final int mSubId;
|
||||
|
||||
private long mQuota;
|
||||
/** Current multipath budget. Nonzero iff we have budget and a UsageCallback is armed. */
|
||||
@@ -204,9 +204,8 @@ public class MultipathPolicyTracker {
|
||||
this.network = network;
|
||||
this.mNetworkCapabilities = new NetworkCapabilities(nc);
|
||||
NetworkSpecifier specifier = nc.getNetworkSpecifier();
|
||||
int subId = INVALID_SUBSCRIPTION_ID;
|
||||
if (specifier instanceof TelephonyNetworkSpecifier) {
|
||||
subId = ((TelephonyNetworkSpecifier) specifier).getSubscriptionId();
|
||||
mSubId = ((TelephonyNetworkSpecifier) specifier).getSubscriptionId();
|
||||
} else {
|
||||
throw new IllegalStateException(String.format(
|
||||
"Can't get subId from mobile network %s (%s)",
|
||||
@@ -217,14 +216,14 @@ public class MultipathPolicyTracker {
|
||||
if (tele == null) {
|
||||
throw new IllegalStateException(String.format("Missing TelephonyManager"));
|
||||
}
|
||||
tele = tele.createForSubscriptionId(subId);
|
||||
tele = tele.createForSubscriptionId(mSubId);
|
||||
if (tele == null) {
|
||||
throw new IllegalStateException(String.format(
|
||||
"Can't get TelephonyManager for subId %d", subId));
|
||||
"Can't get TelephonyManager for subId %d", mSubId));
|
||||
}
|
||||
|
||||
subscriberId = Objects.requireNonNull(tele.getSubscriberId(),
|
||||
"Null subscriber Id for subId " + subId);
|
||||
"Null subscriber Id for subId " + mSubId);
|
||||
mNetworkTemplate = new NetworkTemplate.Builder(NetworkTemplate.MATCH_MOBILE)
|
||||
.setSubscriberIds(Set.of(subscriberId))
|
||||
.setMeteredness(NetworkStats.METERED_YES)
|
||||
@@ -282,6 +281,7 @@ public class MultipathPolicyTracker {
|
||||
.setSubscriberId(subscriberId)
|
||||
.setRoaming(!nc.hasCapability(NET_CAPABILITY_NOT_ROAMING))
|
||||
.setMetered(!nc.hasCapability(NET_CAPABILITY_NOT_METERED))
|
||||
.setSubId(mSubId)
|
||||
.build();
|
||||
}
|
||||
|
||||
|
||||
@@ -61,7 +61,6 @@ import static android.net.INetd.FIREWALL_RULE_ALLOW;
|
||||
import static android.net.INetd.FIREWALL_RULE_DENY;
|
||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED;
|
||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING;
|
||||
import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
|
||||
import static android.net.NetworkPolicy.LIMIT_DISABLED;
|
||||
import static android.net.NetworkPolicy.SNOOZE_NEVER;
|
||||
import static android.net.NetworkPolicy.WARNING_DISABLED;
|
||||
@@ -171,11 +170,9 @@ import android.net.NetworkPolicy;
|
||||
import android.net.NetworkPolicyManager;
|
||||
import android.net.NetworkPolicyManager.UidState;
|
||||
import android.net.NetworkRequest;
|
||||
import android.net.NetworkSpecifier;
|
||||
import android.net.NetworkStack;
|
||||
import android.net.NetworkStateSnapshot;
|
||||
import android.net.NetworkTemplate;
|
||||
import android.net.TelephonyNetworkSpecifier;
|
||||
import android.net.wifi.WifiConfiguration;
|
||||
import android.net.wifi.WifiManager;
|
||||
import android.os.BestClock;
|
||||
@@ -1500,7 +1497,8 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
|
||||
.setType(TYPE_MOBILE)
|
||||
.setSubscriberId(subscriberId)
|
||||
.setMetered(true)
|
||||
.setDefaultNetwork(true).build();
|
||||
.setDefaultNetwork(true)
|
||||
.setSubId(subId).build();
|
||||
if (template.matches(probeIdent)) {
|
||||
return subId;
|
||||
}
|
||||
@@ -1737,7 +1735,8 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
|
||||
.setType(TYPE_MOBILE)
|
||||
.setSubscriberId(subscriberId)
|
||||
.setMetered(true)
|
||||
.setDefaultNetwork(true).build();
|
||||
.setDefaultNetwork(true)
|
||||
.setSubId(subId).build();
|
||||
for (int i = mNetworkPolicy.size() - 1; i >= 0; i--) {
|
||||
final NetworkTemplate template = mNetworkPolicy.keyAt(i);
|
||||
if (template.matches(probeIdent)) {
|
||||
@@ -1969,7 +1968,8 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
|
||||
.setType(TYPE_MOBILE)
|
||||
.setSubscriberId(subscriberId)
|
||||
.setMetered(true)
|
||||
.setDefaultNetwork(true).build();
|
||||
.setDefaultNetwork(true)
|
||||
.setSubId(subId).build();
|
||||
// Template is matched when subscriber id matches.
|
||||
if (template.matches(probeIdent)) {
|
||||
matchingSubIds.add(subId);
|
||||
@@ -2071,7 +2071,8 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
|
||||
mNetIdToSubId.clear();
|
||||
final ArrayMap<NetworkStateSnapshot, NetworkIdentity> identified = new ArrayMap<>();
|
||||
for (final NetworkStateSnapshot snapshot : snapshots) {
|
||||
mNetIdToSubId.put(snapshot.getNetwork().getNetId(), parseSubId(snapshot));
|
||||
final int subId = snapshot.getSubId();
|
||||
mNetIdToSubId.put(snapshot.getNetwork().getNetId(), subId);
|
||||
|
||||
// Policies matched by NPMS only match by subscriber ID or by network ID.
|
||||
final NetworkIdentity ident = new NetworkIdentity.Builder()
|
||||
@@ -2276,7 +2277,8 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
|
||||
.setType(TYPE_MOBILE)
|
||||
.setSubscriberId(subscriberId)
|
||||
.setMetered(true)
|
||||
.setDefaultNetwork(true).build();
|
||||
.setDefaultNetwork(true)
|
||||
.setSubId(subId).build();
|
||||
for (int i = mNetworkPolicy.size() - 1; i >= 0; i--) {
|
||||
final NetworkTemplate template = mNetworkPolicy.keyAt(i);
|
||||
if (template.matches(probeIdent)) {
|
||||
@@ -5739,17 +5741,6 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
|
||||
}
|
||||
}
|
||||
|
||||
private int parseSubId(@NonNull NetworkStateSnapshot snapshot) {
|
||||
int subId = INVALID_SUBSCRIPTION_ID;
|
||||
if (snapshot.getNetworkCapabilities().hasTransport(TRANSPORT_CELLULAR)) {
|
||||
NetworkSpecifier spec = snapshot.getNetworkCapabilities().getNetworkSpecifier();
|
||||
if (spec instanceof TelephonyNetworkSpecifier) {
|
||||
subId = ((TelephonyNetworkSpecifier) spec).getSubscriptionId();
|
||||
}
|
||||
}
|
||||
return subId;
|
||||
}
|
||||
|
||||
@GuardedBy("mNetworkPoliciesSecondLock")
|
||||
private int getSubIdLocked(Network network) {
|
||||
return mNetIdToSubId.get(network.getNetId(), INVALID_SUBSCRIPTION_ID);
|
||||
|
||||
Reference in New Issue
Block a user