Loading api/current.txt +14 −1 Original line number Diff line number Diff line Loading @@ -29167,7 +29167,7 @@ package android.net { method @NonNull public android.net.NetworkRequest.Builder clearCapabilities(); method public android.net.NetworkRequest.Builder removeCapability(int); method public android.net.NetworkRequest.Builder removeTransportType(int); method public android.net.NetworkRequest.Builder setNetworkSpecifier(String); method @Deprecated public android.net.NetworkRequest.Builder setNetworkSpecifier(String); method public android.net.NetworkRequest.Builder setNetworkSpecifier(android.net.NetworkSpecifier); } Loading Loading @@ -29266,6 +29266,19 @@ package android.net { method public void onStopped(); } public final class TelephonyNetworkSpecifier extends android.net.NetworkSpecifier implements android.os.Parcelable { method public int describeContents(); method public int getSubscriptionId(); method public void writeToParcel(@NonNull android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.net.TelephonyNetworkSpecifier> CREATOR; } public static final class TelephonyNetworkSpecifier.Builder { ctor public TelephonyNetworkSpecifier.Builder(); method @NonNull public android.net.TelephonyNetworkSpecifier build(); method @NonNull public android.net.TelephonyNetworkSpecifier.Builder setSubscriptionId(int); } public class TrafficStats { ctor public TrafficStats(); method public static void clearThreadStatsTag(); api/system-current.txt +4 −0 Original line number Diff line number Diff line Loading @@ -4646,6 +4646,10 @@ package android.net { field @NonNull public final String specifier; } public final class TelephonyNetworkSpecifier extends android.net.NetworkSpecifier implements android.os.Parcelable { method public boolean satisfiedBy(android.net.NetworkSpecifier); } public class TrafficStats { method public static void setThreadStatsTagApp(); method public static void setThreadStatsTagBackup(); Loading core/java/android/net/NetworkRequest.java +25 −13 Original line number Diff line number Diff line Loading @@ -300,23 +300,35 @@ public class NetworkRequest implements Parcelable { * this without a single transport set will generate an exception, as will * subsequently adding or removing transports after this is set. * </p> * The interpretation of this {@code String} is bearer specific and bearers that use * it should document their particulars. For example, Bluetooth may use some sort of * device id while WiFi could used ssid and/or bssid. Cellular may use carrier spn. * * @param networkSpecifier An {@code String} of opaque format used to specify the bearer * specific network specifier where the bearer has a choice of * networks. */ * If the {@code networkSpecifier} is provided, it shall be interpreted as follows: * <ul> * <li>If the specifier can be parsed as an integer, it will be treated as a * {@link android.net TelephonyNetworkSpecifier}, and the provided integer will be * interpreted as a SubscriptionId. * <li>If the value is an ethernet interface name, it will be treated as such. * <li>For all other cases, the behavior is undefined. * </ul> * * @param networkSpecifier A {@code String} of either a SubscriptionId in cellular * network request or an ethernet interface name in ethernet * network request. * * @deprecated Use {@link #setNetworkSpecifier(NetworkSpecifier)} instead. */ @Deprecated public Builder setNetworkSpecifier(String networkSpecifier) { /* * A StringNetworkSpecifier does not accept null or empty ("") strings. When network * specifiers were strings a null string and an empty string were considered equivalent. * Hence no meaning is attached to a null or empty ("") string. */ try { int subId = Integer.parseInt(networkSpecifier); return setNetworkSpecifier(new TelephonyNetworkSpecifier.Builder() .setSubscriptionId(subId).build()); } catch (NumberFormatException nfe) { // A StringNetworkSpecifier does not accept null or empty ("") strings. When network // specifiers were strings a null string and an empty string were considered // equivalent. Hence no meaning is attached to a null or empty ("") string. return setNetworkSpecifier(TextUtils.isEmpty(networkSpecifier) ? null : new StringNetworkSpecifier(networkSpecifier)); } } /** * Sets the optional bearer specific network specifier. Loading core/java/android/net/TelephonyNetworkSpecifier.java 0 → 100644 +146 −0 Original line number Diff line number Diff line /* * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.net; import android.annotation.NonNull; import android.os.Parcel; import android.os.Parcelable; /** * NetworkSpecifier object for cellular network request. Apps should use the * {@link TelephonyNetworkSpecifier.Builder} class to create an instance. */ public final class TelephonyNetworkSpecifier extends NetworkSpecifier implements Parcelable { private final int mSubId; /** * Return the subscription Id of current TelephonyNetworkSpecifier object. * * @return The subscription id. */ public int getSubscriptionId() { return mSubId; } /** * @hide */ public TelephonyNetworkSpecifier(int subId) { this.mSubId = subId; } public static final @NonNull Creator<TelephonyNetworkSpecifier> CREATOR = new Creator<TelephonyNetworkSpecifier>() { @Override public TelephonyNetworkSpecifier createFromParcel(Parcel in) { int subId = in.readInt(); return new TelephonyNetworkSpecifier(subId); } @Override public TelephonyNetworkSpecifier[] newArray(int size) { return new TelephonyNetworkSpecifier[size]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(@NonNull Parcel dest, int flags) { dest.writeInt(mSubId); } @Override public int hashCode() { return mSubId; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (!(obj instanceof TelephonyNetworkSpecifier)) { return false; } TelephonyNetworkSpecifier lhs = (TelephonyNetworkSpecifier) obj; return mSubId == lhs.mSubId; } @Override public String toString() { return new StringBuilder() .append("TelephonyNetworkSpecifier [") .append("mSubId = ").append(mSubId) .append("]") .toString(); } /** @hide */ @Override public boolean satisfiedBy(NetworkSpecifier other) { // Any generic requests should be satisfied by a specific telephony network. // For simplicity, we treat null same as MatchAllNetworkSpecifier return equals(other) || other == null || other instanceof MatchAllNetworkSpecifier; } /** * Builder to create {@link TelephonyNetworkSpecifier} object. */ public static final class Builder { // Integer.MIN_VALUE which is not a valid subId, services as the sentinel to check if // subId was set private static final int SENTINEL_SUB_ID = Integer.MIN_VALUE; private int mSubId; public Builder() { mSubId = SENTINEL_SUB_ID; } /** * Set the subscription id. * * @param subId The subscription Id. * @return Instance of {@link Builder} to enable the chaining of the builder method. */ public @NonNull Builder setSubscriptionId(int subId) { mSubId = subId; return this; } /** * Create a NetworkSpecifier for the cellular network request. * * @return TelephonyNetworkSpecifier object. * @throws IllegalArgumentException when subscription Id is not provided through * {@link #setSubscriptionId(int)}. */ public @NonNull TelephonyNetworkSpecifier build() { if (mSubId == SENTINEL_SUB_ID) { throw new IllegalArgumentException("Subscription Id is not provided."); } return new TelephonyNetworkSpecifier(mSubId); } } } services/core/java/com/android/server/connectivity/MultipathPolicyTracker.java +11 −12 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ 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; Loading @@ -46,19 +47,18 @@ import android.net.NetworkIdentity; import android.net.NetworkPolicy; import android.net.NetworkPolicyManager; import android.net.NetworkRequest; import android.net.NetworkSpecifier; import android.net.NetworkStats; import android.net.NetworkTemplate; import android.net.StringNetworkSpecifier; import android.net.TelephonyNetworkSpecifier; import android.net.Uri; import android.os.BestClock; import android.os.Handler; import android.os.SystemClock; import android.net.Uri; import android.os.UserHandle; import android.provider.Settings; import android.telephony.TelephonyManager; import android.util.DataUnit; import android.util.DebugUtils; import android.util.Pair; import android.util.Range; import android.util.Slog; Loading @@ -74,7 +74,6 @@ import java.time.ZoneId; import java.time.ZoneOffset; import java.time.ZonedDateTime; import java.time.temporal.ChronoUnit; import java.util.Iterator; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; Loading Loading @@ -185,7 +184,6 @@ public class MultipathPolicyTracker { // Track information on mobile networks as they come and go. class MultipathTracker { final Network network; final int subId; final String subscriberId; private long mQuota; Loading @@ -198,13 +196,14 @@ public class MultipathPolicyTracker { public MultipathTracker(Network network, NetworkCapabilities nc) { this.network = network; this.mNetworkCapabilities = new NetworkCapabilities(nc); try { subId = Integer.parseInt( ((StringNetworkSpecifier) nc.getNetworkSpecifier()).toString()); } catch (ClassCastException | NullPointerException | NumberFormatException e) { NetworkSpecifier specifier = nc.getNetworkSpecifier(); int subId = INVALID_SUBSCRIPTION_ID; if (specifier instanceof TelephonyNetworkSpecifier) { subId = ((TelephonyNetworkSpecifier) specifier).getSubscriptionId(); } else { throw new IllegalStateException(String.format( "Can't get subId from mobile network %s (%s): %s", network, nc, e.getMessage())); "Can't get subId from mobile network %s (%s)", network, nc)); } TelephonyManager tele = mContext.getSystemService(TelephonyManager.class); Loading Loading
api/current.txt +14 −1 Original line number Diff line number Diff line Loading @@ -29167,7 +29167,7 @@ package android.net { method @NonNull public android.net.NetworkRequest.Builder clearCapabilities(); method public android.net.NetworkRequest.Builder removeCapability(int); method public android.net.NetworkRequest.Builder removeTransportType(int); method public android.net.NetworkRequest.Builder setNetworkSpecifier(String); method @Deprecated public android.net.NetworkRequest.Builder setNetworkSpecifier(String); method public android.net.NetworkRequest.Builder setNetworkSpecifier(android.net.NetworkSpecifier); } Loading Loading @@ -29266,6 +29266,19 @@ package android.net { method public void onStopped(); } public final class TelephonyNetworkSpecifier extends android.net.NetworkSpecifier implements android.os.Parcelable { method public int describeContents(); method public int getSubscriptionId(); method public void writeToParcel(@NonNull android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.net.TelephonyNetworkSpecifier> CREATOR; } public static final class TelephonyNetworkSpecifier.Builder { ctor public TelephonyNetworkSpecifier.Builder(); method @NonNull public android.net.TelephonyNetworkSpecifier build(); method @NonNull public android.net.TelephonyNetworkSpecifier.Builder setSubscriptionId(int); } public class TrafficStats { ctor public TrafficStats(); method public static void clearThreadStatsTag();
api/system-current.txt +4 −0 Original line number Diff line number Diff line Loading @@ -4646,6 +4646,10 @@ package android.net { field @NonNull public final String specifier; } public final class TelephonyNetworkSpecifier extends android.net.NetworkSpecifier implements android.os.Parcelable { method public boolean satisfiedBy(android.net.NetworkSpecifier); } public class TrafficStats { method public static void setThreadStatsTagApp(); method public static void setThreadStatsTagBackup(); Loading
core/java/android/net/NetworkRequest.java +25 −13 Original line number Diff line number Diff line Loading @@ -300,23 +300,35 @@ public class NetworkRequest implements Parcelable { * this without a single transport set will generate an exception, as will * subsequently adding or removing transports after this is set. * </p> * The interpretation of this {@code String} is bearer specific and bearers that use * it should document their particulars. For example, Bluetooth may use some sort of * device id while WiFi could used ssid and/or bssid. Cellular may use carrier spn. * * @param networkSpecifier An {@code String} of opaque format used to specify the bearer * specific network specifier where the bearer has a choice of * networks. */ * If the {@code networkSpecifier} is provided, it shall be interpreted as follows: * <ul> * <li>If the specifier can be parsed as an integer, it will be treated as a * {@link android.net TelephonyNetworkSpecifier}, and the provided integer will be * interpreted as a SubscriptionId. * <li>If the value is an ethernet interface name, it will be treated as such. * <li>For all other cases, the behavior is undefined. * </ul> * * @param networkSpecifier A {@code String} of either a SubscriptionId in cellular * network request or an ethernet interface name in ethernet * network request. * * @deprecated Use {@link #setNetworkSpecifier(NetworkSpecifier)} instead. */ @Deprecated public Builder setNetworkSpecifier(String networkSpecifier) { /* * A StringNetworkSpecifier does not accept null or empty ("") strings. When network * specifiers were strings a null string and an empty string were considered equivalent. * Hence no meaning is attached to a null or empty ("") string. */ try { int subId = Integer.parseInt(networkSpecifier); return setNetworkSpecifier(new TelephonyNetworkSpecifier.Builder() .setSubscriptionId(subId).build()); } catch (NumberFormatException nfe) { // A StringNetworkSpecifier does not accept null or empty ("") strings. When network // specifiers were strings a null string and an empty string were considered // equivalent. Hence no meaning is attached to a null or empty ("") string. return setNetworkSpecifier(TextUtils.isEmpty(networkSpecifier) ? null : new StringNetworkSpecifier(networkSpecifier)); } } /** * Sets the optional bearer specific network specifier. Loading
core/java/android/net/TelephonyNetworkSpecifier.java 0 → 100644 +146 −0 Original line number Diff line number Diff line /* * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.net; import android.annotation.NonNull; import android.os.Parcel; import android.os.Parcelable; /** * NetworkSpecifier object for cellular network request. Apps should use the * {@link TelephonyNetworkSpecifier.Builder} class to create an instance. */ public final class TelephonyNetworkSpecifier extends NetworkSpecifier implements Parcelable { private final int mSubId; /** * Return the subscription Id of current TelephonyNetworkSpecifier object. * * @return The subscription id. */ public int getSubscriptionId() { return mSubId; } /** * @hide */ public TelephonyNetworkSpecifier(int subId) { this.mSubId = subId; } public static final @NonNull Creator<TelephonyNetworkSpecifier> CREATOR = new Creator<TelephonyNetworkSpecifier>() { @Override public TelephonyNetworkSpecifier createFromParcel(Parcel in) { int subId = in.readInt(); return new TelephonyNetworkSpecifier(subId); } @Override public TelephonyNetworkSpecifier[] newArray(int size) { return new TelephonyNetworkSpecifier[size]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(@NonNull Parcel dest, int flags) { dest.writeInt(mSubId); } @Override public int hashCode() { return mSubId; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (!(obj instanceof TelephonyNetworkSpecifier)) { return false; } TelephonyNetworkSpecifier lhs = (TelephonyNetworkSpecifier) obj; return mSubId == lhs.mSubId; } @Override public String toString() { return new StringBuilder() .append("TelephonyNetworkSpecifier [") .append("mSubId = ").append(mSubId) .append("]") .toString(); } /** @hide */ @Override public boolean satisfiedBy(NetworkSpecifier other) { // Any generic requests should be satisfied by a specific telephony network. // For simplicity, we treat null same as MatchAllNetworkSpecifier return equals(other) || other == null || other instanceof MatchAllNetworkSpecifier; } /** * Builder to create {@link TelephonyNetworkSpecifier} object. */ public static final class Builder { // Integer.MIN_VALUE which is not a valid subId, services as the sentinel to check if // subId was set private static final int SENTINEL_SUB_ID = Integer.MIN_VALUE; private int mSubId; public Builder() { mSubId = SENTINEL_SUB_ID; } /** * Set the subscription id. * * @param subId The subscription Id. * @return Instance of {@link Builder} to enable the chaining of the builder method. */ public @NonNull Builder setSubscriptionId(int subId) { mSubId = subId; return this; } /** * Create a NetworkSpecifier for the cellular network request. * * @return TelephonyNetworkSpecifier object. * @throws IllegalArgumentException when subscription Id is not provided through * {@link #setSubscriptionId(int)}. */ public @NonNull TelephonyNetworkSpecifier build() { if (mSubId == SENTINEL_SUB_ID) { throw new IllegalArgumentException("Subscription Id is not provided."); } return new TelephonyNetworkSpecifier(mSubId); } } }
services/core/java/com/android/server/connectivity/MultipathPolicyTracker.java +11 −12 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ 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; Loading @@ -46,19 +47,18 @@ import android.net.NetworkIdentity; import android.net.NetworkPolicy; import android.net.NetworkPolicyManager; import android.net.NetworkRequest; import android.net.NetworkSpecifier; import android.net.NetworkStats; import android.net.NetworkTemplate; import android.net.StringNetworkSpecifier; import android.net.TelephonyNetworkSpecifier; import android.net.Uri; import android.os.BestClock; import android.os.Handler; import android.os.SystemClock; import android.net.Uri; import android.os.UserHandle; import android.provider.Settings; import android.telephony.TelephonyManager; import android.util.DataUnit; import android.util.DebugUtils; import android.util.Pair; import android.util.Range; import android.util.Slog; Loading @@ -74,7 +74,6 @@ import java.time.ZoneId; import java.time.ZoneOffset; import java.time.ZonedDateTime; import java.time.temporal.ChronoUnit; import java.util.Iterator; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; Loading Loading @@ -185,7 +184,6 @@ public class MultipathPolicyTracker { // Track information on mobile networks as they come and go. class MultipathTracker { final Network network; final int subId; final String subscriberId; private long mQuota; Loading @@ -198,13 +196,14 @@ public class MultipathPolicyTracker { public MultipathTracker(Network network, NetworkCapabilities nc) { this.network = network; this.mNetworkCapabilities = new NetworkCapabilities(nc); try { subId = Integer.parseInt( ((StringNetworkSpecifier) nc.getNetworkSpecifier()).toString()); } catch (ClassCastException | NullPointerException | NumberFormatException e) { NetworkSpecifier specifier = nc.getNetworkSpecifier(); int subId = INVALID_SUBSCRIPTION_ID; if (specifier instanceof TelephonyNetworkSpecifier) { subId = ((TelephonyNetworkSpecifier) specifier).getSubscriptionId(); } else { throw new IllegalStateException(String.format( "Can't get subId from mobile network %s (%s): %s", network, nc, e.getMessage())); "Can't get subId from mobile network %s (%s)", network, nc)); } TelephonyManager tele = mContext.getSystemService(TelephonyManager.class); Loading